Merge "Clean up Session2Record in MCS" into sc-dev
diff --git a/Android.bp b/Android.bp
index da52c23..685c69d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -375,7 +375,6 @@
     static_libs: [
         "app-compat-annotations",
         "framework-minus-apex",
-        "framework-connectivity.impl", // TODO(b/182859030): should be removed
         "framework-appsearch.impl", // TODO(b/146218515): should be removed
         "framework-updatable-stubs-module_libs_api",
     ],
diff --git a/StubLibraries.bp b/StubLibraries.bp
index bc3f131..bd66c1c 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -403,17 +403,6 @@
 }
 
 java_defaults {
-    name: "android_defaults_stubs_current",
-    static_libs: ["art-notices-for-framework-stubs-jar"], // License notices from art module
-    sdk_version: "none",
-    system_modules: "none",
-    java_version: "1.8",
-    compile_dex: true,
-    defaults_visibility: ["//visibility:private"],
-    visibility: ["//visibility:public"],
-}
-
-java_defaults {
     name: "android_stubs_dists_default",
     dist: {
         targets: [
@@ -432,7 +421,7 @@
         "android-non-updatable.stubs",
         "private-stub-annotations-jar",
     ],
-    defaults: ["android_defaults_stubs_current"],
+    defaults: ["android.jar_defaults"],
 }
 
 java_library_static {
@@ -442,7 +431,7 @@
         "private-stub-annotations-jar",
     ],
     defaults: [
-        "android_defaults_stubs_current",
+        "android.jar_defaults",
         "android_stubs_dists_default",
     ],
     dist: {
@@ -470,7 +459,7 @@
         "private-stub-annotations-jar",
     ],
     defaults: [
-        "android_defaults_stubs_current",
+        "android.jar_defaults",
         "android_stubs_dists_default",
     ],
     dist: {
@@ -481,7 +470,7 @@
 java_library_static {
     name: "android_module_lib_stubs_current",
     defaults: [
-        "android_defaults_stubs_current",
+        "android.jar_defaults",
         "android_stubs_dists_default",
     ],
     static_libs: [
@@ -493,6 +482,22 @@
     },
 }
 
+java_library {
+    name: "android_system_server_stubs_current",
+    defaults: ["android_stubs_dists_default"],
+    srcs: [":services-non-updatable-stubs"],
+    installable: false,
+    static_libs: [
+        "android_module_lib_stubs_current",
+    ],
+    sdk_version: "none",
+    system_modules: "none",
+    java_version: "1.8",
+    dist: {
+        dir: "apistubs/android/system-server",
+    },
+}
+
 /////////////////////////////////////////////////////////////////////
 // hwbinder.stubs provides APIs required for building HIDL Java
 // libraries.
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 9ceef6b..c5c6012 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,4 +1,20 @@
 {
+  "presubmit-large": [
+    {
+      "name": "FrameworksServicesTests",
+      "options": [
+        {
+          "include-annotation": "android.platform.test.annotations.Presubmit"
+        },
+        {
+          "exclude-annotation": "androidx.test.filters.FlakyTest"
+        },
+        {
+          "exclude-annotation": "org.junit.Ignore"
+        }
+      ]
+    }
+  ],
   "presubmit": [
     {
       "name": "FrameworksUiServicesTests",
@@ -53,20 +69,6 @@
       ]
     },
     {
-      "name": "FrameworksServicesTests",
-      "options": [
-        {
-          "include-annotation": "android.platform.test.annotations.Presubmit"
-        },
-        {
-          "exclude-annotation": "androidx.test.filters.FlakyTest"
-        },
-        {
-          "exclude-annotation": "org.junit.Ignore"
-        }
-      ]
-    },
-    {
       "name": "FrameworksInProcessTests",
       "options": [
         {
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java
index 5a45961..e83c64c 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/TypefaceCreatePerfTest.java
@@ -44,7 +44,7 @@
 @RunWith(AndroidJUnit4.class)
 public class TypefaceCreatePerfTest {
     // A font file name in asset directory.
-    private static final String TEST_FONT_NAME = "DancingScript.ttf";
+    private static final String TEST_FONT_NAME = "DancingScript-Regular.ttf";
 
     @Rule
     public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
diff --git a/apex/appsearch/framework/api/current.txt b/apex/appsearch/framework/api/current.txt
index 5acfe6a..7441b0f 100644
--- a/apex/appsearch/framework/api/current.txt
+++ b/apex/appsearch/framework/api/current.txt
@@ -79,15 +79,14 @@
 
   public static final class AppSearchSchema.DocumentPropertyConfig extends android.app.appsearch.AppSearchSchema.PropertyConfig {
     method @NonNull public String getSchemaType();
-    method public boolean isIndexNestedProperties();
+    method public boolean shouldIndexNestedProperties();
   }
 
   public static final class AppSearchSchema.DocumentPropertyConfig.Builder {
-    ctor public AppSearchSchema.DocumentPropertyConfig.Builder(@NonNull String);
+    ctor public AppSearchSchema.DocumentPropertyConfig.Builder(@NonNull String, @NonNull String);
     method @NonNull public android.app.appsearch.AppSearchSchema.DocumentPropertyConfig build();
     method @NonNull public android.app.appsearch.AppSearchSchema.DocumentPropertyConfig.Builder setCardinality(int);
-    method @NonNull public android.app.appsearch.AppSearchSchema.DocumentPropertyConfig.Builder setIndexNestedProperties(boolean);
-    method @NonNull public android.app.appsearch.AppSearchSchema.DocumentPropertyConfig.Builder setSchemaType(@NonNull String);
+    method @NonNull public android.app.appsearch.AppSearchSchema.DocumentPropertyConfig.Builder setShouldIndexNestedProperties(boolean);
   }
 
   public static final class AppSearchSchema.DoublePropertyConfig extends android.app.appsearch.AppSearchSchema.PropertyConfig {
@@ -136,12 +135,12 @@
 
   public final class AppSearchSession implements java.io.Closeable {
     method public void close();
-    method public void getByUri(@NonNull android.app.appsearch.GetByUriRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.appsearch.BatchResultCallback<java.lang.String,android.app.appsearch.GenericDocument>);
+    method public void getByDocumentId(@NonNull android.app.appsearch.GetByDocumentIdRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.appsearch.BatchResultCallback<java.lang.String,android.app.appsearch.GenericDocument>);
     method public void getNamespaces(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.appsearch.AppSearchResult<java.util.Set<java.lang.String>>>);
     method public void getSchema(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.appsearch.AppSearchResult<android.app.appsearch.GetSchemaResponse>>);
     method public void getStorageInfo(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.appsearch.AppSearchResult<android.app.appsearch.StorageInfo>>);
     method public void put(@NonNull android.app.appsearch.PutDocumentsRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.appsearch.BatchResultCallback<java.lang.String,java.lang.Void>);
-    method public void remove(@NonNull android.app.appsearch.RemoveByUriRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.appsearch.BatchResultCallback<java.lang.String,java.lang.Void>);
+    method public void remove(@NonNull android.app.appsearch.RemoveByDocumentIdRequest, @NonNull java.util.concurrent.Executor, @NonNull android.app.appsearch.BatchResultCallback<java.lang.String,java.lang.Void>);
     method public void remove(@NonNull String, @NonNull android.app.appsearch.SearchSpec, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.appsearch.AppSearchResult<java.lang.Void>>);
     method public void reportUsage(@NonNull android.app.appsearch.ReportUsageRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.appsearch.AppSearchResult<java.lang.Void>>);
     method @NonNull public android.app.appsearch.SearchResults search(@NonNull String, @NonNull android.app.appsearch.SearchSpec);
@@ -156,6 +155,7 @@
   public class GenericDocument {
     ctor protected GenericDocument(@NonNull android.app.appsearch.GenericDocument);
     method public long getCreationTimestampMillis();
+    method @NonNull public String getId();
     method public static int getMaxIndexedProperties();
     method @NonNull public String getNamespace();
     method @Nullable public Object getProperty(@NonNull String);
@@ -175,7 +175,6 @@
     method @NonNull public String getSchemaType();
     method public int getScore();
     method public long getTtlMillis();
-    method @NonNull public String getUri();
   }
 
   public static class GenericDocument.Builder<BuilderType extends android.app.appsearch.GenericDocument.Builder> {
@@ -192,19 +191,19 @@
     method @NonNull public BuilderType setTtlMillis(long);
   }
 
-  public final class GetByUriRequest {
+  public final class GetByDocumentIdRequest {
+    method @NonNull public java.util.Set<java.lang.String> getIds();
     method @NonNull public String getNamespace();
     method @NonNull public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getProjections();
-    method @NonNull public java.util.Set<java.lang.String> getUris();
     field public static final String PROJECTION_SCHEMA_TYPE_WILDCARD = "*";
   }
 
-  public static final class GetByUriRequest.Builder {
-    ctor public GetByUriRequest.Builder(@NonNull String);
-    method @NonNull public android.app.appsearch.GetByUriRequest.Builder addProjection(@NonNull String, @NonNull java.util.Collection<java.lang.String>);
-    method @NonNull public android.app.appsearch.GetByUriRequest.Builder addUris(@NonNull java.lang.String...);
-    method @NonNull public android.app.appsearch.GetByUriRequest.Builder addUris(@NonNull java.util.Collection<java.lang.String>);
-    method @NonNull public android.app.appsearch.GetByUriRequest build();
+  public static final class GetByDocumentIdRequest.Builder {
+    ctor public GetByDocumentIdRequest.Builder(@NonNull String);
+    method @NonNull public android.app.appsearch.GetByDocumentIdRequest.Builder addIds(@NonNull java.lang.String...);
+    method @NonNull public android.app.appsearch.GetByDocumentIdRequest.Builder addIds(@NonNull java.util.Collection<java.lang.String>);
+    method @NonNull public android.app.appsearch.GetByDocumentIdRequest.Builder addProjection(@NonNull String, @NonNull java.util.Collection<java.lang.String>);
+    method @NonNull public android.app.appsearch.GetByDocumentIdRequest build();
   }
 
   public class GetSchemaResponse {
@@ -249,44 +248,42 @@
     method @NonNull public android.app.appsearch.PutDocumentsRequest build();
   }
 
-  public final class RemoveByUriRequest {
+  public final class RemoveByDocumentIdRequest {
+    method @NonNull public java.util.Set<java.lang.String> getIds();
     method @NonNull public String getNamespace();
-    method @NonNull public java.util.Set<java.lang.String> getUris();
   }
 
-  public static final class RemoveByUriRequest.Builder {
-    ctor public RemoveByUriRequest.Builder(@NonNull String);
-    method @NonNull public android.app.appsearch.RemoveByUriRequest.Builder addUris(@NonNull java.lang.String...);
-    method @NonNull public android.app.appsearch.RemoveByUriRequest.Builder addUris(@NonNull java.util.Collection<java.lang.String>);
-    method @NonNull public android.app.appsearch.RemoveByUriRequest build();
+  public static final class RemoveByDocumentIdRequest.Builder {
+    ctor public RemoveByDocumentIdRequest.Builder(@NonNull String);
+    method @NonNull public android.app.appsearch.RemoveByDocumentIdRequest.Builder addIds(@NonNull java.lang.String...);
+    method @NonNull public android.app.appsearch.RemoveByDocumentIdRequest.Builder addIds(@NonNull java.util.Collection<java.lang.String>);
+    method @NonNull public android.app.appsearch.RemoveByDocumentIdRequest build();
   }
 
   public final class ReportSystemUsageRequest {
     method @NonNull public String getDatabaseName();
+    method @NonNull public String getDocumentId();
     method @NonNull public String getNamespace();
     method @NonNull public String getPackageName();
-    method @NonNull public String getUri();
-    method public long getUsageTimeMillis();
+    method public long getUsageTimestampMillis();
   }
 
   public static final class ReportSystemUsageRequest.Builder {
-    ctor public ReportSystemUsageRequest.Builder(@NonNull String, @NonNull String, @NonNull String);
+    ctor public ReportSystemUsageRequest.Builder(@NonNull String, @NonNull String, @NonNull String, @NonNull String);
     method @NonNull public android.app.appsearch.ReportSystemUsageRequest build();
-    method @NonNull public android.app.appsearch.ReportSystemUsageRequest.Builder setUri(@NonNull String);
-    method @NonNull public android.app.appsearch.ReportSystemUsageRequest.Builder setUsageTimeMillis(long);
+    method @NonNull public android.app.appsearch.ReportSystemUsageRequest.Builder setUsageTimestampMillis(long);
   }
 
   public final class ReportUsageRequest {
+    method @NonNull public String getDocumentId();
     method @NonNull public String getNamespace();
-    method @NonNull public String getUri();
-    method public long getUsageTimeMillis();
+    method public long getUsageTimestampMillis();
   }
 
   public static final class ReportUsageRequest.Builder {
-    ctor public ReportUsageRequest.Builder(@NonNull String);
+    ctor public ReportUsageRequest.Builder(@NonNull String, @NonNull String);
     method @NonNull public android.app.appsearch.ReportUsageRequest build();
-    method @NonNull public android.app.appsearch.ReportUsageRequest.Builder setUri(@NonNull String);
-    method @NonNull public android.app.appsearch.ReportUsageRequest.Builder setUsageTimeMillis(long);
+    method @NonNull public android.app.appsearch.ReportUsageRequest.Builder setUsageTimestampMillis(long);
   }
 
   public final class SearchResult {
@@ -315,10 +312,9 @@
   }
 
   public static final class SearchResult.MatchInfo.Builder {
-    ctor public SearchResult.MatchInfo.Builder();
+    ctor public SearchResult.MatchInfo.Builder(@NonNull String);
     method @NonNull public android.app.appsearch.SearchResult.MatchInfo build();
     method @NonNull public android.app.appsearch.SearchResult.MatchInfo.Builder setExactMatchRange(@NonNull android.app.appsearch.SearchResult.MatchRange);
-    method @NonNull public android.app.appsearch.SearchResult.MatchInfo.Builder setPropertyPath(@NonNull String);
     method @NonNull public android.app.appsearch.SearchResult.MatchInfo.Builder setSnippetRange(@NonNull android.app.appsearch.SearchResult.MatchRange);
   }
 
@@ -427,19 +423,11 @@
   }
 
   public static class SetSchemaResponse.MigrationFailure {
+    ctor public SetSchemaResponse.MigrationFailure(@NonNull String, @NonNull String, @NonNull String, @NonNull android.app.appsearch.AppSearchResult<?>);
     method @NonNull public android.app.appsearch.AppSearchResult<java.lang.Void> getAppSearchResult();
+    method @NonNull public String getDocumentId();
     method @NonNull public String getNamespace();
     method @NonNull public String getSchemaType();
-    method @NonNull public String getUri();
-  }
-
-  public static final class SetSchemaResponse.MigrationFailure.Builder {
-    ctor public SetSchemaResponse.MigrationFailure.Builder();
-    method @NonNull public android.app.appsearch.SetSchemaResponse.MigrationFailure build();
-    method @NonNull public android.app.appsearch.SetSchemaResponse.MigrationFailure.Builder setAppSearchResult(@NonNull android.app.appsearch.AppSearchResult<java.lang.Void>);
-    method @NonNull public android.app.appsearch.SetSchemaResponse.MigrationFailure.Builder setNamespace(@NonNull String);
-    method @NonNull public android.app.appsearch.SetSchemaResponse.MigrationFailure.Builder setSchemaType(@NonNull String);
-    method @NonNull public android.app.appsearch.SetSchemaResponse.MigrationFailure.Builder setUri(@NonNull String);
   }
 
   public class StorageInfo {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchBatchResult.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchBatchResult.java
index 6c62426..9ae0d62 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchBatchResult.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchBatchResult.java
@@ -40,7 +40,7 @@
  * both successes and failures.
  *
  * @see AppSearchSession#put
- * @see AppSearchSession#getByUri
+ * @see AppSearchSession#getByDocumentId
  * @see AppSearchSession#remove
  */
 public final class AppSearchBatchResult<KeyType, ValueType> implements Parcelable {
@@ -87,8 +87,9 @@
      * Returns a {@link Map} of keys mapped to instances of the value type for all successful
      * individual results.
      *
-     * <p>Example: {@link AppSearchSession#getByUri} returns an {@link AppSearchBatchResult}. Each
-     * key (a URI of {@code String} type) will map to a {@link GenericDocument} object.
+     * <p>Example: {@link AppSearchSession#getByDocumentId} returns an {@link AppSearchBatchResult}.
+     * Each key (the document ID, of {@code String} type) will map to a {@link GenericDocument}
+     * object.
      *
      * <p>The values of the {@link Map} will not be {@code null}.
      */
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
index 8af91b4..c4dd1a0 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java
@@ -78,10 +78,10 @@
  * });</pre>
  *
  * <p>The basic unit of data in AppSearch is represented as a {@link GenericDocument} object,
- * containing a URI, namespace, time-to-live, score, and properties. A namespace organizes a logical
+ * containing an ID, namespace, time-to-live, score, and properties. A namespace organizes a logical
  * group of documents. For example, a namespace can be created to group documents on a per-account
- * basis. A URI identifies a single document within a namespace. The combination of URI and
- * namespace uniquely identifies a {@link GenericDocument} in the database.
+ * basis. An ID identifies a single document within a namespace. The combination of namespace and ID
+ * uniquely identifies a {@link GenericDocument} in the database.
  *
  * <p>Once the schema has been set, {@link GenericDocument} objects can be put into the database and
  * indexed by calling {@link AppSearchSession#put}.
@@ -91,8 +91,7 @@
  * <pre>
  * // Although for this example we use GenericDocument directly, we recommend extending
  * // GenericDocument to create specific types (i.e. Email) with specific setters/getters.
- * GenericDocument email = new GenericDocument.Builder<>(URI, EMAIL_SCHEMA_TYPE)
- *     .setNamespace(NAMESPACE)
+ * GenericDocument email = new GenericDocument.Builder<>(NAMESPACE, ID, EMAIL_SCHEMA_TYPE)
  *     .setPropertyString(“subject”, EMAIL_SUBJECT)
  *     .setScore(EMAIL_SCORE)
  *     .build();
@@ -108,13 +107,13 @@
  * <p>Searching within the database is done by calling {@link AppSearchSession#search} and providing
  * the query string to search for, as well as a {@link SearchSpec}.
  *
- * <p>Alternatively, {@link AppSearchSession#getByUri} can be called to retrieve documents by URI
- * and namespace.
+ * <p>Alternatively, {@link AppSearchSession#getByDocumentId} can be called to retrieve documents by
+ * namespace and ID.
  *
  * <p>Document removal is done either by time-to-live expiration, or explicitly calling a remove
- * operation. Remove operations can be done by URI and namespace via {@link
- * AppSearchSession#remove(RemoveByUriRequest, Executor, BatchResultCallback)}, or by query via
- * {@link AppSearchSession#remove(String, SearchSpec, Executor, Consumer)}.
+ * operation. Remove operations can be done by namespace and ID via {@link
+ * AppSearchSession#remove(RemoveByDocumentIdRequest, Executor, BatchResultCallback)}, or by query
+ * via {@link AppSearchSession#remove(String, SearchSpec, Executor, Consumer)}.
  */
 @SystemService(Context.APP_SEARCH_SERVICE)
 public class AppSearchManager {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
index c85c4c3..1e0d205 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
@@ -41,10 +41,14 @@
 import java.util.function.Consumer;
 
 /**
- * Represents a connection to an AppSearch storage system where {@link GenericDocument}s can be
- * placed and queried.
+ * Provides a connection to a single AppSearch database.
+ *
+ * <p>An {@link AppSearchSession} instance provides access to database operations such as
+ * setting a schema, adding documents, and searching.
  *
  * <p>This class is thread safe.
+ *
+ * @see GlobalSearchSession
  */
 public final class AppSearchSession implements Closeable {
     private static final String TAG = "AppSearchSession";
@@ -250,12 +254,12 @@
      * @param request containing documents to be indexed.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive pending result of performing this operation. The keys
-     *                 of the returned {@link AppSearchBatchResult} are the URIs of the input
+     *                 of the returned {@link AppSearchBatchResult} are the IDs of the input
      *                 documents. The values are {@code null} if they were successfully indexed,
-     *                 or a failed {@link AppSearchResult} otherwise.
-     *                 Or {@link BatchResultCallback#onSystemError} will be invoked with a
-     *                 {@link Throwable} if an unexpected internal error occurred in AppSearch
-     *                 service.
+     *                 or a failed {@link AppSearchResult} otherwise. If an unexpected internal
+     *                 error occurs in the AppSearch service,
+     *                 {@link BatchResultCallback#onSystemError} will be invoked with a
+     *                 {@link Throwable}.
      */
     public void put(
             @NonNull PutDocumentsRequest request,
@@ -291,23 +295,22 @@
     }
 
     /**
-     * Gets {@link GenericDocument} objects by URIs and namespace from the {@link AppSearchSession}
-     * database.
+     * Gets {@link GenericDocument} objects by document IDs in a namespace from the {@link
+     * AppSearchSession} database.
      *
-     * @param request a request containing URIs and namespace to get documents for.
+     * @param request a request containing a namespace and IDs to get documents for.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive the pending result of performing this operation. The keys
-     *                 of the returned {@link AppSearchBatchResult} are the input URIs. The values
+     *                 of the returned {@link AppSearchBatchResult} are the input IDs. The values
      *                 are the returned {@link GenericDocument}s on success, or a failed
-     *                 {@link AppSearchResult} otherwise. URIs that are not found will return a
+     *                 {@link AppSearchResult} otherwise. IDs that are not found will return a
      *                 failed {@link AppSearchResult} with a result code of
-     *                 {@link AppSearchResult#RESULT_NOT_FOUND}.
-     *                 Or {@link BatchResultCallback#onSystemError} will be invoked with a
-     *                 {@link Throwable} if an unexpected internal error occurred in AppSearch
-     *                 service.
+     *                 {@link AppSearchResult#RESULT_NOT_FOUND}. If an unexpected internal error
+     *                 occurs in the AppSearch service, {@link BatchResultCallback#onSystemError}
+     *                 will be invoked with a {@link Throwable}.
      */
-    public void getByUri(
-            @NonNull GetByUriRequest request,
+    public void getByDocumentId(
+            @NonNull GetByDocumentIdRequest request,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull BatchResultCallback<String, GenericDocument> callback) {
         Objects.requireNonNull(request);
@@ -319,7 +322,7 @@
                     mPackageName,
                     mDatabaseName,
                     request.getNamespace(),
-                    new ArrayList<>(request.getUris()),
+                    new ArrayList<>(request.getIds()),
                     request.getProjectionsInternal(),
                     mUserId,
                     new IAppSearchBatchResultCallback.Stub() {
@@ -373,8 +376,8 @@
     }
 
     /**
-     * Retrieves documents from the open {@link AppSearchSession} that match a given query string
-     * and type of search provided.
+     * Retrieves documents from the open {@link AppSearchSession} that match a given query
+     * string and type of search provided.
      *
      * <p>Query strings can be empty, contain one term with no operators, or contain multiple terms
      * and operators.
@@ -441,7 +444,7 @@
     }
 
     /**
-     * Reports usage of a particular document by URI and namespace.
+     * Reports usage of a particular document by namespace and ID.
      *
      * <p>A usage report represents an event in which a user interacted with or viewed a document.
      *
@@ -470,8 +473,8 @@
                     mPackageName,
                     mDatabaseName,
                     request.getNamespace(),
-                    request.getUri(),
-                    request.getUsageTimeMillis(),
+                    request.getDocumentId(),
+                    request.getUsageTimestampMillis(),
                     /*systemUsage=*/ false,
                     mUserId,
                     new IAppSearchResultCallback.Stub() {
@@ -486,29 +489,29 @@
     }
 
     /**
-     * Removes {@link GenericDocument} objects by URIs and namespace from the {@link
+     * Removes {@link GenericDocument} objects by document IDs in a namespace from the {@link
      * AppSearchSession} database.
      *
-     * <p>Removed documents will no longer be surfaced by {@link #search} or {@link #getByUri}
-     * calls.
+     * <p>Removed documents will no longer be surfaced by {@link #search} or {@link
+     * #getByDocumentId} calls.
      *
-     * <p><b>NOTE:</b>By default, documents are removed via a soft delete operation. Once the
-     * document crosses the count threshold or byte usage threshold, the documents will be removed
-     * from disk.
+     * <p>Once the database crosses the document count or byte usage threshold, removed documents
+     * will be deleted from disk.
      *
-     * @param request {@link RemoveByUriRequest} with URIs and namespace to remove from the index.
+     * @param request {@link RemoveByDocumentIdRequest} with IDs in a namespace to remove from the
+     *     index.
      * @param executor Executor on which to invoke the callback.
      * @param callback Callback to receive the pending result of performing this operation. The keys
-     *                 of the returned {@link AppSearchBatchResult} are the input URIs. The values
-     *                 are {@code null} on success, or a failed {@link AppSearchResult} otherwise.
-     *                 URIs that are not found will return a failed {@link AppSearchResult} with a
-     *                 result code of {@link AppSearchResult#RESULT_NOT_FOUND}.
-     *                 Or {@link BatchResultCallback#onSystemError} will be invoked with a
-     *                 {@link Throwable} if an unexpected internal error occurred in AppSearch
-     *                 service.
+     *                 of the returned {@link AppSearchBatchResult} are the input document IDs. The
+     *                 values are {@code null} on success, or a failed {@link AppSearchResult}
+     *                 otherwise. IDs that are not found will return a failed
+     *                 {@link AppSearchResult} with a result code of
+     *                 {@link AppSearchResult#RESULT_NOT_FOUND}. If an unexpected internal error
+     *                 occurs in the AppSearch service, {@link BatchResultCallback#onSystemError}
+     *                 will be invoked with a {@link Throwable}.
      */
     public void remove(
-            @NonNull RemoveByUriRequest request,
+            @NonNull RemoveByDocumentIdRequest request,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull BatchResultCallback<String, Void> callback) {
         Objects.requireNonNull(request);
@@ -516,8 +519,8 @@
         Objects.requireNonNull(callback);
         Preconditions.checkState(!mIsClosed, "AppSearchSession has already been closed");
         try {
-            mService.removeByUri(mPackageName, mDatabaseName, request.getNamespace(),
-                    new ArrayList<>(request.getUris()), mUserId,
+            mService.removeByDocumentId(mPackageName, mDatabaseName, request.getNamespace(),
+                    new ArrayList<>(request.getIds()), mUserId,
                     new IAppSearchBatchResultCallback.Stub() {
                         @Override
                         public void onResult(AppSearchBatchResult result) {
@@ -581,8 +584,8 @@
     /**
      * Gets the storage info for this {@link AppSearchSession} database.
      *
-     * <p>This may take time proportional to the number of documents and may be inefficient to
-     * call repeatedly.
+     * <p>This may take time proportional to the number of documents and may be inefficient to call
+     * repeatedly.
      *
      * @param executor        Executor on which to invoke the callback.
      * @param callback        Callback to receive the storage info.
@@ -618,8 +621,8 @@
     }
 
     /**
-     * Closes the {@link AppSearchSession} to persist all schema and document updates, additions,
-     * and deletes to disk.
+     * Closes the {@link AppSearchSession} to persist all schema and document updates,
+     * additions, and deletes to disk.
      */
     @Override
     public void close() {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java
index b30ed50..d49f472 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java
@@ -31,9 +31,12 @@
 import java.util.function.Consumer;
 
 /**
- * This class provides global access to the centralized AppSearch index maintained by the system.
+ * Provides a connection to all AppSearch databases the querying application has been granted access
+ * to.
  *
- * <p>Apps can retrieve indexed documents through the {@link #search} API.
+ * <p>This class is thread safe.
+ *
+ * @see AppSearchSession
  */
 public class GlobalSearchSession implements Closeable {
     private static final String TAG = "AppSearchGlobalSearchSe";
@@ -151,8 +154,8 @@
                     request.getPackageName(),
                     request.getDatabaseName(),
                     request.getNamespace(),
-                    request.getUri(),
-                    request.getUsageTimeMillis(),
+                    request.getDocumentId(),
+                    request.getUsageTimestampMillis(),
                     /*systemUsage=*/ true,
                     mUserId,
                     new IAppSearchResultCallback.Stub() {
diff --git a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
index 0b8f052..17f724b 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
+++ b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl
@@ -100,7 +100,7 @@
      *     will be called with the cause throwable. Otherwise,
      *     {@link IAppSearchBatchResultCallback#onResult} will be called with an
      *     {@link AppSearchBatchResult}&lt;{@link String}, {@link Void}&gt;
-     *     where the keys are document URIs, and the values are {@code null}.
+     *     where the keys are document IDs, and the values are {@code null}.
      */
     void putDocuments(
         in String packageName,
@@ -116,7 +116,7 @@
      * @param packageName The name of the package that owns this document.
      * @param databaseName  The databaseName this document resides in.
      * @param namespace    The namespace this document resides in.
-     * @param uris The URIs of the documents to retrieve
+     * @param ids The IDs of the documents to retrieve
      * @param typePropertyPaths A map of schema type to a list of property paths to return in the
      *     result.
      * @param userId Id of the calling user
@@ -125,13 +125,13 @@
      *     will be called with the cause throwable. Otherwise,
      *     {@link IAppSearchBatchResultCallback#onResult} will be called with an
      *     {@link AppSearchBatchResult}&lt;{@link String}, {@link Bundle}&gt;
-     *     where the keys are document URIs, and the values are Document bundles.
+     *     where the keys are document IDs, and the values are Document bundles.
      */
     void getDocuments(
         in String packageName,
         in String databaseName,
         in String namespace,
-        in List<String> uris,
+        in List<String> ids,
         in Map<String, List<String>> typePropertyPaths,
         in int userId,
         in IAppSearchBatchResultCallback callback);
@@ -235,7 +235,7 @@
         in IAppSearchResultCallback callback);
 
     /**
-     * Reports usage of a particular document by URI and namespace.
+     * Reports usage of a particular document by namespace and id.
      *
      * <p>A usage report represents an event in which a user interacted with or viewed a document.
      *
@@ -249,8 +249,8 @@
      * @param packageName The name of the package that owns this document.
      * @param databaseName  The name of the database to report usage against.
      * @param namespace Namespace the document being used belongs to.
-     * @param uri URI of the document being used.
-     * @param usageTimeMillis The timestamp at which the document was used.
+     * @param id ID of the document being used.
+     * @param usageTimestampMillis The timestamp at which the document was used.
      * @param systemUsage Whether the usage was reported by a system app against another app's doc.
      * @param userId Id of the calling user
      * @param callback {@link IAppSearchResultCallback#onResult} will be called with an
@@ -260,33 +260,33 @@
          in String packageName,
          in String databaseName,
          in String namespace,
-         in String uri,
-         in long usageTimeMillis,
+         in String id,
+         in long usageTimestampMillis,
          in boolean systemUsage,
          in int userId,
          in IAppSearchResultCallback callback);
 
     /**
-     * Removes documents by URI.
+     * Removes documents by ID.
      *
      * @param packageName The name of the package the document is in.
      * @param databaseName The databaseName the document is in.
      * @param namespace    Namespace of the document to remove.
-     * @param uris The URIs of the documents to delete
+     * @param ids The IDs of the documents to delete
      * @param userId Id of the calling user
      * @param callback
      *     If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError}
      *     will be called with the cause throwable. Otherwise,
      *     {@link IAppSearchBatchResultCallback#onResult} will be called with an
      *     {@link AppSearchBatchResult}&lt;{@link String}, {@link Void}&gt;
-     *     where the keys are document URIs. If a document doesn't exist, it will be reported as a
+     *     where the keys are document IDs. If a document doesn't exist, it will be reported as a
      *     failure where the {@code throwable} is {@code null}.
      */
-    void removeByUri(
+    void removeByDocumentId(
         in String packageName,
         in String databaseName,
         in String namespace,
-        in List<String> uris,
+        in List<String> ids,
         in int userId,
         in IAppSearchBatchResultCallback callback);
 
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchEmail.java b/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchEmail.java
index 77740f8..d99c73f 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchEmail.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchEmail.java
@@ -156,10 +156,10 @@
          * Creates a new {@link AppSearchEmail.Builder}
          *
          * @param namespace The namespace of the Email.
-         * @param uri The Uri of the Email.
+         * @param id The ID of the Email.
          */
-        public Builder(@NonNull String namespace, @NonNull String uri) {
-            super(namespace, uri, SCHEMA_TYPE);
+        public Builder(@NonNull String namespace, @NonNull String id) {
+            super(namespace, id, SCHEMA_TYPE);
         }
 
         /** Sets the from address of {@link AppSearchEmail} */
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchSchema.java b/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchSchema.java
index 2368bdb..2a941fb 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchSchema.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchSchema.java
@@ -273,7 +273,7 @@
          * Returns the cardinality of the property (whether it is optional, required or repeated).
          */
         public @Cardinality int getCardinality() {
-            return mBundle.getInt(CARDINALITY_FIELD, -1);
+            return mBundle.getInt(CARDINALITY_FIELD, CARDINALITY_OPTIONAL);
         }
 
         @Override
@@ -407,11 +407,7 @@
             return mBundle.getInt(TOKENIZER_TYPE_FIELD);
         }
 
-        /**
-         * Builder for {@link StringPropertyConfig}.
-         *
-         * <p>{@link #setCardinality} must be called or {@link #build} will fail.
-         */
+        /** Builder for {@link StringPropertyConfig}. */
         public static final class Builder {
             private final Bundle mBundle = new Bundle();
             private boolean mBuilt = false;
@@ -420,12 +416,16 @@
             public Builder(@NonNull String propertyName) {
                 mBundle.putString(NAME_FIELD, propertyName);
                 mBundle.putInt(DATA_TYPE_FIELD, DATA_TYPE_STRING);
+                mBundle.putInt(CARDINALITY_FIELD, CARDINALITY_OPTIONAL);
+                mBundle.putInt(INDEXING_TYPE_FIELD, INDEXING_TYPE_NONE);
+                mBundle.putInt(TOKENIZER_TYPE_FIELD, TOKENIZER_TYPE_NONE);
             }
 
             /**
              * The cardinality of the property (whether it is optional, required or repeated).
              *
-             * <p>This property must be set.
+             * <p>If this method is not called, the default cardinality is {@link
+             * PropertyConfig#CARDINALITY_OPTIONAL}.
              */
             @SuppressWarnings("MissingGetterMatchingBuilder") // getter defined in superclass
             @NonNull
@@ -439,6 +439,9 @@
 
             /**
              * Configures how a property should be indexed so that it can be retrieved by queries.
+             *
+             * <p>If this method is not called, the default indexing type is {@link
+             * StringPropertyConfig#INDEXING_TYPE_NONE}, so that it cannot be matched by queries.
              */
             @NonNull
             public StringPropertyConfig.Builder setIndexingType(@IndexingType int indexingType) {
@@ -449,7 +452,17 @@
                 return this;
             }
 
-            /** Configures how this property should be tokenized (split into words). */
+            /**
+             * Configures how this property should be tokenized (split into words).
+             *
+             * <p>If this method is not called, the default indexing type is {@link
+             * StringPropertyConfig#TOKENIZER_TYPE_NONE}, so that it is not tokenized.
+             *
+             * <p>This method must be called with a value other than {@link
+             * StringPropertyConfig#TOKENIZER_TYPE_NONE} if the property is indexed (i.e. if {@link
+             * #setIndexingType} has been called with a value other than {@link
+             * StringPropertyConfig#INDEXING_TYPE_NONE}).
+             */
             @NonNull
             public StringPropertyConfig.Builder setTokenizerType(@TokenizerType int tokenizerType) {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
@@ -464,16 +477,11 @@
              *
              * <p>After calling this method, the builder must no longer be used.
              *
-             * @throws IllegalSchemaException if the property is not correctly populated
+             * @throws IllegalStateException if the builder has already been used
              */
             @NonNull
             public StringPropertyConfig build() {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
-                // TODO(b/147692920): Send the schema to Icing Lib for official validation, instead
-                //     of partially reimplementing some of the validation Icing does here.
-                if (!mBundle.containsKey(CARDINALITY_FIELD)) {
-                    throw new IllegalSchemaException("Missing field: cardinality");
-                }
                 mBuilt = true;
                 return new StringPropertyConfig(mBundle);
             }
@@ -486,11 +494,7 @@
             super(bundle);
         }
 
-        /**
-         * Builder for {@link Int64PropertyConfig}.
-         *
-         * <p>{@link #setCardinality} must be called or {@link #build} will fail.
-         */
+        /** Builder for {@link Int64PropertyConfig}. */
         public static final class Builder {
             private final Bundle mBundle = new Bundle();
             private boolean mBuilt = false;
@@ -499,12 +503,14 @@
             public Builder(@NonNull String propertyName) {
                 mBundle.putString(NAME_FIELD, propertyName);
                 mBundle.putInt(DATA_TYPE_FIELD, DATA_TYPE_INT64);
+                mBundle.putInt(CARDINALITY_FIELD, CARDINALITY_OPTIONAL);
             }
 
             /**
              * The cardinality of the property (whether it is optional, required or repeated).
              *
-             * <p>This property must be set.
+             * <p>If this method is not called, the default cardinality is {@link
+             * PropertyConfig#CARDINALITY_OPTIONAL}.
              */
             @SuppressWarnings("MissingGetterMatchingBuilder") // getter defined in superclass
             @NonNull
@@ -521,14 +527,11 @@
              *
              * <p>After calling this method, the builder must no longer be used.
              *
-             * @throws IllegalSchemaException if the property is not correctly populated
+             * @throws IllegalStateException if the builder has already been used
              */
             @NonNull
             public Int64PropertyConfig build() {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
-                if (!mBundle.containsKey(CARDINALITY_FIELD)) {
-                    throw new IllegalSchemaException("Missing field: cardinality");
-                }
                 mBuilt = true;
                 return new Int64PropertyConfig(mBundle);
             }
@@ -541,11 +544,7 @@
             super(bundle);
         }
 
-        /**
-         * Builder for {@link DoublePropertyConfig}.
-         *
-         * <p>{@link #setCardinality} must be called or {@link #build} will fail.
-         */
+        /** Builder for {@link DoublePropertyConfig}. */
         public static final class Builder {
             private final Bundle mBundle = new Bundle();
             private boolean mBuilt = false;
@@ -554,12 +553,14 @@
             public Builder(@NonNull String propertyName) {
                 mBundle.putString(NAME_FIELD, propertyName);
                 mBundle.putInt(DATA_TYPE_FIELD, DATA_TYPE_DOUBLE);
+                mBundle.putInt(CARDINALITY_FIELD, CARDINALITY_OPTIONAL);
             }
 
             /**
              * The cardinality of the property (whether it is optional, required or repeated).
              *
-             * <p>This property must be set.
+             * <p>If this method is not called, the default cardinality is {@link
+             * PropertyConfig#CARDINALITY_OPTIONAL}.
              */
             @SuppressWarnings("MissingGetterMatchingBuilder") // getter defined in superclass
             @NonNull
@@ -576,14 +577,11 @@
              *
              * <p>After calling this method, the builder must no longer be used.
              *
-             * @throws IllegalSchemaException if the property is not correctly populated
+             * @throws IllegalStateException if the builder has already been used
              */
             @NonNull
             public DoublePropertyConfig build() {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
-                if (!mBundle.containsKey(CARDINALITY_FIELD)) {
-                    throw new IllegalSchemaException("Missing field: cardinality");
-                }
                 mBuilt = true;
                 return new DoublePropertyConfig(mBundle);
             }
@@ -596,11 +594,7 @@
             super(bundle);
         }
 
-        /**
-         * Builder for {@link BooleanPropertyConfig}.
-         *
-         * <p>{@link #setCardinality} must be called or {@link #build} will fail.
-         */
+        /** Builder for {@link BooleanPropertyConfig}. */
         public static final class Builder {
             private final Bundle mBundle = new Bundle();
             private boolean mBuilt = false;
@@ -609,12 +603,14 @@
             public Builder(@NonNull String propertyName) {
                 mBundle.putString(NAME_FIELD, propertyName);
                 mBundle.putInt(DATA_TYPE_FIELD, DATA_TYPE_BOOLEAN);
+                mBundle.putInt(CARDINALITY_FIELD, CARDINALITY_OPTIONAL);
             }
 
             /**
              * The cardinality of the property (whether it is optional, required or repeated).
              *
-             * <p>This property must be set.
+             * <p>If this method is not called, the default cardinality is {@link
+             * PropertyConfig#CARDINALITY_OPTIONAL}.
              */
             @SuppressWarnings("MissingGetterMatchingBuilder") // getter defined in superclass
             @NonNull
@@ -631,14 +627,11 @@
              *
              * <p>After calling this method, the builder must no longer be used.
              *
-             * @throws IllegalSchemaException if the property is not correctly populated
+             * @throws IllegalStateException if the builder has already been used
              */
             @NonNull
             public BooleanPropertyConfig build() {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
-                if (!mBundle.containsKey(CARDINALITY_FIELD)) {
-                    throw new IllegalSchemaException("Missing field: cardinality");
-                }
                 mBuilt = true;
                 return new BooleanPropertyConfig(mBundle);
             }
@@ -651,11 +644,7 @@
             super(bundle);
         }
 
-        /**
-         * Builder for {@link BytesPropertyConfig}.
-         *
-         * <p>{@link #setCardinality} must be called or {@link #build} will fail.
-         */
+        /** Builder for {@link BytesPropertyConfig}. */
         public static final class Builder {
             private final Bundle mBundle = new Bundle();
             private boolean mBuilt = false;
@@ -664,12 +653,14 @@
             public Builder(@NonNull String propertyName) {
                 mBundle.putString(NAME_FIELD, propertyName);
                 mBundle.putInt(DATA_TYPE_FIELD, DATA_TYPE_BYTES);
+                mBundle.putInt(CARDINALITY_FIELD, CARDINALITY_OPTIONAL);
             }
 
             /**
              * The cardinality of the property (whether it is optional, required or repeated).
              *
-             * <p>This property must be set.
+             * <p>If this method is not called, the default cardinality is {@link
+             * PropertyConfig#CARDINALITY_OPTIONAL}.
              */
             @SuppressWarnings("MissingGetterMatchingBuilder") // getter defined in superclass
             @NonNull
@@ -686,14 +677,11 @@
              *
              * <p>After calling this method, the builder must no longer be used.
              *
-             * @throws IllegalSchemaException if the property is not correctly populated
+             * @throws IllegalStateException if the builder has already been used
              */
             @NonNull
             public BytesPropertyConfig build() {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
-                if (!mBundle.containsKey(CARDINALITY_FIELD)) {
-                    throw new IllegalSchemaException("Missing field: cardinality");
-                }
                 mBuilt = true;
                 return new BytesPropertyConfig(mBundle);
             }
@@ -722,7 +710,7 @@
          * <p>If false, the nested document's properties are not indexed regardless of its own
          * schema.
          */
-        public boolean isIndexNestedProperties() {
+        public boolean shouldIndexNestedProperties() {
             return mBundle.getBoolean(INDEX_NESTED_PROPERTIES_FIELD);
         }
 
@@ -741,29 +729,28 @@
             private final Bundle mBundle = new Bundle();
             private boolean mBuilt = false;
 
-            /** Creates a new {@link DocumentPropertyConfig.Builder}. */
-            public Builder(@NonNull String propertyName) {
+            /**
+             * Creates a new {@link DocumentPropertyConfig.Builder}.
+             *
+             * @param propertyName The logical name of the property in the schema, which will be
+             *     used as the key for this property in {@link
+             *     GenericDocument.Builder#setPropertyDocument}.
+             * @param schemaType The type of documents which will be stored in this property.
+             *     Documents of different types cannot be mixed into a single property.
+             */
+            public Builder(@NonNull String propertyName, @NonNull String schemaType) {
                 mBundle.putString(NAME_FIELD, propertyName);
                 mBundle.putInt(DATA_TYPE_FIELD, DATA_TYPE_DOCUMENT);
-            }
-
-            /**
-             * The logical schema-type of the contents of this property.
-             *
-             * <p>This property must be set.
-             */
-            @NonNull
-            public DocumentPropertyConfig.Builder setSchemaType(@NonNull String schemaType) {
-                Preconditions.checkState(!mBuilt, "Builder has already been used");
-                Objects.requireNonNull(schemaType);
+                mBundle.putInt(CARDINALITY_FIELD, CARDINALITY_OPTIONAL);
+                mBundle.putBoolean(INDEX_NESTED_PROPERTIES_FIELD, false);
                 mBundle.putString(SCHEMA_TYPE_FIELD, schemaType);
-                return this;
             }
 
             /**
              * The cardinality of the property (whether it is optional, required or repeated).
              *
-             * <p>This property must be set.
+             * <p>If this method is not called, the default cardinality is {@link
+             * PropertyConfig#CARDINALITY_OPTIONAL}.
              */
             @SuppressWarnings("MissingGetterMatchingBuilder") // getter defined in superclass
             @NonNull
@@ -783,7 +770,7 @@
              * schema.
              */
             @NonNull
-            public DocumentPropertyConfig.Builder setIndexNestedProperties(
+            public DocumentPropertyConfig.Builder setShouldIndexNestedProperties(
                     boolean indexNestedProperties) {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
                 mBundle.putBoolean(INDEX_NESTED_PROPERTIES_FIELD, indexNestedProperties);
@@ -795,18 +782,12 @@
              *
              * <p>After calling this method, the builder must no longer be used.
              *
-             * @throws IllegalSchemaException If the property is not correctly populated (e.g.
-             *     missing {@code dataType}).
+             * @throws IllegalStateException if the builder has already been used (e.g. missing
+             *     {@code dataType}).
              */
             @NonNull
             public DocumentPropertyConfig build() {
                 Preconditions.checkState(!mBuilt, "Builder has already been used");
-                if (mBundle.getString(SCHEMA_TYPE_FIELD, "").isEmpty()) {
-                    throw new IllegalSchemaException("Missing field: schemaType");
-                }
-                if (!mBundle.containsKey(CARDINALITY_FIELD)) {
-                    throw new IllegalSchemaException("Missing field: cardinality");
-                }
                 mBuilt = true;
                 return new DocumentPropertyConfig(mBundle);
             }
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/GenericDocument.java b/apex/appsearch/framework/java/external/android/app/appsearch/GenericDocument.java
index e3b3a85..85018ad 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/GenericDocument.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/GenericDocument.java
@@ -16,6 +16,7 @@
 
 package android.app.appsearch;
 
+import android.annotation.CurrentTimeMillisLong;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -31,6 +32,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 
@@ -38,10 +40,12 @@
  * Represents a document unit.
  *
  * <p>Documents contain structured data conforming to their {@link AppSearchSchema} type. Each
- * document is uniquely identified by a URI and namespace.
+ * document is uniquely identified by a namespace and a String ID within that namespace.
+ *
+ * <p>Documents are constructed by using the {@link GenericDocument.Builder}.
  *
  * @see AppSearchSession#put
- * @see AppSearchSession#getByUri
+ * @see AppSearchSession#getByDocumentId
  * @see AppSearchSession#search
  */
 public class GenericDocument {
@@ -65,7 +69,7 @@
     private static final String PROPERTIES_FIELD = "properties";
     private static final String BYTE_ARRAY_FIELD = "byteArray";
     private static final String SCHEMA_TYPE_FIELD = "schemaType";
-    private static final String URI_FIELD = "uri";
+    private static final String ID_FIELD = "id";
     private static final String SCORE_FIELD = "score";
     private static final String TTL_MILLIS_FIELD = "ttlMillis";
     private static final String CREATION_TIMESTAMP_MILLIS_FIELD = "creationTimestampMillis";
@@ -82,30 +86,33 @@
         return MAX_INDEXED_PROPERTIES;
     }
 
-    /** Contains {@link GenericDocument} basic information (uri, schemaType etc). */
+    /**
+     * Contains all {@link GenericDocument} information in a packaged format.
+     *
+     * <p>Keys are the {@code *_FIELD} constants in this class.
+     */
     @NonNull final Bundle mBundle;
 
-    /** Contains all properties in {@link GenericDocument} to support getting properties via keys */
+    /** Contains all properties in {@link GenericDocument} to support getting properties via name */
     @NonNull private final Bundle mProperties;
 
-    @NonNull private final String mUri;
+    @NonNull private final String mId;
     @NonNull private final String mSchemaType;
     private final long mCreationTimestampMillis;
     @Nullable private Integer mHashCode;
 
     /**
-     * Rebuilds a {@link GenericDocument} by the a bundle.
+     * Rebuilds a {@link GenericDocument} from a bundle.
      *
-     * @param bundle Contains {@link GenericDocument} basic information (uri, schemaType etc) and a
-     *     properties bundle contains all properties in {@link GenericDocument} to support getting
-     *     properties via keys.
+     * @param bundle Packaged {@link GenericDocument} data, such as the result of {@link
+     *     #getBundle}.
      * @hide
      */
     public GenericDocument(@NonNull Bundle bundle) {
         Objects.requireNonNull(bundle);
         mBundle = bundle;
         mProperties = Objects.requireNonNull(bundle.getParcelable(PROPERTIES_FIELD));
-        mUri = Objects.requireNonNull(mBundle.getString(URI_FIELD));
+        mId = Objects.requireNonNull(mBundle.getString(ID_FIELD));
         mSchemaType = Objects.requireNonNull(mBundle.getString(SCHEMA_TYPE_FIELD));
         mCreationTimestampMillis =
                 mBundle.getLong(CREATION_TIMESTAMP_MILLIS_FIELD, System.currentTimeMillis());
@@ -130,10 +137,10 @@
         return mBundle;
     }
 
-    /** Returns the URI of the {@link GenericDocument}. */
+    /** Returns the unique identifier of the {@link GenericDocument}. */
     @NonNull
-    public String getUri() {
-        return mUri;
+    public String getId() {
+        return mId;
     }
 
     /** Returns the namespace of the {@link GenericDocument}. */
@@ -153,6 +160,7 @@
      *
      * <p>The value is in the {@link System#currentTimeMillis} time base.
      */
+    @CurrentTimeMillisLong
     public long getCreationTimestampMillis() {
         return mCreationTimestampMillis;
     }
@@ -193,136 +201,517 @@
     }
 
     /**
-     * Retrieves the property value with the given key as {@link Object}.
+     * Retrieves the property value with the given path as {@link Object}.
      *
-     * @param key The key to look for.
-     * @return The entry with the given key as an object or {@code null} if there is no such key.
+     * <p>A path can be a simple property name, such as those returned by {@link #getPropertyNames}.
+     * It may also be a dot-delimited path through the nested document hierarchy, with nested {@link
+     * GenericDocument} properties accessed via {@code '.'} and repeated properties optionally
+     * indexed into via {@code [n]}.
+     *
+     * <p>For example, given the following {@link GenericDocument}:
+     *
+     * <pre>
+     *     (Message) {
+     *         from: "sender@example.com"
+     *         to: [{
+     *             name: "Albert Einstein"
+     *             email: "einstein@example.com"
+     *           }, {
+     *             name: "Marie Curie"
+     *             email: "curie@example.com"
+     *           }]
+     *         tags: ["important", "inbox"]
+     *         subject: "Hello"
+     *     }
+     * </pre>
+     *
+     * <p>Here are some example paths and their results:
+     *
+     * <ul>
+     *   <li>{@code "from"} returns {@code "sender@example.com"} as a {@link String} array with one
+     *       element
+     *   <li>{@code "to"} returns the two nested documents containing contact information as a
+     *       {@link GenericDocument} array with two elements
+     *   <li>{@code "to[1]"} returns the second nested document containing Marie Curie's contact
+     *       information as a {@link GenericDocument} array with one element
+     *   <li>{@code "to[1].email"} returns {@code "curie@example.com"}
+     *   <li>{@code "to[100].email"} returns {@code null} as this particular document does not have
+     *       that many elements in its {@code "to"} array.
+     *   <li>{@code "to.email"} aggregates emails across all nested documents that have them,
+     *       returning {@code ["einstein@example.com", "curie@example.com"]} as a {@link String}
+     *       array with two elements.
+     * </ul>
+     *
+     * <p>If you know the expected type of the property you are retrieving, it is recommended to use
+     * one of the typed versions of this method instead, such as {@link #getPropertyString} or
+     * {@link #getPropertyStringArray}.
+     *
+     * @param path The path to look for.
+     * @return The entry with the given path as an object or {@code null} if there is no such path.
+     *     The returned object will be one of the following types: {@code String[]}, {@code long[]},
+     *     {@code double[]}, {@code boolean[]}, {@code byte[][]}, {@code GenericDocument[]}.
      */
     @Nullable
-    public Object getProperty(@NonNull String key) {
-        Objects.requireNonNull(key);
-        Object property = mProperties.get(key);
-        if (property instanceof ArrayList) {
-            return getPropertyBytesArray(key);
-        } else if (property instanceof Parcelable[]) {
-            return getPropertyDocumentArray(key);
+    public Object getProperty(@NonNull String path) {
+        Objects.requireNonNull(path);
+        Object rawValue = getRawPropertyFromRawDocument(path, mBundle);
+
+        // Unpack the raw value into the types the user expects, if required.
+        if (rawValue instanceof Bundle) {
+            // getRawPropertyFromRawDocument may return a document as a bare Bundle as a performance
+            // optimization for lookups.
+            GenericDocument document = new GenericDocument((Bundle) rawValue);
+            return new GenericDocument[] {document};
         }
-        return property;
+
+        if (rawValue instanceof List) {
+            // byte[][] fields are packed into List<Bundle> where each Bundle contains just a single
+            // entry: BYTE_ARRAY_FIELD -> byte[].
+            @SuppressWarnings("unchecked")
+            List<Bundle> bundles = (List<Bundle>) rawValue;
+            if (bundles.size() == 0) {
+                return null;
+            }
+            byte[][] bytes = new byte[bundles.size()][];
+            for (int i = 0; i < bundles.size(); i++) {
+                Bundle bundle = bundles.get(i);
+                if (bundle == null) {
+                    Log.e(TAG, "The inner bundle is null at " + i + ", for path: " + path);
+                    continue;
+                }
+                byte[] innerBytes = bundle.getByteArray(BYTE_ARRAY_FIELD);
+                if (innerBytes == null) {
+                    Log.e(TAG, "The bundle at " + i + " contains a null byte[].");
+                    continue;
+                }
+                bytes[i] = innerBytes;
+            }
+            return bytes;
+        }
+
+        if (rawValue instanceof Parcelable[]) {
+            // The underlying Bundle of nested GenericDocuments is packed into a Parcelable array.
+            // We must unpack it into GenericDocument instances.
+            Parcelable[] bundles = (Parcelable[]) rawValue;
+            if (bundles.length == 0) {
+                return null;
+            }
+            GenericDocument[] documents = new GenericDocument[bundles.length];
+            for (int i = 0; i < bundles.length; i++) {
+                if (bundles[i] == null) {
+                    Log.e(TAG, "The inner bundle is null at " + i + ", for path: " + path);
+                    continue;
+                }
+                if (!(bundles[i] instanceof Bundle)) {
+                    Log.e(
+                            TAG,
+                            "The inner element at "
+                                    + i
+                                    + " is a "
+                                    + bundles[i].getClass()
+                                    + ", not a Bundle for path: "
+                                    + path);
+                    continue;
+                }
+                documents[i] = new GenericDocument((Bundle) bundles[i]);
+            }
+            return documents;
+        }
+
+        // Otherwise the raw property is the same as the final property and needs no transformation.
+        return rawValue;
     }
 
     /**
-     * Retrieves a {@link String} value by key.
+     * Looks up a property path within the given document bundle.
      *
-     * @param key The key to look for.
-     * @return The first {@link String} associated with the given key or {@code null} if there is no
-     *     such key or the value is of a different type.
+     * <p>The return value may be any of GenericDocument's internal repeated storage types
+     * (String[], long[], double[], boolean[], ArrayList&lt;Bundle&gt;, Parcelable[]).
      */
     @Nullable
-    public String getPropertyString(@NonNull String key) {
-        Objects.requireNonNull(key);
-        String[] propertyArray = getPropertyStringArray(key);
+    private static Object getRawPropertyFromRawDocument(
+            @NonNull String path, @NonNull Bundle documentBundle) {
+        Objects.requireNonNull(path);
+        Objects.requireNonNull(documentBundle);
+        Bundle properties = Objects.requireNonNull(documentBundle.getBundle(PROPERTIES_FIELD));
+
+        // Determine whether the path is just a raw property name with no control characters
+        int controlIdx = -1;
+        boolean controlIsIndex = false;
+        for (int i = 0; i < path.length(); i++) {
+            char c = path.charAt(i);
+            if (c == '[' || c == '.') {
+                controlIdx = i;
+                controlIsIndex = c == '[';
+                break;
+            }
+        }
+
+        // Look up the value of the first path element
+        Object firstElementValue;
+        if (controlIdx == -1) {
+            firstElementValue = properties.get(path);
+        } else {
+            String name = path.substring(0, controlIdx);
+            firstElementValue = properties.get(name);
+        }
+
+        // If the path has no further elements, we're done.
+        if (firstElementValue == null || controlIdx == -1) {
+            return firstElementValue;
+        }
+
+        // At this point, for a path like "recipients[0]", firstElementValue contains the value of
+        // "recipients". If the first element of the path is an indexed value, we now update
+        // firstElementValue to contain "recipients[0]" instead.
+        String remainingPath;
+        if (!controlIsIndex) {
+            // Remaining path is everything after the .
+            remainingPath = path.substring(controlIdx + 1);
+        } else {
+            int endBracketIdx = path.indexOf(']', controlIdx);
+            if (endBracketIdx == -1) {
+                throw new IllegalArgumentException("Malformed path (no ending ']'): " + path);
+            }
+            if (endBracketIdx + 1 < path.length() && path.charAt(endBracketIdx + 1) != '.') {
+                throw new IllegalArgumentException(
+                        "Malformed path (']' not followed by '.'): " + path);
+            }
+            String indexStr = path.substring(controlIdx + 1, endBracketIdx);
+            int index = Integer.parseInt(indexStr);
+            if (index < 0) {
+                throw new IllegalArgumentException("Path index less than 0: " + path);
+            }
+
+            // Remaining path is everything after the [n]
+            if (endBracketIdx + 1 < path.length()) {
+                // More path remains, and we've already checked that charAt(endBracketIdx+1) == .
+                remainingPath = path.substring(endBracketIdx + 2);
+            } else {
+                // No more path remains.
+                remainingPath = null;
+            }
+
+            // Extract the right array element
+            Object extractedValue = null;
+            if (firstElementValue instanceof String[]) {
+                String[] stringValues = (String[]) firstElementValue;
+                if (index < stringValues.length) {
+                    extractedValue = Arrays.copyOfRange(stringValues, index, index + 1);
+                }
+            } else if (firstElementValue instanceof long[]) {
+                long[] longValues = (long[]) firstElementValue;
+                if (index < longValues.length) {
+                    extractedValue = Arrays.copyOfRange(longValues, index, index + 1);
+                }
+            } else if (firstElementValue instanceof double[]) {
+                double[] doubleValues = (double[]) firstElementValue;
+                if (index < doubleValues.length) {
+                    extractedValue = Arrays.copyOfRange(doubleValues, index, index + 1);
+                }
+            } else if (firstElementValue instanceof boolean[]) {
+                boolean[] booleanValues = (boolean[]) firstElementValue;
+                if (index < booleanValues.length) {
+                    extractedValue = Arrays.copyOfRange(booleanValues, index, index + 1);
+                }
+            } else if (firstElementValue instanceof List) {
+                @SuppressWarnings("unchecked")
+                List<Bundle> bundles = (List<Bundle>) firstElementValue;
+                if (index < bundles.size()) {
+                    extractedValue = bundles.subList(index, index + 1);
+                }
+            } else if (firstElementValue instanceof Parcelable[]) {
+                // Special optimization: to avoid creating new singleton arrays for traversing paths
+                // we return the bare document Bundle in this particular case.
+                Parcelable[] bundles = (Parcelable[]) firstElementValue;
+                if (index < bundles.length) {
+                    extractedValue = (Bundle) bundles[index];
+                }
+            } else {
+                throw new IllegalStateException("Unsupported value type: " + firstElementValue);
+            }
+            firstElementValue = extractedValue;
+        }
+
+        // If we are at the end of the path or there are no deeper elements in this document, we
+        // have nothing to recurse into.
+        if (firstElementValue == null || remainingPath == null) {
+            return firstElementValue;
+        }
+
+        // More of the path remains; recursively evaluate it
+        if (firstElementValue instanceof Bundle) {
+            return getRawPropertyFromRawDocument(remainingPath, (Bundle) firstElementValue);
+        } else if (firstElementValue instanceof Parcelable[]) {
+            Parcelable[] parcelables = (Parcelable[]) firstElementValue;
+            if (parcelables.length == 1) {
+                return getRawPropertyFromRawDocument(remainingPath, (Bundle) parcelables[0]);
+            }
+
+            // Slowest path: we're collecting values across repeated nested docs. (Example: given a
+            // path like recipient.name, where recipient is a repeated field, we return a string
+            // array where each recipient's name is an array element).
+            //
+            // Performance note: Suppose that we have a property path "a.b.c" where the "a"
+            // property has N document values and each containing a "b" property with M document
+            // values and each of those containing a "c" property with an int array.
+            //
+            // We'll allocate a new ArrayList for each of the "b" properties, add the M int arrays
+            // from the "c" properties to it and then we'll allocate an int array in
+            // flattenAccumulator before returning that (1 + M allocation per "b" property).
+            //
+            // When we're on the "a" properties, we'll allocate an ArrayList and add the N
+            // flattened int arrays returned from the "b" properties to the list. Then we'll
+            // allocate an int array in flattenAccumulator (1 + N ("b" allocs) allocations per "a").
+            // So this implementation could incur 1 + N + NM allocs.
+            //
+            // However, we expect the vast majority of getProperty calls to be either for direct
+            // property names (not paths) or else property paths returned from snippetting, which
+            // always refer to exactly one property value and don't aggregate across repeated
+            // values. The implementation is optimized for these two cases, requiring no additional
+            // allocations. So we've decided that the above performance characteristics are OK for
+            // the less used path.
+            List<Object> accumulator = new ArrayList<>(parcelables.length);
+            for (int i = 0; i < parcelables.length; i++) {
+                Object value =
+                        getRawPropertyFromRawDocument(remainingPath, (Bundle) parcelables[i]);
+                if (value != null) {
+                    accumulator.add(value);
+                }
+            }
+            return flattenAccumulator(accumulator);
+        } else {
+            Log.e(TAG, "Failed to apply path to document; no nested value found: " + path);
+            return null;
+        }
+    }
+
+    /**
+     * Combines accumulated repeated properties from multiple documents into a single array.
+     *
+     * @param accumulator List containing objects of the following types: {@code String[]}, {@code
+     *     long[]}, {@code double[]}, {@code boolean[]}, {@code List<Bundle>}, or {@code
+     *     Parcelable[]}.
+     * @return The result of concatenating each individual list element into a larger array/list of
+     *     the same type.
+     */
+    @Nullable
+    private static Object flattenAccumulator(@NonNull List<Object> accumulator) {
+        if (accumulator.isEmpty()) {
+            return null;
+        }
+        Object first = accumulator.get(0);
+        if (first instanceof String[]) {
+            int length = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                length += ((String[]) accumulator.get(i)).length;
+            }
+            String[] result = new String[length];
+            int total = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                String[] castValue = (String[]) accumulator.get(i);
+                System.arraycopy(castValue, 0, result, total, castValue.length);
+                total += castValue.length;
+            }
+            return result;
+        }
+        if (first instanceof long[]) {
+            int length = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                length += ((long[]) accumulator.get(i)).length;
+            }
+            long[] result = new long[length];
+            int total = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                long[] castValue = (long[]) accumulator.get(i);
+                System.arraycopy(castValue, 0, result, total, castValue.length);
+                total += castValue.length;
+            }
+            return result;
+        }
+        if (first instanceof double[]) {
+            int length = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                length += ((double[]) accumulator.get(i)).length;
+            }
+            double[] result = new double[length];
+            int total = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                double[] castValue = (double[]) accumulator.get(i);
+                System.arraycopy(castValue, 0, result, total, castValue.length);
+                total += castValue.length;
+            }
+            return result;
+        }
+        if (first instanceof boolean[]) {
+            int length = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                length += ((boolean[]) accumulator.get(i)).length;
+            }
+            boolean[] result = new boolean[length];
+            int total = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                boolean[] castValue = (boolean[]) accumulator.get(i);
+                System.arraycopy(castValue, 0, result, total, castValue.length);
+                total += castValue.length;
+            }
+            return result;
+        }
+        if (first instanceof List) {
+            int length = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                length += ((List<?>) accumulator.get(i)).size();
+            }
+            List<Bundle> result = new ArrayList<>(length);
+            for (int i = 0; i < accumulator.size(); i++) {
+                @SuppressWarnings("unchecked")
+                List<Bundle> castValue = (List<Bundle>) accumulator.get(i);
+                result.addAll(castValue);
+            }
+            return result;
+        }
+        if (first instanceof Parcelable[]) {
+            int length = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                length += ((Parcelable[]) accumulator.get(i)).length;
+            }
+            Parcelable[] result = new Parcelable[length];
+            int total = 0;
+            for (int i = 0; i < accumulator.size(); i++) {
+                Parcelable[] castValue = (Parcelable[]) accumulator.get(i);
+                System.arraycopy(castValue, 0, result, total, castValue.length);
+                total += castValue.length;
+            }
+            return result;
+        }
+        throw new IllegalStateException("Unexpected property type: " + first);
+    }
+
+    /**
+     * Retrieves a {@link String} property by path.
+     *
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The first {@link String} associated with the given path or {@code null} if there is
+     *     no such value or the value is of a different type.
+     */
+    @Nullable
+    public String getPropertyString(@NonNull String path) {
+        Objects.requireNonNull(path);
+        String[] propertyArray = getPropertyStringArray(path);
         if (propertyArray == null || propertyArray.length == 0) {
             return null;
         }
-        warnIfSinglePropertyTooLong("String", key, propertyArray.length);
+        warnIfSinglePropertyTooLong("String", path, propertyArray.length);
         return propertyArray[0];
     }
 
     /**
-     * Retrieves a {@code long} value by key.
+     * Retrieves a {@code long} property by path.
      *
-     * @param key The key to look for.
-     * @return The first {@code long} associated with the given key or default value {@code 0} if
-     *     there is no such key or the value is of a different type.
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The first {@code long} associated with the given path or default value {@code 0} if
+     *     there is no such value or the value is of a different type.
      */
-    public long getPropertyLong(@NonNull String key) {
-        Objects.requireNonNull(key);
-        long[] propertyArray = getPropertyLongArray(key);
+    public long getPropertyLong(@NonNull String path) {
+        Objects.requireNonNull(path);
+        long[] propertyArray = getPropertyLongArray(path);
         if (propertyArray == null || propertyArray.length == 0) {
             return 0;
         }
-        warnIfSinglePropertyTooLong("Long", key, propertyArray.length);
+        warnIfSinglePropertyTooLong("Long", path, propertyArray.length);
         return propertyArray[0];
     }
 
     /**
-     * Retrieves a {@code double} value by key.
+     * Retrieves a {@code double} property by path.
      *
-     * @param key The key to look for.
-     * @return The first {@code double} associated with the given key or default value {@code 0.0}
-     *     if there is no such key or the value is of a different type.
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The first {@code double} associated with the given path or default value {@code 0.0}
+     *     if there is no such value or the value is of a different type.
      */
-    public double getPropertyDouble(@NonNull String key) {
-        Objects.requireNonNull(key);
-        double[] propertyArray = getPropertyDoubleArray(key);
+    public double getPropertyDouble(@NonNull String path) {
+        Objects.requireNonNull(path);
+        double[] propertyArray = getPropertyDoubleArray(path);
         if (propertyArray == null || propertyArray.length == 0) {
             return 0.0;
         }
-        warnIfSinglePropertyTooLong("Double", key, propertyArray.length);
+        warnIfSinglePropertyTooLong("Double", path, propertyArray.length);
         return propertyArray[0];
     }
 
     /**
-     * Retrieves a {@code boolean} value by key.
+     * Retrieves a {@code boolean} property by path.
      *
-     * @param key The key to look for.
-     * @return The first {@code boolean} associated with the given key or default value {@code
-     *     false} if there is no such key or the value is of a different type.
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The first {@code boolean} associated with the given path or default value {@code
+     *     false} if there is no such value or the value is of a different type.
      */
-    public boolean getPropertyBoolean(@NonNull String key) {
-        Objects.requireNonNull(key);
-        boolean[] propertyArray = getPropertyBooleanArray(key);
+    public boolean getPropertyBoolean(@NonNull String path) {
+        Objects.requireNonNull(path);
+        boolean[] propertyArray = getPropertyBooleanArray(path);
         if (propertyArray == null || propertyArray.length == 0) {
             return false;
         }
-        warnIfSinglePropertyTooLong("Boolean", key, propertyArray.length);
+        warnIfSinglePropertyTooLong("Boolean", path, propertyArray.length);
         return propertyArray[0];
     }
 
     /**
-     * Retrieves a {@code byte[]} value by key.
+     * Retrieves a {@code byte[]} property by path.
      *
-     * @param key The key to look for.
-     * @return The first {@code byte[]} associated with the given key or {@code null} if there is no
-     *     such key or the value is of a different type.
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The first {@code byte[]} associated with the given path or {@code null} if there is
+     *     no such value or the value is of a different type.
      */
     @Nullable
-    public byte[] getPropertyBytes(@NonNull String key) {
-        Objects.requireNonNull(key);
-        byte[][] propertyArray = getPropertyBytesArray(key);
+    public byte[] getPropertyBytes(@NonNull String path) {
+        Objects.requireNonNull(path);
+        byte[][] propertyArray = getPropertyBytesArray(path);
         if (propertyArray == null || propertyArray.length == 0) {
             return null;
         }
-        warnIfSinglePropertyTooLong("ByteArray", key, propertyArray.length);
+        warnIfSinglePropertyTooLong("ByteArray", path, propertyArray.length);
         return propertyArray[0];
     }
 
     /**
-     * Retrieves a {@link GenericDocument} value by key.
+     * Retrieves a {@link GenericDocument} property by path.
      *
-     * @param key The key to look for.
-     * @return The first {@link GenericDocument} associated with the given key or {@code null} if
-     *     there is no such key or the value is of a different type.
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The first {@link GenericDocument} associated with the given path or {@code null} if
+     *     there is no such value or the value is of a different type.
      */
     @Nullable
-    public GenericDocument getPropertyDocument(@NonNull String key) {
-        Objects.requireNonNull(key);
-        GenericDocument[] propertyArray = getPropertyDocumentArray(key);
+    public GenericDocument getPropertyDocument(@NonNull String path) {
+        Objects.requireNonNull(path);
+        GenericDocument[] propertyArray = getPropertyDocumentArray(path);
         if (propertyArray == null || propertyArray.length == 0) {
             return null;
         }
-        warnIfSinglePropertyTooLong("Document", key, propertyArray.length);
+        warnIfSinglePropertyTooLong("Document", path, propertyArray.length);
         return propertyArray[0];
     }
 
     /** Prints a warning to logcat if the given propertyLength is greater than 1. */
     private static void warnIfSinglePropertyTooLong(
-            @NonNull String propertyType, @NonNull String key, int propertyLength) {
+            @NonNull String propertyType, @NonNull String path, int propertyLength) {
         if (propertyLength > 1) {
             Log.w(
                     TAG,
                     "The value for \""
-                            + key
+                            + path
                             + "\" contains "
                             + propertyLength
                             + " elements. Only the first one will be returned from "
@@ -335,141 +724,121 @@
     }
 
     /**
-     * Retrieves a repeated {@code String} property by key.
+     * Retrieves a repeated {@code String} property by path.
      *
-     * @param key The key to look for.
-     * @return The {@code String[]} associated with the given key, or {@code null} if no value is
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The {@code String[]} associated with the given path, or {@code null} if no value is
      *     set or the value is of a different type.
      */
     @Nullable
-    public String[] getPropertyStringArray(@NonNull String key) {
-        Objects.requireNonNull(key);
-        return getAndCastPropertyArray(key, String[].class);
+    public String[] getPropertyStringArray(@NonNull String path) {
+        Objects.requireNonNull(path);
+        Object value = getProperty(path);
+        return safeCastProperty(path, value, String[].class);
     }
 
     /**
-     * Retrieves a repeated {@code long[]} property by key.
+     * Retrieves a repeated {@code long[]} property by path.
      *
-     * @param key The key to look for.
-     * @return The {@code long[]} associated with the given key, or {@code null} if no value is set
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The {@code long[]} associated with the given path, or {@code null} if no value is set
      *     or the value is of a different type.
      */
     @Nullable
-    public long[] getPropertyLongArray(@NonNull String key) {
-        Objects.requireNonNull(key);
-        return getAndCastPropertyArray(key, long[].class);
+    public long[] getPropertyLongArray(@NonNull String path) {
+        Objects.requireNonNull(path);
+        Object value = getProperty(path);
+        return safeCastProperty(path, value, long[].class);
     }
 
     /**
-     * Retrieves a repeated {@code double} property by key.
+     * Retrieves a repeated {@code double} property by path.
      *
-     * @param key The key to look for.
-     * @return The {@code double[]} associated with the given key, or {@code null} if no value is
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The {@code double[]} associated with the given path, or {@code null} if no value is
      *     set or the value is of a different type.
      */
     @Nullable
-    public double[] getPropertyDoubleArray(@NonNull String key) {
-        Objects.requireNonNull(key);
-        return getAndCastPropertyArray(key, double[].class);
+    public double[] getPropertyDoubleArray(@NonNull String path) {
+        Objects.requireNonNull(path);
+        Object value = getProperty(path);
+        return safeCastProperty(path, value, double[].class);
     }
 
     /**
-     * Retrieves a repeated {@code boolean} property by key.
+     * Retrieves a repeated {@code boolean} property by path.
      *
-     * @param key The key to look for.
-     * @return The {@code boolean[]} associated with the given key, or {@code null} if no value is
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The {@code boolean[]} associated with the given path, or {@code null} if no value is
      *     set or the value is of a different type.
      */
     @Nullable
-    public boolean[] getPropertyBooleanArray(@NonNull String key) {
-        Objects.requireNonNull(key);
-        return getAndCastPropertyArray(key, boolean[].class);
+    public boolean[] getPropertyBooleanArray(@NonNull String path) {
+        Objects.requireNonNull(path);
+        Object value = getProperty(path);
+        return safeCastProperty(path, value, boolean[].class);
     }
 
     /**
-     * Retrieves a {@code byte[][]} property by key.
+     * Retrieves a {@code byte[][]} property by path.
      *
-     * @param key The key to look for.
-     * @return The {@code byte[][]} associated with the given key, or {@code null} if no value is
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The {@code byte[][]} associated with the given path, or {@code null} if no value is
      *     set or the value is of a different type.
      */
     @SuppressLint("ArrayReturn")
     @Nullable
-    @SuppressWarnings("unchecked")
-    public byte[][] getPropertyBytesArray(@NonNull String key) {
-        Objects.requireNonNull(key);
-        ArrayList<Bundle> bundles = getAndCastPropertyArray(key, ArrayList.class);
-        if (bundles == null || bundles.size() == 0) {
-            return null;
-        }
-        byte[][] bytes = new byte[bundles.size()][];
-        for (int i = 0; i < bundles.size(); i++) {
-            Bundle bundle = bundles.get(i);
-            if (bundle == null) {
-                Log.e(TAG, "The inner bundle is null at " + i + ", for key: " + key);
-                continue;
-            }
-            byte[] innerBytes = bundle.getByteArray(BYTE_ARRAY_FIELD);
-            if (innerBytes == null) {
-                Log.e(TAG, "The bundle at " + i + " contains a null byte[].");
-                continue;
-            }
-            bytes[i] = innerBytes;
-        }
-        return bytes;
+    public byte[][] getPropertyBytesArray(@NonNull String path) {
+        Objects.requireNonNull(path);
+        Object value = getProperty(path);
+        return safeCastProperty(path, value, byte[][].class);
     }
 
     /**
-     * Retrieves a repeated {@link GenericDocument} property by key.
+     * Retrieves a repeated {@link GenericDocument} property by path.
      *
-     * @param key The key to look for.
-     * @return The {@link GenericDocument}[] associated with the given key, or {@code null} if no
+     * <p>See {@link #getProperty} for a detailed description of the path syntax.
+     *
+     * @param path The path to look for.
+     * @return The {@link GenericDocument}[] associated with the given path, or {@code null} if no
      *     value is set or the value is of a different type.
      */
     @SuppressLint("ArrayReturn")
     @Nullable
-    public GenericDocument[] getPropertyDocumentArray(@NonNull String key) {
-        Objects.requireNonNull(key);
-        Parcelable[] bundles = getAndCastPropertyArray(key, Parcelable[].class);
-        if (bundles == null || bundles.length == 0) {
-            return null;
-        }
-        GenericDocument[] documents = new GenericDocument[bundles.length];
-        for (int i = 0; i < bundles.length; i++) {
-            if (bundles[i] == null) {
-                Log.e(TAG, "The inner bundle is null at " + i + ", for key: " + key);
-                continue;
-            }
-            if (!(bundles[i] instanceof Bundle)) {
-                Log.e(
-                        TAG,
-                        "The inner element at "
-                                + i
-                                + " is a "
-                                + bundles[i].getClass()
-                                + ", not a Bundle for key: "
-                                + key);
-                continue;
-            }
-            documents[i] = new GenericDocument((Bundle) bundles[i]);
-        }
-        return documents;
+    public GenericDocument[] getPropertyDocumentArray(@NonNull String path) {
+        Objects.requireNonNull(path);
+        Object value = getProperty(path);
+        return safeCastProperty(path, value, GenericDocument[].class);
     }
 
     /**
-     * Gets a repeated property of the given key, and casts it to the given class type, which must
-     * be an array class type.
+     * Casts a repeated property to the provided type, logging an error and returning {@code null}
+     * if the cast fails.
+     *
+     * @param path Path to the property within the document. Used for logging.
+     * @param value Value of the property
+     * @param tClass Class to cast the value into
      */
     @Nullable
-    private <T> T getAndCastPropertyArray(@NonNull String key, @NonNull Class<T> tClass) {
-        Object value = mProperties.get(key);
+    private static <T> T safeCastProperty(
+            @NonNull String path, @Nullable Object value, @NonNull Class<T> tClass) {
         if (value == null) {
             return null;
         }
         try {
             return tClass.cast(value);
         } catch (ClassCastException e) {
-            Log.w(TAG, "Error casting to requested type for key \"" + key + "\"", e);
+            Log.w(TAG, "Error casting to requested type for path \"" + path + "\"", e);
             return null;
         }
     }
@@ -500,17 +869,15 @@
         return bundleToString(mBundle).toString();
     }
 
-    @SuppressWarnings("unchecked")
     private static StringBuilder bundleToString(Bundle bundle) {
         StringBuilder stringBuilder = new StringBuilder();
         try {
-            final Set<String> keySet = bundle.keySet();
-            String[] keys = keySet.toArray(new String[0]);
-            // Sort keys to make output deterministic. We need a custom comparator to handle
+            String[] names = bundle.keySet().toArray(new String[0]);
+            // Sort names to make output deterministic. We need a custom comparator to handle
             // nulls (arbitrarily putting them first, similar to Comparator.nullsFirst, which is
             // only available since N).
             Arrays.sort(
-                    keys,
+                    names,
                     (@Nullable String s1, @Nullable String s2) -> {
                         if (s1 == null) {
                             return s2 == null ? 0 : -1;
@@ -520,9 +887,9 @@
                             return s1.compareTo(s2);
                         }
                     });
-            for (String key : keys) {
-                stringBuilder.append("{ key: '").append(key).append("' value: ");
-                Object valueObject = bundle.get(key);
+            for (String name : names) {
+                stringBuilder.append("{ name: '").append(name).append("' value: ");
+                Object valueObject = bundle.get(name);
                 if (valueObject == null) {
                     stringBuilder.append("<null>");
                 } else if (valueObject instanceof Bundle) {
@@ -540,9 +907,11 @@
                         stringBuilder.append("' ");
                     }
                     stringBuilder.append("]");
-                } else if (valueObject instanceof ArrayList) {
-                    for (Bundle innerBundle : (ArrayList<Bundle>) valueObject) {
-                        stringBuilder.append(bundleToString(innerBundle));
+                } else if (valueObject instanceof List) {
+                    @SuppressWarnings("unchecked")
+                    List<Bundle> bundles = (List<Bundle>) valueObject;
+                    for (int i = 0; i < bundles.size(); i++) {
+                        stringBuilder.append(bundleToString(bundles.get(i)));
                     }
                 } else {
                     stringBuilder.append(valueObject.toString());
@@ -577,12 +946,12 @@
          *
          * <p>Once {@link #build} is called, the instance can no longer be used.
          *
-         * <p>URIs are unique within a namespace.
+         * <p>Document IDs are unique within a namespace.
          *
          * <p>The number of namespaces per app should be kept small for efficiency reasons.
          *
          * @param namespace the namespace to set for the {@link GenericDocument}.
-         * @param uri the URI to set for the {@link GenericDocument}.
+         * @param id the unique identifier for the {@link GenericDocument} in its namespace.
          * @param schemaType the {@link AppSearchSchema} type of the {@link GenericDocument}. The
          *     provided {@code schemaType} must be defined using {@link AppSearchSession#setSchema}
          *     prior to inserting a document of this {@code schemaType} into the AppSearch index
@@ -591,13 +960,13 @@
          *     AppSearchResult#RESULT_NOT_FOUND}.
          */
         @SuppressWarnings("unchecked")
-        public Builder(@NonNull String namespace, @NonNull String uri, @NonNull String schemaType) {
+        public Builder(@NonNull String namespace, @NonNull String id, @NonNull String schemaType) {
             Objects.requireNonNull(namespace);
-            Objects.requireNonNull(uri);
+            Objects.requireNonNull(id);
             Objects.requireNonNull(schemaType);
             mBuilderTypeInstance = (BuilderType) this;
             mBundle.putString(GenericDocument.NAMESPACE_FIELD, namespace);
-            mBundle.putString(GenericDocument.URI_FIELD, uri);
+            mBundle.putString(GenericDocument.ID_FIELD, id);
             mBundle.putString(GenericDocument.SCHEMA_TYPE_FIELD, schemaType);
             // Set current timestamp for creation timestamp by default.
             mBundle.putLong(
@@ -641,7 +1010,8 @@
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public BuilderType setCreationTimestampMillis(long creationTimestampMillis) {
+        public BuilderType setCreationTimestampMillis(
+                @CurrentTimeMillisLong long creationTimestampMillis) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
             mBundle.putLong(
                     GenericDocument.CREATION_TIMESTAMP_MILLIS_FIELD, creationTimestampMillis);
@@ -674,18 +1044,19 @@
         /**
          * Sets one or multiple {@code String} values for a property, replacing its previous values.
          *
-         * @param key the key associated with the {@code values}.
+         * @param name the name associated with the {@code values}. Must match the name for this
+         *     property as given in {@link AppSearchSchema.PropertyConfig#getName}.
          * @param values the {@code String} values of the property.
          * @throws IllegalArgumentException if no values are provided, if provided values exceed
          *     maximum repeated property length, or if a passed in {@code String} is {@code null}.
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public BuilderType setPropertyString(@NonNull String key, @NonNull String... values) {
+        public BuilderType setPropertyString(@NonNull String name, @NonNull String... values) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(key);
+            Objects.requireNonNull(name);
             Objects.requireNonNull(values);
-            putInPropertyBundle(key, values);
+            putInPropertyBundle(name, values);
             return mBuilderTypeInstance;
         }
 
@@ -693,69 +1064,73 @@
          * Sets one or multiple {@code boolean} values for a property, replacing its previous
          * values.
          *
-         * @param key the key associated with the {@code values}.
+         * @param name the name associated with the {@code values}. Must match the name for this
+         *     property as given in {@link AppSearchSchema.PropertyConfig#getName}.
          * @param values the {@code boolean} values of the property.
          * @throws IllegalArgumentException if values exceed maximum repeated property length.
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public BuilderType setPropertyBoolean(@NonNull String key, @NonNull boolean... values) {
+        public BuilderType setPropertyBoolean(@NonNull String name, @NonNull boolean... values) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(key);
+            Objects.requireNonNull(name);
             Objects.requireNonNull(values);
-            putInPropertyBundle(key, values);
+            putInPropertyBundle(name, values);
             return mBuilderTypeInstance;
         }
 
         /**
          * Sets one or multiple {@code long} values for a property, replacing its previous values.
          *
-         * @param key the key associated with the {@code values}.
+         * @param name the name associated with the {@code values}. Must match the name for this
+         *     property as given in {@link AppSearchSchema.PropertyConfig#getName}.
          * @param values the {@code long} values of the property.
          * @throws IllegalArgumentException if values exceed maximum repeated property length.
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public BuilderType setPropertyLong(@NonNull String key, @NonNull long... values) {
+        public BuilderType setPropertyLong(@NonNull String name, @NonNull long... values) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(key);
+            Objects.requireNonNull(name);
             Objects.requireNonNull(values);
-            putInPropertyBundle(key, values);
+            putInPropertyBundle(name, values);
             return mBuilderTypeInstance;
         }
 
         /**
          * Sets one or multiple {@code double} values for a property, replacing its previous values.
          *
-         * @param key the key associated with the {@code values}.
+         * @param name the name associated with the {@code values}. Must match the name for this
+         *     property as given in {@link AppSearchSchema.PropertyConfig#getName}.
          * @param values the {@code double} values of the property.
          * @throws IllegalArgumentException if values exceed maximum repeated property length.
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public BuilderType setPropertyDouble(@NonNull String key, @NonNull double... values) {
+        public BuilderType setPropertyDouble(@NonNull String name, @NonNull double... values) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(key);
+            Objects.requireNonNull(name);
             Objects.requireNonNull(values);
-            putInPropertyBundle(key, values);
+            putInPropertyBundle(name, values);
             return mBuilderTypeInstance;
         }
 
         /**
          * Sets one or multiple {@code byte[]} for a property, replacing its previous values.
          *
-         * @param key the key associated with the {@code values}.
+         * @param name the name associated with the {@code values}. Must match the name for this
+         *     property as given in {@link AppSearchSchema.PropertyConfig#getName}.
          * @param values the {@code byte[]} of the property.
          * @throws IllegalArgumentException if no values are provided, if provided values exceed
          *     maximum repeated property length, or if a passed in {@code byte[]} is {@code null}.
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public BuilderType setPropertyBytes(@NonNull String key, @NonNull byte[]... values) {
+        public BuilderType setPropertyBytes(@NonNull String name, @NonNull byte[]... values) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(key);
+            Objects.requireNonNull(name);
             Objects.requireNonNull(values);
-            putInPropertyBundle(key, values);
+            putInPropertyBundle(name, values);
             return mBuilderTypeInstance;
         }
 
@@ -763,7 +1138,8 @@
          * Sets one or multiple {@link GenericDocument} values for a property, replacing its
          * previous values.
          *
-         * @param key the key associated with the {@code values}.
+         * @param name the name associated with the {@code values}. Must match the name for this
+         *     property as given in {@link AppSearchSchema.PropertyConfig#getName}.
          * @param values the {@link GenericDocument} values of the property.
          * @throws IllegalArgumentException if no values are provided, if provided values exceed if
          *     provided values exceed maximum repeated property length, or if a passed in {@link
@@ -772,17 +1148,17 @@
          */
         @NonNull
         public BuilderType setPropertyDocument(
-                @NonNull String key, @NonNull GenericDocument... values) {
+                @NonNull String name, @NonNull GenericDocument... values) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(key);
+            Objects.requireNonNull(name);
             Objects.requireNonNull(values);
-            putInPropertyBundle(key, values);
+            putInPropertyBundle(name, values);
             return mBuilderTypeInstance;
         }
 
-        private void putInPropertyBundle(@NonNull String key, @NonNull String[] values)
+        private void putInPropertyBundle(@NonNull String name, @NonNull String[] values)
                 throws IllegalArgumentException {
-            validateRepeatedPropertyLength(key, values.length);
+            validateRepeatedPropertyLength(name, values.length);
             for (int i = 0; i < values.length; i++) {
                 if (values[i] == null) {
                     throw new IllegalArgumentException("The String at " + i + " is null.");
@@ -797,22 +1173,22 @@
                                     + ".");
                 }
             }
-            mProperties.putStringArray(key, values);
+            mProperties.putStringArray(name, values);
         }
 
-        private void putInPropertyBundle(@NonNull String key, @NonNull boolean[] values) {
-            validateRepeatedPropertyLength(key, values.length);
-            mProperties.putBooleanArray(key, values);
+        private void putInPropertyBundle(@NonNull String name, @NonNull boolean[] values) {
+            validateRepeatedPropertyLength(name, values.length);
+            mProperties.putBooleanArray(name, values);
         }
 
-        private void putInPropertyBundle(@NonNull String key, @NonNull double[] values) {
-            validateRepeatedPropertyLength(key, values.length);
-            mProperties.putDoubleArray(key, values);
+        private void putInPropertyBundle(@NonNull String name, @NonNull double[] values) {
+            validateRepeatedPropertyLength(name, values.length);
+            mProperties.putDoubleArray(name, values);
         }
 
-        private void putInPropertyBundle(@NonNull String key, @NonNull long[] values) {
-            validateRepeatedPropertyLength(key, values.length);
-            mProperties.putLongArray(key, values);
+        private void putInPropertyBundle(@NonNull String name, @NonNull long[] values) {
+            validateRepeatedPropertyLength(name, values.length);
+            mProperties.putLongArray(name, values);
         }
 
         /**
@@ -821,8 +1197,8 @@
          * <p>Bundle doesn't support for two dimension array byte[][], we are converting byte[][]
          * into ArrayList<Bundle>, and each elements will contain a one dimension byte[].
          */
-        private void putInPropertyBundle(@NonNull String key, @NonNull byte[][] values) {
-            validateRepeatedPropertyLength(key, values.length);
+        private void putInPropertyBundle(@NonNull String name, @NonNull byte[][] values) {
+            validateRepeatedPropertyLength(name, values.length);
             ArrayList<Bundle> bundles = new ArrayList<>(values.length);
             for (int i = 0; i < values.length; i++) {
                 if (values[i] == null) {
@@ -832,11 +1208,11 @@
                 bundle.putByteArray(BYTE_ARRAY_FIELD, values[i]);
                 bundles.add(bundle);
             }
-            mProperties.putParcelableArrayList(key, bundles);
+            mProperties.putParcelableArrayList(name, bundles);
         }
 
-        private void putInPropertyBundle(@NonNull String key, @NonNull GenericDocument[] values) {
-            validateRepeatedPropertyLength(key, values.length);
+        private void putInPropertyBundle(@NonNull String name, @NonNull GenericDocument[] values) {
+            validateRepeatedPropertyLength(name, values.length);
             Parcelable[] documentBundles = new Parcelable[values.length];
             for (int i = 0; i < values.length; i++) {
                 if (values[i] == null) {
@@ -844,14 +1220,14 @@
                 }
                 documentBundles[i] = values[i].mBundle;
             }
-            mProperties.putParcelableArray(key, documentBundles);
+            mProperties.putParcelableArray(name, documentBundles);
         }
 
-        private static void validateRepeatedPropertyLength(@NonNull String key, int length) {
+        private static void validateRepeatedPropertyLength(@NonNull String name, int length) {
             if (length > MAX_REPEATED_PROPERTY_LENGTH) {
                 throw new IllegalArgumentException(
                         "Repeated property \""
-                                + key
+                                + name
                                 + "\" has length "
                                 + length
                                 + ", which exceeds the limit of "
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/GetByUriRequest.java b/apex/appsearch/framework/java/external/android/app/appsearch/GetByDocumentIdRequest.java
similarity index 74%
rename from apex/appsearch/framework/java/external/android/app/appsearch/GetByUriRequest.java
rename to apex/appsearch/framework/java/external/android/app/appsearch/GetByDocumentIdRequest.java
index 4dc3225..58fd8be 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/GetByUriRequest.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/GetByDocumentIdRequest.java
@@ -32,29 +32,29 @@
 import java.util.Set;
 
 /**
- * Encapsulates a request to retrieve documents by namespace and URIs from the {@link
+ * Encapsulates a request to retrieve documents by namespace and IDs from the {@link
  * AppSearchSession} database.
  *
- * @see AppSearchSession#getByUri
+ * @see AppSearchSession#getByDocumentId
  */
-public final class GetByUriRequest {
+public final class GetByDocumentIdRequest {
     /**
-     * Schema type to be used in {@link android.app.appsearch.GetByUriRequest.Builder#addProjection}
-     * to apply property paths to all results, excepting any types that have had their own, specific
-     * property paths set.
+     * Schema type to be used in {@link GetByDocumentIdRequest.Builder#addProjection} to apply
+     * property paths to all results, excepting any types that have had their own, specific property
+     * paths set.
      */
     public static final String PROJECTION_SCHEMA_TYPE_WILDCARD = "*";
 
     private final String mNamespace;
-    private final Set<String> mUris;
+    private final Set<String> mIds;
     private final Map<String, List<String>> mTypePropertyPathsMap;
 
-    GetByUriRequest(
+    GetByDocumentIdRequest(
             @NonNull String namespace,
-            @NonNull Set<String> uris,
+            @NonNull Set<String> ids,
             @NonNull Map<String, List<String>> typePropertyPathsMap) {
         mNamespace = Objects.requireNonNull(namespace);
-        mUris = Objects.requireNonNull(uris);
+        mIds = Objects.requireNonNull(ids);
         mTypePropertyPathsMap = Objects.requireNonNull(typePropertyPathsMap);
     }
 
@@ -64,10 +64,10 @@
         return mNamespace;
     }
 
-    /** Returns the set of URIs attached to the request. */
+    /** Returns the set of document IDs attached to the request. */
     @NonNull
-    public Set<String> getUris() {
-        return Collections.unmodifiableSet(mUris);
+    public Set<String> getIds() {
+        return Collections.unmodifiableSet(mIds);
     }
 
     /**
@@ -81,8 +81,8 @@
     @NonNull
     public Map<String, List<String>> getProjections() {
         Map<String, List<String>> copy = new ArrayMap<>();
-        for (String key : mTypePropertyPathsMap.keySet()) {
-            copy.put(key, new ArrayList<>(mTypePropertyPathsMap.get(key)));
+        for (Map.Entry<String, List<String>> entry : mTypePropertyPathsMap.entrySet()) {
+            copy.put(entry.getKey(), new ArrayList<>(entry.getValue()));
         }
         return copy;
     }
@@ -103,42 +103,42 @@
     }
 
     /**
-     * Builder for {@link GetByUriRequest} objects.
+     * Builder for {@link GetByDocumentIdRequest} objects.
      *
      * <p>Once {@link #build} is called, the instance can no longer be used.
      */
     public static final class Builder {
         private final String mNamespace;
-        private final Set<String> mUris = new ArraySet<>();
+        private final Set<String> mIds = new ArraySet<>();
         private final Map<String, List<String>> mProjectionTypePropertyPaths = new ArrayMap<>();
         private boolean mBuilt = false;
 
-        /** Creates a {@link GetByUriRequest.Builder} instance. */
+        /** Creates a {@link GetByDocumentIdRequest.Builder} instance. */
         public Builder(@NonNull String namespace) {
             mNamespace = Objects.requireNonNull(namespace);
         }
 
         /**
-         * Adds one or more URIs to the request.
+         * Adds one or more document IDs to the request.
          *
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public Builder addUris(@NonNull String... uris) {
-            Objects.requireNonNull(uris);
-            return addUris(Arrays.asList(uris));
+        public Builder addIds(@NonNull String... ids) {
+            Objects.requireNonNull(ids);
+            return addIds(Arrays.asList(ids));
         }
 
         /**
-         * Adds a collection of URIs to the request.
+         * Adds a collection of IDs to the request.
          *
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public Builder addUris(@NonNull Collection<String> uris) {
+        public Builder addIds(@NonNull Collection<String> ids) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(uris);
-            mUris.addAll(uris);
+            Objects.requireNonNull(ids);
+            mIds.addAll(ids);
             return this;
         }
 
@@ -152,8 +152,9 @@
          * of that type will be retrieved.
          *
          * <p>If property path is added for the {@link
-         * GetByUriRequest#PROJECTION_SCHEMA_TYPE_WILDCARD}, then those property paths will apply to
-         * all results, excepting any types that have their own, specific property paths set.
+         * GetByDocumentIdRequest#PROJECTION_SCHEMA_TYPE_WILDCARD}, then those property paths will
+         * apply to all results, excepting any types that have their own, specific property paths
+         * set.
          *
          * @throws IllegalStateException if the builder has already been used.
          * @see SearchSpec.Builder#addProjection
@@ -174,15 +175,15 @@
         }
 
         /**
-         * Builds a new {@link GetByUriRequest}.
+         * Builds a new {@link GetByDocumentIdRequest}.
          *
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public GetByUriRequest build() {
+        public GetByDocumentIdRequest build() {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
             mBuilt = true;
-            return new GetByUriRequest(mNamespace, mUris, mProjectionTypePropertyPaths);
+            return new GetByDocumentIdRequest(mNamespace, mIds, mProjectionTypePropertyPaths);
         }
     }
 }
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/GetSchemaResponse.java b/apex/appsearch/framework/java/external/android/app/appsearch/GetSchemaResponse.java
index 691ef4f..6f8cbe8 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/GetSchemaResponse.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/GetSchemaResponse.java
@@ -75,7 +75,7 @@
 
     /** Builder for {@link GetSchemaResponse} objects. */
     public static final class Builder {
-        private int mVersion;
+        private int mVersion = 0;
         private boolean mBuilt = false;
         private final ArrayList<Bundle> mSchemaBundles = new ArrayList<>();
 
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/Migrator.java b/apex/appsearch/framework/java/external/android/app/appsearch/Migrator.java
index 511b42a..c5a0f63 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/Migrator.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/Migrator.java
@@ -52,7 +52,7 @@
      *
      * <p>If this {@link Migrator} is provided to cover a compatible schema change via {@link
      * AppSearchSession#setSchema}, documents under the old version won't be removed unless you use
-     * the same URI.
+     * the same document ID.
      *
      * <p>This method will be invoked on the background worker thread provided via {@link
      * AppSearchSession#setSchema}.
@@ -75,7 +75,7 @@
      *
      * <p>If this {@link Migrator} is provided to cover a compatible schema change via {@link
      * AppSearchSession#setSchema}, documents under the old version won't be removed unless you use
-     * the same URI.
+     * the same document ID.
      *
      * <p>This method will be invoked on the background worker thread.
      *
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/RemoveByUriRequest.java b/apex/appsearch/framework/java/external/android/app/appsearch/RemoveByDocumentIdRequest.java
similarity index 64%
rename from apex/appsearch/framework/java/external/android/app/appsearch/RemoveByUriRequest.java
rename to apex/appsearch/framework/java/external/android/app/appsearch/RemoveByDocumentIdRequest.java
index 4dcad68..1afbe27 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/RemoveByUriRequest.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/RemoveByDocumentIdRequest.java
@@ -28,18 +28,18 @@
 import java.util.Set;
 
 /**
- * Encapsulates a request to remove documents by namespace and URIs from the {@link
- * AppSearchSession} database.
+ * Encapsulates a request to remove documents by namespace and IDs from the {@link AppSearchSession}
+ * database.
  *
  * @see AppSearchSession#remove
  */
-public final class RemoveByUriRequest {
+public final class RemoveByDocumentIdRequest {
     private final String mNamespace;
-    private final Set<String> mUris;
+    private final Set<String> mIds;
 
-    RemoveByUriRequest(String namespace, Set<String> uris) {
+    RemoveByDocumentIdRequest(String namespace, Set<String> ids) {
         mNamespace = namespace;
-        mUris = uris;
+        mIds = ids;
     }
 
     /** Returns the namespace to remove documents from. */
@@ -48,61 +48,61 @@
         return mNamespace;
     }
 
-    /** Returns the set of URIs attached to the request. */
+    /** Returns the set of document IDs attached to the request. */
     @NonNull
-    public Set<String> getUris() {
-        return Collections.unmodifiableSet(mUris);
+    public Set<String> getIds() {
+        return Collections.unmodifiableSet(mIds);
     }
 
     /**
-     * Builder for {@link RemoveByUriRequest} objects.
+     * Builder for {@link RemoveByDocumentIdRequest} objects.
      *
      * <p>Once {@link #build} is called, the instance can no longer be used.
      */
     public static final class Builder {
         private final String mNamespace;
-        private final Set<String> mUris = new ArraySet<>();
+        private final Set<String> mIds = new ArraySet<>();
         private boolean mBuilt = false;
 
-        /** Creates a {@link RemoveByUriRequest.Builder} instance. */
+        /** Creates a {@link RemoveByDocumentIdRequest.Builder} instance. */
         public Builder(@NonNull String namespace) {
             mNamespace = Objects.requireNonNull(namespace);
         }
 
         /**
-         * Adds one or more URIs to the request.
+         * Adds one or more document IDs to the request.
          *
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public Builder addUris(@NonNull String... uris) {
-            Objects.requireNonNull(uris);
-            return addUris(Arrays.asList(uris));
+        public Builder addIds(@NonNull String... ids) {
+            Objects.requireNonNull(ids);
+            return addIds(Arrays.asList(ids));
         }
 
         /**
-         * Adds a collection of URIs to the request.
+         * Adds a collection of IDs to the request.
          *
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public Builder addUris(@NonNull Collection<String> uris) {
+        public Builder addIds(@NonNull Collection<String> ids) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(uris);
-            mUris.addAll(uris);
+            Objects.requireNonNull(ids);
+            mIds.addAll(ids);
             return this;
         }
 
         /**
-         * Builds a new {@link RemoveByUriRequest}.
+         * Builds a new {@link RemoveByDocumentIdRequest}.
          *
          * @throws IllegalStateException if the builder has already been used.
          */
         @NonNull
-        public RemoveByUriRequest build() {
+        public RemoveByDocumentIdRequest build() {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
             mBuilt = true;
-            return new RemoveByUriRequest(mNamespace, mUris);
+            return new RemoveByDocumentIdRequest(mNamespace, mIds);
         }
     }
 }
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/ReportSystemUsageRequest.java b/apex/appsearch/framework/java/external/android/app/appsearch/ReportSystemUsageRequest.java
index 8aff3b4..3947ba7 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/ReportSystemUsageRequest.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/ReportSystemUsageRequest.java
@@ -16,6 +16,7 @@
 
 package android.app.appsearch;
 
+import android.annotation.CurrentTimeMillisLong;
 import android.annotation.NonNull;
 
 import com.android.internal.util.Preconditions;
@@ -35,20 +36,20 @@
     private final String mPackageName;
     private final String mDatabase;
     private final String mNamespace;
-    private final String mUri;
-    private final long mUsageTimeMillis;
+    private final String mDocumentId;
+    private final long mUsageTimestampMillis;
 
     ReportSystemUsageRequest(
             @NonNull String packageName,
             @NonNull String database,
             @NonNull String namespace,
-            @NonNull String uri,
-            long usageTimeMillis) {
+            @NonNull String documentId,
+            long usageTimestampMillis) {
         mPackageName = Objects.requireNonNull(packageName);
         mDatabase = Objects.requireNonNull(database);
         mNamespace = Objects.requireNonNull(namespace);
-        mUri = Objects.requireNonNull(uri);
-        mUsageTimeMillis = usageTimeMillis;
+        mDocumentId = Objects.requireNonNull(documentId);
+        mUsageTimestampMillis = usageTimestampMillis;
     }
 
     /** Returns the package name of the app which owns the document that was used. */
@@ -69,10 +70,10 @@
         return mNamespace;
     }
 
-    /** Returns the URI of document that was used. */
+    /** Returns the ID of document that was used. */
     @NonNull
-    public String getUri() {
-        return mUri;
+    public String getDocumentId() {
+        return mDocumentId;
     }
 
     /**
@@ -81,8 +82,9 @@
      *
      * <p>The value is in the {@link System#currentTimeMillis} time base.
      */
-    public long getUsageTimeMillis() {
-        return mUsageTimeMillis;
+    @CurrentTimeMillisLong
+    public long getUsageTimestampMillis() {
+        return mUsageTimestampMillis;
     }
 
     /** Builder for {@link ReportSystemUsageRequest} objects. */
@@ -90,31 +92,20 @@
         private final String mPackageName;
         private final String mDatabase;
         private final String mNamespace;
-        private String mUri;
-        private Long mUsageTimeMillis;
+        private final String mDocumentId;
+        private Long mUsageTimestampMillis;
         private boolean mBuilt = false;
 
         /** Creates a {@link ReportSystemUsageRequest.Builder} instance. */
         public Builder(
-                @NonNull String packageName, @NonNull String database, @NonNull String namespace) {
+                @NonNull String packageName,
+                @NonNull String database,
+                @NonNull String namespace,
+                @NonNull String documentId) {
             mPackageName = Objects.requireNonNull(packageName);
             mDatabase = Objects.requireNonNull(database);
             mNamespace = Objects.requireNonNull(namespace);
-        }
-
-        /**
-         * Sets the URI of the document being used.
-         *
-         * <p>This field is required.
-         *
-         * @throws IllegalStateException if the builder has already been used
-         */
-        @NonNull
-        public ReportSystemUsageRequest.Builder setUri(@NonNull String uri) {
-            Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(uri);
-            mUri = uri;
-            return this;
+            mDocumentId = Objects.requireNonNull(documentId);
         }
 
         /**
@@ -129,28 +120,27 @@
          * @throws IllegalStateException if the builder has already been used
          */
         @NonNull
-        public ReportSystemUsageRequest.Builder setUsageTimeMillis(long usageTimeMillis) {
+        public ReportSystemUsageRequest.Builder setUsageTimestampMillis(
+                @CurrentTimeMillisLong long usageTimestampMillis) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            mUsageTimeMillis = usageTimeMillis;
+            mUsageTimestampMillis = usageTimestampMillis;
             return this;
         }
 
         /**
          * Builds a new {@link ReportSystemUsageRequest}.
          *
-         * @throws NullPointerException if {@link #setUri} has never been called
          * @throws IllegalStateException if the builder has already been used
          */
         @NonNull
         public ReportSystemUsageRequest build() {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(mUri, "ReportUsageRequest is missing a URI");
-            if (mUsageTimeMillis == null) {
-                mUsageTimeMillis = System.currentTimeMillis();
+            if (mUsageTimestampMillis == null) {
+                mUsageTimestampMillis = System.currentTimeMillis();
             }
             mBuilt = true;
             return new ReportSystemUsageRequest(
-                    mPackageName, mDatabase, mNamespace, mUri, mUsageTimeMillis);
+                    mPackageName, mDatabase, mNamespace, mDocumentId, mUsageTimestampMillis);
         }
     }
 }
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/ReportUsageRequest.java b/apex/appsearch/framework/java/external/android/app/appsearch/ReportUsageRequest.java
index 925bde9..8c8ade8 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/ReportUsageRequest.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/ReportUsageRequest.java
@@ -16,6 +16,7 @@
 
 package android.app.appsearch;
 
+import android.annotation.CurrentTimeMillisLong;
 import android.annotation.NonNull;
 
 import com.android.internal.util.Preconditions;
@@ -31,13 +32,14 @@
  */
 public final class ReportUsageRequest {
     private final String mNamespace;
-    private final String mUri;
-    private final long mUsageTimeMillis;
+    private final String mDocumentId;
+    private final long mUsageTimestampMillis;
 
-    ReportUsageRequest(@NonNull String namespace, @NonNull String uri, long usageTimeMillis) {
+    ReportUsageRequest(
+            @NonNull String namespace, @NonNull String documentId, long usageTimestampMillis) {
         mNamespace = Objects.requireNonNull(namespace);
-        mUri = Objects.requireNonNull(uri);
-        mUsageTimeMillis = usageTimeMillis;
+        mDocumentId = Objects.requireNonNull(documentId);
+        mUsageTimestampMillis = usageTimestampMillis;
     }
 
     /** Returns the namespace of the document that was used. */
@@ -46,10 +48,10 @@
         return mNamespace;
     }
 
-    /** Returns the URI of document that was used. */
+    /** Returns the ID of document that was used. */
     @NonNull
-    public String getUri() {
-        return mUri;
+    public String getDocumentId() {
+        return mDocumentId;
     }
 
     /**
@@ -58,35 +60,22 @@
      *
      * <p>The value is in the {@link System#currentTimeMillis} time base.
      */
-    public long getUsageTimeMillis() {
-        return mUsageTimeMillis;
+    @CurrentTimeMillisLong
+    public long getUsageTimestampMillis() {
+        return mUsageTimestampMillis;
     }
 
     /** Builder for {@link ReportUsageRequest} objects. */
     public static final class Builder {
         private final String mNamespace;
-        private String mUri;
-        private Long mUsageTimeMillis;
+        private final String mDocumentId;
+        private Long mUsageTimestampMillis;
         private boolean mBuilt = false;
 
         /** Creates a {@link ReportUsageRequest.Builder} instance. */
-        public Builder(@NonNull String namespace) {
+        public Builder(@NonNull String namespace, @NonNull String documentId) {
             mNamespace = Objects.requireNonNull(namespace);
-        }
-
-        /**
-         * Sets the URI of the document being used.
-         *
-         * <p>This field is required.
-         *
-         * @throws IllegalStateException if the builder has already been used
-         */
-        @NonNull
-        public ReportUsageRequest.Builder setUri(@NonNull String uri) {
-            Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(uri);
-            mUri = uri;
-            return this;
+            mDocumentId = Objects.requireNonNull(documentId);
         }
 
         /**
@@ -101,27 +90,26 @@
          * @throws IllegalStateException if the builder has already been used
          */
         @NonNull
-        public ReportUsageRequest.Builder setUsageTimeMillis(long usageTimeMillis) {
+        public ReportUsageRequest.Builder setUsageTimestampMillis(
+                @CurrentTimeMillisLong long usageTimestampMillis) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            mUsageTimeMillis = usageTimeMillis;
+            mUsageTimestampMillis = usageTimestampMillis;
             return this;
         }
 
         /**
          * Builds a new {@link ReportUsageRequest}.
          *
-         * @throws NullPointerException if {@link #setUri} has never been called
          * @throws IllegalStateException if the builder has already been used
          */
         @NonNull
         public ReportUsageRequest build() {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            Objects.requireNonNull(mUri, "ReportUsageRequest is missing a URI");
-            if (mUsageTimeMillis == null) {
-                mUsageTimeMillis = System.currentTimeMillis();
+            if (mUsageTimestampMillis == null) {
+                mUsageTimestampMillis = System.currentTimeMillis();
             }
             mBuilt = true;
-            return new ReportUsageRequest(mNamespace, mUri, mUsageTimeMillis);
+            return new ReportUsageRequest(mNamespace, mDocumentId, mUsageTimestampMillis);
         }
     }
 }
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java b/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java
index 432f838..4fc654f 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/SearchResult.java
@@ -415,16 +415,13 @@
         private static String getPropertyValues(GenericDocument document, String propertyName) {
             // In IcingLib snippeting is available for only 3 data types i.e String, double and
             // long, so we need to check which of these three are requested.
-            // TODO (tytytyww): getPropertyStringArray takes property name, handle for property
-            //  path.
             // TODO (tytytyww): support double[] and long[].
-            String[] values = document.getPropertyStringArray(propertyName);
-            if (values == null) {
-                throw new IllegalStateException("No content found for requested property path!");
+            String result = document.getPropertyString(propertyName);
+            if (result == null) {
+                throw new IllegalStateException(
+                        "No content found for requested property path: " + propertyName);
             }
-
-            // TODO(b/175146044): Return the proper match based on the index in the propertyName.
-            return values[0];
+            return result;
         }
 
         /** Builder for {@link MatchInfo} objects. */
@@ -433,23 +430,22 @@
             private boolean mBuilt = false;
 
             /**
-             * Sets the property path corresponding to the given entry.
+             * Creates a new {@link MatchInfo.Builder} reporting a match with the given property
+             * path.
              *
-             * <p>A property path is a '.' - delimited sequence of property names indicating which
+             * <p>A property path is a dot-delimited sequence of property names indicating which
              * property in the document these snippets correspond to.
              *
-             * <p>Example properties: 'body', 'sender.name', 'sender.emailaddress', etc. For class
-             * example 1 this returns "subject"
+             * <p>Example properties: 'body', 'sender.name', 'sender.emailaddress', etc.
+             * For class example 1 this returns "subject".
              *
-             * @throws IllegalStateException if the builder has already been used
+             * @param propertyPath A {@code dot-delimited sequence of property names indicating
+             *                     which property in the document these snippets correspond to.
              */
-            @NonNull
-            public Builder setPropertyPath(@NonNull String propertyPath) {
-                Preconditions.checkState(!mBuilt, "Builder has already been used");
+            public Builder(@NonNull String propertyPath) {
                 mBundle.putString(
                         SearchResult.MatchInfo.PROPERTY_PATH_FIELD,
                         Objects.requireNonNull(propertyPath));
-                return this;
             }
 
             /**
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java b/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java
index d466bf1..20e5b9d 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/SearchSpec.java
@@ -20,7 +20,6 @@
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
-import android.app.appsearch.exceptions.IllegalSearchSpecException;
 import android.os.Bundle;
 import android.util.ArrayMap;
 
@@ -323,9 +322,15 @@
         public Builder() {
             mBundle = new Bundle();
             mBundle.putInt(NUM_PER_PAGE_FIELD, DEFAULT_NUM_PER_PAGE);
+            mBundle.putInt(TERM_MATCH_TYPE_FIELD, TERM_MATCH_PREFIX);
         }
 
-        /** Indicates how the query terms should match {@code TermMatchCode} in the index. */
+        /**
+         * Indicates how the query terms should match {@code TermMatchCode} in the index.
+         *
+         * <p>If this method is not called, the default term match type is {@link
+         * SearchSpec#TERM_MATCH_PREFIX}.
+         */
         @NonNull
         public Builder setTermMatch(@TermMatch int termMatchTypeCode) {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
@@ -634,9 +639,6 @@
         @NonNull
         public SearchSpec build() {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            if (!mBundle.containsKey(TERM_MATCH_TYPE_FIELD)) {
-                throw new IllegalSearchSpecException("Missing termMatchType field.");
-            }
             mBundle.putStringArrayList(NAMESPACE_FIELD, mNamespaces);
             mBundle.putStringArrayList(SCHEMA_FIELD, mSchemas);
             mBundle.putStringArrayList(PACKAGE_NAME_FIELD, mPackageNames);
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaRequest.java b/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaRequest.java
index 8f7a0bf..275b2c3 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaRequest.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaRequest.java
@@ -414,7 +414,6 @@
         @NonNull
         public SetSchemaRequest build() {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
-            mBuilt = true;
 
             // Verify that any schema types with display or visibility settings refer to a real
             // schema.
@@ -432,6 +431,7 @@
                         "Schema types " + referencedSchemas + " referenced, but were not added.");
             }
 
+            mBuilt = true;
             return new SetSchemaRequest(
                     mSchemas,
                     mSchemasNotDisplayedBySystem,
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaResponse.java b/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaResponse.java
index 7be589f..b7bd387 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaResponse.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/SetSchemaResponse.java
@@ -86,7 +86,7 @@
      * <p>A {@link MigrationFailure} will be generated if the system trying to save a post-migrated
      * {@link GenericDocument} but fail.
      *
-     * <p>{@link MigrationFailure} contains the uri, namespace and schemaType of the post-migrated
+     * <p>{@link MigrationFailure} contains the namespace, id and schemaType of the post-migrated
      * {@link GenericDocument} and the error reason. Mostly it will be mismatch the schema it
      * migrated to.
      */
@@ -96,8 +96,13 @@
     }
 
     /**
-     * Returns a {@link Set} of schema type that were deleted by the {@link
-     * AppSearchSession#setSchema} call.
+     * Returns a {@link Set} of deleted schema types.
+     *
+     * <p>A "deleted" type is a schema type that was previously a part of the database schema but
+     * was not present in the {@link SetSchemaRequest} object provided in the
+     * {@link AppSearchSession#setSchema) call.
+     *
+     * <p>Documents for a deleted type are removed from the database.
      */
     @NonNull
     public Set<String> getDeletedTypes() {
@@ -113,6 +118,15 @@
     /**
      * Returns a {@link Set} of schema type that were migrated by the {@link
      * AppSearchSession#setSchema} call.
+     *
+     * <p>A "migrated" type is a schema type that has triggered a {@link Migrator} instance to
+     * migrate documents of the schema type to another schema type, or to another version of the
+     * schema type.
+     *
+     * <p>If a document fails to be migrated, a {@link MigrationFailure} will be generated for that
+     * document.
+     *
+     * @see Migrator
      */
     @NonNull
     public Set<String> getMigratedTypes() {
@@ -132,6 +146,7 @@
      * <p>If a {@link Migrator} is provided for this type and the migration is success triggered.
      * The type will also appear in {@link #getMigratedTypes()}.
      *
+     * @see SetSchemaRequest
      * @see AppSearchSession#setSchema
      * @see SetSchemaRequest.Builder#setForceOverride
      */
@@ -257,14 +272,40 @@
     public static class MigrationFailure {
         private static final String SCHEMA_TYPE_FIELD = "schemaType";
         private static final String NAMESPACE_FIELD = "namespace";
-        private static final String URI_FIELD = "uri";
+        private static final String DOCUMENT_ID_FIELD = "id";
         private static final String ERROR_MESSAGE_FIELD = "errorMessage";
         private static final String RESULT_CODE_FIELD = "resultCode";
 
         private final Bundle mBundle;
 
+        /**
+         * Constructs a new {@link MigrationFailure}.
+         *
+         * @param namespace The namespace of the document which failed to be migrated.
+         * @param documentId The id of the document which failed to be migrated.
+         * @param schemaType The type of the document which failed to be migrated.
+         * @param failedResult The reason why the document failed to be indexed.
+         * @throws IllegalArgumentException if the provided {@code failedResult} was not a failure.
+         */
+        public MigrationFailure(
+                @NonNull String namespace,
+                @NonNull String documentId,
+                @NonNull String schemaType,
+                @NonNull AppSearchResult<?> failedResult) {
+            mBundle = new Bundle();
+            mBundle.putString(NAMESPACE_FIELD, Objects.requireNonNull(namespace));
+            mBundle.putString(DOCUMENT_ID_FIELD, Objects.requireNonNull(documentId));
+            mBundle.putString(SCHEMA_TYPE_FIELD, Objects.requireNonNull(schemaType));
+
+            Objects.requireNonNull(failedResult);
+            Preconditions.checkArgument(
+                    !failedResult.isSuccess(), "failedResult was actually successful");
+            mBundle.putString(ERROR_MESSAGE_FIELD, failedResult.getErrorMessage());
+            mBundle.putInt(RESULT_CODE_FIELD, failedResult.getResultCode());
+        }
+
         MigrationFailure(@NonNull Bundle bundle) {
-            mBundle = bundle;
+            mBundle = Objects.requireNonNull(bundle);
         }
 
         /**
@@ -277,27 +318,27 @@
             return mBundle;
         }
 
-        /** Returns the schema type of the {@link GenericDocument} that fails to be migrated. */
-        @NonNull
-        public String getSchemaType() {
-            return mBundle.getString(SCHEMA_TYPE_FIELD, /*defaultValue=*/ "");
-        }
-
-        /** Returns the namespace of the {@link GenericDocument} that fails to be migrated. */
+        /** Returns the namespace of the {@link GenericDocument} that failed to be migrated. */
         @NonNull
         public String getNamespace() {
             return mBundle.getString(NAMESPACE_FIELD, /*defaultValue=*/ "");
         }
 
-        /** Returns the uri of the {@link GenericDocument} that fails to be migrated. */
+        /** Returns the id of the {@link GenericDocument} that failed to be migrated. */
         @NonNull
-        public String getUri() {
-            return mBundle.getString(URI_FIELD, /*defaultValue=*/ "");
+        public String getDocumentId() {
+            return mBundle.getString(DOCUMENT_ID_FIELD, /*defaultValue=*/ "");
+        }
+
+        /** Returns the schema type of the {@link GenericDocument} that failed to be migrated. */
+        @NonNull
+        public String getSchemaType() {
+            return mBundle.getString(SCHEMA_TYPE_FIELD, /*defaultValue=*/ "");
         }
 
         /**
-         * Returns the {@link AppSearchResult} that indicates why the post-migrated {@link
-         * GenericDocument} fails to be saved.
+         * Returns the {@link AppSearchResult} that indicates why the post-migration {@link
+         * GenericDocument} failed to be indexed.
          */
         @NonNull
         public AppSearchResult<Void> getAppSearchResult() {
@@ -305,61 +346,5 @@
                     mBundle.getInt(RESULT_CODE_FIELD),
                     mBundle.getString(ERROR_MESSAGE_FIELD, /*defaultValue=*/ ""));
         }
-
-        /** Builder for {@link MigrationFailure} objects. */
-        public static final class Builder {
-            private String mSchemaType;
-            private String mNamespace;
-            private String mUri;
-            private final Bundle mBundle = new Bundle();
-            private AppSearchResult<Void> mFailureResult;
-            private boolean mBuilt = false;
-
-            /** Sets the schema type for the {@link MigrationFailure}. */
-            @NonNull
-            public Builder setSchemaType(@NonNull String schemaType) {
-                Preconditions.checkState(!mBuilt, "Builder has already been used");
-                mSchemaType = Objects.requireNonNull(schemaType);
-                return this;
-            }
-
-            /** Sets the namespace for the {@link MigrationFailure}. */
-            @NonNull
-            public Builder setNamespace(@NonNull String namespace) {
-                Preconditions.checkState(!mBuilt, "Builder has already been used");
-                mNamespace = Objects.requireNonNull(namespace);
-                return this;
-            }
-
-            /** Sets the uri for the {@link MigrationFailure}. */
-            @NonNull
-            public Builder setUri(@NonNull String uri) {
-                Preconditions.checkState(!mBuilt, "Builder has already been used");
-                mUri = Objects.requireNonNull(uri);
-                return this;
-            }
-
-            /** Sets the failure {@link AppSearchResult} for the {@link MigrationFailure}. */
-            @NonNull
-            public Builder setAppSearchResult(@NonNull AppSearchResult<Void> appSearchResult) {
-                Preconditions.checkState(!mBuilt, "Builder has already been used");
-                Preconditions.checkState(!appSearchResult.isSuccess(), "Input a success result");
-                mFailureResult = Objects.requireNonNull(appSearchResult);
-                return this;
-            }
-
-            /** Builds a {@link MigrationFailure} object. */
-            @NonNull
-            public MigrationFailure build() {
-                Preconditions.checkState(!mBuilt, "Builder has already been used");
-                mBundle.putString(SCHEMA_TYPE_FIELD, mSchemaType);
-                mBundle.putString(NAMESPACE_FIELD, mNamespace);
-                mBundle.putString(URI_FIELD, mUri);
-                mBundle.putString(ERROR_MESSAGE_FIELD, mFailureResult.getErrorMessage());
-                mBundle.putInt(RESULT_CODE_FIELD, mFailureResult.getResultCode());
-                mBuilt = true;
-                return new MigrationFailure(mBundle);
-            }
-        }
     }
 }
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/exceptions/AppSearchException.java b/apex/appsearch/framework/java/external/android/app/appsearch/exceptions/AppSearchException.java
index ca4ea2b..62593ae8 100644
--- a/apex/appsearch/framework/java/external/android/app/appsearch/exceptions/AppSearchException.java
+++ b/apex/appsearch/framework/java/external/android/app/appsearch/exceptions/AppSearchException.java
@@ -42,6 +42,8 @@
      * Initializes an {@link AppSearchException} with a result code and message.
      *
      * @param resultCode One of the constants documented in {@link AppSearchResult#getResultCode}.
+     * @param message The detail message (which is saved for later retrieval by the {@link
+     *     #getMessage()} method).
      */
     public AppSearchException(
             @AppSearchResult.ResultCode int resultCode, @Nullable String message) {
@@ -52,6 +54,11 @@
      * Initializes an {@link AppSearchException} with a result code, message and cause.
      *
      * @param resultCode One of the constants documented in {@link AppSearchResult#getResultCode}.
+     * @param message The detail message (which is saved for later retrieval by the {@link
+     *     #getMessage()} method).
+     * @param cause The cause (which is saved for later retrieval by the {@link #getCause()}
+     *     method). (A null value is permitted, and indicates that the cause is nonexistent or
+     *     unknown.)
      */
     public AppSearchException(
             @AppSearchResult.ResultCode int resultCode,
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/exceptions/IllegalSearchSpecException.java b/apex/appsearch/framework/java/external/android/app/appsearch/exceptions/IllegalSearchSpecException.java
deleted file mode 100644
index 0b5dc2e..0000000
--- a/apex/appsearch/framework/java/external/android/app/appsearch/exceptions/IllegalSearchSpecException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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 android.app.appsearch.exceptions;
-
-import android.annotation.NonNull;
-
-/**
- * Indicates that a {@link android.app.appsearch.SearchResult} has logical inconsistencies such as
- * unpopulated mandatory fields or illegal combinations of parameters.
- *
- * @hide
- */
-public class IllegalSearchSpecException extends IllegalArgumentException {
-    /**
-     * Constructs a new {@link IllegalSearchSpecException}.
-     *
-     * @param message A developer-readable description of the issue with the bundle.
-     */
-    public IllegalSearchSpecException(@NonNull String message) {
-        super(message);
-    }
-}
diff --git a/apex/appsearch/service/Android.bp b/apex/appsearch/service/Android.bp
index 57ee1ec..566a18f 100644
--- a/apex/appsearch/service/Android.bp
+++ b/apex/appsearch/service/Android.bp
@@ -28,6 +28,7 @@
         "framework",
         "framework-appsearch",
         "services.core",
+        "services.usage",
     ],
     static_libs: [
         "icing-java-proto-lite",
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
index f6f5c98..a4188a2 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
@@ -16,6 +16,7 @@
 package com.android.server.appsearch;
 
 import static android.app.appsearch.AppSearchResult.throwableToFailedResult;
+import static android.os.Process.INVALID_UID;
 import static android.os.UserHandle.USER_NULL;
 
 import android.annotation.ElapsedRealtimeLong;
@@ -40,7 +41,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageStats;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
@@ -51,7 +54,6 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Log;
-import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.server.LocalServices;
@@ -60,6 +62,8 @@
 import com.android.server.appsearch.external.localstorage.stats.CallStats;
 import com.android.server.appsearch.stats.LoggerInstanceManager;
 import com.android.server.appsearch.stats.PlatformLogger;
+import com.android.server.usage.StorageStatsManagerInternal;
+import com.android.server.usage.StorageStatsManagerInternal.StorageStatsAugmenter;
 
 import com.google.android.icing.proto.PersistType;
 
@@ -82,6 +86,7 @@
 public class AppSearchManagerService extends SystemService {
     private static final String TAG = "AppSearchManagerService";
     private final Context mContext;
+    private PackageManager mPackageManager;
     private PackageManagerInternal mPackageManagerInternal;
     private ImplInstanceManager mImplInstanceManager;
     private UserManager mUserManager;
@@ -109,17 +114,31 @@
     @Override
     public void onStart() {
         publishBinderService(Context.APP_SEARCH_SERVICE, new Stub());
+        mPackageManager = getContext().getPackageManager();
         mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
         mImplInstanceManager = ImplInstanceManager.getInstance(mContext);
         mUserManager = mContext.getSystemService(UserManager.class);
         mLoggerInstanceManager = LoggerInstanceManager.getInstance();
         registerReceivers();
+        LocalServices.getService(StorageStatsManagerInternal.class)
+                .registerStorageStatsAugmenter(new AppSearchStorageStatsAugmenter(), TAG);
     }
 
     private void registerReceivers() {
         mContext.registerReceiverAsUser(new UserActionReceiver(), UserHandle.ALL,
                 new IntentFilter(Intent.ACTION_USER_REMOVED), /*broadcastPermission=*/ null,
                 /*scheduler=*/ null);
+
+        //TODO(b/145759910) Add a direct callback when user clears the data instead of relying on
+        // broadcasts
+        IntentFilter packageChangedFilter = new IntentFilter();
+        packageChangedFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
+        packageChangedFilter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
+        packageChangedFilter.addDataScheme("package");
+        packageChangedFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
+        mContext.registerReceiverAsUser(new PackageChangedReceiver(), UserHandle.ALL,
+                packageChangedFilter, /*broadcastPermission=*/ null,
+                /*scheduler=*/ null);
     }
 
     private class UserActionReceiver extends BroadcastReceiver {
@@ -127,15 +146,15 @@
         public void onReceive(@NonNull Context context, @NonNull Intent intent) {
             switch (intent.getAction()) {
                 case Intent.ACTION_USER_REMOVED:
-                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
+                    int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
                     if (userId == USER_NULL) {
-                        Slog.e(TAG, "userId is missing in the intent: " + intent);
+                        Log.e(TAG, "userId is missing in the intent: " + intent);
                         return;
                     }
                     handleUserRemoved(userId);
                     break;
                 default:
-                    Slog.e(TAG, "Received unknown intent: " + intent);
+                    Log.e(TAG, "Received unknown intent: " + intent);
             }
         }
     }
@@ -155,9 +174,52 @@
         try {
             mImplInstanceManager.removeAppSearchImplForUser(userId);
             mLoggerInstanceManager.removePlatformLoggerForUser(userId);
-            Slog.i(TAG, "Removed AppSearchImpl instance for user: " + userId);
+            Log.i(TAG, "Removed AppSearchImpl instance for user: " + userId);
         } catch (Throwable t) {
-            Slog.e(TAG, "Unable to remove data for user: " + userId, t);
+            Log.e(TAG, "Unable to remove data for user: " + userId, t);
+        }
+    }
+
+    private class PackageChangedReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(@NonNull Context context, @NonNull Intent intent) {
+            switch (intent.getAction()) {
+                case Intent.ACTION_PACKAGE_FULLY_REMOVED:
+                case Intent.ACTION_PACKAGE_DATA_CLEARED:
+                    String packageName = intent.getData().getSchemeSpecificPart();
+                    if (packageName == null) {
+                        Log.e(TAG, "Package name is missing in the intent: " + intent);
+                        return;
+                    }
+                    int uid = intent.getIntExtra(Intent.EXTRA_UID, INVALID_UID);
+                    if (uid == INVALID_UID) {
+                        Log.e(TAG, "uid is missing in the intent: " + intent);
+                        return;
+                    }
+                    handlePackageRemoved(packageName, uid);
+                    break;
+                default:
+                    Log.e(TAG, "Received unknown intent: " + intent);
+            }
+        }
+    }
+
+    private void handlePackageRemoved(String packageName, int uid) {
+        int userId = UserHandle.getUserId(uid);
+        try {
+            if (isUserLocked(userId)) {
+                //TODO(b/186151459) clear the uninstalled package data when user is unlocked.
+                return;
+            }
+            if (ImplInstanceManager.getAppSearchDir(userId).exists()) {
+                // Only clear the package's data if AppSearch exists for this user.
+                AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext,
+                        userId);
+                //TODO(b/145759910) clear visibility setting for package.
+                impl.clearPackageData(packageName);
+            }
+        } catch (Throwable t) {
+            Log.e(TAG, "Unable to remove data for package: " + packageName, t);
         }
     }
 
@@ -168,6 +230,24 @@
         }
     }
 
+    private void verifyUserUnlocked(int callingUserId) {
+        if (isUserLocked(callingUserId)) {
+            throw new IllegalStateException("User " + callingUserId + " is locked or not running.");
+        }
+    }
+
+    private boolean isUserLocked(int callingUserId) {
+        synchronized (mUnlockedUserIdsLocked) {
+            // First, check the local copy.
+            if (mUnlockedUserIdsLocked.contains(callingUserId)) {
+                return false;
+            }
+            // If the local copy says the user is locked, check with UM for the actual state,
+            // since the user might just have been unlocked.
+            return !mUserManager.isUserUnlockingOrUnlocked(UserHandle.of(callingUserId));
+        }
+    }
+
     private class Stub extends IAppSearchManager.Stub {
         @Override
         public void setSchema(
@@ -308,13 +388,13 @@
                         GenericDocument document = new GenericDocument(documentBundles.get(i));
                         try {
                             impl.putDocument(packageName, databaseName, document, logger);
-                            resultBuilder.setSuccess(document.getUri(), /*result=*/ null);
+                            resultBuilder.setSuccess(document.getId(), /*result=*/ null);
                             ++operationSuccessCount;
                         } catch (Throwable t) {
-                            resultBuilder.setResult(document.getUri(),
+                            resultBuilder.setResult(document.getId(),
                                     throwableToFailedResult(t));
                             AppSearchResult<Void> result = throwableToFailedResult(t);
-                            resultBuilder.setResult(document.getUri(), result);
+                            resultBuilder.setResult(document.getId(), result);
                             // for failures, we would just log the one for last failure
                             statusCode = result.getResultCode();
                             ++operationFailureCount;
@@ -354,14 +434,14 @@
                 @NonNull String packageName,
                 @NonNull String databaseName,
                 @NonNull String namespace,
-                @NonNull List<String> uris,
+                @NonNull List<String> ids,
                 @NonNull Map<String, List<String>> typePropertyPaths,
                 @UserIdInt int userId,
                 @NonNull IAppSearchBatchResultCallback callback) {
             Objects.requireNonNull(packageName);
             Objects.requireNonNull(databaseName);
             Objects.requireNonNull(namespace);
-            Objects.requireNonNull(uris);
+            Objects.requireNonNull(ids);
             Objects.requireNonNull(callback);
             int callingUid = Binder.getCallingUid();
             int callingUserId = handleIncomingUser(userId, callingUid);
@@ -373,19 +453,19 @@
                             new AppSearchBatchResult.Builder<>();
                     AppSearchImpl impl =
                             mImplInstanceManager.getAppSearchImpl(callingUserId);
-                    for (int i = 0; i < uris.size(); i++) {
-                        String uri = uris.get(i);
+                    for (int i = 0; i < ids.size(); i++) {
+                        String id = ids.get(i);
                         try {
                             GenericDocument document =
                                     impl.getDocument(
                                             packageName,
                                             databaseName,
                                             namespace,
-                                            uri,
+                                            id,
                                             typePropertyPaths);
-                            resultBuilder.setSuccess(uri, document.getBundle());
+                            resultBuilder.setSuccess(id, document.getBundle());
                         } catch (Throwable t) {
-                            resultBuilder.setResult(uri, throwableToFailedResult(t));
+                            resultBuilder.setResult(id, throwableToFailedResult(t));
                         }
                     }
                     invokeCallbackOnResult(callback, resultBuilder.build());
@@ -421,7 +501,8 @@
                                     packageName,
                                     databaseName,
                                     queryExpression,
-                                    new SearchSpec(searchSpecBundle));
+                                    new SearchSpec(searchSpecBundle),
+                                    /*logger=*/ null);
                     invokeCallbackOnResult(
                             callback,
                             AppSearchResult.newSuccessfulResult(searchResultPage.getBundle()));
@@ -455,7 +536,8 @@
                                     queryExpression,
                                     new SearchSpec(searchSpecBundle),
                                     packageName,
-                                    callingUid);
+                                    callingUid,
+                                    /*logger=*/ null);
                     invokeCallbackOnResult(
                             callback,
                             AppSearchResult.newSuccessfulResult(searchResultPage.getBundle()));
@@ -529,7 +611,8 @@
                                 packageName,
                                 databaseName,
                                 queryExpression,
-                                new SearchSpec(searchSpecBundle));
+                                new SearchSpec(searchSpecBundle),
+                                /*logger=*/ null);
                         while (!searchResultPage.getResults().isEmpty()) {
                             for (int i = 0; i < searchResultPage.getResults().size(); i++) {
                                 AppSearchMigrationHelper.writeBundleToOutputStream(
@@ -578,14 +661,12 @@
                                 impl.putDocument(packageName, databaseName, document,
                                         /*logger=*/ null);
                             } catch (Throwable t) {
-                                migrationFailureBundles.add(
-                                        new SetSchemaResponse.MigrationFailure.Builder()
-                                                .setNamespace(document.getNamespace())
-                                                .setSchemaType(document.getSchemaType())
-                                                .setUri(document.getUri())
-                                                .setAppSearchResult(AppSearchResult
-                                                        .throwableToFailedResult(t))
-                                                .build().getBundle());
+                                migrationFailureBundles.add(new SetSchemaResponse.MigrationFailure(
+                                        document.getNamespace(),
+                                        document.getId(),
+                                        document.getSchemaType(),
+                                        AppSearchResult.throwableToFailedResult(t))
+                                        .getBundle());
                             }
                         }
                     }
@@ -603,14 +684,14 @@
                 @NonNull String packageName,
                 @NonNull String databaseName,
                 @NonNull String namespace,
-                @NonNull String uri,
+                @NonNull String documentId,
                 long usageTimeMillis,
                 boolean systemUsage,
                 @UserIdInt int userId,
                 @NonNull IAppSearchResultCallback callback) {
             Objects.requireNonNull(databaseName);
             Objects.requireNonNull(namespace);
-            Objects.requireNonNull(uri);
+            Objects.requireNonNull(documentId);
             Objects.requireNonNull(callback);
             int callingUid = Binder.getCallingUid();
             int callingUserId = handleIncomingUser(userId, callingUid);
@@ -625,7 +706,7 @@
                     AppSearchImpl impl =
                             mImplInstanceManager.getAppSearchImpl(callingUserId);
                     impl.reportUsage(
-                            packageName, databaseName, namespace, uri,
+                            packageName, databaseName, namespace, documentId,
                             usageTimeMillis, systemUsage);
                     invokeCallbackOnResult(
                             callback, AppSearchResult.newSuccessfulResult(/*result=*/ null));
@@ -636,16 +717,16 @@
         }
 
         @Override
-        public void removeByUri(
+        public void removeByDocumentId(
                 @NonNull String packageName,
                 @NonNull String databaseName,
                 @NonNull String namespace,
-                @NonNull List<String> uris,
+                @NonNull List<String> ids,
                 @UserIdInt int userId,
                 @NonNull IAppSearchBatchResultCallback callback) {
             Objects.requireNonNull(packageName);
             Objects.requireNonNull(databaseName);
-            Objects.requireNonNull(uris);
+            Objects.requireNonNull(ids);
             Objects.requireNonNull(callback);
             int callingUid = Binder.getCallingUid();
             int callingUserId = handleIncomingUser(userId, callingUid);
@@ -657,13 +738,13 @@
                             new AppSearchBatchResult.Builder<>();
                     AppSearchImpl impl =
                             mImplInstanceManager.getAppSearchImpl(callingUserId);
-                    for (int i = 0; i < uris.size(); i++) {
-                        String uri = uris.get(i);
+                    for (int i = 0; i < ids.size(); i++) {
+                        String id = ids.get(i);
                         try {
-                            impl.remove(packageName, databaseName, namespace, uri);
-                            resultBuilder.setSuccess(uri, /*result= */ null);
+                            impl.remove(packageName, databaseName, namespace, id);
+                            resultBuilder.setSuccess(id, /*result= */ null);
                         } catch (Throwable t) {
-                            resultBuilder.setResult(uri, throwableToFailedResult(t));
+                            resultBuilder.setResult(id, throwableToFailedResult(t));
                         }
                     }
                     // Now that the batch has been written. Persist the newly written data.
@@ -771,25 +852,10 @@
             });
         }
 
-        private void verifyUserUnlocked(int callingUserId) {
-            synchronized (mUnlockedUserIdsLocked) {
-                // First, check the local copy.
-                if (mUnlockedUserIdsLocked.contains(callingUserId)) {
-                    return;
-                }
-                // If the local copy says the user is locked, check with UM for the actual state,
-                // since the user might just have been unlocked.
-                if (!mUserManager.isUserUnlockingOrUnlocked(UserHandle.of(callingUserId))) {
-                    throw new IllegalStateException(
-                            "User " + callingUserId + " is locked or not running.");
-                }
-            }
-        }
-
         private void verifyCallingPackage(int callingUid, @NonNull String callingPackage) {
             Objects.requireNonNull(callingPackage);
             if (mPackageManagerInternal.getPackageUid(
-                            callingPackage, /*flags=*/ 0, UserHandle.getUserId(callingUid))
+                    callingPackage, /*flags=*/ 0, UserHandle.getUserId(callingUid))
                     != callingUid) {
                 throw new SecurityException(
                         "Specified calling package ["
@@ -861,4 +927,52 @@
                 /*name=*/ null,
                 /*callerPackage=*/ null);
     }
+
+    // TODO(b/179160886): Cache the previous storage stats.
+    private class AppSearchStorageStatsAugmenter implements StorageStatsAugmenter {
+        @Override
+        public void augmentStatsForPackage(
+                @NonNull PackageStats stats,
+                @NonNull String packageName,
+                @UserIdInt int userId,
+                boolean callerHasStatsPermission) {
+            Objects.requireNonNull(stats);
+            Objects.requireNonNull(packageName);
+            try {
+                verifyUserUnlocked(userId);
+                AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext,
+                        userId);
+                stats.dataSize += impl.getStorageInfoForPackage(packageName).getSizeBytes();
+            } catch (Throwable t) {
+                Log.e(
+                        TAG,
+                        "Unable to augment storage stats for userId "
+                                + userId
+                                + " packageName "
+                                + packageName,
+                        t);
+            }
+        }
+
+        @Override
+        public void augmentStatsForUid(
+                @NonNull PackageStats stats, int uid, boolean callerHasStatsPermission) {
+            Objects.requireNonNull(stats);
+            int userId = UserHandle.getUserId(uid);
+            try {
+                verifyUserUnlocked(userId);
+                String[] packagesForUid = mPackageManager.getPackagesForUid(uid);
+                if (packagesForUid == null) {
+                    return;
+                }
+                AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext,
+                        userId);
+                for (String packageName : packagesForUid) {
+                    stats.dataSize += impl.getStorageInfoForPackage(packageName).getSizeBytes();
+                }
+            } catch (Throwable t) {
+                Log.e(TAG, "Unable to augment storage stats for uid " + uid, t);
+            }
+        }
+    }
 }
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
index af39b79..94ee830 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
@@ -73,6 +73,15 @@
     }
 
     /**
+     * Returns AppSearch directory in the credential encrypted system directory for the given user.
+     *
+     * <p>This folder should only be accessed after unlock.
+     */
+    public static File getAppSearchDir(@UserIdInt int userId) {
+        return new File(Environment.getDataSystemCeDirectory(userId), APP_SEARCH_DIR);
+    }
+
+    /**
      * Gets an instance of AppSearchImpl for the given user, or creates one if none exists.
      *
      * <p>If no AppSearchImpl instance exists for the unlocked user, Icing will be initialized and
@@ -139,13 +148,9 @@
 
     private AppSearchImpl createImpl(@NonNull Context context, @UserIdInt int userId)
             throws AppSearchException {
-        File appSearchDir = getAppSearchDir(context, userId);
-        return AppSearchImpl.create(appSearchDir, context, userId, mGlobalQuerierPackage);
-    }
-
-    private static File getAppSearchDir(@NonNull Context context, @UserIdInt int userId) {
-        // See com.android.internal.app.ChooserActivity::getPinnedSharedPrefs
-        return new File(Environment.getDataSystemCeDirectory(userId), APP_SEARCH_DIR);
+        File appSearchDir = getAppSearchDir(userId);
+        return AppSearchImpl.create(
+                appSearchDir, context, userId, mGlobalQuerierPackage, /*logger=*/ null);
     }
 
     /**
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/VisibilityStore.java b/apex/appsearch/service/java/com/android/server/appsearch/VisibilityStore.java
index 4de52fb..a8d429b 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/VisibilityStore.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/VisibilityStore.java
@@ -103,14 +103,13 @@
             new AppSearchSchema.Builder(VISIBILITY_TYPE)
                     .addProperty(
                             new AppSearchSchema.StringPropertyConfig.Builder(
-                                            NOT_PLATFORM_SURFACEABLE_PROPERTY)
+                                    NOT_PLATFORM_SURFACEABLE_PROPERTY)
                                     .setCardinality(
                                             AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
                                     .build())
                     .addProperty(
                             new AppSearchSchema.DocumentPropertyConfig.Builder(
-                                            PACKAGE_ACCESSIBLE_PROPERTY)
-                                    .setSchemaType(PACKAGE_ACCESSIBLE_TYPE)
+                                    PACKAGE_ACCESSIBLE_PROPERTY, PACKAGE_ACCESSIBLE_TYPE)
                                     .setCardinality(
                                             AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
                                     .build())
@@ -160,9 +159,9 @@
     private static final String NAMESPACE = "";
 
     /**
-     * Prefix to add to all visibility document uri's. IcingSearchEngine doesn't allow empty uri's.
+     * Prefix to add to all visibility document ids. IcingSearchEngine doesn't allow empty ids.
      */
-    private static final String URI_PREFIX = "uri:";
+    private static final String ID_PREFIX = "uri:";
 
     private final AppSearchImpl mAppSearchImpl;
 
@@ -259,13 +258,13 @@
             }
 
             try {
-                // Note: We use the other clients' prefixed names as uris
+                // Note: We use the other clients' prefixed names as ids
                 GenericDocument document =
                         mAppSearchImpl.getDocument(
                                 PACKAGE_NAME,
                                 DATABASE_NAME,
                                 NAMESPACE,
-                                /*uri=*/ addUriPrefix(prefix),
+                                /*id=*/ addIdPrefix(prefix),
                                 /*typePropertyPaths=*/ Collections.emptyMap());
 
                 // Update platform visibility settings
@@ -340,7 +339,7 @@
         // Persist the document
         GenericDocument.Builder<?> visibilityDocument =
                 new GenericDocument.Builder<>(
-                        NAMESPACE, /*uri=*/ addUriPrefix(prefix), VISIBILITY_TYPE);
+                        NAMESPACE, /*id=*/ addIdPrefix(prefix), VISIBILITY_TYPE);
         if (!schemasNotPlatformSurfaceable.isEmpty()) {
             visibilityDocument.setPropertyString(
                     NOT_PLATFORM_SURFACEABLE_PROPERTY,
@@ -353,7 +352,7 @@
                 schemasPackageAccessible.entrySet()) {
             for (int i = 0; i < entry.getValue().size(); i++) {
                 GenericDocument packageAccessibleDocument = new GenericDocument.Builder<>(
-                        NAMESPACE, /*uri=*/ "", PACKAGE_ACCESSIBLE_TYPE)
+                        NAMESPACE, /*id=*/ "", PACKAGE_ACCESSIBLE_TYPE)
                         .setPropertyString(
                                 PACKAGE_NAME_PROPERTY,
                                 entry.getValue().get(i).getPackageName())
@@ -480,13 +479,13 @@
     }
 
     /**
-     * Adds a uri prefix to create a visibility store document's uri.
+     * Adds a prefix to create a visibility store document's id.
      *
-     * @param uri Non-prefixed uri
-     * @return Prefixed uri
+     * @param id Non-prefixed id
+     * @return Prefixed id
      */
-    private static String addUriPrefix(String uri) {
-        return URI_PREFIX + uri;
+    private static String addIdPrefix(String id) {
+        return ID_PREFIX + id;
     }
 
     /**
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
index 50ac054..e5e20e7 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java
@@ -30,7 +30,7 @@
 import android.annotation.WorkerThread;
 import android.app.appsearch.AppSearchSchema;
 import android.app.appsearch.GenericDocument;
-import android.app.appsearch.GetByUriRequest;
+import android.app.appsearch.GetByDocumentIdRequest;
 import android.app.appsearch.GetSchemaResponse;
 import android.app.appsearch.PackageIdentifier;
 import android.app.appsearch.SearchResultPage;
@@ -54,7 +54,9 @@
 import com.android.server.appsearch.external.localstorage.converter.SearchSpecToProtoConverter;
 import com.android.server.appsearch.external.localstorage.converter.SetSchemaResponseToProtoConverter;
 import com.android.server.appsearch.external.localstorage.converter.TypePropertyPathToProtoConverter;
+import com.android.server.appsearch.external.localstorage.stats.InitializeStats;
 import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats;
+import com.android.server.appsearch.external.localstorage.stats.SearchStats;
 
 import com.google.android.icing.IcingSearchEngine;
 import com.google.android.icing.proto.DeleteByQueryResultProto;
@@ -178,28 +180,63 @@
     /**
      * Creates and initializes an instance of {@link AppSearchImpl} which writes data to the given
      * folder.
+     *
+     * <p>Clients can pass a {@link AppSearchLogger} here through their AppSearchSession, but it
+     * can't be saved inside {@link AppSearchImpl}, because the impl will be shared by all the
+     * sessions for the same package in JetPack.
+     *
+     * <p>Instead, logger instance needs to be passed to each individual method, like create, query
+     * and putDocument.
+     *
+     * @param logger collects stats for initialization if provided.
      */
     @NonNull
     public static AppSearchImpl create(
             @NonNull File icingDir,
             @NonNull Context context,
             int userId,
-            @NonNull String globalQuerierPackage)
+            @NonNull String globalQuerierPackage,
+            @Nullable AppSearchLogger logger)
             throws AppSearchException {
         Objects.requireNonNull(icingDir);
         Objects.requireNonNull(context);
         Objects.requireNonNull(globalQuerierPackage);
+
+        long totalLatencyStartMillis = SystemClock.elapsedRealtime();
+        InitializeStats.Builder initStatsBuilder = null;
+        if (logger != null) {
+            initStatsBuilder = new InitializeStats.Builder();
+        }
+
         AppSearchImpl appSearchImpl =
-                new AppSearchImpl(icingDir, context, userId, globalQuerierPackage);
+                new AppSearchImpl(
+                        icingDir, context, userId, globalQuerierPackage, initStatsBuilder);
+
+        long prepareVisibilityStoreLatencyStartMillis = SystemClock.elapsedRealtime();
         appSearchImpl.initializeVisibilityStore();
+        long prepareVisibilityStoreLatencyEndMillis = SystemClock.elapsedRealtime();
+
+        if (logger != null && initStatsBuilder != null) {
+            initStatsBuilder
+                    .setTotalLatencyMillis(
+                            (int) (SystemClock.elapsedRealtime() - totalLatencyStartMillis))
+                    .setPrepareVisibilityStoreLatencyMillis(
+                            (int)
+                                    (prepareVisibilityStoreLatencyEndMillis
+                                            - prepareVisibilityStoreLatencyStartMillis));
+            logger.logStats(initStatsBuilder.build());
+        }
+
         return appSearchImpl;
     }
 
+    /** @param initStatsBuilder collects stats for initialization if provided. */
     private AppSearchImpl(
             @NonNull File icingDir,
             @NonNull Context context,
             int userId,
-            @NonNull String globalQuerierPackage)
+            @NonNull String globalQuerierPackage,
+            @Nullable InitializeStats.Builder initStatsBuilder)
             throws AppSearchException {
         mReadWriteLock.writeLock().lock();
 
@@ -211,13 +248,24 @@
                             .setBaseDir(icingDir.getAbsolutePath())
                             .build();
             mIcingSearchEngineLocked = new IcingSearchEngine(options);
-
             mVisibilityStoreLocked =
                     new VisibilityStore(this, context, userId, globalQuerierPackage);
-
             InitializeResultProto initializeResultProto = mIcingSearchEngineLocked.initialize();
+
+            if (initStatsBuilder != null) {
+                initStatsBuilder
+                        .setStatusCode(
+                                statusProtoToAppSearchException(initializeResultProto.getStatus())
+                                        .getResultCode())
+                        // TODO(b/173532925) how to get DeSyncs value
+                        .setHasDeSync(false);
+                AppSearchLoggerHelper.copyNativeStats(
+                        initializeResultProto.getInitializeStats(), initStatsBuilder);
+            }
+
+            long prepareSchemaAndNamespacesLatencyStartMillis = SystemClock.elapsedRealtime();
             SchemaProto schemaProto;
-            GetAllNamespacesResultProto getAllNamespacesResultProto;
+            GetAllNamespacesResultProto getAllNamespacesResultProto = null;
             try {
                 checkSuccess(initializeResultProto.getStatus());
                 schemaProto = getSchemaProtoLocked();
@@ -225,6 +273,17 @@
                 checkSuccess(getAllNamespacesResultProto.getStatus());
             } catch (AppSearchException e) {
                 Log.w(TAG, "Error initializing, resetting IcingSearchEngine.", e);
+                if (initStatsBuilder != null && getAllNamespacesResultProto != null) {
+                    initStatsBuilder
+                            .setStatusCode(
+                                    statusProtoToAppSearchException(
+                                                    getAllNamespacesResultProto.getStatus())
+                                            .getResultCode())
+                            .setPrepareSchemaAndNamespacesLatencyMillis(
+                                    (int)
+                                            (SystemClock.elapsedRealtime()
+                                                    - prepareSchemaAndNamespacesLatencyStartMillis));
+                }
                 // Some error. Reset and see if it fixes it.
                 resetLocked();
                 return;
@@ -240,6 +299,14 @@
             for (String prefixedNamespace : getAllNamespacesResultProto.getNamespacesList()) {
                 addToMap(mNamespaceMapLocked, getPrefix(prefixedNamespace), prefixedNamespace);
             }
+
+            // logging prepare_schema_and_namespaces latency
+            if (initStatsBuilder != null) {
+                initStatsBuilder.setPrepareSchemaAndNamespacesLatencyMillis(
+                        (int)
+                                (SystemClock.elapsedRealtime()
+                                        - prepareSchemaAndNamespacesLatencyStartMillis));
+            }
         } finally {
             mReadWriteLock.writeLock().unlock();
         }
@@ -539,7 +606,7 @@
             addToMap(mNamespaceMapLocked, prefix, documentBuilder.getNamespace());
 
             // Logging stats
-            if (logger != null) {
+            if (logger != null && pStatsBuilder != null) {
                 pStatsBuilder
                         .getGeneralStatsBuilder()
                         .setStatusCode(
@@ -562,7 +629,7 @@
         } finally {
             mReadWriteLock.writeLock().unlock();
 
-            if (logger != null) {
+            if (logger != null && pStatsBuilder != null) {
                 long totalEndTimeMillis = SystemClock.elapsedRealtime();
                 pStatsBuilder
                         .getGeneralStatsBuilder()
@@ -573,14 +640,14 @@
     }
 
     /**
-     * Retrieves a document from the AppSearch index by URI.
+     * Retrieves a document from the AppSearch index by namespace and document ID.
      *
      * <p>This method belongs to query group.
      *
      * @param packageName The package that owns this document.
      * @param databaseName The databaseName this document resides in.
      * @param namespace The namespace this document resides in.
-     * @param uri The URI of the document to get.
+     * @param id The ID of the document to get.
      * @param typePropertyPaths A map of schema type to a list of property paths to return in the
      *     result.
      * @return The Document contents
@@ -591,7 +658,7 @@
             @NonNull String packageName,
             @NonNull String databaseName,
             @NonNull String namespace,
-            @NonNull String uri,
+            @NonNull String id,
             @NonNull Map<String, List<String>> typePropertyPaths)
             throws AppSearchException {
         mReadWriteLock.readLock().lock();
@@ -606,7 +673,8 @@
                 TypePropertyMask typePropertyMask = nonPrefixedPropertyMasks.get(i);
                 String nonPrefixedType = typePropertyMask.getSchemaType();
                 String prefixedType =
-                        nonPrefixedType.equals(GetByUriRequest.PROJECTION_SCHEMA_TYPE_WILDCARD)
+                        nonPrefixedType.equals(
+                                        GetByDocumentIdRequest.PROJECTION_SCHEMA_TYPE_WILDCARD)
                                 ? nonPrefixedType
                                 : prefix + nonPrefixedType;
                 prefixedPropertyMasks.add(
@@ -618,7 +686,7 @@
                             .build();
 
             GetResultProto getResultProto =
-                    mIcingSearchEngineLocked.get(prefix + namespace, uri, getResultSpec);
+                    mIcingSearchEngineLocked.get(prefix + namespace, id, getResultSpec);
             checkSuccess(getResultProto.getStatus());
 
             // The schema type map cannot be null at this point. It could only be null if no
@@ -643,6 +711,7 @@
      * @param databaseName The databaseName this query for.
      * @param queryExpression Query String to search.
      * @param searchSpec Spec for setting filters, raw query etc.
+     * @param logger logger to collect query stats
      * @return The results of performing this search. It may contain an empty list of results if no
      *     documents matched the query.
      * @throws AppSearchException on IcingSearchEngine error.
@@ -652,8 +721,17 @@
             @NonNull String packageName,
             @NonNull String databaseName,
             @NonNull String queryExpression,
-            @NonNull SearchSpec searchSpec)
+            @NonNull SearchSpec searchSpec,
+            @Nullable AppSearchLogger logger)
             throws AppSearchException {
+        long totalLatencyStartMillis = SystemClock.elapsedRealtime();
+        SearchStats.Builder sStatsBuilder = null;
+        if (logger != null) {
+            sStatsBuilder =
+                    new SearchStats.Builder(SearchStats.VISIBILITY_SCOPE_LOCAL, packageName)
+                            .setDatabase(databaseName);
+        }
+
         mReadWriteLock.readLock().lock();
         try {
             throwIfClosedLocked();
@@ -672,9 +750,15 @@
                     Collections.singleton(createPrefix(packageName, databaseName)),
                     allowedPrefixedSchemas,
                     queryExpression,
-                    searchSpec);
+                    searchSpec,
+                    sStatsBuilder);
         } finally {
             mReadWriteLock.readLock().unlock();
+            if (logger != null && sStatsBuilder != null) {
+                sStatsBuilder.setTotalLatencyMillis(
+                        (int) (SystemClock.elapsedRealtime() - totalLatencyStartMillis));
+                logger.logStats(sStatsBuilder.build());
+            }
         }
     }
 
@@ -688,6 +772,7 @@
      * @param searchSpec Spec for setting filters, raw query etc.
      * @param callerPackageName Package name of the caller, should belong to the {@code callerUid}.
      * @param callerUid UID of the client making the globalQuery call.
+     * @param logger logger to collect globalQuery stats
      * @return The results of performing this search. It may contain an empty list of results if no
      *     documents matched the query.
      * @throws AppSearchException on IcingSearchEngine error.
@@ -697,8 +782,16 @@
             @NonNull String queryExpression,
             @NonNull SearchSpec searchSpec,
             @NonNull String callerPackageName,
-            int callerUid)
+            int callerUid,
+            @Nullable AppSearchLogger logger)
             throws AppSearchException {
+        long totalLatencyStartMillis = SystemClock.elapsedRealtime();
+        SearchStats.Builder sStatsBuilder = null;
+        if (logger != null) {
+            sStatsBuilder =
+                    new SearchStats.Builder(SearchStats.VISIBILITY_SCOPE_GLOBAL, callerPackageName);
+        }
+
         mReadWriteLock.readLock().lock();
         try {
             throwIfClosedLocked();
@@ -753,9 +846,19 @@
             }
 
             return doQueryLocked(
-                    prefixFilters, allowedPrefixedSchemas, queryExpression, searchSpec);
+                    prefixFilters,
+                    allowedPrefixedSchemas,
+                    queryExpression,
+                    searchSpec,
+                    sStatsBuilder);
         } finally {
             mReadWriteLock.readLock().unlock();
+
+            if (logger != null && sStatsBuilder != null) {
+                sStatsBuilder.setTotalLatencyMillis(
+                        (int) (SystemClock.elapsedRealtime() - totalLatencyStartMillis));
+                logger.logStats(sStatsBuilder.build());
+            }
         }
     }
 
@@ -793,8 +896,11 @@
             @NonNull Set<String> prefixes,
             @NonNull Set<String> allowedPrefixedSchemas,
             @NonNull String queryExpression,
-            @NonNull SearchSpec searchSpec)
+            @NonNull SearchSpec searchSpec,
+            @Nullable SearchStats.Builder sStatsBuilder)
             throws AppSearchException {
+        long rewriteSearchSpecLatencyStartMillis = SystemClock.elapsedRealtime();
+
         SearchSpecProto.Builder searchSpecBuilder =
                 SearchSpecToProtoConverter.toSearchSpecProto(searchSpec).toBuilder()
                         .setQuery(queryExpression);
@@ -803,9 +909,17 @@
         // sending request to Icing.
         if (!rewriteSearchSpecForPrefixesLocked(
                 searchSpecBuilder, prefixes, allowedPrefixedSchemas)) {
+            if (sStatsBuilder != null) {
+                sStatsBuilder.setRewriteSearchSpecLatencyMillis(
+                        (int)
+                                (SystemClock.elapsedRealtime()
+                                        - rewriteSearchSpecLatencyStartMillis));
+            }
             return new SearchResultPage(Bundle.EMPTY);
         }
 
+        // rewriteSearchSpec, rewriteResultSpec and convertScoringSpec are all counted in
+        // rewriteSearchSpecLatencyMillis
         ResultSpecProto.Builder resultSpecBuilder =
                 SearchSpecToProtoConverter.toResultSpecProto(searchSpec).toBuilder();
 
@@ -821,15 +935,38 @@
             addPerNamespaceResultGroupingsLocked(
                     resultSpecBuilder, prefixes, searchSpec.getResultGroupingLimit());
         }
-        rewriteResultSpecForPrefixesLocked(resultSpecBuilder, prefixes, allowedPrefixedSchemas);
 
+        rewriteResultSpecForPrefixesLocked(resultSpecBuilder, prefixes, allowedPrefixedSchemas);
         ScoringSpecProto scoringSpec = SearchSpecToProtoConverter.toScoringSpecProto(searchSpec);
+
+        long rewriteSearchSpecLatencyEndMillis = SystemClock.elapsedRealtime();
+
         SearchResultProto searchResultProto =
                 mIcingSearchEngineLocked.search(
                         searchSpecBuilder.build(), scoringSpec, resultSpecBuilder.build());
+
+        if (sStatsBuilder != null) {
+            sStatsBuilder
+                    .setStatusCode(
+                            statusProtoToAppSearchException(searchResultProto.getStatus())
+                                    .getResultCode())
+                    .setRewriteSearchSpecLatencyMillis(
+                            (int)
+                                    (rewriteSearchSpecLatencyEndMillis
+                                            - rewriteSearchSpecLatencyStartMillis));
+            AppSearchLoggerHelper.copyNativeStats(searchResultProto.getQueryStats(), sStatsBuilder);
+        }
+
         checkSuccess(searchResultProto.getStatus());
 
-        return rewriteSearchResultProto(searchResultProto, mSchemaMapLocked);
+        long rewriteSearchResultLatencyStartMillis = SystemClock.elapsedRealtime();
+        SearchResultPage resultPage = rewriteSearchResultProto(searchResultProto, mSchemaMapLocked);
+        if (sStatsBuilder != null) {
+            sStatsBuilder.setRewriteSearchResultLatencyMillis(
+                    (int) (SystemClock.elapsedRealtime() - rewriteSearchResultLatencyStartMillis));
+        }
+
+        return resultPage;
     }
 
     /**
@@ -881,7 +1018,7 @@
             @NonNull String packageName,
             @NonNull String databaseName,
             @NonNull String namespace,
-            @NonNull String uri,
+            @NonNull String documentId,
             long usageTimestampMillis,
             boolean systemUsage)
             throws AppSearchException {
@@ -897,7 +1034,7 @@
             UsageReport report =
                     UsageReport.newBuilder()
                             .setDocumentNamespace(prefixedNamespace)
-                            .setDocumentUri(uri)
+                            .setDocumentUri(documentId)
                             .setUsageTimestampMs(usageTimestampMillis)
                             .setUsageType(usageType)
                             .build();
@@ -910,21 +1047,21 @@
     }
 
     /**
-     * Removes the given document by URI.
+     * Removes the given document by id.
      *
      * <p>This method belongs to mutate group.
      *
      * @param packageName The package name that owns the document.
      * @param databaseName The databaseName the document is in.
      * @param namespace Namespace of the document to remove.
-     * @param uri URI of the document to remove.
+     * @param id ID of the document to remove.
      * @throws AppSearchException on IcingSearchEngine error.
      */
     public void remove(
             @NonNull String packageName,
             @NonNull String databaseName,
             @NonNull String namespace,
-            @NonNull String uri)
+            @NonNull String id)
             throws AppSearchException {
         mReadWriteLock.writeLock().lock();
         try {
@@ -932,7 +1069,7 @@
 
             String prefixedNamespace = createPrefix(packageName, databaseName) + namespace;
             DeleteResultProto deleteResultProto =
-                    mIcingSearchEngineLocked.delete(prefixedNamespace, uri);
+                    mIcingSearchEngineLocked.delete(prefixedNamespace, id);
 
             checkSuccess(deleteResultProto.getStatus());
         } finally {
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java
index 0f23d92..97c8869 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java
@@ -20,7 +20,9 @@
 import android.app.appsearch.exceptions.AppSearchException;
 
 import com.android.server.appsearch.external.localstorage.stats.CallStats;
+import com.android.server.appsearch.external.localstorage.stats.InitializeStats;
 import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats;
+import com.android.server.appsearch.external.localstorage.stats.SearchStats;
 
 /**
  * An interface for implementing client-defined logging AppSearch operations stats.
@@ -39,5 +41,11 @@
     /** Logs {@link PutDocumentStats} */
     void logStats(@NonNull PutDocumentStats stats) throws AppSearchException;
 
+    /** Logs {@link InitializeStats} */
+    void logStats(@NonNull InitializeStats stats) throws AppSearchException;
+
+    /** Logs {@link SearchStats} */
+    void logStats(@NonNull SearchStats stats) throws AppSearchException;
+
     // TODO(b/173532925) Add remaining logStats once we add all the stats.
 }
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java
index cdd7952..4a5ecf1 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java
@@ -18,9 +18,13 @@
 
 import android.annotation.NonNull;
 
+import com.android.server.appsearch.external.localstorage.stats.InitializeStats;
 import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats;
+import com.android.server.appsearch.external.localstorage.stats.SearchStats;
 
+import com.google.android.icing.proto.InitializeStatsProto;
 import com.google.android.icing.proto.PutDocumentStatsProto;
+import com.google.android.icing.proto.QueryStatsProto;
 
 import java.util.Objects;
 
@@ -35,7 +39,7 @@
     private AppSearchLoggerHelper() {}
 
     /**
-     * Copies native stats to builder.
+     * Copies native PutDocument stats to builder.
      *
      * @param fromNativeStats stats copied from
      * @param toStatsBuilder stats copied to
@@ -56,4 +60,64 @@
                 .setNativeExceededMaxNumTokens(
                         fromNativeStats.getTokenizationStats().getExceededMaxTokenNum());
     }
+
+    /**
+     * Copies native Initialize stats to builder.
+     *
+     * @param fromNativeStats stats copied from
+     * @param toStatsBuilder stats copied to
+     */
+    static void copyNativeStats(
+            @NonNull InitializeStatsProto fromNativeStats,
+            @NonNull InitializeStats.Builder toStatsBuilder) {
+        Objects.requireNonNull(fromNativeStats);
+        Objects.requireNonNull(toStatsBuilder);
+        toStatsBuilder
+                .setNativeLatencyMillis(fromNativeStats.getLatencyMs())
+                .setDocumentStoreRecoveryCause(
+                        fromNativeStats.getDocumentStoreRecoveryCause().getNumber())
+                .setIndexRestorationCause(fromNativeStats.getIndexRestorationCause().getNumber())
+                .setSchemaStoreRecoveryCause(
+                        fromNativeStats.getSchemaStoreRecoveryCause().getNumber())
+                .setDocumentStoreRecoveryLatencyMillis(
+                        fromNativeStats.getDocumentStoreRecoveryLatencyMs())
+                .setIndexRestorationLatencyMillis(fromNativeStats.getIndexRestorationLatencyMs())
+                .setSchemaStoreRecoveryLatencyMillis(
+                        fromNativeStats.getSchemaStoreRecoveryLatencyMs())
+                .setDocumentStoreDataStatus(
+                        fromNativeStats.getDocumentStoreDataStatus().getNumber())
+                .setDocumentCount(fromNativeStats.getNumDocuments())
+                .setSchemaTypeCount(fromNativeStats.getNumSchemaTypes());
+    }
+
+    /*
+     * Copy native Query stats to buiilder.
+     *
+     * @param fromNativeStats Stats copied from.
+     * @param toStatsBuilder Stats copied to.
+     */
+    static void copyNativeStats(
+            @NonNull QueryStatsProto fromNativeStats, @NonNull SearchStats.Builder toStatsBuilder) {
+        Objects.requireNonNull(fromNativeStats);
+        Objects.requireNonNull(toStatsBuilder);
+        toStatsBuilder
+                .setNativeLatencyMillis(fromNativeStats.getLatencyMs())
+                .setTermCount(fromNativeStats.getNumTerms())
+                // TODO(b/173532925) query length missing in native
+                // .setNativeQueryLength(0)
+                .setFilteredNamespaceCount(fromNativeStats.getNumNamespacesFiltered())
+                .setFilteredSchemaTypeCount(fromNativeStats.getNumSchemaTypesFiltered())
+                .setRequestedPageSize(fromNativeStats.getRequestedPageSize())
+                .setCurrentPageReturnedResultCount(
+                        fromNativeStats.getNumResultsReturnedCurrentPage())
+                .setIsFirstPage(fromNativeStats.getIsFirstPage())
+                .setParseQueryLatencyMillis(fromNativeStats.getParseQueryLatencyMs())
+                .setRankingStrategy(fromNativeStats.getRankingStrategy().getNumber())
+                .setScoredDocumentCount(fromNativeStats.getNumDocumentsScored())
+                .setScoringLatencyMillis(fromNativeStats.getScoringLatencyMs())
+                .setRankingLatencyMillis(fromNativeStats.getRankingLatencyMs())
+                .setResultWithSnippetsCount(fromNativeStats.getNumResultsWithSnippets())
+                .setDocumentRetrievingLatencyMillis(
+                        fromNativeStats.getDocumentRetrievalLatencyMs());
+    }
 }
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverter.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverter.java
index 5ff56ab..0cdad37 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverter.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverter.java
@@ -52,7 +52,7 @@
         Objects.requireNonNull(document);
         DocumentProto.Builder mProtoBuilder = DocumentProto.newBuilder();
         mProtoBuilder
-                .setUri(document.getUri())
+                .setUri(document.getId())
                 .setSchema(document.getSchemaType())
                 .setNamespace(document.getNamespace())
                 .setScore(document.getScore())
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SchemaToProtoConverter.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SchemaToProtoConverter.java
index e3fa7e0..80f7007 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SchemaToProtoConverter.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SchemaToProtoConverter.java
@@ -104,7 +104,7 @@
                     .setDocumentIndexingConfig(
                             DocumentIndexingConfig.newBuilder()
                                     .setIndexNestedProperties(
-                                            documentProperty.isIndexNestedProperties()));
+                                            documentProperty.shouldIndexNestedProperties()));
         }
         return builder.build();
     }
@@ -174,10 +174,10 @@
     @NonNull
     private static AppSearchSchema.DocumentPropertyConfig toDocumentPropertyConfig(
             @NonNull PropertyConfigProto proto) {
-        return new AppSearchSchema.DocumentPropertyConfig.Builder(proto.getPropertyName())
+        return new AppSearchSchema.DocumentPropertyConfig.Builder(
+                        proto.getPropertyName(), proto.getSchemaType())
                 .setCardinality(proto.getCardinality().getNumber())
-                .setSchemaType(proto.getSchemaType())
-                .setIndexNestedProperties(
+                .setShouldIndexNestedProperties(
                         proto.getDocumentIndexingConfig().getIndexNestedProperties())
                 .build();
     }
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java
index 57c1590..84220d7 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/converter/SearchResultToProtoConverter.java
@@ -125,8 +125,7 @@
 
     private static SearchResult.MatchInfo toMatchInfo(
             @NonNull SnippetMatchProto snippetMatchProto, @NonNull String propertyPath) {
-        return new SearchResult.MatchInfo.Builder()
-                .setPropertyPath(propertyPath)
+        return new SearchResult.MatchInfo.Builder(propertyPath)
                 .setExactMatchRange(
                         new SearchResult.MatchRange(
                                 snippetMatchProto.getExactMatchPosition(),
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/InitializeStats.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/InitializeStats.java
new file mode 100644
index 0000000..5364a0c
--- /dev/null
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/InitializeStats.java
@@ -0,0 +1,404 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appsearch.external.localstorage.stats;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.app.appsearch.AppSearchResult;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * Class holds detailed stats for initialization
+ *
+ * @hide
+ */
+public final class InitializeStats {
+    /**
+     * The cause of IcingSearchEngine recovering from a previous bad state during initialization.
+     */
+    @IntDef(
+            value = {
+                // It needs to be sync with RecoveryCause in
+                // external/icing/proto/icing/proto/logging.proto#InitializeStatsProto
+                RECOVERY_CAUSE_NONE,
+                RECOVERY_CAUSE_DATA_LOSS,
+                RECOVERY_CAUSE_INCONSISTENT_WITH_GROUND_TRUTH,
+                RECOVERY_CAUSE_TOTAL_CHECKSUM_MISMATCH,
+                RECOVERY_CAUSE_IO_ERROR,
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface RecoveryCause {}
+
+    // No recovery happened.
+    public static final int RECOVERY_CAUSE_NONE = 0;
+    // Data loss in ground truth.
+    public static final int RECOVERY_CAUSE_DATA_LOSS = 1;
+    // Data in index is inconsistent with ground truth.
+    public static final int RECOVERY_CAUSE_INCONSISTENT_WITH_GROUND_TRUTH = 2;
+    // Total checksum of all the components does not match.
+    public static final int RECOVERY_CAUSE_TOTAL_CHECKSUM_MISMATCH = 3;
+    // Random I/O errors.
+    public static final int RECOVERY_CAUSE_IO_ERROR = 4;
+
+    /** Status regarding how much data is lost during the initialization. */
+    @IntDef(
+            value = {
+                // It needs to be sync with DocumentStoreDataStatus in
+                // external/icing/proto/icing/proto/logging.proto#InitializeStatsProto
+
+                DOCUMENT_STORE_DATA_STATUS_NO_DATA_LOSS,
+                DOCUMENT_STORE_DATA_STATUS_PARTIAL_LOSS,
+                DOCUMENT_STORE_DATA_STATUS_COMPLETE_LOSS,
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface DocumentStoreDataStatus {}
+
+    // Document store is successfully initialized or fully recovered.
+    public static final int DOCUMENT_STORE_DATA_STATUS_NO_DATA_LOSS = 0;
+    // Ground truth data is partially lost.
+    public static final int DOCUMENT_STORE_DATA_STATUS_PARTIAL_LOSS = 1;
+    // Ground truth data is completely lost.
+    public static final int DOCUMENT_STORE_DATA_STATUS_COMPLETE_LOSS = 2;
+
+    @AppSearchResult.ResultCode private final int mStatusCode;
+    private final int mTotalLatencyMillis;
+    /** Whether the initialize() detects deSync. */
+    private final boolean mHasDeSync;
+    /** Time used to read and process the schema and namespaces. */
+    private final int mPrepareSchemaAndNamespacesLatencyMillis;
+    /** Time used to read and process the visibility store. */
+    private final int mPrepareVisibilityStoreLatencyMillis;
+    /** Overall time used for the native function call. */
+    private final int mNativeLatencyMillis;
+
+    @RecoveryCause private final int mNativeDocumentStoreRecoveryCause;
+    @RecoveryCause private final int mNativeIndexRestorationCause;
+    @RecoveryCause private final int mNativeSchemaStoreRecoveryCause;
+    /** Time used to recover the document store. */
+    private final int mNativeDocumentStoreRecoveryLatencyMillis;
+    /** Time used to restore the index. */
+    private final int mNativeIndexRestorationLatencyMillis;
+    /** Time used to recover the schema store. */
+    private final int mNativeSchemaStoreRecoveryLatencyMillis;
+    /** Status regarding how much data is lost during the initialization. */
+    private final int mNativeDocumentStoreDataStatus;
+    /**
+     * Returns number of documents currently in document store. Those may include alive, deleted,
+     * and expired documents.
+     */
+    private final int mNativeNumDocuments;
+    /** Returns number of schema types currently in the schema store. */
+    private final int mNativeNumSchemaTypes;
+
+    /** Returns the status of the initialization. */
+    @AppSearchResult.ResultCode
+    public int getStatusCode() {
+        return mStatusCode;
+    }
+
+    /** Returns the total latency in milliseconds for the initialization. */
+    public int getTotalLatencyMillis() {
+        return mTotalLatencyMillis;
+    }
+
+    /**
+     * Returns whether the initialize() detects deSync.
+     *
+     * <p>If there is a deSync, it means AppSearch and IcingSearchEngine have an inconsistent view
+     * of what data should exist.
+     */
+    public boolean hasDeSync() {
+        return mHasDeSync;
+    }
+
+    /** Returns time used to read and process the schema and namespaces. */
+    public int getPrepareSchemaAndNamespacesLatencyMillis() {
+        return mPrepareSchemaAndNamespacesLatencyMillis;
+    }
+
+    /** Returns time used to read and process the visibility file. */
+    public int getPrepareVisibilityStoreLatencyMillis() {
+        return mPrepareVisibilityStoreLatencyMillis;
+    }
+
+    /** Returns overall time used for the native function call. */
+    public int getNativeLatencyMillis() {
+        return mNativeLatencyMillis;
+    }
+
+    /**
+     * Returns recovery cause for document store.
+     *
+     * <p>Possible recovery causes for document store:
+     * <li>{@link InitializeStats#RECOVERY_CAUSE_DATA_LOSS}
+     * <li>{@link InitializeStats#RECOVERY_CAUSE_TOTAL_CHECKSUM_MISMATCH}
+     * <li>{@link InitializeStats#RECOVERY_CAUSE_IO_ERROR}
+     */
+    @RecoveryCause
+    public int getDocumentStoreRecoveryCause() {
+        return mNativeDocumentStoreRecoveryCause;
+    }
+
+    /**
+     * Returns restoration cause for index store.
+     *
+     * <p>Possible causes:
+     * <li>{@link InitializeStats#RECOVERY_CAUSE_INCONSISTENT_WITH_GROUND_TRUTH}
+     * <li>{@link InitializeStats#RECOVERY_CAUSE_TOTAL_CHECKSUM_MISMATCH}
+     * <li>{@link InitializeStats#RECOVERY_CAUSE_IO_ERROR}
+     */
+    @RecoveryCause
+    public int getIndexRestorationCause() {
+        return mNativeIndexRestorationCause;
+    }
+
+    /**
+     * Returns recovery cause for schema store.
+     *
+     * <p>Possible causes:
+     * <li>IO_ERROR
+     */
+    @RecoveryCause
+    public int getSchemaStoreRecoveryCause() {
+        return mNativeSchemaStoreRecoveryCause;
+    }
+
+    /** Returns time used to recover the document store. */
+    public int getDocumentStoreRecoveryLatencyMillis() {
+        return mNativeDocumentStoreRecoveryLatencyMillis;
+    }
+
+    /** Returns time used to restore the index. */
+    public int getIndexRestorationLatencyMillis() {
+        return mNativeIndexRestorationLatencyMillis;
+    }
+
+    /** Returns time used to recover the schema store. */
+    public int getSchemaStoreRecoveryLatencyMillis() {
+        return mNativeSchemaStoreRecoveryLatencyMillis;
+    }
+
+    /** Returns status about how much data is lost during the initialization. */
+    @DocumentStoreDataStatus
+    public int getDocumentStoreDataStatus() {
+        return mNativeDocumentStoreDataStatus;
+    }
+
+    /**
+     * Returns number of documents currently in document store. Those may include alive, deleted,
+     * and expired documents.
+     */
+    public int getDocumentCount() {
+        return mNativeNumDocuments;
+    }
+
+    /** Returns number of schema types currently in the schema store. */
+    public int getSchemaTypeCount() {
+        return mNativeNumSchemaTypes;
+    }
+
+    InitializeStats(@NonNull Builder builder) {
+        Objects.requireNonNull(builder);
+        mStatusCode = builder.mStatusCode;
+        mTotalLatencyMillis = builder.mTotalLatencyMillis;
+        mHasDeSync = builder.mHasDeSync;
+        mPrepareSchemaAndNamespacesLatencyMillis = builder.mPrepareSchemaAndNamespacesLatencyMillis;
+        mPrepareVisibilityStoreLatencyMillis = builder.mPrepareVisibilityStoreLatencyMillis;
+        mNativeLatencyMillis = builder.mNativeLatencyMillis;
+        mNativeDocumentStoreRecoveryCause = builder.mNativeDocumentStoreRecoveryCause;
+        mNativeIndexRestorationCause = builder.mNativeIndexRestorationCause;
+        mNativeSchemaStoreRecoveryCause = builder.mNativeSchemaStoreRecoveryCause;
+        mNativeDocumentStoreRecoveryLatencyMillis =
+                builder.mNativeDocumentStoreRecoveryLatencyMillis;
+        mNativeIndexRestorationLatencyMillis = builder.mNativeIndexRestorationLatencyMillis;
+        mNativeSchemaStoreRecoveryLatencyMillis = builder.mNativeSchemaStoreRecoveryLatencyMillis;
+        mNativeDocumentStoreDataStatus = builder.mNativeDocumentStoreDataStatus;
+        mNativeNumDocuments = builder.mNativeNumDocuments;
+        mNativeNumSchemaTypes = builder.mNativeNumSchemaTypes;
+    }
+
+    /** Builder for {@link InitializeStats}. */
+    public static class Builder {
+        @AppSearchResult.ResultCode int mStatusCode;
+        int mTotalLatencyMillis;
+        boolean mHasDeSync;
+        int mPrepareSchemaAndNamespacesLatencyMillis;
+        int mPrepareVisibilityStoreLatencyMillis;
+        int mNativeLatencyMillis;
+        @RecoveryCause int mNativeDocumentStoreRecoveryCause;
+        @RecoveryCause int mNativeIndexRestorationCause;
+        @RecoveryCause int mNativeSchemaStoreRecoveryCause;
+        int mNativeDocumentStoreRecoveryLatencyMillis;
+        int mNativeIndexRestorationLatencyMillis;
+        int mNativeSchemaStoreRecoveryLatencyMillis;
+        @DocumentStoreDataStatus int mNativeDocumentStoreDataStatus;
+        int mNativeNumDocuments;
+        int mNativeNumSchemaTypes;
+
+        /** Sets the status of the initialization. */
+        @NonNull
+        public Builder setStatusCode(@AppSearchResult.ResultCode int statusCode) {
+            mStatusCode = statusCode;
+            return this;
+        }
+
+        /** Sets the total latency of the initialization in milliseconds. */
+        @NonNull
+        public Builder setTotalLatencyMillis(int totalLatencyMillis) {
+            mTotalLatencyMillis = totalLatencyMillis;
+            return this;
+        }
+
+        /**
+         * Sets whether the initialize() detects deSync.
+         *
+         * <p>If there is a deSync, it means AppSearch and IcingSearchEngine have an inconsistent
+         * view of what data should exist.
+         */
+        @NonNull
+        public Builder setHasDeSync(boolean hasDeSync) {
+            mHasDeSync = hasDeSync;
+            return this;
+        }
+
+        /** Sets time used to read and process the schema and namespaces. */
+        @NonNull
+        public Builder setPrepareSchemaAndNamespacesLatencyMillis(
+                int prepareSchemaAndNamespacesLatencyMillis) {
+            mPrepareSchemaAndNamespacesLatencyMillis = prepareSchemaAndNamespacesLatencyMillis;
+            return this;
+        }
+
+        /** Sets time used to read and process the visibility file. */
+        @NonNull
+        public Builder setPrepareVisibilityStoreLatencyMillis(
+                int prepareVisibilityStoreLatencyMillis) {
+            mPrepareVisibilityStoreLatencyMillis = prepareVisibilityStoreLatencyMillis;
+            return this;
+        }
+
+        /** Sets overall time used for the native function call. */
+        @NonNull
+        public Builder setNativeLatencyMillis(int nativeLatencyMillis) {
+            mNativeLatencyMillis = nativeLatencyMillis;
+            return this;
+        }
+
+        /**
+         * Sets recovery cause for document store.
+         *
+         * <p>Possible recovery causes for document store:
+         * <li>{@link InitializeStats#RECOVERY_CAUSE_DATA_LOSS}
+         * <li>{@link InitializeStats#RECOVERY_CAUSE_TOTAL_CHECKSUM_MISMATCH}
+         * <li>{@link InitializeStats#RECOVERY_CAUSE_IO_ERROR}
+         */
+        @NonNull
+        public Builder setDocumentStoreRecoveryCause(
+                @RecoveryCause int documentStoreRecoveryCause) {
+            mNativeDocumentStoreRecoveryCause = documentStoreRecoveryCause;
+            return this;
+        }
+
+        /**
+         * Sets restoration cause for index store.
+         *
+         * <p>Possible causes:
+         * <li>{@link InitializeStats#DOCUMENT_STORE_DATA_STATUS_COMPLETE_LOSS}
+         * <li>{@link InitializeStats#RECOVERY_CAUSE_TOTAL_CHECKSUM_MISMATCH}
+         * <li>{@link InitializeStats#RECOVERY_CAUSE_IO_ERROR}
+         */
+        @NonNull
+        public Builder setIndexRestorationCause(@RecoveryCause int indexRestorationCause) {
+            mNativeIndexRestorationCause = indexRestorationCause;
+            return this;
+        }
+
+        /**
+         * Returns recovery cause for schema store.
+         *
+         * <p>Possible causes:
+         * <li>{@link InitializeStats#RECOVERY_CAUSE_IO_ERROR}
+         */
+        @NonNull
+        public Builder setSchemaStoreRecoveryCause(@RecoveryCause int schemaStoreRecoveryCause) {
+            mNativeSchemaStoreRecoveryCause = schemaStoreRecoveryCause;
+            return this;
+        }
+
+        /** Sets time used to recover the document store. */
+        @NonNull
+        public Builder setDocumentStoreRecoveryLatencyMillis(
+                int documentStoreRecoveryLatencyMillis) {
+            mNativeDocumentStoreRecoveryLatencyMillis = documentStoreRecoveryLatencyMillis;
+            return this;
+        }
+
+        /** Sets time used to restore the index. */
+        @NonNull
+        public Builder setIndexRestorationLatencyMillis(int indexRestorationLatencyMillis) {
+            mNativeIndexRestorationLatencyMillis = indexRestorationLatencyMillis;
+            return this;
+        }
+
+        /** Sets time used to recover the schema store. */
+        @NonNull
+        public Builder setSchemaStoreRecoveryLatencyMillis(int schemaStoreRecoveryLatencyMillis) {
+            mNativeSchemaStoreRecoveryLatencyMillis = schemaStoreRecoveryLatencyMillis;
+            return this;
+        }
+
+        /**
+         * Sets Native Document Store Data status. status is defined in
+         * external/icing/proto/icing/proto/logging.proto
+         */
+        @NonNull
+        public Builder setDocumentStoreDataStatus(
+                @DocumentStoreDataStatus int documentStoreDataStatus) {
+            mNativeDocumentStoreDataStatus = documentStoreDataStatus;
+            return this;
+        }
+
+        /**
+         * Sets number of documents currently in document store. Those may include alive, deleted,
+         * and expired documents.
+         */
+        @NonNull
+        public Builder setDocumentCount(int numDocuments) {
+            mNativeNumDocuments = numDocuments;
+            return this;
+        }
+
+        /** Sets number of schema types currently in the schema store. */
+        @NonNull
+        public Builder setSchemaTypeCount(int numSchemaTypes) {
+            mNativeNumSchemaTypes = numSchemaTypes;
+            return this;
+        }
+
+        /**
+         * Constructs a new {@link InitializeStats} from the contents of this {@link
+         * InitializeStats.Builder}
+         */
+        @NonNull
+        public InitializeStats build() {
+            return new InitializeStats(/* builder= */ this);
+        }
+    }
+}
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SearchStats.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SearchStats.java
new file mode 100644
index 0000000..7b22b2f
--- /dev/null
+++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SearchStats.java
@@ -0,0 +1,460 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.appsearch.external.localstorage.stats;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.appsearch.AppSearchResult;
+import android.app.appsearch.SearchSpec;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * Class holds detailed stats for {@link android.app.appsearch.AppSearchSession#search(String,
+ * SearchSpec)}
+ *
+ * @hide
+ */
+public final class SearchStats {
+    @IntDef(
+            value = {
+                // Searches apps' own documents.
+                VISIBILITY_SCOPE_LOCAL,
+                // Searches the global documents. Including platform surfaceable and 3p-access.
+                VISIBILITY_SCOPE_GLOBAL,
+                // TODO(b/173532925) Add THIRD_PARTY_ACCESS once we can distinguish platform
+                //  surfaceable from 3p access(right both of them are categorized as
+                //  VISIBILITY_SCOPE_GLOBAL)
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface VisibilityScope {}
+
+    // Searches apps' own documents.
+    public static final int VISIBILITY_SCOPE_LOCAL = 1;
+    // Searches the global documents. Including platform surfaceable and 3p-access.
+    public static final int VISIBILITY_SCOPE_GLOBAL = 2;
+
+    @NonNull private final String mPackageName;
+    @Nullable private final String mDatabase;
+    /**
+     * The status code returned by {@link AppSearchResult#getResultCode()} for the call or internal
+     * state.
+     */
+    @AppSearchResult.ResultCode private final int mStatusCode;
+
+    private final int mTotalLatencyMillis;
+    /** Time used to rewrite the search spec. */
+    private final int mRewriteSearchSpecLatencyMillis;
+    /** Time used to rewrite the search results. */
+    private final int mRewriteSearchResultLatencyMillis;
+    /** Defines the scope the query is searching over */
+    @VisibilityScope private final int mVisibilityScope;
+    /** Overall time used for the native function call. */
+    private final int mNativeLatencyMillis;
+    /** Number of terms in the query string. */
+    private final int mNativeNumTerms;
+    /** Length of the query string. */
+    private final int mNativeQueryLength;
+    /** Number of namespaces filtered. */
+    private final int mNativeNumNamespacesFiltered;
+    /** Number of schema types filtered. */
+    private final int mNativeNumSchemaTypesFiltered;
+    /** The requested number of results in one page. */
+    private final int mNativeRequestedPageSize;
+    /** The actual number of results returned in the current page. */
+    private final int mNativeNumResultsReturnedCurrentPage;
+    /**
+     * Whether the function call is querying the first page. If it's not, Icing will fetch the
+     * results from cache so that some steps may be skipped.
+     */
+    private final boolean mNativeIsFirstPage;
+    /**
+     * Time used to parse the query, including 2 parts: tokenizing and transforming tokens into an
+     * iterator tree.
+     */
+    private final int mNativeParseQueryLatencyMillis;
+    /** Strategy of scoring and ranking. */
+    @SearchSpec.RankingStrategy private final int mNativeRankingStrategy;
+    /** Number of documents scored. */
+    private final int mNativeNumDocumentsScored;
+    /** Time used to score the raw results. */
+    private final int mNativeScoringLatencyMillis;
+    /** Time used to rank the scored results. */
+    private final int mNativeRankingLatencyMillis;
+    /**
+     * Time used to fetch the document protos. Note that it includes the time to snippet if {@link
+     * SearchStats#mNativeNumResultsWithSnippets} is greater than 0.
+     */
+    private final int mNativeDocumentRetrievingLatencyMillis;
+    /** How many snippets are calculated. */
+    private final int mNativeNumResultsWithSnippets;
+
+    SearchStats(@NonNull Builder builder) {
+        Objects.requireNonNull(builder);
+        mPackageName = builder.mPackageName;
+        mDatabase = builder.mDatabase;
+        mStatusCode = builder.mStatusCode;
+        mTotalLatencyMillis = builder.mTotalLatencyMillis;
+        mRewriteSearchSpecLatencyMillis = builder.mRewriteSearchSpecLatencyMillis;
+        mRewriteSearchResultLatencyMillis = builder.mRewriteSearchResultLatencyMillis;
+        mVisibilityScope = builder.mVisibilityScope;
+        mNativeLatencyMillis = builder.mNativeLatencyMillis;
+        mNativeNumTerms = builder.mNativeNumTerms;
+        mNativeQueryLength = builder.mNativeQueryLength;
+        mNativeNumNamespacesFiltered = builder.mNativeNumNamespacesFiltered;
+        mNativeNumSchemaTypesFiltered = builder.mNativeNumSchemaTypesFiltered;
+        mNativeRequestedPageSize = builder.mNativeRequestedPageSize;
+        mNativeNumResultsReturnedCurrentPage = builder.mNativeNumResultsReturnedCurrentPage;
+        mNativeIsFirstPage = builder.mNativeIsFirstPage;
+        mNativeParseQueryLatencyMillis = builder.mNativeParseQueryLatencyMillis;
+        mNativeRankingStrategy = builder.mNativeRankingStrategy;
+        mNativeNumDocumentsScored = builder.mNativeNumDocumentsScored;
+        mNativeScoringLatencyMillis = builder.mNativeScoringLatencyMillis;
+        mNativeRankingLatencyMillis = builder.mNativeRankingLatencyMillis;
+        mNativeNumResultsWithSnippets = builder.mNativeNumResultsWithSnippets;
+        mNativeDocumentRetrievingLatencyMillis = builder.mNativeDocumentRetrievingLatencyMillis;
+    }
+
+    /** Returns the package name of the session. */
+    @NonNull
+    public String getPackageName() {
+        return mPackageName;
+    }
+
+    /**
+     * Returns the database name of the session.
+     *
+     * @return database name used by the session. {@code null} if and only if it is a global
+     *     search(visibilityScope is {@link SearchStats#VISIBILITY_SCOPE_GLOBAL}).
+     */
+    @Nullable
+    public String getDatabase() {
+        return mDatabase;
+    }
+
+    /** Returns status of the search. */
+    @AppSearchResult.ResultCode
+    public int getStatusCode() {
+        return mStatusCode;
+    }
+
+    /** Returns the total latency of the search. */
+    public int getTotalLatencyMillis() {
+        return mTotalLatencyMillis;
+    }
+
+    /** Returns how much time spent on rewriting the {@link SearchSpec}. */
+    public int getRewriteSearchSpecLatencyMillis() {
+        return mRewriteSearchSpecLatencyMillis;
+    }
+
+    /** Returns how much time spent on rewriting the {@link android.app.appsearch.SearchResult}. */
+    public int getRewriteSearchResultLatencyMillis() {
+        return mRewriteSearchResultLatencyMillis;
+    }
+
+    /** Returns the visibility scope of the search. */
+    @VisibilityScope
+    public int getVisibilityScope() {
+        return mVisibilityScope;
+    }
+
+    /** Returns how much time spent on the native calls. */
+    public int getNativeLatencyMillis() {
+        return mNativeLatencyMillis;
+    }
+
+    /** Returns number of terms in the search string. */
+    public int getTermCount() {
+        return mNativeNumTerms;
+    }
+
+    /** Returns the length of the search string. */
+    public int getQueryLength() {
+        return mNativeQueryLength;
+    }
+
+    /** Returns number of namespaces filtered. */
+    public int getFilteredNamespaceCount() {
+        return mNativeNumNamespacesFiltered;
+    }
+
+    /** Returns number of schema types filtered. */
+    public int getFilteredSchemaTypeCount() {
+        return mNativeNumSchemaTypesFiltered;
+    }
+
+    /** Returns the requested number of results in one page. */
+    public int getRequestedPageSize() {
+        return mNativeRequestedPageSize;
+    }
+
+    /** Returns the actual number of results returned in the current page. */
+    public int getCurrentPageReturnedResultCount() {
+        return mNativeNumResultsReturnedCurrentPage;
+    }
+
+    // TODO(b/185184738) Make it an integer to show how many pages having been returned.
+    /** Returns whether the function call is querying the first page. */
+    public boolean isFirstPage() {
+        return mNativeIsFirstPage;
+    }
+
+    /**
+     * Returns time used to parse the query, including 2 parts: tokenizing and transforming tokens
+     * into an iterator tree.
+     */
+    public int getParseQueryLatencyMillis() {
+        return mNativeParseQueryLatencyMillis;
+    }
+
+    /** Returns strategy of scoring and ranking. */
+    @SearchSpec.RankingStrategy
+    public int getRankingStrategy() {
+        return mNativeRankingStrategy;
+    }
+
+    /** Returns number of documents scored. */
+    public int getScoredDocumentCount() {
+        return mNativeNumDocumentsScored;
+    }
+
+    /** Returns time used to score the raw results. */
+    public int getScoringLatencyMillis() {
+        return mNativeScoringLatencyMillis;
+    }
+
+    /** Returns time used to rank the scored results. */
+    public int getRankingLatencyMillis() {
+        return mNativeRankingLatencyMillis;
+    }
+
+    /**
+     * Returns time used to fetch the document protos. Note that it includes the time to snippet if
+     * {@link SearchStats#mNativeNumResultsWithSnippets} is not zero.
+     */
+    public int getDocumentRetrievingLatencyMillis() {
+        return mNativeDocumentRetrievingLatencyMillis;
+    }
+
+    /** Returns the number of the results in the page returned were snippeted. */
+    public int getResultWithSnippetsCount() {
+        return mNativeNumResultsWithSnippets;
+    }
+
+    /** Builder for {@link SearchStats} */
+    public static class Builder {
+        @NonNull final String mPackageName;
+        @Nullable String mDatabase;
+        @AppSearchResult.ResultCode int mStatusCode;
+        int mTotalLatencyMillis;
+        int mRewriteSearchSpecLatencyMillis;
+        int mRewriteSearchResultLatencyMillis;
+        int mVisibilityScope;
+        int mNativeLatencyMillis;
+        int mNativeNumTerms;
+        int mNativeQueryLength;
+        int mNativeNumNamespacesFiltered;
+        int mNativeNumSchemaTypesFiltered;
+        int mNativeRequestedPageSize;
+        int mNativeNumResultsReturnedCurrentPage;
+        boolean mNativeIsFirstPage;
+        int mNativeParseQueryLatencyMillis;
+        int mNativeRankingStrategy;
+        int mNativeNumDocumentsScored;
+        int mNativeScoringLatencyMillis;
+        int mNativeRankingLatencyMillis;
+        int mNativeNumResultsWithSnippets;
+        int mNativeDocumentRetrievingLatencyMillis;
+
+        /**
+         * Constructor
+         *
+         * @param visibilityScope scope for the corresponding search.
+         * @param packageName name of the calling package.
+         */
+        public Builder(@VisibilityScope int visibilityScope, @NonNull String packageName) {
+            mVisibilityScope = visibilityScope;
+            mPackageName = Objects.requireNonNull(packageName);
+        }
+
+        /** Sets the database used by the session. */
+        @NonNull
+        public Builder setDatabase(@NonNull String database) {
+            mDatabase = Objects.requireNonNull(database);
+            return this;
+        }
+
+        /** Sets the status of the search. */
+        @NonNull
+        public Builder setStatusCode(@AppSearchResult.ResultCode int statusCode) {
+            mStatusCode = statusCode;
+            return this;
+        }
+
+        /** Sets total latency for the search. */
+        @NonNull
+        public Builder setTotalLatencyMillis(int totalLatencyMillis) {
+            mTotalLatencyMillis = totalLatencyMillis;
+            return this;
+        }
+
+        /** Sets time used to rewrite the search spec. */
+        @NonNull
+        public Builder setRewriteSearchSpecLatencyMillis(int rewriteSearchSpecLatencyMillis) {
+            mRewriteSearchSpecLatencyMillis = rewriteSearchSpecLatencyMillis;
+            return this;
+        }
+
+        /** Sets time used to rewrite the search results. */
+        @NonNull
+        public Builder setRewriteSearchResultLatencyMillis(int rewriteSearchResultLatencyMillis) {
+            mRewriteSearchResultLatencyMillis = rewriteSearchResultLatencyMillis;
+            return this;
+        }
+
+        /** Sets overall time used for the native function calls. */
+        @NonNull
+        public Builder setNativeLatencyMillis(int nativeLatencyMillis) {
+            mNativeLatencyMillis = nativeLatencyMillis;
+            return this;
+        }
+
+        /** Sets number of terms in the search string. */
+        @NonNull
+        public Builder setTermCount(int termCount) {
+            mNativeNumTerms = termCount;
+            return this;
+        }
+
+        /** Sets length of the search string. */
+        @NonNull
+        public Builder setQueryLength(int queryLength) {
+            mNativeQueryLength = queryLength;
+            return this;
+        }
+
+        /** Sets number of namespaces filtered. */
+        @NonNull
+        public Builder setFilteredNamespaceCount(int filteredNamespaceCount) {
+            mNativeNumNamespacesFiltered = filteredNamespaceCount;
+            return this;
+        }
+
+        /** Sets number of schema types filtered. */
+        @NonNull
+        public Builder setFilteredSchemaTypeCount(int filteredSchemaTypeCount) {
+            mNativeNumSchemaTypesFiltered = filteredSchemaTypeCount;
+            return this;
+        }
+
+        /** Sets the requested number of results in one page. */
+        @NonNull
+        public Builder setRequestedPageSize(int requestedPageSize) {
+            mNativeRequestedPageSize = requestedPageSize;
+            return this;
+        }
+
+        /** Sets the actual number of results returned in the current page. */
+        @NonNull
+        public Builder setCurrentPageReturnedResultCount(int currentPageReturnedResultCount) {
+            mNativeNumResultsReturnedCurrentPage = currentPageReturnedResultCount;
+            return this;
+        }
+
+        /**
+         * Sets whether the function call is querying the first page. If it's not, Icing will fetch
+         * the results from cache so that some steps may be skipped.
+         */
+        @NonNull
+        public Builder setIsFirstPage(boolean nativeIsFirstPage) {
+            mNativeIsFirstPage = nativeIsFirstPage;
+            return this;
+        }
+
+        /**
+         * Sets time used to parse the query, including 2 parts: tokenizing and transforming tokens
+         * into an iterator tree.
+         */
+        @NonNull
+        public Builder setParseQueryLatencyMillis(int parseQueryLatencyMillis) {
+            mNativeParseQueryLatencyMillis = parseQueryLatencyMillis;
+            return this;
+        }
+
+        /** Sets strategy of scoring and ranking. */
+        @NonNull
+        public Builder setRankingStrategy(@SearchSpec.RankingStrategy int rankingStrategy) {
+            mNativeRankingStrategy = rankingStrategy;
+            return this;
+        }
+
+        /** Sets number of documents scored. */
+        @NonNull
+        public Builder setScoredDocumentCount(int scoredDocumentCount) {
+            mNativeNumDocumentsScored = scoredDocumentCount;
+            return this;
+        }
+
+        /** Sets time used to score the raw results. */
+        @NonNull
+        public Builder setScoringLatencyMillis(int scoringLatencyMillis) {
+            mNativeScoringLatencyMillis = scoringLatencyMillis;
+            return this;
+        }
+
+        /** Sets time used to rank the scored results. */
+        @NonNull
+        public Builder setRankingLatencyMillis(int rankingLatencyMillis) {
+            mNativeRankingLatencyMillis = rankingLatencyMillis;
+            return this;
+        }
+
+        /** Sets time used to fetch the document protos. */
+        @NonNull
+        public Builder setDocumentRetrievingLatencyMillis(int documentRetrievingLatencyMillis) {
+            mNativeDocumentRetrievingLatencyMillis = documentRetrievingLatencyMillis;
+            return this;
+        }
+
+        /** Sets how many snippets are calculated. */
+        @NonNull
+        public Builder setResultWithSnippetsCount(int resultWithSnippetsCount) {
+            mNativeNumResultsWithSnippets = resultWithSnippetsCount;
+            return this;
+        }
+
+        /**
+         * Constructs a new {@link SearchStats} from the contents of this {@link
+         * SearchStats.Builder}.
+         */
+        @NonNull
+        public SearchStats build() {
+            if (mDatabase == null) {
+                Preconditions.checkState(
+                        mVisibilityScope != SearchStats.VISIBILITY_SCOPE_LOCAL,
+                        "database can not be null if visibilityScope is local.");
+            }
+
+            return new SearchStats(/* builder= */ this);
+        }
+    }
+}
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
index 731ab35..88f238e 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java
@@ -31,7 +31,9 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.appsearch.external.localstorage.AppSearchLogger;
 import com.android.server.appsearch.external.localstorage.stats.CallStats;
+import com.android.server.appsearch.external.localstorage.stats.InitializeStats;
 import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats;
+import com.android.server.appsearch.external.localstorage.stats.SearchStats;
 
 import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
@@ -189,6 +191,16 @@
         }
     }
 
+    @Override
+    public void logStats(@NonNull InitializeStats stats) throws AppSearchException {
+        // TODO(b/173532925): Implement
+    }
+
+    @Override
+    public void logStats(@NonNull SearchStats stats) throws AppSearchException {
+        // TODO(b/173532925): Implement
+    }
+
     /**
      * Removes cached UID for package.
      *
diff --git a/apex/appsearch/synced_jetpack_changeid.txt b/apex/appsearch/synced_jetpack_changeid.txt
index f99664b..10bba13 100644
--- a/apex/appsearch/synced_jetpack_changeid.txt
+++ b/apex/appsearch/synced_jetpack_changeid.txt
@@ -1 +1 @@
-If9d1d770d2327d7d0db7d82acfc54787b5de64bc
+I19dac52031c47099f621eced9f148931f1021f25
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/AppSearchSessionShimImpl.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/AppSearchSessionShimImpl.java
index 6193367..930cd60 100644
--- a/apex/appsearch/testing/java/com/android/server/appsearch/testing/AppSearchSessionShimImpl.java
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/AppSearchSessionShimImpl.java
@@ -24,10 +24,10 @@
 import android.app.appsearch.AppSearchSessionShim;
 import android.app.appsearch.BatchResultCallback;
 import android.app.appsearch.GenericDocument;
-import android.app.appsearch.GetByUriRequest;
+import android.app.appsearch.GetByDocumentIdRequest;
 import android.app.appsearch.GetSchemaResponse;
 import android.app.appsearch.PutDocumentsRequest;
-import android.app.appsearch.RemoveByUriRequest;
+import android.app.appsearch.RemoveByDocumentIdRequest;
 import android.app.appsearch.ReportUsageRequest;
 import android.app.appsearch.SearchResults;
 import android.app.appsearch.SearchResultsShim;
@@ -121,11 +121,12 @@
 
     @Override
     @NonNull
-    public ListenableFuture<AppSearchBatchResult<String, GenericDocument>> getByUri(
-            @NonNull GetByUriRequest request) {
+    public ListenableFuture<AppSearchBatchResult<String, GenericDocument>> getByDocumentId(
+            @NonNull GetByDocumentIdRequest request) {
         SettableFuture<AppSearchBatchResult<String, GenericDocument>> future =
                 SettableFuture.create();
-        mAppSearchSession.getByUri(request, mExecutor, new BatchResultCallbackAdapter<>(future));
+        mAppSearchSession.getByDocumentId(
+                request, mExecutor, new BatchResultCallbackAdapter<>(future));
         return future;
     }
 
@@ -148,7 +149,7 @@
     @Override
     @NonNull
     public ListenableFuture<AppSearchBatchResult<String, Void>> remove(
-            @NonNull RemoveByUriRequest request) {
+            @NonNull RemoveByDocumentIdRequest request) {
         SettableFuture<AppSearchBatchResult<String, Void>> future = SettableFuture.create();
         mAppSearchSession.remove(request, mExecutor, new BatchResultCallbackAdapter<>(future));
         return future;
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchSessionShim.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchSessionShim.java
index 494945d..345b059 100644
--- a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchSessionShim.java
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchSessionShim.java
@@ -25,10 +25,14 @@
 import java.util.Set;
 
 /**
- * Represents a connection to an AppSearch storage system where {@link GenericDocument}s can be
- * placed and queried.
+ * Provides a connection to a single AppSearch database.
+ *
+ * <p>An {@link AppSearchSessionShim} instance provides access to database operations such as
+ * setting a schema, adding documents, and searching.
  *
  * <p>All implementations of this interface must be thread safe.
+ *
+ * @see GlobalSearchSessionShim
  */
 public interface AppSearchSessionShim extends Closeable {
 
@@ -76,28 +80,29 @@
      *
      * @param request containing documents to be indexed.
      * @return a {@link ListenableFuture} which resolves to an {@link AppSearchBatchResult}. The
-     *     keys of the returned {@link AppSearchBatchResult} are the URIs of the input documents.
-     *     The values are either {@code null} if the corresponding document was successfully
-     *     indexed, or a failed {@link AppSearchResult} otherwise.
+     *     keys of the returned {@link AppSearchBatchResult} are the IDs of the input documents. The
+     *     values are either {@code null} if the corresponding document was successfully indexed, or
+     *     a failed {@link AppSearchResult} otherwise.
      */
     @NonNull
     ListenableFuture<AppSearchBatchResult<String, Void>> put(@NonNull PutDocumentsRequest request);
 
     /**
-     * Gets {@link GenericDocument} objects by URIs and namespace from the {@link
+     * Gets {@link GenericDocument} objects by document IDs in a namespace from the {@link
      * AppSearchSessionShim} database.
      *
-     * @param request a request containing URIs and namespace to get documents for.
+     * @param request a request containing a namespace and IDs to get documents for.
      * @return A {@link ListenableFuture} which resolves to an {@link AppSearchBatchResult}. The
-     *     keys of the {@link AppSearchBatchResult} represent the input URIs from the {@link
-     *     GetByUriRequest} object. The values are either the corresponding {@link GenericDocument}
-     *     object for the URI on success, or an {@link AppSearchResult} object on failure. For
-     *     example, if a URI is not found, the value for that URI will be set to an {@link
-     *     AppSearchResult} object with result code: {@link AppSearchResult#RESULT_NOT_FOUND}.
+     *     keys of the {@link AppSearchBatchResult} represent the input document IDs from the {@link
+     *     GetByDocumentIdRequest} object. The values are either the corresponding {@link
+     *     GenericDocument} object for the ID on success, or an {@link AppSearchResult} object on
+     *     failure. For example, if an ID is not found, the value for that ID will be set to an
+     *     {@link AppSearchResult} object with result code: {@link
+     *     AppSearchResult#RESULT_NOT_FOUND}.
      */
     @NonNull
-    ListenableFuture<AppSearchBatchResult<String, GenericDocument>> getByUri(
-            @NonNull GetByUriRequest request);
+    ListenableFuture<AppSearchBatchResult<String, GenericDocument>> getByDocumentId(
+            @NonNull GetByDocumentIdRequest request);
 
     /**
      * Retrieves documents from the open {@link AppSearchSessionShim} that match a given query
@@ -162,7 +167,7 @@
     SearchResultsShim search(@NonNull String queryExpression, @NonNull SearchSpec searchSpec);
 
     /**
-     * Reports usage of a particular document by URI and namespace.
+     * Reports usage of a particular document by namespace and ID.
      *
      * <p>A usage report represents an event in which a user interacted with or viewed a document.
      *
@@ -181,25 +186,26 @@
     ListenableFuture<Void> reportUsage(@NonNull ReportUsageRequest request);
 
     /**
-     * Removes {@link GenericDocument} objects by URIs and namespace from the {@link
+     * Removes {@link GenericDocument} objects by document IDs in a namespace from the {@link
      * AppSearchSessionShim} database.
      *
-     * <p>Removed documents will no longer be surfaced by {@link #search} or {@link #getByUri}
-     * calls.
+     * <p>Removed documents will no longer be surfaced by {@link #search} or {@link
+     * #getByDocumentId} calls.
      *
      * <p>Once the database crosses the document count or byte usage threshold, removed documents
      * will be deleted from disk.
      *
-     * @param request {@link RemoveByUriRequest} with URIs and namespace to remove from the index.
+     * @param request {@link RemoveByDocumentIdRequest} with IDs in a namespace to remove from the
+     *     index.
      * @return a {@link ListenableFuture} which resolves to an {@link AppSearchBatchResult}. The
-     *     keys of the {@link AppSearchBatchResult} represent the input URIs from the {@link
-     *     RemoveByUriRequest} object. The values are either {@code null} on success, or a failed
-     *     {@link AppSearchResult} otherwise. URIs that are not found will return a failed {@link
-     *     AppSearchResult} with a result code of {@link AppSearchResult#RESULT_NOT_FOUND}.
+     *     keys of the {@link AppSearchBatchResult} represent the input IDs from the {@link
+     *     RemoveByDocumentIdRequest} object. The values are either {@code null} on success, or a
+     *     failed {@link AppSearchResult} otherwise. IDs that are not found will return a failed
+     *     {@link AppSearchResult} with a result code of {@link AppSearchResult#RESULT_NOT_FOUND}.
      */
     @NonNull
     ListenableFuture<AppSearchBatchResult<String, Void>> remove(
-            @NonNull RemoveByUriRequest request);
+            @NonNull RemoveByDocumentIdRequest request);
 
     /**
      * Removes {@link GenericDocument}s from the index by Query. Documents will be removed if they
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java
index fd4734c..ec9a42ea 100644
--- a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java
@@ -22,7 +22,7 @@
 import android.app.appsearch.AppSearchBatchResult;
 import android.app.appsearch.AppSearchSessionShim;
 import android.app.appsearch.GenericDocument;
-import android.app.appsearch.GetByUriRequest;
+import android.app.appsearch.GetByDocumentIdRequest;
 import android.app.appsearch.SearchResult;
 import android.app.appsearch.SearchResultsShim;
 
@@ -43,30 +43,30 @@
     }
 
     public static List<GenericDocument> doGet(
-            AppSearchSessionShim session, String namespace, String... uris) throws Exception {
+            AppSearchSessionShim session, String namespace, String... ids) throws Exception {
         AppSearchBatchResult<String, GenericDocument> result =
                 checkIsBatchResultSuccess(
-                        session.getByUri(
-                                new GetByUriRequest.Builder(namespace).addUris(uris).build()));
-        assertThat(result.getSuccesses()).hasSize(uris.length);
+                        session.getByDocumentId(
+                                new GetByDocumentIdRequest.Builder(namespace).addIds(ids).build()));
+        assertThat(result.getSuccesses()).hasSize(ids.length);
         assertThat(result.getFailures()).isEmpty();
-        List<GenericDocument> list = new ArrayList<>(uris.length);
-        for (String uri : uris) {
-            list.add(result.getSuccesses().get(uri));
+        List<GenericDocument> list = new ArrayList<>(ids.length);
+        for (String id : ids) {
+            list.add(result.getSuccesses().get(id));
         }
         return list;
     }
 
-    public static List<GenericDocument> doGet(AppSearchSessionShim session, GetByUriRequest request)
-            throws Exception {
+    public static List<GenericDocument> doGet(
+            AppSearchSessionShim session, GetByDocumentIdRequest request) throws Exception {
         AppSearchBatchResult<String, GenericDocument> result =
-                checkIsBatchResultSuccess(session.getByUri(request));
-        Set<String> uris = request.getUris();
-        assertThat(result.getSuccesses()).hasSize(uris.size());
+                checkIsBatchResultSuccess(session.getByDocumentId(request));
+        Set<String> ids = request.getIds();
+        assertThat(result.getSuccesses()).hasSize(ids.size());
         assertThat(result.getFailures()).isEmpty();
-        List<GenericDocument> list = new ArrayList<>(uris.size());
-        for (String uri : uris) {
-            list.add(result.getSuccesses().get(uri));
+        List<GenericDocument> list = new ArrayList<>(ids.size());
+        for (String id : ids) {
+            list.add(result.getSuccesses().get(id));
         }
         return list;
     }
diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/GlobalSearchSessionShim.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/GlobalSearchSessionShim.java
index f39916e..892f84e 100644
--- a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/GlobalSearchSessionShim.java
+++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/GlobalSearchSessionShim.java
@@ -23,9 +23,12 @@
 import java.io.Closeable;
 
 /**
- * This class provides global access to the centralized AppSearch index maintained by the system.
+ * Provides a connection to all AppSearch databases the querying application has been granted access
+ * to.
  *
- * <p>Apps can retrieve indexed documents through the {@link #search} API.
+ * <p>All implementations of this interface must be thread safe.
+ *
+ * @see AppSearchSessionShim
  */
 public interface GlobalSearchSessionShim extends Closeable {
     /**
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreIdleJobService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreIdleJobService.java
index e65abcf..7c67ce4 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreIdleJobService.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreIdleJobService.java
@@ -49,7 +49,8 @@
     public boolean onStopJob(final JobParameters params) {
         Slog.d(TAG, "Idle maintenance job is stopped; id=" + params.getJobId()
                 + ", reason="
-                + JobParameters.getLegacyReasonCodeDescription(params.getLegacyStopReason()));
+                + JobParameters.getInternalReasonCodeDescription(
+                        params.getInternalStopReasonCode()));
         return false;
     }
 
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
index 5729385..17682a5 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
@@ -1513,6 +1513,11 @@
          * available quota (and the job will not be successfully scheduled).
          *
          * <p>
+         * Expedited job quota will replenish over time and as the user interacts with the app,
+         * so you should not have to worry about running out of quota because of processing from
+         * frequent user engagement.
+         *
+         * <p>
          * Expedited jobs may only set network, storage-not-low, and persistence constraints.
          * No other constraints are allowed.
          *
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
index e1bfde1..32655c7 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
@@ -44,36 +44,57 @@
 public class JobParameters implements Parcelable {
 
     /** @hide */
-    public static final int REASON_CANCELED = JobProtoEnums.STOP_REASON_CANCELLED; // 0.
+    public static final int INTERNAL_STOP_REASON_CANCELED =
+            JobProtoEnums.INTERNAL_STOP_REASON_CANCELLED; // 0.
     /** @hide */
-    public static final int REASON_CONSTRAINTS_NOT_SATISFIED =
-            JobProtoEnums.STOP_REASON_CONSTRAINTS_NOT_SATISFIED; //1.
+    public static final int INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED =
+            JobProtoEnums.INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED; // 1.
     /** @hide */
-    public static final int REASON_PREEMPT = JobProtoEnums.STOP_REASON_PREEMPT; // 2.
+    public static final int INTERNAL_STOP_REASON_PREEMPT =
+            JobProtoEnums.INTERNAL_STOP_REASON_PREEMPT; // 2.
+    /**
+     * The job ran for at least its minimum execution limit.
+     * @hide
+     */
+    public static final int INTERNAL_STOP_REASON_TIMEOUT =
+            JobProtoEnums.INTERNAL_STOP_REASON_TIMEOUT; // 3.
     /** @hide */
-    public static final int REASON_TIMEOUT = JobProtoEnums.STOP_REASON_TIMEOUT; // 3.
+    public static final int INTERNAL_STOP_REASON_DEVICE_IDLE =
+            JobProtoEnums.INTERNAL_STOP_REASON_DEVICE_IDLE; // 4.
     /** @hide */
-    public static final int REASON_DEVICE_IDLE = JobProtoEnums.STOP_REASON_DEVICE_IDLE; // 4.
-    /** @hide */
-    public static final int REASON_DEVICE_THERMAL = JobProtoEnums.STOP_REASON_DEVICE_THERMAL; // 5.
+    public static final int INTERNAL_STOP_REASON_DEVICE_THERMAL =
+            JobProtoEnums.INTERNAL_STOP_REASON_DEVICE_THERMAL; // 5.
     /**
      * The job is in the {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED}
      * bucket.
      *
      * @hide
      */
-    public static final int REASON_RESTRICTED_BUCKET =
-            JobProtoEnums.STOP_REASON_RESTRICTED_BUCKET; // 6.
+    public static final int INTERNAL_STOP_REASON_RESTRICTED_BUCKET =
+            JobProtoEnums.INTERNAL_STOP_REASON_RESTRICTED_BUCKET; // 6.
     /**
      * The app was uninstalled.
      * @hide
      */
-    public static  final int DEBUG_REASON_UNINSTALL = 7;
+    public static final int INTERNAL_STOP_REASON_UNINSTALL =
+            JobProtoEnums.INTERNAL_STOP_REASON_UNINSTALL; // 7.
     /**
      * The app's data was cleared.
      * @hide
      */
-    public static  final int DEBUG_REASON_DATA_CLEARED = 8;
+    public static final int INTERNAL_STOP_REASON_DATA_CLEARED =
+            JobProtoEnums.INTERNAL_STOP_REASON_DATA_CLEARED; // 8.
+    /**
+     * @hide
+     */
+    public static final int INTERNAL_STOP_REASON_RTC_UPDATED =
+            JobProtoEnums.INTERNAL_STOP_REASON_RTC_UPDATED; // 9.
+    /**
+     * The app called jobFinished() on its own.
+     * @hide
+     */
+    public static final int INTERNAL_STOP_REASON_SUCCESSFUL_FINISH =
+            JobProtoEnums.INTERNAL_STOP_REASON_SUCCESSFUL_FINISH; // 10.
 
     /**
      * All the stop reason codes. This should be regarded as an immutable array at runtime.
@@ -85,13 +106,17 @@
      * @hide
      */
     public static final int[] JOB_STOP_REASON_CODES = {
-            REASON_CANCELED,
-            REASON_CONSTRAINTS_NOT_SATISFIED,
-            REASON_PREEMPT,
-            REASON_TIMEOUT,
-            REASON_DEVICE_IDLE,
-            REASON_DEVICE_THERMAL,
-            REASON_RESTRICTED_BUCKET,
+            INTERNAL_STOP_REASON_CANCELED,
+            INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED,
+            INTERNAL_STOP_REASON_PREEMPT,
+            INTERNAL_STOP_REASON_TIMEOUT,
+            INTERNAL_STOP_REASON_DEVICE_IDLE,
+            INTERNAL_STOP_REASON_DEVICE_THERMAL,
+            INTERNAL_STOP_REASON_RESTRICTED_BUCKET,
+            INTERNAL_STOP_REASON_UNINSTALL,
+            INTERNAL_STOP_REASON_DATA_CLEARED,
+            INTERNAL_STOP_REASON_RTC_UPDATED,
+            INTERNAL_STOP_REASON_SUCCESSFUL_FINISH,
     };
 
     /**
@@ -99,21 +124,24 @@
      */
     // TODO(142420609): make it @SystemApi for mainline
     @NonNull
-    public static String getLegacyReasonCodeDescription(int reasonCode) {
+    public static String getInternalReasonCodeDescription(int reasonCode) {
         switch (reasonCode) {
-            case REASON_CANCELED: return "canceled";
-            case REASON_CONSTRAINTS_NOT_SATISFIED: return "constraints";
-            case REASON_PREEMPT: return "preempt";
-            case REASON_TIMEOUT: return "timeout";
-            case REASON_DEVICE_IDLE: return "device_idle";
-            case REASON_DEVICE_THERMAL: return "thermal";
-            case REASON_RESTRICTED_BUCKET: return "restricted_bucket";
+            case INTERNAL_STOP_REASON_CANCELED: return "canceled";
+            case INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED: return "constraints";
+            case INTERNAL_STOP_REASON_PREEMPT: return "preempt";
+            case INTERNAL_STOP_REASON_TIMEOUT: return "timeout";
+            case INTERNAL_STOP_REASON_DEVICE_IDLE: return "device_idle";
+            case INTERNAL_STOP_REASON_DEVICE_THERMAL: return "thermal";
+            case INTERNAL_STOP_REASON_RESTRICTED_BUCKET: return "restricted_bucket";
+            case INTERNAL_STOP_REASON_UNINSTALL: return "uninstall";
+            case INTERNAL_STOP_REASON_DATA_CLEARED: return "data_cleared";
+            case INTERNAL_STOP_REASON_RTC_UPDATED: return "rtc_updated";
+            case INTERNAL_STOP_REASON_SUCCESSFUL_FINISH: return "successful_finish";
             default: return "unknown:" + reasonCode;
         }
     }
 
     /** @hide */
-    // TODO: move current users of legacy reasons to new public reasons
     @NonNull
     public static int[] getJobStopReasonCodes() {
         return JOB_STOP_REASON_CODES;
@@ -241,7 +269,7 @@
     private final Network network;
 
     private int mStopReason = STOP_REASON_UNDEFINED;
-    private int mLegacyStopReason; // Default value of stopReason is REASON_CANCELED
+    private int mInternalStopReason; // Default value is REASON_CANCELED
     private String debugStopReason; // Human readable stop reason for debugging.
 
     /** @hide */
@@ -280,8 +308,8 @@
     }
 
     /** @hide */
-    public int getLegacyStopReason() {
-        return mLegacyStopReason;
+    public int getInternalStopReasonCode() {
+        return mInternalStopReason;
     }
 
     /**
@@ -343,14 +371,6 @@
     }
 
     /**
-     * @deprecated Use {@link #isExpeditedJob()} instead.
-     */
-    @Deprecated
-    public boolean isForegroundJob() {
-        return mIsExpedited;
-    }
-
-    /**
      * For jobs with {@link android.app.job.JobInfo.Builder#setOverrideDeadline(long)} set, this
      * provides an easy way to tell whether the job is being executed due to the deadline
      * expiring. Note: If the job is running because its deadline expired, it implies that its
@@ -502,15 +522,15 @@
             network = null;
         }
         mStopReason = in.readInt();
-        mLegacyStopReason = in.readInt();
+        mInternalStopReason = in.readInt();
         debugStopReason = in.readString();
     }
 
     /** @hide */
-    public void setStopReason(@StopReason int reason, int legacyStopReason,
+    public void setStopReason(@StopReason int reason, int internalStopReason,
             String debugStopReason) {
         mStopReason = reason;
-        mLegacyStopReason = legacyStopReason;
+        mInternalStopReason = internalStopReason;
         this.debugStopReason = debugStopReason;
     }
 
@@ -543,7 +563,7 @@
             dest.writeInt(0);
         }
         dest.writeInt(mStopReason);
-        dest.writeInt(mLegacyStopReason);
+        dest.writeInt(mInternalStopReason);
         dest.writeString(debugStopReason);
     }
 
diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
index 93b6566..f96fc83 100644
--- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
+++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java
@@ -185,6 +185,11 @@
     public static final int REASON_OP_ACTIVATE_VPN = 68;
     /** @hide */
     public static final int REASON_OP_ACTIVATE_PLATFORM_VPN = 69;
+    /**
+     * Temporarily allowed to have FGS while-in-use permissions.
+     * @hide
+     */
+    public static final int REASON_TEMP_ALLOWED_WHILE_IN_USE = 70;
 
     /* BG-FGS-launch is allowed by temp-allow-list or system-allow-list.
        Reason code for temp and system allow list starts here.
@@ -226,6 +231,11 @@
      * @hide
      */
     public static final int REASON_LOCKED_BOOT_COMPLETED = 202;
+    /**
+     * All Bluetooth broadcasts.
+     * @hide
+     */
+    public static final int REASON_BLUETOOTH_BROADCAST = 203;
 
     /* Reason code range 300-399 are reserved for other internal reasons */
     /**
@@ -348,6 +358,7 @@
             REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD,
             REASON_OP_ACTIVATE_VPN,
             REASON_OP_ACTIVATE_PLATFORM_VPN,
+            REASON_TEMP_ALLOWED_WHILE_IN_USE,
             // temp and system allow list reasons.
             REASON_GEOFENCING,
             REASON_PUSH_MESSAGING,
@@ -357,6 +368,7 @@
             REASON_BOOT_COMPLETED,
             REASON_PRE_BOOT_COMPLETED,
             REASON_LOCKED_BOOT_COMPLETED,
+            REASON_BLUETOOTH_BROADCAST,
             REASON_SYSTEM_ALLOW_LISTED,
             REASON_ALARM_MANAGER_ALARM_CLOCK,
             REASON_ALARM_MANAGER_WHILE_IDLE,
@@ -609,6 +621,8 @@
                 return "OP_ACTIVATE_VPN";
             case REASON_OP_ACTIVATE_PLATFORM_VPN:
                 return "OP_ACTIVATE_PLATFORM_VPN";
+            case REASON_TEMP_ALLOWED_WHILE_IN_USE:
+                return "TEMP_ALLOWED_WHILE_IN_USE";
             case REASON_GEOFENCING:
                 return "GEOFENCING";
             case REASON_PUSH_MESSAGING:
@@ -625,6 +639,8 @@
                 return "PRE_BOOT_COMPLETED";
             case REASON_LOCKED_BOOT_COMPLETED:
                 return "LOCKED_BOOT_COMPLETED";
+            case REASON_BLUETOOTH_BROADCAST:
+                return "BLUETOOTH_BROADCAST";
             case REASON_SYSTEM_ALLOW_LISTED:
                 return "SYSTEM_ALLOW_LISTED";
             case REASON_ALARM_MANAGER_ALARM_CLOCK:
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java b/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
index 3bc7b30..9ffef9c 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
@@ -66,6 +66,23 @@
      */
     public static final int BATTERY_SAVER_POLICY_INDEX = 3;
 
+    /**
+     * Reason to use for inexact alarms.
+     */
+    static final int EXACT_ALLOW_REASON_NOT_APPLICABLE = -1;
+    /**
+     * Caller had SCHEDULE_EXACT_ALARM permission.
+     */
+    static final int EXACT_ALLOW_REASON_PERMISSION = 0;
+    /**
+     * Caller was in the power allow-list.
+     */
+    static final int EXACT_ALLOW_REASON_ALLOW_LIST = 1;
+    /**
+     * Change wasn't enable for the caller due to compat reasons.
+     */
+    static final int EXACT_ALLOW_REASON_COMPAT = 2;
+
     public final int type;
     /**
      * The original trigger time supplied by the caller. This can be in the elapsed or rtc time base
@@ -92,13 +109,15 @@
     /** The ultimate delivery time to be used for this alarm */
     private long mWhenElapsed;
     private long mMaxWhenElapsed;
+    public int mExactAllowReason;
     public AlarmManagerService.PriorityClass priorityClass;
     /** Broadcast options to use when delivering this alarm */
     public Bundle mIdleOptions;
 
     Alarm(int type, long when, long requestedWhenElapsed, long windowLength, long interval,
             PendingIntent op, IAlarmListener rec, String listenerTag, WorkSource ws, int flags,
-            AlarmManager.AlarmClockInfo info, int uid, String pkgName, Bundle idleOptions) {
+            AlarmManager.AlarmClockInfo info, int uid, String pkgName, Bundle idleOptions,
+            int exactAllowReason) {
         this.type = type;
         origWhen = when;
         wakeup = type == AlarmManager.ELAPSED_REALTIME_WAKEUP
@@ -119,6 +138,7 @@
         this.uid = uid;
         packageName = pkgName;
         mIdleOptions = idleOptions;
+        mExactAllowReason = exactAllowReason;
         sourcePackage = (operation != null) ? operation.getCreatorPackage() : packageName;
         creatorUid = (operation != null) ? operation.getCreatorUid() : this.uid;
     }
@@ -216,7 +236,6 @@
         sb.append(type);
         sb.append(" origWhen ");
         sb.append(origWhen);
-        sb.append(" ");
         sb.append(" whenElapsed ");
         sb.append(getWhenElapsed());
         sb.append(" ");
@@ -240,6 +259,21 @@
         }
     }
 
+    private static String exactReasonToString(int reason) {
+        switch (reason) {
+            case EXACT_ALLOW_REASON_ALLOW_LIST:
+                return "allow-listed";
+            case EXACT_ALLOW_REASON_COMPAT:
+                return "compat";
+            case EXACT_ALLOW_REASON_PERMISSION:
+                return "permission";
+            case EXACT_ALLOW_REASON_NOT_APPLICABLE:
+                return "N/A";
+            default:
+                return "--unknown--";
+        }
+    }
+
     public static String typeToString(int type) {
         switch (type) {
             case RTC:
@@ -270,6 +304,10 @@
         }
         ipw.print(" window=");
         TimeUtils.formatDuration(windowLength, ipw);
+        if (mExactAllowReason != EXACT_ALLOW_REASON_NOT_APPLICABLE) {
+            ipw.print(" exactAllowReason=");
+            ipw.print(exactReasonToString(mExactAllowReason));
+        }
         ipw.print(" repeatInterval=");
         ipw.print(repeatInterval);
         ipw.print(" count=");
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 03d9a96..54e47cf 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -38,7 +38,16 @@
 import static com.android.server.alarm.Alarm.APP_STANDBY_POLICY_INDEX;
 import static com.android.server.alarm.Alarm.BATTERY_SAVER_POLICY_INDEX;
 import static com.android.server.alarm.Alarm.DEVICE_IDLE_POLICY_INDEX;
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_ALLOW_LIST;
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_COMPAT;
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_NOT_APPLICABLE;
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_PERMISSION;
 import static com.android.server.alarm.Alarm.REQUESTER_POLICY_INDEX;
+import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_ALARM_CANCELLED;
+import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_DATA_CLEARED;
+import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_EXACT_PERMISSION_REVOKED;
+import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_PI_CANCELLED;
+import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_UNDEFINED;
 
 import android.Manifest;
 import android.annotation.NonNull;
@@ -59,7 +68,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.PermissionChecker;
+import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.net.Uri;
 import android.os.BatteryManager;
@@ -112,6 +121,7 @@
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.LocalLog;
+import com.android.internal.util.RingBuffer;
 import com.android.internal.util.StatLogger;
 import com.android.server.AlarmManagerInternal;
 import com.android.server.AppStateTracker;
@@ -123,6 +133,7 @@
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
 import com.android.server.SystemServiceManager;
+import com.android.server.pm.permission.PermissionManagerServiceInternal;
 import com.android.server.usage.AppStandbyInternal;
 import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
 
@@ -155,6 +166,7 @@
 public class AlarmManagerService extends SystemService {
     private static final int RTC_WAKEUP_MASK = 1 << RTC_WAKEUP;
     private static final int ELAPSED_REALTIME_WAKEUP_MASK = 1 << ELAPSED_REALTIME_WAKEUP;
+    private static final int REMOVAL_HISTORY_SIZE_PER_UID = 10;
     static final int TIME_CHANGED_MASK = 1 << 16;
     static final int IS_WAKEUP_MASK = RTC_WAKEUP_MASK | ELAPSED_REALTIME_WAKEUP_MASK;
 
@@ -198,9 +210,13 @@
     private UsageStatsManagerInternal mUsageStatsManagerInternal;
     private ActivityManagerInternal mActivityManagerInternal;
     private PackageManagerInternal mPackageManagerInternal;
+    private PermissionManagerServiceInternal mLocalPermissionManager;
 
     final Object mLock = new Object();
 
+    /** Immutable set of app ids that have requested SCHEDULE_EXACT_ALARM permission.*/
+    @VisibleForTesting
+    volatile Set<Integer> mExactAlarmCandidates = Collections.emptySet();
     // List of alarms per uid deferred due to user applied background restrictions on the source app
     SparseArray<ArrayList<Alarm>> mPendingBackgroundAlarms = new SparseArray<>();
     private long mNextWakeup;
@@ -218,6 +234,7 @@
 
     private final Injector mInjector;
     int mBroadcastRefCount = 0;
+    MetricsHelper mMetricsHelper;
     PowerManager.WakeLock mWakeLock;
     SparseIntArray mAlarmsPerUid = new SparseIntArray();
     ArrayList<Alarm> mPendingNonWakeupAlarms = new ArrayList<>();
@@ -228,6 +245,7 @@
     AppWakeupHistory mAppWakeupHistory;
     AppWakeupHistory mAllowWhileIdleHistory;
     private final SparseLongArray mLastPriorityAlarmDispatch = new SparseLongArray();
+    private final SparseArray<RingBuffer<RemovedAlarm>> mRemovalHistory = new SparseArray<>();
     ClockReceiver mClockReceiver;
     final DeliveryTracker mDeliveryTracker = new DeliveryTracker();
     IBinder.DeathRecipient mListenerDeathRecipient;
@@ -382,6 +400,57 @@
         }
     }
 
+    static class RemovedAlarm {
+        static final int REMOVE_REASON_UNDEFINED = 0;
+        static final int REMOVE_REASON_ALARM_CANCELLED = 1;
+        static final int REMOVE_REASON_EXACT_PERMISSION_REVOKED = 2;
+        static final int REMOVE_REASON_DATA_CLEARED = 3;
+        static final int REMOVE_REASON_PI_CANCELLED = 4;
+
+        final String mTag;
+        final long mWhenRemovedElapsed;
+        final long mWhenRemovedRtc;
+        final int mRemoveReason;
+
+        RemovedAlarm(Alarm a, int removeReason, long nowRtc, long nowElapsed) {
+            mTag = a.statsTag;
+            mRemoveReason = removeReason;
+            mWhenRemovedRtc = nowRtc;
+            mWhenRemovedElapsed = nowElapsed;
+        }
+
+        static final boolean isLoggable(int reason) {
+            // We don't want to log meaningless reasons. This also gives a way for callers to
+            // opt out of logging, e.g. when replacing an alarm.
+            return reason != REMOVE_REASON_UNDEFINED;
+        }
+
+        static final String removeReasonToString(int reason) {
+            switch (reason) {
+                case REMOVE_REASON_ALARM_CANCELLED:
+                    return "alarm_cancelled";
+                case REMOVE_REASON_EXACT_PERMISSION_REVOKED:
+                    return "exact_alarm_permission_revoked";
+                case REMOVE_REASON_DATA_CLEARED:
+                    return "data_cleared";
+                case REMOVE_REASON_PI_CANCELLED:
+                    return "pi_cancelled";
+                default:
+                    return "unknown:" + reason;
+            }
+        }
+
+        void dump(IndentingPrintWriter pw, long nowElapsed, SimpleDateFormat sdf) {
+            pw.print("[tag", mTag);
+            pw.print("reason", removeReasonToString(mRemoveReason));
+            pw.print("elapsed=");
+            TimeUtils.formatDuration(mWhenRemovedElapsed, nowElapsed, pw);
+            pw.print(" rtc=");
+            pw.print(sdf.format(new Date(mWhenRemovedRtc)));
+            pw.println("]");
+        }
+    }
+
     /**
      * All times are in milliseconds. These constants are kept synchronized with the system
      * global Settings. Any access to this class or its fields should be done while
@@ -1216,7 +1285,7 @@
                 setImplLocked(alarm.type, alarm.origWhen + delta, nextElapsed,
                         nextMaxElapsed - nextElapsed, alarm.repeatInterval, alarm.operation, null,
                         null, alarm.flags, alarm.workSource, alarm.alarmClock, alarm.uid,
-                        alarm.packageName, null);
+                        alarm.packageName, null, EXACT_ALLOW_REASON_NOT_APPLICABLE);
                 // Kernel alarms will be rescheduled as needed in setImplLocked
             }
         }
@@ -1437,6 +1506,7 @@
     @Override
     public void onStart() {
         mInjector.init();
+        mMetricsHelper = new MetricsHelper(getContext());
 
         mListenerDeathRecipient = new IBinder.DeathRecipient() {
             @Override
@@ -1540,6 +1610,21 @@
         publishBinderService(Context.ALARM_SERVICE, mService);
     }
 
+    void refreshExactAlarmCandidates() {
+        final String[] candidates = mLocalPermissionManager.getAppOpPermissionPackages(
+                Manifest.permission.SCHEDULE_EXACT_ALARM);
+        final Set<Integer> appIds = new ArraySet<>(candidates.length);
+        for (final String candidate : candidates) {
+            final int uid = mPackageManagerInternal.getPackageUid(candidate,
+                    PackageManager.MATCH_ANY_USER, USER_SYSTEM);
+            if (uid > 0) {
+                appIds.add(UserHandle.getAppId(uid));
+            }
+        }
+        // No need to lock. Assignment is always atomic.
+        mExactAlarmCandidates = Collections.unmodifiableSet(appIds);
+    }
+
     @Override
     public void onBootPhase(int phase) {
         if (phase == PHASE_SYSTEM_SERVICES_READY) {
@@ -1564,11 +1649,17 @@
                             });
                 } catch (RemoteException e) {
                 }
+                mMetricsHelper.registerPuller(mAlarmStore);
 
                 mLocalDeviceIdleController =
                         LocalServices.getService(DeviceIdleInternal.class);
                 mUsageStatsManagerInternal =
                         LocalServices.getService(UsageStatsManagerInternal.class);
+
+                mLocalPermissionManager = LocalServices.getService(
+                        PermissionManagerServiceInternal.class);
+                refreshExactAlarmCandidates();
+
                 AppStandbyInternal appStandbyInternal =
                         LocalServices.getService(AppStandbyInternal.class);
                 appStandbyInternal.addListener(new AppStandbyTracker());
@@ -1659,14 +1750,14 @@
 
     void removeImpl(PendingIntent operation, IAlarmListener listener) {
         synchronized (mLock) {
-            removeLocked(operation, listener);
+            removeLocked(operation, listener, REMOVE_REASON_UNDEFINED);
         }
     }
 
     void setImpl(int type, long triggerAtTime, long windowLength, long interval,
             PendingIntent operation, IAlarmListener directReceiver, String listenerTag,
             int flags, WorkSource workSource, AlarmManager.AlarmClockInfo alarmClock,
-            int callingUid, String callingPackage, Bundle idleOptions) {
+            int callingUid, String callingPackage, Bundle idleOptions, int exactAllowReason) {
         if ((operation == null && directReceiver == null)
                 || (operation != null && directReceiver != null)) {
             Slog.w(TAG, "Alarms must either supply a PendingIntent or an AlarmReceiver");
@@ -1763,7 +1854,7 @@
             }
             setImplLocked(type, triggerAtTime, triggerElapsed, windowLength, interval, operation,
                     directReceiver, listenerTag, flags, workSource, alarmClock, callingUid,
-                    callingPackage, idleOptions);
+                    callingPackage, idleOptions, exactAllowReason);
         }
     }
 
@@ -1771,18 +1862,19 @@
             long interval, PendingIntent operation, IAlarmListener directReceiver,
             String listenerTag, int flags, WorkSource workSource,
             AlarmManager.AlarmClockInfo alarmClock, int callingUid, String callingPackage,
-            Bundle idleOptions) {
+            Bundle idleOptions, int exactAllowReason) {
         final Alarm a = new Alarm(type, when, whenElapsed, windowLength, interval,
                 operation, directReceiver, listenerTag, workSource, flags, alarmClock,
-                callingUid, callingPackage, idleOptions);
+                callingUid, callingPackage, idleOptions, exactAllowReason);
         if (mActivityManagerInternal.isAppStartModeDisabled(callingUid, callingPackage)) {
             Slog.w(TAG, "Not setting alarm from " + callingUid + ":" + a
                     + " -- package not allowed to start");
             return;
         }
-        removeLocked(operation, directReceiver);
+        removeLocked(operation, directReceiver, REMOVE_REASON_UNDEFINED);
         incrementAlarmCount(a.uid);
         setImplLocked(a);
+        MetricsHelper.pushAlarmScheduled(a);
     }
 
     /**
@@ -2073,7 +2165,7 @@
         @Override
         public void removeAlarmsForUid(int uid) {
             synchronized (mLock) {
-                removeLocked(uid);
+                removeLocked(uid, REMOVE_REASON_DATA_CLEARED);
             }
         }
 
@@ -2097,17 +2189,21 @@
 
     boolean hasScheduleExactAlarmInternal(String packageName, int uid) {
         final long start = mStatLogger.getTime();
-        // No locking needed as EXACT_ALARM_DENY_LIST is immutable.
-        final boolean isOnDenyList = mConstants.EXACT_ALARM_DENY_LIST.contains(packageName);
-        if (isOnDenyList && mAppOps.checkOpNoThrow(AppOpsManager.OP_SCHEDULE_EXACT_ALARM, uid,
-                packageName) != AppOpsManager.MODE_ALLOWED) {
-            return false;
+        final boolean hasPermission;
+        // No locking needed as all internal containers being queried are immutable.
+        if (!mExactAlarmCandidates.contains(UserHandle.getAppId(uid))) {
+            hasPermission = false;
+        } else {
+            final int mode = mAppOps.checkOpNoThrow(AppOpsManager.OP_SCHEDULE_EXACT_ALARM, uid,
+                    packageName);
+            if (mode == AppOpsManager.MODE_DEFAULT) {
+                hasPermission = !mConstants.EXACT_ALARM_DENY_LIST.contains(packageName);
+            } else {
+                hasPermission = (mode == AppOpsManager.MODE_ALLOWED);
+            }
         }
-        final boolean has = PermissionChecker.checkPermissionForPreflight(getContext(),
-                Manifest.permission.SCHEDULE_EXACT_ALARM, -1, uid, packageName)
-                == PermissionChecker.PERMISSION_GRANTED;
         mStatLogger.logDurationStat(Stats.HAS_SCHEDULE_EXACT_ALARM, start);
-        return has;
+        return hasPermission;
     }
 
     /**
@@ -2191,6 +2287,8 @@
 
             // Make sure the caller is allowed to use the requested kind of alarm, and also
             // decide what quota and broadcast options to use.
+            boolean allowListed = false;    // For logging the reason.
+            boolean changeDisabled = false; // For logging the reason.
             Bundle idleOptions = null;
             if ((flags & FLAG_PRIORITIZE) != 0) {
                 getContext().enforcePermission(
@@ -2207,6 +2305,7 @@
                     lowerQuota = !exact;
                     idleOptions = exact ? mOptsWithFgs.toBundle() : mOptsWithoutFgs.toBundle();
                 } else {
+                    changeDisabled = true;
                     needsPermission = false;
                     lowerQuota = allowWhileIdle;
                     idleOptions = allowWhileIdle ? mOptsWithFgs.toBundle() : null;
@@ -2221,6 +2320,8 @@
                         } else {
                             Slog.wtf(TAG, errorMessage);
                         }
+                    } else {
+                        allowListed = true;
                     }
                     // If the app is on the full system power allow-list (not except-idle), or we're
                     // in a soft failure mode, we still allow the alarms.
@@ -2234,15 +2335,25 @@
                     flags |= FLAG_ALLOW_WHILE_IDLE_COMPAT;
                 }
             }
-
-            // If this is an exact time alarm, then it can't be batched with other alarms.
+            final int exactAllowReason;
             if (exact) {
+                // If this is an exact time alarm, then it can't be batched with other alarms.
                 flags |= AlarmManager.FLAG_STANDALONE;
+
+                if (changeDisabled) {
+                    exactAllowReason = EXACT_ALLOW_REASON_COMPAT;
+                } else if (allowListed) {
+                    exactAllowReason = EXACT_ALLOW_REASON_ALLOW_LIST;
+                } else {
+                    exactAllowReason = EXACT_ALLOW_REASON_PERMISSION;
+                }
+            } else {
+                exactAllowReason = EXACT_ALLOW_REASON_NOT_APPLICABLE;
             }
 
             setImpl(type, triggerAtTime, windowLength, interval, operation, directReceiver,
                     listenerTag, flags, workSource, alarmClock, callingUid, callingPackage,
-                    idleOptions);
+                    idleOptions, exactAllowReason);
         }
 
         @Override
@@ -2290,7 +2401,7 @@
                 return;
             }
             synchronized (mLock) {
-                removeLocked(operation, listener);
+                removeLocked(operation, listener, REMOVE_REASON_ALARM_CANCELLED);
             }
         }
 
@@ -2490,6 +2601,9 @@
             pw.println(mNumTimeChanged);
 
             pw.println();
+            pw.println("App ids requesting SCHEDULE_EXACT_ALARM: " + mExactAlarmCandidates);
+
+            pw.println();
             pw.println("Next alarm clock information: ");
             pw.increaseIndent();
             final TreeSet<Integer> users = new TreeSet<>();
@@ -2633,6 +2747,7 @@
 
             pw.println("Allow while idle history:");
             mAllowWhileIdleHistory.dump(pw, nowELAPSED);
+            pw.println();
 
             if (mLastPriorityAlarmDispatch.size() > 0) {
                 pw.println("Last priority alarm dispatches:");
@@ -2647,6 +2762,23 @@
                 pw.decreaseIndent();
             }
 
+            if (mRemovalHistory.size() > 0) {
+                pw.println("Removal history: ");
+                pw.increaseIndent();
+                for (int i = 0; i < mRemovalHistory.size(); i++) {
+                    UserHandle.formatUid(pw, mRemovalHistory.keyAt(i));
+                    pw.println(":");
+                    pw.increaseIndent();
+                    final RemovedAlarm[] historyForUid = mRemovalHistory.valueAt(i).toArray();
+                    for (final RemovedAlarm removedAlarm : historyForUid) {
+                        removedAlarm.dump(pw, nowELAPSED, sdf);
+                    }
+                    pw.decreaseIndent();
+                }
+                pw.decreaseIndent();
+                pw.println();
+            }
+
             if (mLog.dump(pw, "Recent problems:")) {
                 pw.println();
             }
@@ -3184,7 +3316,7 @@
             }
             return !hasScheduleExactAlarmInternal(a.packageName, a.uid);
         };
-        removeAlarmsInternalLocked(whichAlarms);
+        removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
     }
 
     /**
@@ -3192,7 +3324,6 @@
      * that the app is no longer eligible to use.
      *
      * This is not expected to get called frequently.
-     * TODO (b/179541791): Add revocation history to dumpsys.
      */
     void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName) {
         Slog.w(TAG, "Package " + packageName + ", uid " + uid + " lost SCHEDULE_EXACT_ALARM!");
@@ -3208,26 +3339,22 @@
             }
             return false;
         };
-        removeAlarmsInternalLocked(whichAlarms);
+        removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
     }
 
-    private void removeAlarmsInternalLocked(Predicate<Alarm> whichAlarms) {
+    private void removeAlarmsInternalLocked(Predicate<Alarm> whichAlarms, int reason) {
+        final long nowRtc = mInjector.getCurrentTimeMillis();
+        final long nowElapsed = mInjector.getElapsedRealtime();
+
         final ArrayList<Alarm> removedAlarms = mAlarmStore.remove(whichAlarms);
-        final boolean didRemove = !removedAlarms.isEmpty();
-        if (didRemove) {
-            for (final Alarm removed : removedAlarms) {
-                decrementAlarmCount(removed.uid, 1);
-            }
-        }
+        final boolean removedFromStore = !removedAlarms.isEmpty();
 
         for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
             final ArrayList<Alarm> alarmsForUid = mPendingBackgroundAlarms.valueAt(i);
             for (int j = alarmsForUid.size() - 1; j >= 0; j--) {
                 final Alarm alarm = alarmsForUid.get(j);
                 if (whichAlarms.test(alarm)) {
-                    // Don't set didRemove, since this doesn't impact the scheduled alarms.
-                    alarmsForUid.remove(j);
-                    decrementAlarmCount(alarm.uid, 1);
+                    removedAlarms.add(alarmsForUid.remove(j));
                 }
             }
             if (alarmsForUid.size() == 0) {
@@ -3237,13 +3364,24 @@
         for (int i = mPendingNonWakeupAlarms.size() - 1; i >= 0; i--) {
             final Alarm a = mPendingNonWakeupAlarms.get(i);
             if (whichAlarms.test(a)) {
-                // Don't set didRemove, since this doesn't impact the scheduled alarms.
-                mPendingNonWakeupAlarms.remove(i);
-                decrementAlarmCount(a.uid, 1);
+                removedAlarms.add(mPendingNonWakeupAlarms.remove(i));
             }
         }
 
-        if (didRemove) {
+        for (final Alarm removed : removedAlarms) {
+            decrementAlarmCount(removed.uid, 1);
+            if (!RemovedAlarm.isLoggable(reason)) {
+                continue;
+            }
+            RingBuffer<RemovedAlarm> bufferForUid = mRemovalHistory.get(removed.uid);
+            if (bufferForUid == null) {
+                bufferForUid = new RingBuffer<>(RemovedAlarm.class, REMOVAL_HISTORY_SIZE_PER_UID);
+                mRemovalHistory.put(removed.uid, bufferForUid);
+            }
+            bufferForUid.append(new RemovedAlarm(removed, reason, nowRtc, nowElapsed));
+        }
+
+        if (removedFromStore) {
             boolean idleUntilUpdated = false;
             if (mPendingIdleUntil != null && whichAlarms.test(mPendingIdleUntil)) {
                 mPendingIdleUntil = null;
@@ -3265,7 +3403,7 @@
         }
     }
 
-    void removeLocked(PendingIntent operation, IAlarmListener directReceiver) {
+    void removeLocked(PendingIntent operation, IAlarmListener directReceiver, int reason) {
         if (operation == null && directReceiver == null) {
             if (localLOGV) {
                 Slog.w(TAG, "requested remove() of null operation",
@@ -3273,15 +3411,15 @@
             }
             return;
         }
-        removeAlarmsInternalLocked(a -> a.matches(operation, directReceiver));
+        removeAlarmsInternalLocked(a -> a.matches(operation, directReceiver), reason);
     }
 
-    void removeLocked(final int uid) {
+    void removeLocked(final int uid, int reason) {
         if (uid == Process.SYSTEM_UID) {
             // If a force-stop occurs for a system-uid package, ignore it.
             return;
         }
-        removeAlarmsInternalLocked(a -> a.uid == uid);
+        removeAlarmsInternalLocked(a -> a.uid == uid, reason);
     }
 
     void removeLocked(final String packageName) {
@@ -3292,7 +3430,7 @@
             }
             return;
         }
-        removeAlarmsInternalLocked(a -> a.matches(packageName));
+        removeAlarmsInternalLocked(a -> a.matches(packageName), REMOVE_REASON_UNDEFINED);
     }
 
     // Only called for ephemeral apps
@@ -3303,61 +3441,28 @@
         }
         final Predicate<Alarm> whichAlarms = (a) -> (a.uid == uid
                 && mActivityManagerInternal.isAppStartModeDisabled(uid, a.packageName));
-        removeAlarmsInternalLocked(whichAlarms);
+        removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_UNDEFINED);
     }
 
     void removeUserLocked(int userHandle) {
         if (userHandle == USER_SYSTEM) {
-            // If we're told we're removing the system user, ignore it.
+            Slog.w(TAG, "Ignoring attempt to remove system-user state!");
             return;
         }
         final Predicate<Alarm> whichAlarms =
-                (Alarm a) -> UserHandle.getUserId(a.creatorUid) == userHandle;
-        final ArrayList<Alarm> removedAlarms = mAlarmStore.remove(whichAlarms);
-        for (final Alarm removed : removedAlarms) {
-            decrementAlarmCount(removed.uid, 1);
-        }
-        final boolean didRemove = !removedAlarms.isEmpty();
+                (Alarm a) -> UserHandle.getUserId(a.uid) == userHandle;
+        removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_UNDEFINED);
 
-        for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
-            if (UserHandle.getUserId(mPendingBackgroundAlarms.keyAt(i)) == userHandle) {
-                final ArrayList<Alarm> toRemove = mPendingBackgroundAlarms.valueAt(i);
-                if (toRemove != null) {
-                    for (int j = 0; j < toRemove.size(); j++) {
-                        decrementAlarmCount(toRemove.get(j).uid, 1);
-                    }
-                }
-                mPendingBackgroundAlarms.removeAt(i);
-            }
-        }
         for (int i = mLastPriorityAlarmDispatch.size() - 1; i >= 0; i--) {
             if (UserHandle.getUserId(mLastPriorityAlarmDispatch.keyAt(i)) == userHandle) {
                 mLastPriorityAlarmDispatch.removeAt(i);
             }
         }
-        if (mNextWakeFromIdle != null && whichAlarms.test(mNextWakeFromIdle)) {
-            mNextWakeFromIdle = mAlarmStore.getNextWakeFromIdleAlarm();
-            if (mPendingIdleUntil != null) {
-                final boolean updated = mAlarmStore.updateAlarmDeliveries(alarm -> {
-                    if (alarm != mPendingIdleUntil) {
-                        return false;
-                    }
-                    return adjustIdleUntilTime(alarm);
-                });
-                if (updated) {
-                    mAlarmStore.updateAlarmDeliveries(
-                            alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm));
-                }
+        for (int i = mRemovalHistory.size() - 1; i >= 0; i--) {
+            if (UserHandle.getUserId(mRemovalHistory.keyAt(i)) == userHandle) {
+                mRemovalHistory.removeAt(i);
             }
         }
-
-        if (didRemove) {
-            if (DEBUG_BATCH) {
-                Slog.v(TAG, "remove(user) changed bounds; rebatching");
-            }
-            rescheduleKernelAlarmsLocked();
-            updateNextAlarmClockLocked();
-        }
     }
 
     void interactiveStateChangedLocked(boolean interactive) {
@@ -3469,8 +3574,8 @@
     private static native int setKernelTimezone(long nativeData, int minuteswest);
     private static native long getNextAlarm(long nativeData, int type);
 
-    boolean triggerAlarmsLocked(ArrayList<Alarm> triggerList, final long nowELAPSED) {
-        boolean hasWakeup = false;
+    int triggerAlarmsLocked(ArrayList<Alarm> triggerList, final long nowELAPSED) {
+        int wakeUps = 0;
         final ArrayList<Alarm> pendingAlarms = mAlarmStore.removePendingAlarms(nowELAPSED);
         for (final Alarm alarm : pendingAlarms) {
             if (isBackgroundRestricted(alarm)) {
@@ -3527,11 +3632,11 @@
                 setImplLocked(alarm.type, alarm.origWhen + delta, nextElapsed,
                         nextMaxElapsed - nextElapsed, alarm.repeatInterval, alarm.operation, null,
                         null, alarm.flags, alarm.workSource, alarm.alarmClock, alarm.uid,
-                        alarm.packageName, null);
+                        alarm.packageName, null, EXACT_ALLOW_REASON_NOT_APPLICABLE);
             }
 
             if (alarm.wakeup) {
-                hasWakeup = true;
+                wakeUps++;
             }
 
             // We removed an alarm clock. Let the caller recompute the next alarm clock.
@@ -3552,7 +3657,7 @@
             }
         }
 
-        return hasWakeup;
+        return wakeUps;
     }
 
     long currentNonWakeupFuzzLocked(long nowELAPSED) {
@@ -3811,8 +3916,8 @@
                         }
 
                         mLastTrigger = nowELAPSED;
-                        boolean hasWakeup = triggerAlarmsLocked(triggerList, nowELAPSED);
-                        if (!hasWakeup && checkAllowNonWakeupDelayLocked(nowELAPSED)) {
+                        final int wakeUps = triggerAlarmsLocked(triggerList, nowELAPSED);
+                        if (wakeUps == 0 && checkAllowNonWakeupDelayLocked(nowELAPSED)) {
                             // if there are no wakeup alarms and the screen is off, we can
                             // delay what we have so far until the future.
                             if (mPendingNonWakeupAlarms.size() == 0) {
@@ -3864,6 +3969,7 @@
                             reorderAlarmsBasedOnStandbyBuckets(triggerPackages);
                             rescheduleKernelAlarmsLocked();
                             updateNextAlarmClockLocked();
+                            MetricsHelper.pushAlarmBatchDelivered(triggerList.size(), wakeUps);
                         }
                     }
 
@@ -3924,6 +4030,7 @@
         public static final int REMOVE_FOR_CANCELED = 7;
         public static final int REMOVE_EXACT_ALARMS = 8;
         public static final int EXACT_ALARM_DENY_LIST_CHANGED = 9;
+        public static final int REFRESH_EXACT_ALARM_CANDIDATES = 10;
 
         AlarmHandler() {
             super(Looper.myLooper());
@@ -3999,7 +4106,7 @@
                 case REMOVE_FOR_CANCELED:
                     final PendingIntent operation = (PendingIntent) msg.obj;
                     synchronized (mLock) {
-                        removeLocked(operation, null);
+                        removeLocked(operation, null, REMOVE_REASON_PI_CANCELLED);
                     }
                     break;
 
@@ -4015,6 +4122,9 @@
                         handlePackagesAddedToExactAlarmsDenyListLocked((ArraySet<String>) msg.obj);
                     }
                     break;
+                case REFRESH_EXACT_ALARM_CANDIDATES:
+                    refreshExactAlarmCandidates();
+                    break;
                 default:
                     // nope, just ignore it
                     break;
@@ -4090,7 +4200,7 @@
 
             setImpl(ELAPSED_REALTIME, mInjector.getElapsedRealtime() + tickEventDelay, 0,
                     0, null, mTimeTickTrigger, TIME_TICK_TAG, flags, workSource, null,
-                    Process.myUid(), "android", null);
+                    Process.myUid(), "android", null, EXACT_ALLOW_REASON_ALLOW_LIST);
 
             // Finally, remember when we set the tick alarm
             synchronized (mLock) {
@@ -4110,7 +4220,7 @@
             final WorkSource workSource = null; // Let system take blame for date change events.
             setImpl(RTC, calendar.getTimeInMillis(), 0, 0, mDateChangeSender, null, null,
                     AlarmManager.FLAG_STANDALONE, workSource, null,
-                    Process.myUid(), "android", null);
+                    Process.myUid(), "android", null, EXACT_ALLOW_REASON_ALLOW_LIST);
         }
     }
 
@@ -4135,6 +4245,7 @@
         public UninstallReceiver() {
             IntentFilter filter = new IntentFilter();
             filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+            filter.addAction(Intent.ACTION_PACKAGE_ADDED);
             filter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
             filter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
             filter.addDataScheme(IntentFilter.SCHEME_PACKAGE);
@@ -4175,12 +4286,16 @@
                         return;
                     case Intent.ACTION_UID_REMOVED:
                         mLastPriorityAlarmDispatch.delete(uid);
+                        mRemovalHistory.delete(uid);
                         return;
                     case Intent.ACTION_PACKAGE_REMOVED:
                         if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                             // This package is being updated; don't kill its alarms.
+                            // We will refresh the exact alarm candidates on subsequent receipt of
+                            // PACKAGE_ADDED.
                             return;
                         }
+                        mHandler.sendEmptyMessage(AlarmHandler.REFRESH_EXACT_ALARM_CANDIDATES);
                         // Intentional fall-through.
                     case Intent.ACTION_PACKAGE_RESTARTED:
                         final Uri data = intent.getData();
@@ -4191,6 +4306,9 @@
                             }
                         }
                         break;
+                    case Intent.ACTION_PACKAGE_ADDED:
+                        mHandler.sendEmptyMessage(AlarmHandler.REFRESH_EXACT_ALARM_CANDIDATES);
+                        return;
                 }
                 if (pkgList != null && (pkgList.length > 0)) {
                     for (String pkg : pkgList) {
@@ -4198,7 +4316,7 @@
                             // package-removed and package-restarted case
                             mAppWakeupHistory.removeForPackage(pkg, UserHandle.getUserId(uid));
                             mAllowWhileIdleHistory.removeForPackage(pkg, UserHandle.getUserId(uid));
-                            removeLocked(uid);
+                            removeLocked(uid, REMOVE_REASON_UNDEFINED);
                         } else {
                             // external-applications-unavailable case
                             removeLocked(pkg);
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmStore.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmStore.java
index e684b84..0172748 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmStore.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmStore.java
@@ -139,6 +139,11 @@
     String getName();
 
     /**
+     * Returns the number of alarms that satisfy the given condition.
+     */
+    int getCount(Predicate<Alarm> condition);
+
+    /**
      * A functional interface used to update the alarm. Used to describe the update in
      * {@link #updateAlarmDeliveries(AlarmDeliveryCalculator)}
      */
@@ -153,4 +158,3 @@
         boolean updateAlarmDelivery(Alarm a);
     }
 }
-
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/BatchingAlarmStore.java b/apex/jobscheduler/service/java/com/android/server/alarm/BatchingAlarmStore.java
index cb528ba..1a4efb8 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/BatchingAlarmStore.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/BatchingAlarmStore.java
@@ -17,7 +17,6 @@
 package com.android.server.alarm;
 
 import static com.android.server.alarm.AlarmManagerService.DEBUG_BATCH;
-import static com.android.server.alarm.AlarmManagerService.TAG;
 import static com.android.server.alarm.AlarmManagerService.clampPositive;
 import static com.android.server.alarm.AlarmManagerService.dumpAlarmList;
 import static com.android.server.alarm.AlarmManagerService.isTimeTickAlarm;
@@ -50,10 +49,12 @@
 
     interface Stats {
         int REBATCH_ALL_ALARMS = 0;
+        int GET_COUNT = 1;
     }
 
     final StatLogger mStatLogger = new StatLogger(TAG + " stats", new String[]{
             "REBATCH_ALL_ALARMS",
+            "GET_COUNT",
     });
 
     private static final Comparator<Batch> sBatchOrder = Comparator.comparingLong(b -> b.mStart);
@@ -219,6 +220,22 @@
         return TAG;
     }
 
+    @Override
+    public int getCount(Predicate<Alarm> condition) {
+        long start = mStatLogger.getTime();
+
+        int count = 0;
+        for (Batch b : mAlarmBatches) {
+            for (int i = 0; i < b.size(); i++) {
+                if (condition.test(b.get(i))) {
+                    count++;
+                }
+            }
+        }
+        mStatLogger.logDurationStat(Stats.GET_COUNT, start);
+        return count;
+    }
+
     private void insertAndBatchAlarm(Alarm alarm) {
         final int whichBatch = ((alarm.flags & AlarmManager.FLAG_STANDALONE) != 0) ? -1
                 : attemptCoalesce(alarm.getWhenElapsed(), alarm.getMaxWhenElapsed());
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/LazyAlarmStore.java b/apex/jobscheduler/service/java/com/android/server/alarm/LazyAlarmStore.java
index 9b1b066..2e12e2f 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/LazyAlarmStore.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/LazyAlarmStore.java
@@ -47,11 +47,13 @@
     interface Stats {
         int GET_NEXT_DELIVERY_TIME = 0;
         int GET_NEXT_WAKEUP_DELIVERY_TIME = 1;
+        int GET_COUNT = 2;
     }
 
     final StatLogger mStatLogger = new StatLogger(TAG + " stats", new String[]{
             "GET_NEXT_DELIVERY_TIME",
             "GET_NEXT_WAKEUP_DELIVERY_TIME",
+            "GET_COUNT",
     });
 
     // Decreasing time order because it is more efficient to remove from the tail of an array list.
@@ -221,4 +223,18 @@
     public String getName() {
         return TAG;
     }
+
+    @Override
+    public int getCount(Predicate<Alarm> condition) {
+        long start = mStatLogger.getTime();
+
+        int count = 0;
+        for (final Alarm a : mAlarms) {
+            if (condition.test(a)) {
+                count++;
+            }
+        }
+        mStatLogger.logDurationStat(Stats.GET_COUNT, start);
+        return count;
+    }
 }
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java b/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
new file mode 100644
index 0000000..a8cf7b2
--- /dev/null
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.alarm;
+
+import static com.android.internal.util.FrameworkStatsLog.ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__ALLOW_LIST;
+import static com.android.internal.util.FrameworkStatsLog.ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__CHANGE_DISABLED;
+import static com.android.internal.util.FrameworkStatsLog.ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__NOT_APPLICABLE;
+import static com.android.internal.util.FrameworkStatsLog.ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__PERMISSION;
+import static com.android.server.alarm.AlarmManagerService.INDEFINITE_DELAY;
+
+import android.app.AlarmManager;
+import android.app.StatsManager;
+import android.content.Context;
+import android.os.SystemClock;
+
+import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.FrameworkStatsLog;
+
+/**
+ * A helper class to write logs to statsd.
+ */
+class MetricsHelper {
+    private Context mContext;
+
+    MetricsHelper(Context context) {
+        mContext = context;
+    }
+
+    void registerPuller(AlarmStore alarmStore) {
+        final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
+        statsManager.setPullAtomCallback(FrameworkStatsLog.PENDING_ALARM_INFO, null,
+                BackgroundThread.getExecutor(), (atomTag, data) -> {
+                    if (atomTag != FrameworkStatsLog.PENDING_ALARM_INFO) {
+                        throw new UnsupportedOperationException("Unknown tag" + atomTag);
+                    }
+                    final long now = SystemClock.elapsedRealtime();
+                    data.add(FrameworkStatsLog.buildStatsEvent(atomTag,
+                            alarmStore.size(),
+                            alarmStore.getCount(a -> a.windowLength == 0),
+                            alarmStore.getCount(a -> a.wakeup),
+                            alarmStore.getCount(
+                                    a -> (a.flags & AlarmManager.FLAG_ALLOW_WHILE_IDLE) != 0),
+                            alarmStore.getCount(a -> (a.flags & AlarmManager.FLAG_PRIORITIZE) != 0),
+                            alarmStore.getCount(a -> (a.operation != null
+                                    && a.operation.isForegroundService())),
+                            alarmStore.getCount(
+                                    a -> (a.operation != null && a.operation.isActivity())),
+                            alarmStore.getCount(
+                                    a -> (a.operation != null && a.operation.isService())),
+                            alarmStore.getCount(a -> (a.listener != null)),
+                            alarmStore.getCount(
+                                    a -> (a.getRequestedElapsed() > now + INDEFINITE_DELAY)),
+                            alarmStore.getCount(a -> (a.repeatInterval != 0)),
+                            alarmStore.getCount(a -> (a.alarmClock != null))
+                    ));
+                    return StatsManager.PULL_SUCCESS;
+                });
+    }
+
+    private static int reasonToStatsReason(int reasonCode) {
+        switch (reasonCode) {
+            case Alarm.EXACT_ALLOW_REASON_ALLOW_LIST:
+                return ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__ALLOW_LIST;
+            case Alarm.EXACT_ALLOW_REASON_PERMISSION:
+                return ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__PERMISSION;
+            case Alarm.EXACT_ALLOW_REASON_COMPAT:
+                return ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__CHANGE_DISABLED;
+            default:
+                return ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__NOT_APPLICABLE;
+        }
+    }
+
+    static void pushAlarmScheduled(Alarm a) {
+        FrameworkStatsLog.write(
+                FrameworkStatsLog.ALARM_SCHEDULED,
+                a.uid,
+                a.windowLength == 0,
+                a.wakeup,
+                (a.flags & AlarmManager.FLAG_ALLOW_WHILE_IDLE) != 0,
+                a.alarmClock != null,
+                a.repeatInterval != 0,
+                reasonToStatsReason(a.mExactAllowReason));
+    }
+
+    static void pushAlarmBatchDelivered(int numAlarms, int wakeups) {
+        FrameworkStatsLog.write(
+                FrameworkStatsLog.ALARM_BATCH_DELIVERED,
+                numAlarms,
+                wakeups);
+    }
+}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java
index 366e174..5a13a84 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java
@@ -179,7 +179,7 @@
             new WorkConfigLimitsPerMemoryTrimLevel(
                     new WorkTypeConfig("screen_on_normal", 11,
                             // defaultMin
-                            List.of(Pair.create(WORK_TYPE_TOP, 2), Pair.create(WORK_TYPE_FGS, 1),
+                            List.of(Pair.create(WORK_TYPE_TOP, 4), Pair.create(WORK_TYPE_FGS, 1),
                                     Pair.create(WORK_TYPE_EJ, 3), Pair.create(WORK_TYPE_BG, 2),
                                     Pair.create(WORK_TYPE_BGUSER_IMPORTANT, 1)),
                             // defaultMax
@@ -202,7 +202,7 @@
                             List.of(Pair.create(WORK_TYPE_TOP, 4), Pair.create(WORK_TYPE_FGS, 1),
                                     Pair.create(WORK_TYPE_EJ, 1)),
                             // defaultMax
-                            List.of(Pair.create(WORK_TYPE_BG, 1),
+                            List.of(Pair.create(WORK_TYPE_BG, 2),
                                     Pair.create(WORK_TYPE_BGUSER_IMPORTANT, 1),
                                     Pair.create(WORK_TYPE_BGUSER, 1))
                     ),
@@ -218,23 +218,23 @@
             );
     private static final WorkConfigLimitsPerMemoryTrimLevel CONFIG_LIMITS_SCREEN_OFF =
             new WorkConfigLimitsPerMemoryTrimLevel(
-                    new WorkTypeConfig("screen_off_normal", 15,
+                    new WorkTypeConfig("screen_off_normal", 16,
                             // defaultMin
                             List.of(Pair.create(WORK_TYPE_TOP, 4), Pair.create(WORK_TYPE_FGS, 2),
                                     Pair.create(WORK_TYPE_EJ, 3), Pair.create(WORK_TYPE_BG, 2),
                                     Pair.create(WORK_TYPE_BGUSER_IMPORTANT, 1)),
                             // defaultMax
-                            List.of(Pair.create(WORK_TYPE_BG, 6),
+                            List.of(Pair.create(WORK_TYPE_BG, 10),
                                     Pair.create(WORK_TYPE_BGUSER_IMPORTANT, 2),
                                     Pair.create(WORK_TYPE_BGUSER, 3))
                     ),
-                    new WorkTypeConfig("screen_off_moderate", 15,
+                    new WorkTypeConfig("screen_off_moderate", 14,
                             // defaultMin
-                            List.of(Pair.create(WORK_TYPE_TOP, 6), Pair.create(WORK_TYPE_FGS, 2),
+                            List.of(Pair.create(WORK_TYPE_TOP, 4), Pair.create(WORK_TYPE_FGS, 2),
                                     Pair.create(WORK_TYPE_EJ, 3), Pair.create(WORK_TYPE_BG, 2),
                                     Pair.create(WORK_TYPE_BGUSER_IMPORTANT, 1)),
                             // defaultMax
-                            List.of(Pair.create(WORK_TYPE_BG, 4),
+                            List.of(Pair.create(WORK_TYPE_BG, 7),
                                     Pair.create(WORK_TYPE_BGUSER_IMPORTANT, 1),
                                     Pair.create(WORK_TYPE_BGUSER, 1))
                     ),
@@ -243,7 +243,7 @@
                             List.of(Pair.create(WORK_TYPE_TOP, 4), Pair.create(WORK_TYPE_FGS, 1),
                                     Pair.create(WORK_TYPE_EJ, 2), Pair.create(WORK_TYPE_BG, 1)),
                             // defaultMax
-                            List.of(Pair.create(WORK_TYPE_BG, 1),
+                            List.of(Pair.create(WORK_TYPE_BG, 3),
                                     Pair.create(WORK_TYPE_BGUSER_IMPORTANT, 1),
                                     Pair.create(WORK_TYPE_BGUSER, 1))
                     ),
@@ -470,6 +470,11 @@
         }
     }
 
+    @GuardedBy("mLock")
+    boolean isJobRunningLocked(JobStatus job) {
+        return mRunningJobs.contains(job);
+    }
+
     /** Return {@code true} if the state was updated. */
     @GuardedBy("mLock")
     private boolean refreshSystemStateLocked() {
@@ -690,7 +695,7 @@
                     // preferredUid will be set to uid of currently running job.
                     activeServices.get(i).cancelExecutingJobLocked(
                             preemptReasonCodeForContext[i],
-                            JobParameters.REASON_PREEMPT, preemptReasonForContext[i]);
+                            JobParameters.INTERNAL_STOP_REASON_PREEMPT, preemptReasonForContext[i]);
                     // Only preserve the UID if we're preempting for the same UID. If we're stopping
                     // the job because something is pending (eg. EJs), then we shouldn't preserve
                     // the UID.
@@ -722,7 +727,7 @@
 
             if (jobStatus != null && !jsc.isWithinExecutionGuaranteeTime()) {
                 jsc.cancelExecutingJobLocked(JobParameters.STOP_REASON_DEVICE_STATE,
-                        JobParameters.REASON_TIMEOUT, debugReason);
+                        JobParameters.INTERNAL_STOP_REASON_TIMEOUT, debugReason);
             }
         }
     }
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobPackageTracker.java b/apex/jobscheduler/service/java/com/android/server/job/JobPackageTracker.java
index 02f9129..1f0900d 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobPackageTracker.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobPackageTracker.java
@@ -374,7 +374,7 @@
                             pw.print(pe.stopReasons.valueAt(k));
                             pw.print("x ");
                             pw.print(JobParameters
-                                    .getLegacyReasonCodeDescription(pe.stopReasons.keyAt(k)));
+                                    .getInternalReasonCodeDescription(pe.stopReasons.keyAt(k)));
                         }
                         pw.println();
                     }
@@ -621,7 +621,7 @@
                 if (reason != null) {
                     pw.print(mEventReasons[index]);
                 } else {
-                    pw.print(JobParameters.getLegacyReasonCodeDescription(
+                    pw.print(JobParameters.getInternalReasonCodeDescription(
                             (mEventCmds[index] & EVENT_STOP_REASON_MASK)
                                     >> EVENT_STOP_REASON_SHIFT));
                 }
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 1815661..452be30 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -336,8 +336,6 @@
     // (ScheduledJobStateChanged and JobStatusDumpProto).
     public static final int RESTRICTED_INDEX = 5;
 
-    // -- Pre-allocated temporaries only for use in assignJobsToContextsLocked --
-
     private class ConstantsObserver implements DeviceConfig.OnPropertiesChangedListener {
         public void start() {
             DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_JOB_SCHEDULER,
@@ -760,7 +758,7 @@
                                             // put USER instead of UNINSTALL or DISABLED.
                                             cancelJobsForPackageAndUidLocked(pkgName, pkgUid,
                                                     JobParameters.STOP_REASON_USER,
-                                                    JobParameters.DEBUG_REASON_UNINSTALL,
+                                                    JobParameters.INTERNAL_STOP_REASON_UNINSTALL,
                                                     "app disabled");
                                         }
                                     }
@@ -811,7 +809,7 @@
                     // be fine to just put USER instead of UNINSTALL or DISABLED.
                     cancelJobsForPackageAndUidLocked(pkgName, uidRemoved,
                             JobParameters.STOP_REASON_USER,
-                            JobParameters.DEBUG_REASON_UNINSTALL, "app uninstalled");
+                            JobParameters.INTERNAL_STOP_REASON_UNINSTALL, "app uninstalled");
                     for (int c = 0; c < mControllers.size(); ++c) {
                         mControllers.get(c).onAppRemovedLocked(pkgName, pkgUid);
                     }
@@ -865,7 +863,8 @@
                     }
                     synchronized (mLock) {
                         cancelJobsForPackageAndUidLocked(pkgName, pkgUid,
-                                JobParameters.STOP_REASON_USER, JobParameters.REASON_CANCELED,
+                                JobParameters.STOP_REASON_USER,
+                                JobParameters.INTERNAL_STOP_REASON_CANCELED,
                                 "app force stopped");
                     }
                 }
@@ -1076,7 +1075,7 @@
             if (toCancel != null) {
                 // Implicitly replaces the existing job record with the new instance
                 cancelJobImplLocked(toCancel, jobStatus, JobParameters.STOP_REASON_CANCELLED_BY_APP,
-                        JobParameters.REASON_CANCELED, "job rescheduled by app");
+                        JobParameters.INTERNAL_STOP_REASON_CANCELED, "job rescheduled by app");
             } else {
                 startTrackingJobLocked(jobStatus, null);
             }
@@ -1089,7 +1088,7 @@
             FrameworkStatsLog.write_non_chained(FrameworkStatsLog.SCHEDULED_JOB_STATE_CHANGED,
                     uId, null, jobStatus.getBatteryName(),
                     FrameworkStatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED,
-                    JobProtoEnums.STOP_REASON_UNKNOWN, jobStatus.getStandbyBucket(),
+                    JobProtoEnums.INTERNAL_STOP_REASON_UNKNOWN, jobStatus.getStandbyBucket(),
                     jobStatus.getJobId(),
                     jobStatus.hasChargingConstraint(),
                     jobStatus.hasBatteryNotLowConstraint(),
@@ -1100,7 +1099,8 @@
                     jobStatus.hasConnectivityConstraint(),
                     jobStatus.hasContentTriggerConstraint(),
                     jobStatus.isRequestedExpeditedJob(),
-                    /* isRunningAsExpeditedJob */ false);
+                    /* isRunningAsExpeditedJob */ false,
+                    JobProtoEnums.STOP_REASON_UNDEFINED);
 
             // If the job is immediately ready to run, then we can just immediately
             // put it in the pending list and try to schedule it.  This is especially
@@ -1157,7 +1157,7 @@
             // but since this is a user-initiated action, it should be fine to just put USER
             // instead of UNINSTALL or DISABLED.
             cancelJobImplLocked(toRemove, null, JobParameters.STOP_REASON_USER,
-                    JobParameters.DEBUG_REASON_UNINSTALL, "user removed");
+                    JobParameters.INTERNAL_STOP_REASON_UNINSTALL, "user removed");
         }
     }
 
@@ -1169,7 +1169,7 @@
     }
 
     private void cancelJobsForPackageAndUidLocked(String pkgName, int uid,
-            @JobParameters.StopReason int reason, int debugReasonCode, String debugReason) {
+            @JobParameters.StopReason int reason, int internalReasonCode, String debugReason) {
         if ("android".equals(pkgName)) {
             Slog.wtfStack(TAG, "Can't cancel all jobs for system package");
             return;
@@ -1178,7 +1178,7 @@
         for (int i = jobsForUid.size() - 1; i >= 0; i--) {
             final JobStatus job = jobsForUid.get(i);
             if (job.getSourcePackageName().equals(pkgName)) {
-                cancelJobImplLocked(job, null, reason, debugReasonCode, debugReason);
+                cancelJobImplLocked(job, null, reason, internalReasonCode, debugReason);
             }
         }
     }
@@ -1191,7 +1191,7 @@
      * @param uid Uid to check against for removal of a job.
      */
     public boolean cancelJobsForUid(int uid, @JobParameters.StopReason int reason,
-            int debugReasonCode, String debugReason) {
+            int internalReasonCode, String debugReason) {
         if (uid == Process.SYSTEM_UID) {
             Slog.wtfStack(TAG, "Can't cancel all jobs for system uid");
             return false;
@@ -1202,7 +1202,7 @@
             final List<JobStatus> jobsForUid = mJobs.getJobsByUid(uid);
             for (int i = 0; i < jobsForUid.size(); i++) {
                 JobStatus toRemove = jobsForUid.get(i);
-                cancelJobImplLocked(toRemove, null, reason, debugReasonCode, debugReason);
+                cancelJobImplLocked(toRemove, null, reason, internalReasonCode, debugReason);
                 jobsCanceled = true;
             }
         }
@@ -1224,7 +1224,7 @@
             toCancel = mJobs.getJobByUidAndJobId(uid, jobId);
             if (toCancel != null) {
                 cancelJobImplLocked(toCancel, null, reason,
-                        JobParameters.REASON_CANCELED,
+                        JobParameters.INTERNAL_STOP_REASON_CANCELED,
                         "cancel() called by app, callingUid=" + callingUid
                                 + " uid=" + uid + " jobId=" + jobId);
             }
@@ -1239,7 +1239,7 @@
      * currently scheduled jobs.
      */
     private void cancelJobImplLocked(JobStatus cancelled, JobStatus incomingJob,
-            @JobParameters.StopReason int reason, int debugReasonCode, String debugReason) {
+            @JobParameters.StopReason int reason, int internalReasonCode, String debugReason) {
         if (DEBUG) Slog.d(TAG, "CANCEL: " + cancelled.toShortString());
         cancelled.unprepareLocked();
         stopTrackingJobLocked(cancelled, incomingJob, true /* writeBack */);
@@ -1248,7 +1248,7 @@
             mJobPackageTracker.noteNonpending(cancelled);
         }
         // Cancel if running.
-        stopJobOnServiceContextLocked(cancelled, reason, debugReasonCode, debugReason);
+        stopJobOnServiceContextLocked(cancelled, reason, internalReasonCode, debugReason);
         // If this is a replacement, bring in the new version of the job
         if (incomingJob != null) {
             if (DEBUG) Slog.i(TAG, "Tracking replacement job " + incomingJob.toShortString());
@@ -1299,7 +1299,7 @@
                     final JobStatus executing = jsc.getRunningJobLocked();
                     if (executing != null && !executing.canRunInDoze()) {
                         jsc.cancelExecutingJobLocked(JobParameters.STOP_REASON_DEVICE_STATE,
-                                JobParameters.REASON_DEVICE_IDLE,
+                                JobParameters.INTERNAL_STOP_REASON_DEVICE_IDLE,
                                 "cancelled due to doze");
                     }
                 }
@@ -1498,7 +1498,7 @@
                     Slog.v(TAG, "  replacing " + oldJob + " with " + newJob);
                 }
                 cancelJobImplLocked(oldJob, newJob, JobParameters.STOP_REASON_SYSTEM_PROCESSING,
-                        JobParameters.REASON_CANCELED, "deferred rtc calculation");
+                        JobParameters.INTERNAL_STOP_REASON_RTC_UPDATED, "deferred rtc calculation");
             }
         }
     };
@@ -1620,28 +1620,12 @@
     }
 
     private boolean stopJobOnServiceContextLocked(JobStatus job,
-            @JobParameters.StopReason int reason, int legacyReason, String debugReason) {
-        for (int i=0; i<mActiveServices.size(); i++) {
+            @JobParameters.StopReason int reason, int internalReasonCode, String debugReason) {
+        for (int i = 0; i < mActiveServices.size(); i++) {
             JobServiceContext jsc = mActiveServices.get(i);
             final JobStatus executing = jsc.getRunningJobLocked();
             if (executing != null && executing.matches(job.getUid(), job.getJobId())) {
-                jsc.cancelExecutingJobLocked(reason, legacyReason, debugReason);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * @param job JobStatus we are querying against.
-     * @return Whether or not the job represented by the status object is currently being run or
-     * is pending.
-     */
-    private boolean isCurrentlyActiveLocked(JobStatus job) {
-        for (int i=0; i<mActiveServices.size(); i++) {
-            JobServiceContext serviceContext = mActiveServices.get(i);
-            final JobStatus running = serviceContext.getRunningJobLocked();
-            if (running != null && running.matches(job.getUid(), job.getJobId())) {
+                jsc.cancelExecutingJobLocked(reason, internalReasonCode, debugReason);
                 return true;
             }
         }
@@ -1837,8 +1821,8 @@
         mLastCompletedJobTimeElapsed[mLastCompletedJobIndex] = sElapsedRealtimeClock.millis();
         mLastCompletedJobIndex = (mLastCompletedJobIndex + 1) % NUM_COMPLETED_JOB_HISTORY;
 
-        if (debugStopReason == JobParameters.DEBUG_REASON_UNINSTALL
-                || debugStopReason == JobParameters.DEBUG_REASON_DATA_CLEARED) {
+        if (debugStopReason == JobParameters.INTERNAL_STOP_REASON_UNINSTALL
+                || debugStopReason == JobParameters.INTERNAL_STOP_REASON_DATA_CLEARED) {
             // The job should have already been cleared from the rest of the JS tracking. No need
             // to go through all that flow again.
             jobStatus.unprepareLocked();
@@ -1856,8 +1840,8 @@
         final JobStatus rescheduledJob = needsReschedule
                 ? getRescheduleJobForFailureLocked(jobStatus) : null;
         if (rescheduledJob != null
-                && (debugStopReason == JobParameters.REASON_TIMEOUT
-                || debugStopReason == JobParameters.REASON_PREEMPT)) {
+                && (debugStopReason == JobParameters.INTERNAL_STOP_REASON_TIMEOUT
+                || debugStopReason == JobParameters.INTERNAL_STOP_REASON_PREEMPT)) {
             rescheduledJob.disallowRunInBatterySaverAndDoze();
         }
 
@@ -1962,7 +1946,7 @@
                         break;
                     case MSG_STOP_JOB:
                         cancelJobImplLocked((JobStatus) message.obj, null, message.arg1,
-                                JobParameters.REASON_CONSTRAINTS_NOT_SATISFIED,
+                                JobParameters.INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED,
                                 "app no longer allowed to run");
                         break;
 
@@ -1979,7 +1963,8 @@
                         if (disabled) {
                             cancelJobsForUid(uid,
                                     JobParameters.STOP_REASON_BACKGROUND_RESTRICTION,
-                                    JobParameters.REASON_CONSTRAINTS_NOT_SATISFIED, "uid gone");
+                                    JobParameters.INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED,
+                                    "uid gone");
                         }
                         synchronized (mLock) {
                             mDeviceIdleJobsController.setUidActiveLocked(uid, false);
@@ -1999,7 +1984,8 @@
                         if (disabled) {
                             cancelJobsForUid(uid,
                                     JobParameters.STOP_REASON_BACKGROUND_RESTRICTION,
-                                    JobParameters.REASON_CONSTRAINTS_NOT_SATISFIED, "app uid idle");
+                                    JobParameters.INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED,
+                                    "app uid idle");
                         }
                         synchronized (mLock) {
                             mDeviceIdleJobsController.setUidActiveLocked(uid, false);
@@ -2052,22 +2038,23 @@
                         && !running.areDynamicConstraintsSatisfied()) {
                     serviceContext.cancelExecutingJobLocked(
                             running.getStopReason(),
-                            JobParameters.REASON_RESTRICTED_BUCKET,
+                            JobParameters.INTERNAL_STOP_REASON_RESTRICTED_BUCKET,
                             "cancelled due to restricted bucket");
                 } else {
                     serviceContext.cancelExecutingJobLocked(
                             running.getStopReason(),
-                            JobParameters.REASON_CONSTRAINTS_NOT_SATISFIED,
+                            JobParameters.INTERNAL_STOP_REASON_CONSTRAINTS_NOT_SATISFIED,
                             "cancelled due to unsatisfied constraints");
                 }
             } else {
                 final JobRestriction restriction = checkIfRestricted(running);
                 if (restriction != null) {
-                    final int reason = restriction.getReason();
-                    serviceContext.cancelExecutingJobLocked(reason,
-                            restriction.getLegacyReason(),
-                            "restricted due to " + JobParameters.getLegacyReasonCodeDescription(
-                                    reason));
+                    final int internalReasonCode = restriction.getInternalReason();
+                    serviceContext.cancelExecutingJobLocked(restriction.getReason(),
+                            internalReasonCode,
+                            "restricted due to "
+                                    + JobParameters.getInternalReasonCodeDescription(
+                                    internalReasonCode));
                 }
             }
         }
@@ -2253,10 +2240,12 @@
      *      - The component is enabled and runnable.
      */
     @VisibleForTesting
+    @GuardedBy("mLock")
     boolean isReadyToBeExecutedLocked(JobStatus job) {
         return isReadyToBeExecutedLocked(job, true);
     }
 
+    @GuardedBy("mLock")
     boolean isReadyToBeExecutedLocked(JobStatus job, boolean rejectActive) {
         final boolean jobReady = job.isReady();
 
@@ -2296,7 +2285,7 @@
         }
 
         final boolean jobPending = mPendingJobs.contains(job);
-        final boolean jobActive = rejectActive && isCurrentlyActiveLocked(job);
+        final boolean jobActive = rejectActive && mConcurrencyManager.isJobRunningLocked(job);
 
         if (DEBUG) {
             Slog.v(TAG, "isReadyToBeExecutedLocked: " + job.toShortString()
@@ -2370,7 +2359,7 @@
         if (restriction != null) {
             if (DEBUG) {
                 Slog.v(TAG, "areComponentsInPlaceLocked: " + job.toShortString()
-                        + " restricted due to " + restriction.getLegacyReason());
+                        + " restricted due to " + restriction.getInternalReason());
             }
             return false;
         }
@@ -2452,7 +2441,7 @@
             synchronized (mLock) {
                 final List<JobInfo> pendingJobs = new ArrayList<JobInfo>();
                 mJobs.forEachJob(Process.SYSTEM_UID, (job) -> {
-                    if (job.getJob().isPeriodic() || !isCurrentlyActiveLocked(job)) {
+                    if (job.getJob().isPeriodic() || !mConcurrencyManager.isJobRunningLocked(job)) {
                         pendingJobs.add(job.getJob());
                     }
                 });
@@ -2462,8 +2451,8 @@
 
         @Override
         public void cancelJobsForUid(int uid, @JobParameters.StopReason int reason,
-                int debugReasonCode, String debugReason) {
-            JobSchedulerService.this.cancelJobsForUid(uid, reason, debugReasonCode, debugReason);
+                int internalReasonCode, String debugReason) {
+            JobSchedulerService.this.cancelJobsForUid(uid, reason, internalReasonCode, debugReason);
         }
 
         @Override
@@ -2802,7 +2791,7 @@
             try {
                 JobSchedulerService.this.cancelJobsForUid(uid,
                         JobParameters.STOP_REASON_CANCELLED_BY_APP,
-                        JobParameters.REASON_CANCELED,
+                        JobParameters.INTERNAL_STOP_REASON_CANCELED,
                         "cancelAll() called by app, callingUid=" + uid);
             } finally {
                 Binder.restoreCallingIdentity(ident);
@@ -3023,7 +3012,8 @@
         if (!hasJobId) {
             pw.println("Canceling all jobs for " + pkgName + " in user " + userId);
             if (!cancelJobsForUid(pkgUid, JobParameters.STOP_REASON_USER,
-                    JobParameters.REASON_CANCELED, "cancel shell command for package")) {
+                    JobParameters.INTERNAL_STOP_REASON_CANCELED,
+                    "cancel shell command for package")) {
                 pw.println("No matching jobs found.");
             }
         } else {
@@ -3101,7 +3091,7 @@
                     pw.print("pending");
                     printed = true;
                 }
-                if (isCurrentlyActiveLocked(js)) {
+                if (mConcurrencyManager.isJobRunningLocked(js)) {
                     if (printed) {
                         pw.print(" ");
                     }
@@ -3263,9 +3253,9 @@
                         for (int i = mJobRestrictions.size() - 1; i >= 0; i--) {
                             final JobRestriction restriction = mJobRestrictions.get(i);
                             if (restriction.isJobRestricted(job)) {
-                                final int reason = restriction.getLegacyReason();
+                                final int reason = restriction.getInternalReason();
                                 pw.print(" ");
-                                pw.print(JobParameters.getLegacyReasonCodeDescription(reason));
+                                pw.print(JobParameters.getInternalReasonCodeDescription(reason));
                             }
                         }
                     } else {
@@ -3284,7 +3274,7 @@
                     pw.print(" !pending=");
                     pw.print(!mPendingJobs.contains(job));
                     pw.print(" !active=");
-                    pw.print(!isCurrentlyActiveLocked(job));
+                    pw.print(!mConcurrencyManager.isJobRunningLocked(job));
                     pw.print(" !backingup=");
                     pw.print(!(mBackingUpUids.indexOfKey(job.getSourceUid()) >= 0));
                     pw.print(" comp=");
@@ -3540,7 +3530,7 @@
                     proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_JOB_PENDING,
                             mPendingJobs.contains(job));
                     proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_JOB_CURRENTLY_ACTIVE,
-                            isCurrentlyActiveLocked(job));
+                            mConcurrencyManager.isJobRunningLocked(job));
                     proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_UID_BACKING_UP,
                             mBackingUpUids.indexOfKey(job.getSourceUid()) >= 0);
                     proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_COMPONENT_USABLE,
@@ -3550,7 +3540,7 @@
                         final long restrictionsToken = proto.start(
                                 JobSchedulerServiceDumpProto.RegisteredJob.RESTRICTIONS);
                         proto.write(JobSchedulerServiceDumpProto.JobRestriction.REASON,
-                                restriction.getLegacyReason());
+                                restriction.getInternalReason());
                         proto.write(JobSchedulerServiceDumpProto.JobRestriction.IS_RESTRICTING,
                                 restriction.isJobRestricted(job));
                         proto.end(restrictionsToken);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
index 44b3e3e..3fa1c12 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
@@ -156,7 +156,7 @@
      * {@link JobParameters#STOP_REASON_UNDEFINED}.
      */
     private int mPendingStopReason = JobParameters.STOP_REASON_UNDEFINED;
-    private int mPendingLegacyStopReason;
+    private int mPendingInternalStopReason;
     private String mPendingDebugStopReason;
 
     // Debugging: reason this job was last stopped.
@@ -314,7 +314,8 @@
             FrameworkStatsLog.write_non_chained(FrameworkStatsLog.SCHEDULED_JOB_STATE_CHANGED,
                     job.getSourceUid(), null, job.getBatteryName(),
                     FrameworkStatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED,
-                    JobProtoEnums.STOP_REASON_UNKNOWN, job.getStandbyBucket(), job.getJobId(),
+                    JobProtoEnums.INTERNAL_STOP_REASON_UNKNOWN,
+                    job.getStandbyBucket(), job.getJobId(),
                     job.hasChargingConstraint(),
                     job.hasBatteryNotLowConstraint(),
                     job.hasStorageNotLowConstraint(),
@@ -324,7 +325,8 @@
                     job.hasConnectivityConstraint(),
                     job.hasContentTriggerConstraint(),
                     job.isRequestedExpeditedJob(),
-                    job.shouldTreatAsExpeditedJob());
+                    job.shouldTreatAsExpeditedJob(),
+                    JobProtoEnums.STOP_REASON_UNDEFINED);
             try {
                 mBatteryStats.noteJobStart(job.getBatteryName(), job.getSourceUid());
             } catch (RemoteException e) {
@@ -366,8 +368,8 @@
     /** Called externally when a job that was scheduled for execution should be cancelled. */
     @GuardedBy("mLock")
     void cancelExecutingJobLocked(@JobParameters.StopReason int reason,
-            int legacyStopReason, @NonNull String debugReason) {
-        doCancelLocked(reason, legacyStopReason, debugReason);
+            int internalStopReason, @NonNull String debugReason) {
+        doCancelLocked(reason, internalStopReason, debugReason);
     }
 
     int getPreferredUid() {
@@ -400,7 +402,7 @@
                 && (!matchJobId || jobId == executing.getJobId())) {
             if (mVerb == VERB_EXECUTING) {
                 mParams.setStopReason(JobParameters.STOP_REASON_TIMEOUT,
-                        JobParameters.REASON_TIMEOUT, reason);
+                        JobParameters.INTERNAL_STOP_REASON_TIMEOUT, reason);
                 sendStopMessageLocked("force timeout from shell");
                 return true;
             }
@@ -409,7 +411,20 @@
     }
 
     void doJobFinished(JobCallback cb, int jobId, boolean reschedule) {
-        doCallback(cb, reschedule, "app called jobFinished");
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            synchronized (mLock) {
+                if (!verifyCallerLocked(cb)) {
+                    return;
+                }
+                mParams.setStopReason(JobParameters.STOP_REASON_UNDEFINED,
+                        JobParameters.INTERNAL_STOP_REASON_SUCCESSFUL_FINISH,
+                        "app called jobFinished");
+                doCallbackLocked(reschedule, "app called jobFinished");
+            }
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
     }
 
     void doAcknowledgeStopMessage(JobCallback cb, int jobId, boolean reschedule) {
@@ -433,6 +448,9 @@
                 }
                 final JobWorkItem work = mRunningJob.dequeueWorkLocked();
                 if (work == null && !mRunningJob.hasExecutingWorkLocked()) {
+                    mParams.setStopReason(JobParameters.STOP_REASON_UNDEFINED,
+                            JobParameters.INTERNAL_STOP_REASON_SUCCESSFUL_FINISH,
+                            "last work dequeued");
                     // This will finish the job.
                     doCallbackLocked(false, "last work dequeued");
                 }
@@ -627,8 +645,8 @@
     }
 
     @GuardedBy("mLock")
-    private void doCancelLocked(@JobParameters.StopReason int stopReasonCode, int legacyStopReason,
-            @Nullable String debugReason) {
+    private void doCancelLocked(@JobParameters.StopReason int stopReasonCode,
+            int internalStopReasonCode, @Nullable String debugReason) {
         if (mVerb == VERB_FINISHED) {
             if (DEBUG) {
                 Slog.d(TAG,
@@ -644,15 +662,14 @@
             final long nowElapsed = sElapsedRealtimeClock.millis();
             if (nowElapsed < earliestStopTimeElapsed) {
                 mPendingStopReason = stopReasonCode;
-                mPendingLegacyStopReason = legacyStopReason;
+                mPendingInternalStopReason = internalStopReasonCode;
                 mPendingDebugStopReason = debugReason;
                 return;
             }
         }
-        mParams.setStopReason(stopReasonCode, legacyStopReason, debugReason);
-        if (legacyStopReason == JobParameters.REASON_PREEMPT) {
-            mPreferredUid = mRunningJob != null ? mRunningJob.getUid() :
-                    NO_PREFERRED_UID;
+        mParams.setStopReason(stopReasonCode, internalStopReasonCode, debugReason);
+        if (internalStopReasonCode == JobParameters.INTERNAL_STOP_REASON_PREEMPT) {
+            mPreferredUid = mRunningJob != null ? mRunningJob.getUid() : NO_PREFERRED_UID;
         }
         handleCancelLocked(debugReason);
     }
@@ -807,12 +824,12 @@
                         // the device was temporarily taken off the charger). Ignore the pending
                         // stop and see what the manager says.
                         mPendingStopReason = JobParameters.STOP_REASON_UNDEFINED;
-                        mPendingLegacyStopReason = 0;
+                        mPendingInternalStopReason = 0;
                         mPendingDebugStopReason = null;
                     } else {
                         Slog.i(TAG, "JS was waiting to stop this job."
                                 + " Sending onStop: " + getRunningJobNameLocked());
-                        mParams.setStopReason(mPendingStopReason, mPendingLegacyStopReason,
+                        mParams.setStopReason(mPendingStopReason, mPendingInternalStopReason,
                                 mPendingDebugStopReason);
                         sendStopMessageLocked(mPendingDebugStopReason);
                         break;
@@ -826,7 +843,7 @@
                     Slog.i(TAG, "Client timed out while executing (no jobFinished received)."
                             + " Sending onStop: " + getRunningJobNameLocked());
                     mParams.setStopReason(JobParameters.STOP_REASON_TIMEOUT,
-                            JobParameters.REASON_TIMEOUT, "client timed out");
+                            JobParameters.INTERNAL_STOP_REASON_TIMEOUT, "client timed out");
                     sendStopMessageLocked("timeout while executing");
                 } else {
                     // We've given the app the minimum execution time. See if we should stop it or
@@ -839,7 +856,7 @@
                         // of timeout since all of the reasons could equate to "the system needs
                         // the resources the app is currently using."
                         mParams.setStopReason(JobParameters.STOP_REASON_DEVICE_STATE,
-                                JobParameters.REASON_TIMEOUT, reason);
+                                JobParameters.INTERNAL_STOP_REASON_TIMEOUT, reason);
                         sendStopMessageLocked(reason);
                     } else {
                         Slog.i(TAG, "Letting " + getRunningJobNameLocked()
@@ -893,12 +910,12 @@
         }
         applyStoppedReasonLocked(reason);
         completedJob = mRunningJob;
-        final int legacyStopReason = mParams.getLegacyStopReason();
-        mJobPackageTracker.noteInactive(completedJob, legacyStopReason, reason);
+        final int internalStopReason = mParams.getInternalStopReasonCode();
+        mJobPackageTracker.noteInactive(completedJob, internalStopReason, reason);
         FrameworkStatsLog.write_non_chained(FrameworkStatsLog.SCHEDULED_JOB_STATE_CHANGED,
                 completedJob.getSourceUid(), null, completedJob.getBatteryName(),
                 FrameworkStatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED,
-                legacyStopReason, completedJob.getStandbyBucket(), completedJob.getJobId(),
+                internalStopReason, completedJob.getStandbyBucket(), completedJob.getJobId(),
                 completedJob.hasChargingConstraint(),
                 completedJob.hasBatteryNotLowConstraint(),
                 completedJob.hasStorageNotLowConstraint(),
@@ -908,10 +925,11 @@
                 completedJob.hasConnectivityConstraint(),
                 completedJob.hasContentTriggerConstraint(),
                 completedJob.isRequestedExpeditedJob(),
-                completedJob.startedAsExpeditedJob);
+                completedJob.startedAsExpeditedJob,
+                mParams.getStopReason());
         try {
             mBatteryStats.noteJobFinish(mRunningJob.getBatteryName(), mRunningJob.getSourceUid(),
-                    legacyStopReason);
+                    internalStopReason);
         } catch (RemoteException e) {
             // Whatever.
         }
@@ -930,10 +948,10 @@
         service = null;
         mAvailable = true;
         mPendingStopReason = JobParameters.STOP_REASON_UNDEFINED;
-        mPendingLegacyStopReason = 0;
+        mPendingInternalStopReason = 0;
         mPendingDebugStopReason = null;
         removeOpTimeOutLocked();
-        mCompletedListener.onJobCompletedLocked(completedJob, legacyStopReason, reschedule);
+        mCompletedListener.onJobCompletedLocked(completedJob, internalStopReason, reschedule);
         mJobConcurrencyManager.onJobCompletedLocked(this, completedJob, workType);
     }
 
@@ -1023,7 +1041,7 @@
                 pw.print(" Pending stop because ");
                 pw.print(mPendingStopReason);
                 pw.print("/");
-                pw.print(mPendingLegacyStopReason);
+                pw.print(mPendingInternalStopReason);
                 pw.print("/");
                 pw.print(mPendingDebugStopReason);
             }
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
index 2bdf656..7b947fd 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
@@ -697,7 +697,7 @@
             }
             callback.setUid(uidStats.uid);
             mCurrentDefaultNetworkCallbacks.append(uidStats.uid, callback);
-            mConnManager.registerDefaultNetworkCallbackAsUid(uidStats.uid, callback, mHandler);
+            mConnManager.registerDefaultNetworkCallbackForUid(uidStats.uid, callback, mHandler);
         }
     }
 
@@ -794,7 +794,7 @@
                     }
                     defaultNetworkCallback.setUid(us.uid);
                     mCurrentDefaultNetworkCallbacks.append(us.uid, defaultNetworkCallback);
-                    mConnManager.registerDefaultNetworkCallbackAsUid(
+                    mConnManager.registerDefaultNetworkCallbackForUid(
                             us.uid, defaultNetworkCallback, mHandler);
                 }
             }
diff --git a/apex/jobscheduler/service/java/com/android/server/job/restrictions/JobRestriction.java b/apex/jobscheduler/service/java/com/android/server/job/restrictions/JobRestriction.java
index 2962b10..20df3ea 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/restrictions/JobRestriction.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/restrictions/JobRestriction.java
@@ -28,7 +28,7 @@
  * Used by {@link JobSchedulerService} to impose additional restrictions regarding whether jobs
  * should be scheduled or not based on the state of the system/device.
  * Every restriction is associated with exactly one stop reason, which could be retrieved using
- * {@link #getReason()} (and the legacy reason via {@link #getLegacyReason()}).
+ * {@link #getReason()} (and the internal reason via {@link #getInternalReason()}).
  * Note, that this is not taken into account for the jobs that have priority
  * {@link JobInfo#PRIORITY_FOREGROUND_APP} or higher.
  */
@@ -36,13 +36,13 @@
 
     final JobSchedulerService mService;
     private final int mReason;
-    private final int mLegacyReason;
+    private final int mInternalReason;
 
     JobRestriction(JobSchedulerService service, @JobParameters.StopReason int reason,
-            int legacyReason) {
+            int internalReason) {
         mService = service;
         mReason = reason;
-        mLegacyReason = legacyReason;
+        mInternalReason = internalReason;
     }
 
     /**
@@ -74,7 +74,7 @@
         return mReason;
     }
 
-    public final int getLegacyReason() {
-        return mLegacyReason;
+    public final int getInternalReason() {
+        return mInternalReason;
     }
 }
diff --git a/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java b/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java
index 8b699e9..3069db3 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java
@@ -34,7 +34,8 @@
     private PowerManager mPowerManager;
 
     public ThermalStatusRestriction(JobSchedulerService service) {
-        super(service, JobParameters.STOP_REASON_DEVICE_STATE, JobParameters.REASON_DEVICE_THERMAL);
+        super(service, JobParameters.STOP_REASON_DEVICE_STATE,
+                JobParameters.INTERNAL_STOP_REASON_DEVICE_THERMAL);
     }
 
     @Override
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 97ee0e1..ebf4ed0 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -58,7 +58,6 @@
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
-import android.app.AppGlobals;
 import android.app.usage.AppStandbyInfo;
 import android.app.usage.UsageEvents;
 import android.app.usage.UsageStatsManager.StandbyBuckets;
@@ -75,7 +74,6 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
-import android.content.pm.ParceledListSlice;
 import android.database.ContentObserver;
 import android.hardware.display.DisplayManager;
 import android.net.NetworkScoreManager;
@@ -101,7 +99,7 @@
 import android.util.IndentingPrintWriter;
 import android.util.Slog;
 import android.util.SparseArray;
-import android.util.SparseIntArray;
+import android.util.SparseBooleanArray;
 import android.util.TimeUtils;
 import android.view.Display;
 import android.widget.Toast;
@@ -118,6 +116,8 @@
 import com.android.server.pm.parsing.pkg.AndroidPackage;
 import com.android.server.usage.AppIdleHistory.AppUsageHistory;
 
+import libcore.util.EmptyArray;
+
 import java.io.File;
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -1249,71 +1249,55 @@
     @Override
     public int[] getIdleUidsForUser(int userId) {
         if (!mAppIdleEnabled) {
-            return new int[0];
+            return EmptyArray.INT;
         }
 
         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "getIdleUidsForUser");
 
         final long elapsedRealtime = mInjector.elapsedRealtime();
 
-        List<ApplicationInfo> apps;
-        try {
-            ParceledListSlice<ApplicationInfo> slice = AppGlobals.getPackageManager()
-                    .getInstalledApplications(/* flags= */ 0, userId);
-            if (slice == null) {
-                return new int[0];
-            }
-            apps = slice.getList();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
+        final PackageManagerInternal pmi = mInjector.getPackageManagerInternal();
+        final List<ApplicationInfo> apps = pmi.getInstalledApplications(0, userId, Process.myUid());
+        if (apps == null) {
+            return EmptyArray.INT;
         }
 
-        // State of each uid.  Key is the uid.  Value lower 16 bits is the number of apps
-        // associated with that uid, upper 16 bits is the number of those apps that is idle.
-        SparseIntArray uidStates = new SparseIntArray();
-
-        // Now resolve all app state.  Iterating over all apps, keeping track of how many
-        // we find for each uid and how many of those are idle.
+        // State of each uid: Key is the uid, value is whether all the apps in that uid are idle.
+        final SparseBooleanArray uidIdleStates = new SparseBooleanArray();
+        int notIdleCount = 0;
         for (int i = apps.size() - 1; i >= 0; i--) {
-            ApplicationInfo ai = apps.get(i);
+            final ApplicationInfo ai = apps.get(i);
+            final int index = uidIdleStates.indexOfKey(ai.uid);
 
-            // Check whether this app is idle.
-            boolean idle = isAppIdleFiltered(ai.packageName, UserHandle.getAppId(ai.uid),
-                    userId, elapsedRealtime);
+            final boolean currentIdle = (index < 0) ? true : uidIdleStates.valueAt(index);
 
-            int index = uidStates.indexOfKey(ai.uid);
+            final boolean newIdle = currentIdle && isAppIdleFiltered(ai.packageName,
+                    UserHandle.getAppId(ai.uid), userId, elapsedRealtime);
+
+            if (currentIdle && !newIdle) {
+                // This transition from true to false can happen at most once per uid in this loop.
+                notIdleCount++;
+            }
             if (index < 0) {
-                uidStates.put(ai.uid, 1 + (idle ? 1<<16 : 0));
+                uidIdleStates.put(ai.uid, newIdle);
             } else {
-                int value = uidStates.valueAt(index);
-                uidStates.setValueAt(index, value + 1 + (idle ? 1<<16 : 0));
+                uidIdleStates.setValueAt(index, newIdle);
             }
         }
 
+        int numIdleUids = uidIdleStates.size() - notIdleCount;
+        final int[] idleUids = new int[numIdleUids];
+        for (int i = uidIdleStates.size() - 1; i >= 0; i--) {
+            if (uidIdleStates.valueAt(i)) {
+                idleUids[--numIdleUids] = uidIdleStates.keyAt(i);
+            }
+        }
         if (DEBUG) {
             Slog.d(TAG, "getIdleUids took " + (mInjector.elapsedRealtime() - elapsedRealtime));
         }
-        int numIdle = 0;
-        for (int i = uidStates.size() - 1; i >= 0; i--) {
-            int value = uidStates.valueAt(i);
-            if ((value&0x7fff) == (value>>16)) {
-                numIdle++;
-            }
-        }
-
-        int[] res = new int[numIdle];
-        numIdle = 0;
-        for (int i = uidStates.size() - 1; i >= 0; i--) {
-            int value = uidStates.valueAt(i);
-            if ((value&0x7fff) == (value>>16)) {
-                res[numIdle] = uidStates.keyAt(i);
-                numIdle++;
-            }
-        }
-
         Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
 
-        return res;
+        return idleUids;
     }
 
     @Override
diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp
index 7020f18..1bf732b 100644
--- a/apex/media/framework/Android.bp
+++ b/apex/media/framework/Android.bp
@@ -41,7 +41,10 @@
     installable: true,
 
     sdk_version: "module_current",
-    libs: ["framework-annotations-lib"],
+    libs: [
+        "androidx.annotation_annotation",
+        "framework-annotations-lib",
+    ],
     static_libs: [
         "exoplayer2-extractor",
         "mediatranscoding_aidl_interface-java",
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java
index cff422d..8cc3bc0 100644
--- a/apex/media/framework/java/android/media/MediaParser.java
+++ b/apex/media/framework/java/android/media/MediaParser.java
@@ -28,6 +28,10 @@
 import android.util.Pair;
 import android.util.SparseArray;
 
+import androidx.annotation.RequiresApi;
+
+import com.android.modules.utils.build.SdkLevel;
+
 import com.google.android.exoplayer2.C;
 import com.google.android.exoplayer2.Format;
 import com.google.android.exoplayer2.ParserException;
@@ -1068,7 +1072,7 @@
     private boolean mReleased;
 
     // MediaMetrics fields.
-    @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
+    @Nullable private LogSessionId mLogSessionId;
     private final boolean mCreatedByName;
     private final SparseArray<Format> mTrackFormats;
     private String mLastObservedExceptionName;
@@ -1331,7 +1335,7 @@
                                 MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH));
 
         nativeSubmitMetrics(
-                // TODO: mLogSessionId,
+                SdkLevel.isAtLeastS() ? getLogSessionIdStringV31() : "",
                 mParserName,
                 mCreatedByName,
                 String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool),
@@ -1345,13 +1349,15 @@
                 videoHeight);
     }
 
-    public void setLogSessionId(@NonNull LogSessionId sessionId) {
-        this.mLogSessionId = Objects.requireNonNull(sessionId);
+    @RequiresApi(31)
+    public void setLogSessionId(@NonNull LogSessionId logSessionId) {
+        this.mLogSessionId = Objects.requireNonNull(logSessionId);
     }
 
+    @RequiresApi(31)
     @NonNull
     public LogSessionId getLogSessionId() {
-        return mLogSessionId;
+        return mLogSessionId != null ? mLogSessionId : LogSessionId.LOG_SESSION_ID_NONE;
     }
 
     // Private methods.
@@ -1548,6 +1554,11 @@
         return (String) mParserParameters.getOrDefault(name, defaultValue);
     }
 
+    @RequiresApi(31)
+    private String getLogSessionIdStringV31() {
+        return mLogSessionId != null ? mLogSessionId.getStringId() : "";
+    }
+
     // Private classes.
 
     private static final class InputReadingDataReader implements DataReader {
@@ -2197,7 +2208,7 @@
     // Native methods.
 
     private native void nativeSubmitMetrics(
-            // TODO: String logSessionId,
+            String logSessionId,
             String parserName,
             boolean createdByName,
             String parserPool,
diff --git a/apex/media/framework/java/android/media/MediaTranscodeManager.java b/apex/media/framework/java/android/media/MediaTranscodeManager.java
index d7e9609..d1106a2 100644
--- a/apex/media/framework/java/android/media/MediaTranscodeManager.java
+++ b/apex/media/framework/java/android/media/MediaTranscodeManager.java
@@ -22,6 +22,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.app.ActivityManager;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
@@ -36,6 +37,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.modules.annotation.MinSdk;
+import com.android.modules.utils.build.SdkLevel;
 
 import java.io.FileNotFoundException;
 import java.lang.annotation.Retention;
@@ -119,6 +121,7 @@
     private final String mPackageName;
     private final int mPid;
     private final int mUid;
+    private final boolean mIsLowRamDevice;
     private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
     private final HashMap<Integer, TranscodingSession> mPendingTranscodingSessions = new HashMap();
     private final Object mLock = new Object();
@@ -199,7 +202,16 @@
         }
     }
 
-    private static IMediaTranscodingService getService(boolean retry) {
+    private IMediaTranscodingService getService(boolean retry) {
+        // Do not try to get the service on pre-S. The service is lazy-start and getting the
+        // service could block.
+        if (!SdkLevel.isAtLeastS()) {
+            return null;
+        }
+        // Do not try to get the service on AndroidGo (low-ram) devices.
+        if (mIsLowRamDevice) {
+            return null;
+        }
         int retryCount = !retry ? 1 :  CONNECT_SERVICE_RETRY_COUNT;
         Log.i(TAG, "get service with retry " + retryCount);
         for (int count = 1;  count <= retryCount; count++) {
@@ -417,6 +429,7 @@
         mPackageName = mContext.getPackageName();
         mUid = Os.getuid();
         mPid = Os.getpid();
+        mIsLowRamDevice = mContext.getSystemService(ActivityManager.class).isLowRamDevice();
         IMediaTranscodingService service = getService(false /*retry*/);
         if (service != null) {
             mTranscodingClient = registerClient(service);
diff --git a/apex/media/framework/jni/android_media_MediaParserJNI.cpp b/apex/media/framework/jni/android_media_MediaParserJNI.cpp
index 7fc4628..c81152c 100644
--- a/apex/media/framework/jni/android_media_MediaParserJNI.cpp
+++ b/apex/media/framework/jni/android_media_MediaParserJNI.cpp
@@ -29,6 +29,7 @@
 
 constexpr char kMediaMetricsKey[] = "mediaparser";
 
+constexpr char kAttributeLogSessionId[] = "android.media.mediaparser.logSessionId";
 constexpr char kAttributeParserName[] = "android.media.mediaparser.parserName";
 constexpr char kAttributeCreatedByName[] = "android.media.mediaparser.createdByName";
 constexpr char kAttributeParserPool[] = "android.media.mediaparser.parserPool";
@@ -65,11 +66,14 @@
 
 } // namespace
 
-JNI_FUNCTION(void, nativeSubmitMetrics, jstring parserNameJstring, jboolean createdByName,
-             jstring parserPoolJstring, jstring lastExceptionJstring, jlong resourceByteCount,
-             jlong durationMillis, jstring trackMimeTypesJstring, jstring trackCodecsJstring,
-             jstring alteredParameters, jint videoWidth, jint videoHeight) {
+JNI_FUNCTION(void, nativeSubmitMetrics, jstring logSessionIdJstring, jstring parserNameJstring,
+             jboolean createdByName, jstring parserPoolJstring, jstring lastExceptionJstring,
+             jlong resourceByteCount, jlong durationMillis, jstring trackMimeTypesJstring,
+             jstring trackCodecsJstring, jstring alteredParameters, jint videoWidth,
+             jint videoHeight) {
     mediametrics_handle_t item(mediametrics_create(kMediaMetricsKey));
+    mediametrics_setCString(item, kAttributeLogSessionId,
+                            JstringHandle(env, logSessionIdJstring).value());
     mediametrics_setCString(item, kAttributeParserName,
                             JstringHandle(env, parserNameJstring).value());
     mediametrics_setInt32(item, kAttributeCreatedByName, createdByName ? 1 : 0);
diff --git a/api/Android.bp b/api/Android.bp
index 6571270..5b73388 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -370,7 +370,7 @@
         {
             targets: ["sdk", "win_sdk"],
             dir: "apistubs/android/system-server/api",
-            dest: "merge-android.txt",
+            dest: "android.txt",
         },
     ],
 }
@@ -394,7 +394,7 @@
         {
             targets: ["sdk", "win_sdk"],
             dir: "apistubs/android/system-server/api",
-            dest: "merge-removed.txt",
+            dest: "removed.txt",
         },
     ],
 }
diff --git a/boot/Android.bp b/boot/Android.bp
index 844dd64..ef2abc8 100644
--- a/boot/Android.bp
+++ b/boot/Android.bp
@@ -44,6 +44,19 @@
 platform_bootclasspath {
     name: "platform-bootclasspath",
 
+    // The bootclasspath_fragments that contribute to the platform
+    // bootclasspath.
+    fragments: [
+        {
+            apex: "com.android.art",
+            module: "art-bootclasspath-fragment",
+        },
+        {
+            apex: "com.android.i18n",
+            module: "i18n-bootclasspath-fragment",
+        },
+    ],
+
     // Additional information needed by hidden api processing.
     hidden_api: {
         unsupported: [
@@ -64,9 +77,6 @@
         max_target_o_low_priority: [
             "hiddenapi/hiddenapi-max-target-o.txt",
         ],
-        blocked: [
-            "hiddenapi/hiddenapi-force-blocked.txt",
-        ],
         unsupported_packages: [
             "hiddenapi/hiddenapi-unsupported-packages.txt",
         ],
diff --git a/boot/hiddenapi/hiddenapi-force-blocked.txt b/boot/hiddenapi/hiddenapi-force-blocked.txt
deleted file mode 100644
index b328f2a..0000000
--- a/boot/hiddenapi/hiddenapi-force-blocked.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-Ldalvik/system/VMRuntime;->setHiddenApiExemptions([Ljava/lang/String;)V
-Ldalvik/system/VMRuntime;->setTargetSdkVersion(I)V
-Ldalvik/system/VMRuntime;->setTargetSdkVersionNative(I)V
-Ljava/lang/invoke/MethodHandles$Lookup;->IMPL_LOOKUP:Ljava/lang/invoke/MethodHandles$Lookup;
-Ljava/lang/invoke/VarHandle;->acquireFence()V
-Ljava/lang/invoke/VarHandle;->compareAndExchange([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->compareAndExchangeAcquire([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->compareAndExchangeRelease([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->compareAndSet([Ljava/lang/Object;)Z
-Ljava/lang/invoke/VarHandle;->fullFence()V
-Ljava/lang/invoke/VarHandle;->get([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAcquire([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndAdd([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndAddAcquire([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndAddRelease([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseAnd([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseAndAcquire([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseAndRelease([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseOr([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseOrAcquire([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseOrRelease([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseXor([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseXorAcquire([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndBitwiseXorRelease([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndSet([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndSetAcquire([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getAndSetRelease([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getOpaque([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->getVolatile([Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/VarHandle;->loadLoadFence()V
-Ljava/lang/invoke/VarHandle;->releaseFence()V
-Ljava/lang/invoke/VarHandle;->set([Ljava/lang/Object;)V
-Ljava/lang/invoke/VarHandle;->setOpaque([Ljava/lang/Object;)V
-Ljava/lang/invoke/VarHandle;->setRelease([Ljava/lang/Object;)V
-Ljava/lang/invoke/VarHandle;->setVolatile([Ljava/lang/Object;)V
-Ljava/lang/invoke/VarHandle;->storeStoreFence()V
-Ljava/lang/invoke/VarHandle;->weakCompareAndSet([Ljava/lang/Object;)Z
-Ljava/lang/invoke/VarHandle;->weakCompareAndSetAcquire([Ljava/lang/Object;)Z
-Ljava/lang/invoke/VarHandle;->weakCompareAndSetPlain([Ljava/lang/Object;)Z
-Ljava/lang/invoke/VarHandle;->weakCompareAndSetRelease([Ljava/lang/Object;)Z
diff --git a/boot/hiddenapi/hiddenapi-max-target-o.txt b/boot/hiddenapi/hiddenapi-max-target-o.txt
index 3fee568..45ebbb1 100644
--- a/boot/hiddenapi/hiddenapi-max-target-o.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-o.txt
@@ -25375,7248 +25375,6 @@
 Landroid/hardware/usb/UsbRequest;->native_queue_array([BIZ)Z
 Landroid/hardware/usb/UsbRequest;->native_queue_direct(Ljava/nio/ByteBuffer;IZ)Z
 Landroid/hardware/usb/UsbRequest;->TAG:Ljava/lang/String;
-Landroid/icu/impl/BMPSet;->bmpBlockBits:[I
-Landroid/icu/impl/BMPSet;->containsSlow(III)Z
-Landroid/icu/impl/BMPSet;->findCodePoint(III)I
-Landroid/icu/impl/BMPSet;->initBits()V
-Landroid/icu/impl/BMPSet;->latin1Contains:[Z
-Landroid/icu/impl/BMPSet;->list4kStarts:[I
-Landroid/icu/impl/BMPSet;->list:[I
-Landroid/icu/impl/BMPSet;->listLength:I
-Landroid/icu/impl/BMPSet;->set32x64Bits([III)V
-Landroid/icu/impl/BMPSet;->table7FF:[I
-Landroid/icu/impl/CacheValue$NullValue;-><init>()V
-Landroid/icu/impl/CacheValue$SoftValue;-><init>(Ljava/lang/Object;)V
-Landroid/icu/impl/CacheValue$SoftValue;->ref:Ljava/lang/ref/Reference;
-Landroid/icu/impl/CacheValue$StrongValue;-><init>(Ljava/lang/Object;)V
-Landroid/icu/impl/CacheValue$StrongValue;->value:Ljava/lang/Object;
-Landroid/icu/impl/CacheValue;->NULL_VALUE:Landroid/icu/impl/CacheValue;
-Landroid/icu/impl/CacheValue;->strength:Landroid/icu/impl/CacheValue$Strength;
-Landroid/icu/impl/CalendarAstronomer$AngleFunc;->eval()D
-Landroid/icu/impl/CalendarAstronomer$CoordFunc;->eval()Landroid/icu/impl/CalendarAstronomer$Equatorial;
-Landroid/icu/impl/CalendarAstronomer$MoonAge;-><init>(D)V
-Landroid/icu/impl/CalendarAstronomer$MoonAge;->value:D
-Landroid/icu/impl/CalendarAstronomer$SolarLongitude;-><init>(D)V
-Landroid/icu/impl/CalendarAstronomer$SolarLongitude;->value:D
-Landroid/icu/impl/CalendarAstronomer;->clearCache()V
-Landroid/icu/impl/CalendarAstronomer;->DEG_RAD:D
-Landroid/icu/impl/CalendarAstronomer;->eclipObliquity:D
-Landroid/icu/impl/CalendarAstronomer;->eclipticObliquity()D
-Landroid/icu/impl/CalendarAstronomer;->EPOCH_2000_MS:J
-Landroid/icu/impl/CalendarAstronomer;->fGmtOffset:J
-Landroid/icu/impl/CalendarAstronomer;->fLatitude:D
-Landroid/icu/impl/CalendarAstronomer;->fLongitude:D
-Landroid/icu/impl/CalendarAstronomer;->getSiderealOffset()D
-Landroid/icu/impl/CalendarAstronomer;->getSunLongitude(D)[D
-Landroid/icu/impl/CalendarAstronomer;->INVALID:D
-Landroid/icu/impl/CalendarAstronomer;->JD_EPOCH:D
-Landroid/icu/impl/CalendarAstronomer;->julianCentury:D
-Landroid/icu/impl/CalendarAstronomer;->julianDay:D
-Landroid/icu/impl/CalendarAstronomer;->lstToUT(D)J
-Landroid/icu/impl/CalendarAstronomer;->meanAnomalySun:D
-Landroid/icu/impl/CalendarAstronomer;->moonA:D
-Landroid/icu/impl/CalendarAstronomer;->moonE:D
-Landroid/icu/impl/CalendarAstronomer;->moonEclipLong:D
-Landroid/icu/impl/CalendarAstronomer;->moonI:D
-Landroid/icu/impl/CalendarAstronomer;->moonL0:D
-Landroid/icu/impl/CalendarAstronomer;->moonLongitude:D
-Landroid/icu/impl/CalendarAstronomer;->moonN0:D
-Landroid/icu/impl/CalendarAstronomer;->moonP0:D
-Landroid/icu/impl/CalendarAstronomer;->moonPi:D
-Landroid/icu/impl/CalendarAstronomer;->moonPosition:Landroid/icu/impl/CalendarAstronomer$Equatorial;
-Landroid/icu/impl/CalendarAstronomer;->moonT0:D
-Landroid/icu/impl/CalendarAstronomer;->norm2PI(D)D
-Landroid/icu/impl/CalendarAstronomer;->normalize(DD)D
-Landroid/icu/impl/CalendarAstronomer;->normPI(D)D
-Landroid/icu/impl/CalendarAstronomer;->PI2:D
-Landroid/icu/impl/CalendarAstronomer;->PI:D
-Landroid/icu/impl/CalendarAstronomer;->radToDms(D)Ljava/lang/String;
-Landroid/icu/impl/CalendarAstronomer;->radToHms(D)Ljava/lang/String;
-Landroid/icu/impl/CalendarAstronomer;->RAD_DEG:D
-Landroid/icu/impl/CalendarAstronomer;->RAD_HOUR:D
-Landroid/icu/impl/CalendarAstronomer;->riseOrSet(Landroid/icu/impl/CalendarAstronomer$CoordFunc;ZDDJ)J
-Landroid/icu/impl/CalendarAstronomer;->siderealT0:D
-Landroid/icu/impl/CalendarAstronomer;->siderealTime:D
-Landroid/icu/impl/CalendarAstronomer;->sunLongitude:D
-Landroid/icu/impl/CalendarAstronomer;->SUN_E:D
-Landroid/icu/impl/CalendarAstronomer;->SUN_ETA_G:D
-Landroid/icu/impl/CalendarAstronomer;->SUN_OMEGA_G:D
-Landroid/icu/impl/CalendarAstronomer;->time:J
-Landroid/icu/impl/CalendarAstronomer;->timeOfAngle(Landroid/icu/impl/CalendarAstronomer$AngleFunc;DDJZ)J
-Landroid/icu/impl/CalendarAstronomer;->trueAnomaly(DD)D
-Landroid/icu/impl/CalendarCache;->arraySize:I
-Landroid/icu/impl/CalendarCache;->findIndex(J)I
-Landroid/icu/impl/CalendarCache;->hash(J)I
-Landroid/icu/impl/CalendarCache;->hash2(J)I
-Landroid/icu/impl/CalendarCache;->keys:[J
-Landroid/icu/impl/CalendarCache;->makeArrays(I)V
-Landroid/icu/impl/CalendarCache;->pIndex:I
-Landroid/icu/impl/CalendarCache;->primes:[I
-Landroid/icu/impl/CalendarCache;->rehash()V
-Landroid/icu/impl/CalendarCache;->size:I
-Landroid/icu/impl/CalendarCache;->threshold:I
-Landroid/icu/impl/CalendarCache;->values:[J
-Landroid/icu/impl/CharTrie;->m_data_:[C
-Landroid/icu/impl/CharTrie;->m_initialValue_:C
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;->DEFAULT_CTX_MATCH:Ljava/lang/String;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;->DEFAULT_CUR_MATCH:Ljava/lang/String;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;->DEFAULT_INSERT:Ljava/lang/String;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;->symbols:[[Ljava/lang/String;
-Landroid/icu/impl/CurrencyData$DefaultInfo;-><init>(Z)V
-Landroid/icu/impl/CurrencyData$DefaultInfo;->fallback:Z
-Landroid/icu/impl/CurrencyData$DefaultInfo;->FALLBACK_INSTANCE:Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;
-Landroid/icu/impl/CurrencyData$DefaultInfo;->NO_FALLBACK_INSTANCE:Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;
-Landroid/icu/impl/DayPeriodRules$CutoffType;->AFTER:Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$CutoffType;->AT:Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$CutoffType;->BEFORE:Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$CutoffType;->FROM:Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$CutoffType;->fromStringOrNull(Ljava/lang/CharSequence;)Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$CutoffType;->valueOf(Ljava/lang/String;)Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$CutoffType;->values()[Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$DayPeriod;->fromStringOrNull(Ljava/lang/CharSequence;)Landroid/icu/impl/DayPeriodRules$DayPeriod;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesCountSink;-><init>(Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;)V
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesCountSink;->data:Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;-><init>()V
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;->localesToRuleSetNumMap:Ljava/util/Map;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;->maxRuleSetNum:I
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;->rules:[Landroid/icu/impl/DayPeriodRules;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;-><init>(Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;)V
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->addCutoff(Landroid/icu/impl/DayPeriodRules$CutoffType;Ljava/lang/String;)V
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->cutoffs:[I
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->cutoffType:Landroid/icu/impl/DayPeriodRules$CutoffType;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->data:Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->parseHour(Ljava/lang/String;)I
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->period:Landroid/icu/impl/DayPeriodRules$DayPeriod;
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->processRules(Landroid/icu/impl/UResource$Table;Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->ruleSetNum:I
-Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->setDayPeriodForHoursFromCutoffs()V
-Landroid/icu/impl/DayPeriodRules;-><init>()V
-Landroid/icu/impl/DayPeriodRules;->add(IILandroid/icu/impl/DayPeriodRules$DayPeriod;)V
-Landroid/icu/impl/DayPeriodRules;->DATA:Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;
-Landroid/icu/impl/DayPeriodRules;->dayPeriodForHour:[Landroid/icu/impl/DayPeriodRules$DayPeriod;
-Landroid/icu/impl/DayPeriodRules;->getEndHourForDayPeriod(Landroid/icu/impl/DayPeriodRules$DayPeriod;)I
-Landroid/icu/impl/DayPeriodRules;->getStartHourForDayPeriod(Landroid/icu/impl/DayPeriodRules$DayPeriod;)I
-Landroid/icu/impl/DayPeriodRules;->hasMidnight:Z
-Landroid/icu/impl/DayPeriodRules;->hasNoon:Z
-Landroid/icu/impl/DayPeriodRules;->loadData()Landroid/icu/impl/DayPeriodRules$DayPeriodRulesData;
-Landroid/icu/impl/DayPeriodRules;->parseSetNum(Ljava/lang/String;)I
-Landroid/icu/impl/ICUBinary$DataFile;-><init>(Ljava/lang/String;)V
-Landroid/icu/impl/ICUBinary$DataFile;->addBaseNamesInFolder(Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-Landroid/icu/impl/ICUBinary$DataFile;->getData(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUBinary$DataFile;->itemPath:Ljava/lang/String;
-Landroid/icu/impl/ICUBinary$DatPackageReader$IsAcceptable;-><init>()V
-Landroid/icu/impl/ICUBinary$DatPackageReader;-><init>()V
-Landroid/icu/impl/ICUBinary$DatPackageReader;->addBaseName(Ljava/nio/ByteBuffer;ILjava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/util/Set;)Z
-Landroid/icu/impl/ICUBinary$DatPackageReader;->addBaseNamesInFolder(Ljava/nio/ByteBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-Landroid/icu/impl/ICUBinary$DatPackageReader;->binarySearch(Ljava/nio/ByteBuffer;Ljava/lang/CharSequence;)I
-Landroid/icu/impl/ICUBinary$DatPackageReader;->DATA_FORMAT:I
-Landroid/icu/impl/ICUBinary$DatPackageReader;->getData(Ljava/nio/ByteBuffer;Ljava/lang/CharSequence;)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUBinary$DatPackageReader;->getDataOffset(Ljava/nio/ByteBuffer;I)I
-Landroid/icu/impl/ICUBinary$DatPackageReader;->getNameOffset(Ljava/nio/ByteBuffer;I)I
-Landroid/icu/impl/ICUBinary$DatPackageReader;->IS_ACCEPTABLE:Landroid/icu/impl/ICUBinary$DatPackageReader$IsAcceptable;
-Landroid/icu/impl/ICUBinary$DatPackageReader;->startsWithPackageName(Ljava/nio/ByteBuffer;I)Z
-Landroid/icu/impl/ICUBinary$DatPackageReader;->validate(Ljava/nio/ByteBuffer;)Z
-Landroid/icu/impl/ICUBinary$PackageDataFile;-><init>(Ljava/lang/String;Ljava/nio/ByteBuffer;)V
-Landroid/icu/impl/ICUBinary$PackageDataFile;->addBaseNamesInFolder(Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-Landroid/icu/impl/ICUBinary$PackageDataFile;->getData(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUBinary$PackageDataFile;->pkgBytes:Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUBinary$SingleDataFile;-><init>(Ljava/lang/String;Ljava/io/File;)V
-Landroid/icu/impl/ICUBinary$SingleDataFile;->addBaseNamesInFolder(Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-Landroid/icu/impl/ICUBinary$SingleDataFile;->getData(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUBinary$SingleDataFile;->path:Ljava/io/File;
-Landroid/icu/impl/ICUBinary;->addDataFilesFromFolder(Ljava/io/File;Ljava/lang/StringBuilder;Ljava/util/List;)V
-Landroid/icu/impl/ICUBinary;->addDataFilesFromPath(Ljava/lang/String;Ljava/util/List;)V
-Landroid/icu/impl/ICUBinary;->CHAR_SET_:B
-Landroid/icu/impl/ICUBinary;->CHAR_SIZE_:B
-Landroid/icu/impl/ICUBinary;->compareKeys(Ljava/lang/CharSequence;Ljava/nio/ByteBuffer;I)I
-Landroid/icu/impl/ICUBinary;->compareKeys(Ljava/lang/CharSequence;[BI)I
-Landroid/icu/impl/ICUBinary;->getData(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Z)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUBinary;->getDataFromFile(Ljava/lang/String;)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUBinary;->HEADER_AUTHENTICATION_FAILED_:Ljava/lang/String;
-Landroid/icu/impl/ICUBinary;->icuDataFiles:Ljava/util/List;
-Landroid/icu/impl/ICUBinary;->MAGIC1:B
-Landroid/icu/impl/ICUBinary;->MAGIC2:B
-Landroid/icu/impl/ICUBinary;->MAGIC_NUMBER_AUTHENTICATION_FAILED_:Ljava/lang/String;
-Landroid/icu/impl/ICUBinary;->mapFile(Ljava/io/File;)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;-><init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->fullNameSet:Ljava/util/Set;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->getFullLocaleNameSet()Ljava/util/Set;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->getLocaleList()[Ljava/util/Locale;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->getLocaleNameSet()Ljava/util/Set;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->getULocaleList()[Landroid/icu/util/ULocale;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->loader:Ljava/lang/ClassLoader;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->locales:[Ljava/util/Locale;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->nameSet:Ljava/util/Set;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->prefix:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle$AvailEntry;->ulocales:[Landroid/icu/util/ULocale;
-Landroid/icu/impl/ICUResourceBundle$Loader;-><init>()V
-Landroid/icu/impl/ICUResourceBundle$Loader;->load()Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundleReader;)V
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;->baseName:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;->loader:Ljava/lang/ClassLoader;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;->localeID:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;->reader:Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;->topLevelKeys:Ljava/util/Set;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;->ulocale:Landroid/icu/util/ULocale;
-Landroid/icu/impl/ICUResourceBundle;->addBundleBaseNamesFromClassLoader(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/Set;)V
-Landroid/icu/impl/ICUResourceBundle;->addLocaleIDsFromIndexBundle(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/Set;)V
-Landroid/icu/impl/ICUResourceBundle;->addLocaleIDsFromListFile(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/Set;)V
-Landroid/icu/impl/ICUResourceBundle;->BUNDLE_CACHE:Landroid/icu/impl/CacheBase;
-Landroid/icu/impl/ICUResourceBundle;->container:Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle;->countPathKeys(Ljava/lang/String;)I
-Landroid/icu/impl/ICUResourceBundle;->createFullLocaleNameSet(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/Set;
-Landroid/icu/impl/ICUResourceBundle;->createLocaleNameSet(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/Set;
-Landroid/icu/impl/ICUResourceBundle;->createULocaleList(Ljava/lang/String;Ljava/lang/ClassLoader;)[Landroid/icu/util/ULocale;
-Landroid/icu/impl/ICUResourceBundle;->DEBUG:Z
-Landroid/icu/impl/ICUResourceBundle;->DEFAULT_TAG:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle;->findResourceWithFallback(Ljava/lang/String;Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle;->findResourceWithFallback([Ljava/lang/String;ILandroid/icu/impl/ICUResourceBundle;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle;->findStringWithFallback(Ljava/lang/String;Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle;->FULL_LOCALE_NAMES_LIST:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle;->get(Ljava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle;->getAllItemsWithFallback(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;Landroid/icu/impl/UResource$Sink;)V
-Landroid/icu/impl/ICUResourceBundle;->getAvailEntry(Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundle$AvailEntry;
-Landroid/icu/impl/ICUResourceBundle;->getBundle(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle;->getNoFallback()Z
-Landroid/icu/impl/ICUResourceBundle;->getResDepth()I
-Landroid/icu/impl/ICUResourceBundle;->getResPathKeys(Ljava/lang/String;I[Ljava/lang/String;I)V
-Landroid/icu/impl/ICUResourceBundle;->getResPathKeys([Ljava/lang/String;I)V
-Landroid/icu/impl/ICUResourceBundle;->GET_AVAILABLE_CACHE:Landroid/icu/impl/CacheBase;
-Landroid/icu/impl/ICUResourceBundle;->HYPHEN:C
-Landroid/icu/impl/ICUResourceBundle;->ICUDATA:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle;->ICU_RESOURCE_INDEX:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle;->instantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle;->LOCALE:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle;->localeIDStartsWithLangSubtag(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/icu/impl/ICUResourceBundle;->RES_PATH_SEP_CHAR:C
-Landroid/icu/impl/ICUResourceBundle;->RES_PATH_SEP_STR:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundle;->wholeBundle:Landroid/icu/impl/ICUResourceBundle$WholeBundle;
-Landroid/icu/impl/ICUResourceBundleReader$Array16;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-Landroid/icu/impl/ICUResourceBundleReader$Array16;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Array32;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-Landroid/icu/impl/ICUResourceBundleReader$Array32;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Array;-><init>()V
-Landroid/icu/impl/ICUResourceBundleReader$Container;-><init>()V
-Landroid/icu/impl/ICUResourceBundleReader$Container;->getContainer16Resource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Container;->getContainer32Resource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Container;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Container;->getResource(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/String;)I
-Landroid/icu/impl/ICUResourceBundleReader$Container;->getSize()I
-Landroid/icu/impl/ICUResourceBundleReader$Container;->itemsOffset:I
-Landroid/icu/impl/ICUResourceBundleReader$Container;->size:I
-Landroid/icu/impl/ICUResourceBundleReader$IsAcceptable;-><init>()V
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;-><init>()V
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;->createInstance(Landroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;->baseName:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;->localeID:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;-><init>()V
-Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getStringArray(Landroid/icu/impl/ICUResourceBundleReader$Array;)[Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;->reader:Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;->res:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;-><init>(II)V
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->get(I)Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->keys:[I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->levelBitsList:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->mask:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->shift:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->values:[Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;-><init>(I)V
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->findSimple(I)I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->get(I)Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->keys:[I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->length:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->levelBitsList:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->makeKey(I)I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->maxOffsetBits:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->NEXT_BITS:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->putIfCleared([Ljava/lang/Object;ILjava/lang/Object;I)Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->rootLevel:Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->ROOT_BITS:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->SIMPLE_LENGTH:I
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->storeDirectly(I)Z
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;->values:[Ljava/lang/Object;
-Landroid/icu/impl/ICUResourceBundleReader$Table1632;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-Landroid/icu/impl/ICUResourceBundleReader$Table1632;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Table16;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-Landroid/icu/impl/ICUResourceBundleReader$Table16;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Table32;-><init>(Landroid/icu/impl/ICUResourceBundleReader;I)V
-Landroid/icu/impl/ICUResourceBundleReader$Table32;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I
-Landroid/icu/impl/ICUResourceBundleReader$Table;-><init>()V
-Landroid/icu/impl/ICUResourceBundleReader$Table;->findTableItem(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/CharSequence;)I
-Landroid/icu/impl/ICUResourceBundleReader$Table;->getKey(Landroid/icu/impl/ICUResourceBundleReader;I)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader$Table;->getResource(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/String;)I
-Landroid/icu/impl/ICUResourceBundleReader$Table;->key32Offsets:[I
-Landroid/icu/impl/ICUResourceBundleReader$Table;->keyOffsets:[C
-Landroid/icu/impl/ICUResourceBundleReader$Table;->URESDATA_ITEM_NOT_FOUND:I
-Landroid/icu/impl/ICUResourceBundleReader;-><init>()V
-Landroid/icu/impl/ICUResourceBundleReader;-><init>(Ljava/nio/ByteBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V
-Landroid/icu/impl/ICUResourceBundleReader;->b16BitUnits:Ljava/nio/CharBuffer;
-Landroid/icu/impl/ICUResourceBundleReader;->bytes:Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUResourceBundleReader;->CACHE:Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;
-Landroid/icu/impl/ICUResourceBundleReader;->compareKeys(Ljava/lang/CharSequence;C)I
-Landroid/icu/impl/ICUResourceBundleReader;->compareKeys32(Ljava/lang/CharSequence;I)I
-Landroid/icu/impl/ICUResourceBundleReader;->dataVersion:I
-Landroid/icu/impl/ICUResourceBundleReader;->DATA_FORMAT:I
-Landroid/icu/impl/ICUResourceBundleReader;->DEBUG:Z
-Landroid/icu/impl/ICUResourceBundleReader;->emptyByteBuffer:Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUResourceBundleReader;->emptyBytes:[B
-Landroid/icu/impl/ICUResourceBundleReader;->emptyChars:[C
-Landroid/icu/impl/ICUResourceBundleReader;->emptyInts:[I
-Landroid/icu/impl/ICUResourceBundleReader;->emptyString:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->EMPTY_16_BIT_UNITS:Ljava/nio/CharBuffer;
-Landroid/icu/impl/ICUResourceBundleReader;->EMPTY_ARRAY:Landroid/icu/impl/ICUResourceBundleReader$Array;
-Landroid/icu/impl/ICUResourceBundleReader;->EMPTY_TABLE:Landroid/icu/impl/ICUResourceBundleReader$Table;
-Landroid/icu/impl/ICUResourceBundleReader;->getAlias(I)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->getArray(I)Landroid/icu/impl/ICUResourceBundleReader$Array;
-Landroid/icu/impl/ICUResourceBundleReader;->getBinary(I)Ljava/nio/ByteBuffer;
-Landroid/icu/impl/ICUResourceBundleReader;->getBinary(I[B)[B
-Landroid/icu/impl/ICUResourceBundleReader;->getChars(II)[C
-Landroid/icu/impl/ICUResourceBundleReader;->getIndexesInt(I)I
-Landroid/icu/impl/ICUResourceBundleReader;->getInt(I)I
-Landroid/icu/impl/ICUResourceBundleReader;->getInts(II)[I
-Landroid/icu/impl/ICUResourceBundleReader;->getIntVector(I)[I
-Landroid/icu/impl/ICUResourceBundleReader;->getKey16String(I)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->getKey32String(I)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->getNoFallback()Z
-Landroid/icu/impl/ICUResourceBundleReader;->getReader(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceBundleReader;->getResourceByteOffset(I)I
-Landroid/icu/impl/ICUResourceBundleReader;->getRootResource()I
-Landroid/icu/impl/ICUResourceBundleReader;->getString(I)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->getStringV2(I)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->getTable(I)Landroid/icu/impl/ICUResourceBundleReader$Table;
-Landroid/icu/impl/ICUResourceBundleReader;->getTable16KeyOffsets(I)[C
-Landroid/icu/impl/ICUResourceBundleReader;->getTable32KeyOffsets(I)[I
-Landroid/icu/impl/ICUResourceBundleReader;->getTableKeyOffsets(I)[C
-Landroid/icu/impl/ICUResourceBundleReader;->getUsesPoolBundle()Z
-Landroid/icu/impl/ICUResourceBundleReader;->getVersion()Landroid/icu/util/VersionInfo;
-Landroid/icu/impl/ICUResourceBundleReader;->ICU_RESOURCE_SUFFIX:Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->init(Ljava/nio/ByteBuffer;)V
-Landroid/icu/impl/ICUResourceBundleReader;->isNoInheritanceMarker(I)Z
-Landroid/icu/impl/ICUResourceBundleReader;->isPoolBundle:Z
-Landroid/icu/impl/ICUResourceBundleReader;->isStringV2NoInheritanceMarker(I)Z
-Landroid/icu/impl/ICUResourceBundleReader;->IS_ACCEPTABLE:Landroid/icu/impl/ICUResourceBundleReader$IsAcceptable;
-Landroid/icu/impl/ICUResourceBundleReader;->keyBytes:[B
-Landroid/icu/impl/ICUResourceBundleReader;->LARGE_SIZE:I
-Landroid/icu/impl/ICUResourceBundleReader;->localKeyLimit:I
-Landroid/icu/impl/ICUResourceBundleReader;->makeKeyStringFromBytes([BI)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->makeStringFromBytes(II)Ljava/lang/String;
-Landroid/icu/impl/ICUResourceBundleReader;->noFallback:Z
-Landroid/icu/impl/ICUResourceBundleReader;->NULL_READER:Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceBundleReader;->poolBundleReader:Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceBundleReader;->poolCheckSum:I
-Landroid/icu/impl/ICUResourceBundleReader;->poolStringIndex16Limit:I
-Landroid/icu/impl/ICUResourceBundleReader;->poolStringIndexLimit:I
-Landroid/icu/impl/ICUResourceBundleReader;->PUBLIC_TYPES:[I
-Landroid/icu/impl/ICUResourceBundleReader;->resourceCache:Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;
-Landroid/icu/impl/ICUResourceBundleReader;->RES_GET_INT(I)I
-Landroid/icu/impl/ICUResourceBundleReader;->RES_GET_OFFSET(I)I
-Landroid/icu/impl/ICUResourceBundleReader;->RES_GET_TYPE(I)I
-Landroid/icu/impl/ICUResourceBundleReader;->RES_GET_UINT(I)I
-Landroid/icu/impl/ICUResourceBundleReader;->rootRes:I
-Landroid/icu/impl/ICUResourceBundleReader;->setKeyFromKey16(ILandroid/icu/impl/UResource$Key;)V
-Landroid/icu/impl/ICUResourceBundleReader;->setKeyFromKey32(ILandroid/icu/impl/UResource$Key;)V
-Landroid/icu/impl/ICUResourceBundleReader;->URES_ATT_IS_POOL_BUNDLE:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_ATT_NO_FALLBACK:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_ATT_USES_POOL_BUNDLE:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_INDEX_16BIT_TOP:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_INDEX_ATTRIBUTES:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_INDEX_BUNDLE_TOP:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_INDEX_KEYS_TOP:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_INDEX_LENGTH:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_INDEX_MAX_TABLE_LENGTH:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_INDEX_POOL_CHECKSUM:I
-Landroid/icu/impl/ICUResourceBundleReader;->URES_IS_ARRAY(I)Z
-Landroid/icu/impl/ICUResourceBundleReader;->URES_IS_TABLE(I)Z
-Landroid/icu/impl/ICUResourceBundleReader;->usesPoolBundle:Z
-Landroid/icu/impl/locale/AsciiUtil$CaseInsensitiveKey;->_hash:I
-Landroid/icu/impl/locale/AsciiUtil$CaseInsensitiveKey;->_key:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale$Cache;-><init>()V
-Landroid/icu/impl/locale/BaseLocale$Cache;->createObject(Landroid/icu/impl/locale/BaseLocale$Key;)Landroid/icu/impl/locale/BaseLocale;
-Landroid/icu/impl/locale/BaseLocale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/locale/BaseLocale$Cache;->normalizeKey(Landroid/icu/impl/locale/BaseLocale$Key;)Landroid/icu/impl/locale/BaseLocale$Key;
-Landroid/icu/impl/locale/BaseLocale$Cache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/impl/locale/BaseLocale$Key;->compareTo(Landroid/icu/impl/locale/BaseLocale$Key;)I
-Landroid/icu/impl/locale/BaseLocale$Key;->compareTo(Ljava/lang/Object;)I
-Landroid/icu/impl/locale/BaseLocale$Key;->normalize(Landroid/icu/impl/locale/BaseLocale$Key;)Landroid/icu/impl/locale/BaseLocale$Key;
-Landroid/icu/impl/locale/BaseLocale$Key;->_hash:I
-Landroid/icu/impl/locale/BaseLocale$Key;->_lang:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale$Key;->_regn:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale$Key;->_scrt:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale$Key;->_vart:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/impl/locale/BaseLocale;->CACHE:Landroid/icu/impl/locale/BaseLocale$Cache;
-Landroid/icu/impl/locale/BaseLocale;->JDKIMPL:Z
-Landroid/icu/impl/locale/BaseLocale;->_hash:I
-Landroid/icu/impl/locale/BaseLocale;->_language:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale;->_region:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale;->_script:Ljava/lang/String;
-Landroid/icu/impl/locale/BaseLocale;->_variant:Ljava/lang/String;
-Landroid/icu/impl/locale/Extension;-><init>(CLjava/lang/String;)V
-Landroid/icu/impl/locale/Extension;->_key:C
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveChar;-><init>(C)V
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveChar;->value()C
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveChar;->_c:C
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveString;-><init>(Ljava/lang/String;)V
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveString;->value()Ljava/lang/String;
-Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveString;->_s:Ljava/lang/String;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->checkVariants(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/impl/locale/InternalLocaleBuilder;->JDKIMPL:Z
-Landroid/icu/impl/locale/InternalLocaleBuilder;->PRIVUSE_KEY:Landroid/icu/impl/locale/InternalLocaleBuilder$CaseInsensitiveChar;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->removePrivateuseVariant(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->setExtensions(Ljava/util/List;Ljava/lang/String;)Landroid/icu/impl/locale/InternalLocaleBuilder;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->setUnicodeLocaleExtension(Ljava/lang/String;)V
-Landroid/icu/impl/locale/InternalLocaleBuilder;->_extensions:Ljava/util/HashMap;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->_language:Ljava/lang/String;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->_region:Ljava/lang/String;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->_script:Ljava/lang/String;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->_uattributes:Ljava/util/HashSet;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->_ukeywords:Ljava/util/HashMap;
-Landroid/icu/impl/locale/InternalLocaleBuilder;->_variant:Ljava/lang/String;
-Landroid/icu/impl/locale/LanguageTag;-><init>()V
-Landroid/icu/impl/locale/LanguageTag;->GRANDFATHERED:Ljava/util/Map;
-Landroid/icu/impl/locale/LanguageTag;->JDKIMPL:Z
-Landroid/icu/impl/locale/LanguageTag;->parseExtensions(Landroid/icu/impl/locale/StringTokenIterator;Landroid/icu/impl/locale/ParseStatus;)Z
-Landroid/icu/impl/locale/LanguageTag;->parseExtlangs(Landroid/icu/impl/locale/StringTokenIterator;Landroid/icu/impl/locale/ParseStatus;)Z
-Landroid/icu/impl/locale/LanguageTag;->parseLanguage(Landroid/icu/impl/locale/StringTokenIterator;Landroid/icu/impl/locale/ParseStatus;)Z
-Landroid/icu/impl/locale/LanguageTag;->parsePrivateuse(Landroid/icu/impl/locale/StringTokenIterator;Landroid/icu/impl/locale/ParseStatus;)Z
-Landroid/icu/impl/locale/LanguageTag;->parseRegion(Landroid/icu/impl/locale/StringTokenIterator;Landroid/icu/impl/locale/ParseStatus;)Z
-Landroid/icu/impl/locale/LanguageTag;->parseScript(Landroid/icu/impl/locale/StringTokenIterator;Landroid/icu/impl/locale/ParseStatus;)Z
-Landroid/icu/impl/locale/LanguageTag;->parseVariants(Landroid/icu/impl/locale/StringTokenIterator;Landroid/icu/impl/locale/ParseStatus;)Z
-Landroid/icu/impl/locale/LanguageTag;->_extensions:Ljava/util/List;
-Landroid/icu/impl/locale/LanguageTag;->_extlangs:Ljava/util/List;
-Landroid/icu/impl/locale/LanguageTag;->_language:Ljava/lang/String;
-Landroid/icu/impl/locale/LanguageTag;->_privateuse:Ljava/lang/String;
-Landroid/icu/impl/locale/LanguageTag;->_region:Ljava/lang/String;
-Landroid/icu/impl/locale/LanguageTag;->_script:Ljava/lang/String;
-Landroid/icu/impl/locale/LanguageTag;->_variants:Ljava/util/List;
-Landroid/icu/impl/locale/LocaleExtensions;-><init>()V
-Landroid/icu/impl/locale/LocaleExtensions;-><init>(Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V
-Landroid/icu/impl/locale/LocaleExtensions;->EMPTY_MAP:Ljava/util/SortedMap;
-Landroid/icu/impl/locale/LocaleExtensions;->toID(Ljava/util/SortedMap;)Ljava/lang/String;
-Landroid/icu/impl/locale/LocaleExtensions;->_id:Ljava/lang/String;
-Landroid/icu/impl/locale/LocaleExtensions;->_map:Ljava/util/SortedMap;
-Landroid/icu/impl/locale/LocaleObjectCache$CacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-Landroid/icu/impl/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object;
-Landroid/icu/impl/locale/LocaleObjectCache$CacheEntry;->_key:Ljava/lang/Object;
-Landroid/icu/impl/locale/LocaleObjectCache;->cleanStaleEntries()V
-Landroid/icu/impl/locale/LocaleObjectCache;->_map:Ljava/util/concurrent/ConcurrentHashMap;
-Landroid/icu/impl/locale/LocaleObjectCache;->_queue:Ljava/lang/ref/ReferenceQueue;
-Landroid/icu/impl/locale/LocaleSyntaxException;->_index:I
-Landroid/icu/impl/locale/ParseStatus;->_errorIndex:I
-Landroid/icu/impl/locale/ParseStatus;->_errorMsg:Ljava/lang/String;
-Landroid/icu/impl/locale/ParseStatus;->_parseLength:I
-Landroid/icu/impl/locale/StringTokenIterator;->nextDelimiter(I)I
-Landroid/icu/impl/locale/StringTokenIterator;->_dlms:Ljava/lang/String;
-Landroid/icu/impl/locale/StringTokenIterator;->_done:Z
-Landroid/icu/impl/locale/StringTokenIterator;->_end:I
-Landroid/icu/impl/locale/StringTokenIterator;->_start:I
-Landroid/icu/impl/locale/StringTokenIterator;->_text:Ljava/lang/String;
-Landroid/icu/impl/locale/StringTokenIterator;->_token:Ljava/lang/String;
-Landroid/icu/impl/locale/XCldrStub$HashMultimap;-><init>()V
-Landroid/icu/impl/locale/XCldrStub$Joiner;-><init>(Ljava/lang/String;)V
-Landroid/icu/impl/locale/XCldrStub$Joiner;->separator:Ljava/lang/String;
-Landroid/icu/impl/locale/XCldrStub$LinkedHashMultimap;-><init>()V
-Landroid/icu/impl/locale/XCldrStub$Multimap;-><init>(Ljava/util/Map;Ljava/lang/Class;)V
-Landroid/icu/impl/locale/XCldrStub$Multimap;->createSetIfMissing(Ljava/lang/Object;)Ljava/util/Set;
-Landroid/icu/impl/locale/XCldrStub$Multimap;->getInstance()Ljava/util/Set;
-Landroid/icu/impl/locale/XCldrStub$Multimap;->map:Ljava/util/Map;
-Landroid/icu/impl/locale/XCldrStub$Multimap;->setClass:Ljava/lang/Class;
-Landroid/icu/impl/locale/XCldrStub$MultimapIterator;-><init>(Ljava/util/Map;)V
-Landroid/icu/impl/locale/XCldrStub$MultimapIterator;->entry:Landroid/icu/impl/locale/XCldrStub$ReusableEntry;
-Landroid/icu/impl/locale/XCldrStub$MultimapIterator;->it1:Ljava/util/Iterator;
-Landroid/icu/impl/locale/XCldrStub$MultimapIterator;->it2:Ljava/util/Iterator;
-Landroid/icu/impl/locale/XCldrStub$ReusableEntry;-><init>()V
-Landroid/icu/impl/locale/XCldrStub$ReusableEntry;->key:Ljava/lang/Object;
-Landroid/icu/impl/locale/XCldrStub$ReusableEntry;->value:Ljava/lang/Object;
-Landroid/icu/impl/locale/XCldrStub$Splitter;->pattern:Ljava/util/regex/Pattern;
-Landroid/icu/impl/locale/XCldrStub$Splitter;->trimResults:Z
-Landroid/icu/impl/locale/XCldrStub$TreeMultimap;-><init>()V
-Landroid/icu/impl/locale/XLikelySubtags$Aliases;->toAliases:Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLikelySubtags$Aliases;->toCanonical:Ljava/util/Map;
-Landroid/icu/impl/locale/XLikelySubtags$LSR;->from(Ljava/lang/String;)Landroid/icu/impl/locale/XLikelySubtags$LSR;
-Landroid/icu/impl/locale/XLikelySubtags$Maker;-><init>()V
-Landroid/icu/impl/locale/XLikelySubtags$Maker;->getSubtable(Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/locale/XLikelySubtags$Maker;->HASHMAP:Landroid/icu/impl/locale/XLikelySubtags$Maker;
-Landroid/icu/impl/locale/XLikelySubtags$Maker;->make()Ljava/lang/Object;
-Landroid/icu/impl/locale/XLikelySubtags$Maker;->TREEMAP:Landroid/icu/impl/locale/XLikelySubtags$Maker;
-Landroid/icu/impl/locale/XLikelySubtags;->DEFAULT:Landroid/icu/impl/locale/XLikelySubtags;
-Landroid/icu/impl/locale/XLikelySubtags;->getDefaultRawData()Ljava/util/Map;
-Landroid/icu/impl/locale/XLikelySubtags;->init(Ljava/util/Map;Z)Ljava/util/Map;
-Landroid/icu/impl/locale/XLikelySubtags;->langTable:Ljava/util/Map;
-Landroid/icu/impl/locale/XLikelySubtags;->minimizeSubtags(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale$Minimize;)Landroid/icu/impl/locale/XLikelySubtags$LSR;
-Landroid/icu/impl/locale/XLikelySubtags;->set(Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/locale/XLikelySubtags$LSR;)V
-Landroid/icu/impl/locale/XLikelySubtags;->set(Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
-Landroid/icu/impl/locale/XLikelySubtags;->show(Ljava/util/Map;Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-Landroid/icu/impl/locale/XLocaleDistance$AddSub;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;)V
-Landroid/icu/impl/locale/XLocaleDistance$AddSub;->desiredSub:Ljava/lang/String;
-Landroid/icu/impl/locale/XLocaleDistance$AddSub;->r:Landroid/icu/impl/locale/XLocaleDistance$CopyIfEmpty;
-Landroid/icu/impl/locale/XLocaleDistance$AddSub;->supportedSub:Ljava/lang/String;
-Landroid/icu/impl/locale/XLocaleDistance$AddSub;->test(Landroid/icu/impl/locale/XLocaleDistance$DistanceNode;)Z
-Landroid/icu/impl/locale/XLocaleDistance$AddSub;->test(Ljava/lang/Object;)Z
-Landroid/icu/impl/locale/XLocaleDistance$CompactAndImmutablizer;-><init>()V
-Landroid/icu/impl/locale/XLocaleDistance$CompactAndImmutablizer;->compact(Landroid/icu/impl/locale/XLocaleDistance$DistanceNode;)Landroid/icu/impl/locale/XLocaleDistance$DistanceNode;
-Landroid/icu/impl/locale/XLocaleDistance$CompactAndImmutablizer;->compact(Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;)Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;
-Landroid/icu/impl/locale/XLocaleDistance$CompactAndImmutablizer;->compact(Ljava/util/Map;I)Ljava/util/Map;
-Landroid/icu/impl/locale/XLocaleDistance$CopyIfEmpty;-><init>(Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;)V
-Landroid/icu/impl/locale/XLocaleDistance$CopyIfEmpty;->test(Landroid/icu/impl/locale/XLocaleDistance$DistanceNode;)Z
-Landroid/icu/impl/locale/XLocaleDistance$CopyIfEmpty;->test(Ljava/lang/Object;)Z
-Landroid/icu/impl/locale/XLocaleDistance$CopyIfEmpty;->toCopy:Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;
-Landroid/icu/impl/locale/XLocaleDistance$DistanceNode;->distance:I
-Landroid/icu/impl/locale/XLocaleDistance$DistanceTable;->getCloser(I)Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$DistanceTable;->getDistance(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/Output;Z)I
-Landroid/icu/impl/locale/XLocaleDistance$DistanceTable;->toString(Z)Ljava/lang/String;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;-><init>()V
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;-><init>(Ljava/lang/String;)V
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;-><init>(Ljava/lang/String;Ljava/lang/Object;)V
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->add(Ljava/lang/Object;)Ljava/lang/Integer;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->fromId(I)Ljava/lang/Object;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->getOldAndAdd(Ljava/lang/Object;)Ljava/lang/Integer;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->intern(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->intToObject:Ljava/util/List;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->name:Ljava/lang/String;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->objectToInt:Ljava/util/Map;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->size()I
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->toId(Ljava/lang/Object;)Ljava/lang/Integer;
-Landroid/icu/impl/locale/XLocaleDistance$IdMakerFull;->toId(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/locale/XLocaleDistance$IdMapper;->toId(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper$Builder;-><init>()V
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper$Builder;->add(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper$Builder;->build()Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper$Builder;->paradigms:Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper$Builder;->regionSet:Landroid/icu/impl/locale/XLocaleDistance$RegionSet;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper$Builder;->regionToRawPartition:Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;-><init>(Landroid/icu/impl/locale/XCldrStub$Multimap;Ljava/util/Map;Landroid/icu/impl/locale/XCldrStub$Multimap;Ljava/util/Set;)V
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->getIdsFromVariable(Ljava/lang/String;)Ljava/util/Collection;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->macroToPartitions:Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->paradigms:Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->regions()Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->regionToPartition:Ljava/util/Map;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->toId(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->toId(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->variables()Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;->variableToPartition:Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;->add:Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;->remove:Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;->valueOf(Ljava/lang/String;)Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;->values()[Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet;-><init>()V
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet;->add(Ljava/lang/String;II)V
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet;->changeSet(Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;Ljava/lang/String;)V
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet;->inverse()Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet;->operation:Landroid/icu/impl/locale/XLocaleDistance$RegionSet$Operation;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet;->parseSet(Ljava/lang/String;)Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$RegionSet;->tempRegions:Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceNode;-><init>(I)V
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceNode;-><init>(ILandroid/icu/impl/locale/XLocaleDistance$DistanceTable;)V
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceNode;->addSubtables(Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/locale/XLocaleDistance$CopyIfEmpty;)V
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceNode;->copyTables(Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;)V
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceNode;->distanceTable:Landroid/icu/impl/locale/XLocaleDistance$DistanceTable;
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;-><init>()V
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;-><init>(Ljava/util/Map;)V
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;->addSubtable(Ljava/lang/String;Ljava/lang/String;I)Landroid/icu/impl/locale/XLocaleDistance$DistanceNode;
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;->getNode(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/impl/locale/XLocaleDistance$DistanceNode;
-Landroid/icu/impl/locale/XLocaleDistance$StringDistanceTable;->subtables:Ljava/util/Map;
-Landroid/icu/impl/locale/XLocaleDistance;->ALL_FINAL_REGIONS:Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance;->CONTAINER_TO_CONTAINED:Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLocaleDistance;->CONTAINER_TO_CONTAINED_FINAL:Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLocaleDistance;->DEFAULT:Landroid/icu/impl/locale/XLocaleDistance;
-Landroid/icu/impl/locale/XLocaleDistance;->defaultLanguageDistance:I
-Landroid/icu/impl/locale/XLocaleDistance;->defaultRegionDistance:I
-Landroid/icu/impl/locale/XLocaleDistance;->defaultScriptDistance:I
-Landroid/icu/impl/locale/XLocaleDistance;->english:Landroid/icu/text/LocaleDisplayNames;
-Landroid/icu/impl/locale/XLocaleDistance;->fill(Ljava/lang/String;Landroid/icu/impl/locale/XCldrStub$TreeMultimap;Landroid/icu/impl/locale/XCldrStub$Multimap;)Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance;->fixAny(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/impl/locale/XLocaleDistance;->fixedName(Ljava/util/List;)Ljava/lang/String;
-Landroid/icu/impl/locale/XLocaleDistance;->getContainingMacrosFor(Ljava/util/Collection;Ljava/util/Set;)Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleDistance;->languageDesired2Supported:Landroid/icu/impl/locale/XLocaleDistance$DistanceTable;
-Landroid/icu/impl/locale/XLocaleDistance;->newMap()Ljava/util/Map;
-Landroid/icu/impl/locale/XLocaleDistance;->printMatchXml(Ljava/util/List;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/Boolean;)V
-Landroid/icu/impl/locale/XLocaleDistance;->PRINT_OVERRIDES:Z
-Landroid/icu/impl/locale/XLocaleDistance;->regionMapper:Landroid/icu/impl/locale/XLocaleDistance$RegionMapper;
-Landroid/icu/impl/locale/XLocaleDistance;->xGetContainment()Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLocaleDistance;->xGetLanguageMatcherData()Ljava/util/List;
-Landroid/icu/impl/locale/XLocaleDistance;->xGetMatchVariables()Ljava/util/Map;
-Landroid/icu/impl/locale/XLocaleDistance;->xGetParadigmLocales()Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleMatcher$Builder;->defaultLanguage:Landroid/icu/util/ULocale;
-Landroid/icu/impl/locale/XLocaleMatcher$Builder;->demotionPerAdditionalDesiredLocale:I
-Landroid/icu/impl/locale/XLocaleMatcher$Builder;->distanceOption:Landroid/icu/impl/locale/XLocaleDistance$DistanceOption;
-Landroid/icu/impl/locale/XLocaleMatcher$Builder;->localeDistance:Landroid/icu/impl/locale/XLocaleDistance;
-Landroid/icu/impl/locale/XLocaleMatcher$Builder;->supportedLanguagesList:Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleMatcher$Builder;->thresholdDistance:I
-Landroid/icu/impl/locale/XLocaleMatcher;-><init>(Landroid/icu/impl/locale/XLocaleMatcher$Builder;)V
-Landroid/icu/impl/locale/XLocaleMatcher;->asSet(Landroid/icu/util/LocalePriorityList;)Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleMatcher;->defaultLanguage:Landroid/icu/util/ULocale;
-Landroid/icu/impl/locale/XLocaleMatcher;->demotionPerAdditionalDesiredLocale:I
-Landroid/icu/impl/locale/XLocaleMatcher;->distanceOption:Landroid/icu/impl/locale/XLocaleDistance$DistanceOption;
-Landroid/icu/impl/locale/XLocaleMatcher;->exactSupportedLocales:Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleMatcher;->extractLsrMap(Ljava/util/Set;Ljava/util/Set;)Landroid/icu/impl/locale/XCldrStub$Multimap;
-Landroid/icu/impl/locale/XLocaleMatcher;->extractLsrSet(Ljava/util/Set;)Ljava/util/Set;
-Landroid/icu/impl/locale/XLocaleMatcher;->localeDistance:Landroid/icu/impl/locale/XLocaleDistance;
-Landroid/icu/impl/locale/XLocaleMatcher;->supportedLanguages:Ljava/util/Map;
-Landroid/icu/impl/locale/XLocaleMatcher;->thresholdDistance:I
-Landroid/icu/impl/locale/XLocaleMatcher;->UND:Landroid/icu/impl/locale/XLikelySubtags$LSR;
-Landroid/icu/impl/locale/XLocaleMatcher;->UND_LOCALE:Landroid/icu/util/ULocale;
-Landroid/icu/impl/Normalizer2Impl$IsAcceptable;-><init>()V
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->app:Ljava/lang/Appendable;
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->appIsStringBuilder:Z
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->codePointLimit:I
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->codePointStart:I
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->impl:Landroid/icu/impl/Normalizer2Impl;
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->insert(II)V
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->lastCC:I
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->previousCC()I
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->reorderStart:I
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->setIterator()V
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->skipPrevious()V
-Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->str:Ljava/lang/StringBuilder;
-Landroid/icu/impl/Normalizer2Impl;->addComposites(ILandroid/icu/text/UnicodeSet;)V
-Landroid/icu/impl/Normalizer2Impl;->addToStartSet(Landroid/icu/impl/Trie2Writable;II)V
-Landroid/icu/impl/Normalizer2Impl;->canonIterData:Landroid/icu/impl/Trie2_32;
-Landroid/icu/impl/Normalizer2Impl;->canonStartSets:Ljava/util/ArrayList;
-Landroid/icu/impl/Normalizer2Impl;->CANON_HAS_COMPOSITIONS:I
-Landroid/icu/impl/Normalizer2Impl;->CANON_HAS_SET:I
-Landroid/icu/impl/Normalizer2Impl;->CANON_NOT_SEGMENT_STARTER:I
-Landroid/icu/impl/Normalizer2Impl;->CANON_VALUE_MASK:I
-Landroid/icu/impl/Normalizer2Impl;->centerNoNoDelta:I
-Landroid/icu/impl/Normalizer2Impl;->combine(Ljava/lang/String;II)I
-Landroid/icu/impl/Normalizer2Impl;->dataVersion:Landroid/icu/util/VersionInfo;
-Landroid/icu/impl/Normalizer2Impl;->DATA_FORMAT:I
-Landroid/icu/impl/Normalizer2Impl;->decompose(IILandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)V
-Landroid/icu/impl/Normalizer2Impl;->decomposeShort(Ljava/lang/CharSequence;IIZZLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)I
-Landroid/icu/impl/Normalizer2Impl;->enumLcccRange(IIILandroid/icu/text/UnicodeSet;)V
-Landroid/icu/impl/Normalizer2Impl;->enumNorm16PropertyStartsRange(IIILandroid/icu/text/UnicodeSet;)V
-Landroid/icu/impl/Normalizer2Impl;->extraData:Ljava/lang/String;
-Landroid/icu/impl/Normalizer2Impl;->findNextCompBoundary(Ljava/lang/CharSequence;IIZ)I
-Landroid/icu/impl/Normalizer2Impl;->findNextFCDBoundary(Ljava/lang/CharSequence;II)I
-Landroid/icu/impl/Normalizer2Impl;->findPreviousCompBoundary(Ljava/lang/CharSequence;IZ)I
-Landroid/icu/impl/Normalizer2Impl;->findPreviousFCDBoundary(Ljava/lang/CharSequence;I)I
-Landroid/icu/impl/Normalizer2Impl;->getCCFromNoNo(I)I
-Landroid/icu/impl/Normalizer2Impl;->getCompositionsList(I)I
-Landroid/icu/impl/Normalizer2Impl;->getCompositionsListForComposite(I)I
-Landroid/icu/impl/Normalizer2Impl;->getCompositionsListForDecompYes(I)I
-Landroid/icu/impl/Normalizer2Impl;->getCompositionsListForMaybe(I)I
-Landroid/icu/impl/Normalizer2Impl;->getPreviousTrailCC(Ljava/lang/CharSequence;II)I
-Landroid/icu/impl/Normalizer2Impl;->getTrailCCFromCompYesAndZeroCC(I)I
-Landroid/icu/impl/Normalizer2Impl;->hangulLVT()I
-Landroid/icu/impl/Normalizer2Impl;->hasCompBoundaryAfter(Ljava/lang/CharSequence;IIZ)Z
-Landroid/icu/impl/Normalizer2Impl;->hasCompBoundaryBefore(II)Z
-Landroid/icu/impl/Normalizer2Impl;->hasCompBoundaryBefore(Ljava/lang/CharSequence;II)Z
-Landroid/icu/impl/Normalizer2Impl;->isCompYesAndZeroCC(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isDecompNoAlgorithmic(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isDecompYesAndZeroCC(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isHangulLV(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isHangulLVT(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isInert(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isJamoL(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isJamoVT(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isMaybe(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isMaybeOrNonZeroCC(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isMostDecompYesAndZeroCC(I)Z
-Landroid/icu/impl/Normalizer2Impl;->isTrailCC01ForCompBoundaryAfter(I)Z
-Landroid/icu/impl/Normalizer2Impl;->IS_ACCEPTABLE:Landroid/icu/impl/Normalizer2Impl$IsAcceptable;
-Landroid/icu/impl/Normalizer2Impl;->limitNoNo:I
-Landroid/icu/impl/Normalizer2Impl;->mapAlgorithmic(II)I
-Landroid/icu/impl/Normalizer2Impl;->maybeYesCompositions:Ljava/lang/String;
-Landroid/icu/impl/Normalizer2Impl;->minCompNoMaybeCP:I
-Landroid/icu/impl/Normalizer2Impl;->minDecompNoCP:I
-Landroid/icu/impl/Normalizer2Impl;->minLcccCP:I
-Landroid/icu/impl/Normalizer2Impl;->minMaybeYes:I
-Landroid/icu/impl/Normalizer2Impl;->minNoNo:I
-Landroid/icu/impl/Normalizer2Impl;->minNoNoCompBoundaryBefore:I
-Landroid/icu/impl/Normalizer2Impl;->minNoNoCompNoMaybeCC:I
-Landroid/icu/impl/Normalizer2Impl;->minNoNoEmpty:I
-Landroid/icu/impl/Normalizer2Impl;->minYesNo:I
-Landroid/icu/impl/Normalizer2Impl;->minYesNoMappingsOnly:I
-Landroid/icu/impl/Normalizer2Impl;->norm16HasCompBoundaryAfter(IZ)Z
-Landroid/icu/impl/Normalizer2Impl;->norm16HasCompBoundaryBefore(I)Z
-Landroid/icu/impl/Normalizer2Impl;->normTrie:Landroid/icu/impl/Trie2_16;
-Landroid/icu/impl/Normalizer2Impl;->recompose(Landroid/icu/impl/Normalizer2Impl$ReorderingBuffer;IZ)V
-Landroid/icu/impl/Normalizer2Impl;->segmentStarterMapper:Landroid/icu/impl/Trie2$ValueMapper;
-Landroid/icu/impl/Normalizer2Impl;->smallFCD:[B
-Landroid/icu/impl/number/AffixUtils;->getCodePoint(J)I
-Landroid/icu/impl/number/AffixUtils;->getOffset(J)I
-Landroid/icu/impl/number/AffixUtils;->getState(J)I
-Landroid/icu/impl/number/AffixUtils;->getType(J)I
-Landroid/icu/impl/number/AffixUtils;->makeTag(IIII)J
-Landroid/icu/impl/number/AffixUtils;->STATE_AFTER_QUOTE:I
-Landroid/icu/impl/number/AffixUtils;->STATE_BASE:I
-Landroid/icu/impl/number/AffixUtils;->STATE_FIFTH_CURR:I
-Landroid/icu/impl/number/AffixUtils;->STATE_FIRST_CURR:I
-Landroid/icu/impl/number/AffixUtils;->STATE_FIRST_QUOTE:I
-Landroid/icu/impl/number/AffixUtils;->STATE_FOURTH_CURR:I
-Landroid/icu/impl/number/AffixUtils;->STATE_INSIDE_QUOTE:I
-Landroid/icu/impl/number/AffixUtils;->STATE_OVERFLOW_CURR:I
-Landroid/icu/impl/number/AffixUtils;->STATE_SECOND_CURR:I
-Landroid/icu/impl/number/AffixUtils;->STATE_THIRD_CURR:I
-Landroid/icu/impl/number/AffixUtils;->TYPE_CODEPOINT:I
-Landroid/icu/impl/number/CompactData$CompactDataSink;-><init>(Landroid/icu/impl/number/CompactData;)V
-Landroid/icu/impl/number/CompactData$CompactDataSink;->data:Landroid/icu/impl/number/CompactData;
-Landroid/icu/impl/number/CompactData;->COMPACT_MAX_DIGITS:I
-Landroid/icu/impl/number/CompactData;->countZeros(Ljava/lang/String;)I
-Landroid/icu/impl/number/CompactData;->getIndex(ILandroid/icu/impl/StandardPlural;)I
-Landroid/icu/impl/number/CompactData;->getResourceBundleKey(Ljava/lang/String;Landroid/icu/text/CompactDecimalFormat$CompactStyle;Landroid/icu/impl/number/CompactData$CompactType;Ljava/lang/StringBuilder;)V
-Landroid/icu/impl/number/CompactData;->isEmpty:Z
-Landroid/icu/impl/number/CompactData;->largestMagnitude:B
-Landroid/icu/impl/number/CompactData;->multipliers:[B
-Landroid/icu/impl/number/CompactData;->patterns:[Ljava/lang/String;
-Landroid/icu/impl/number/CompactData;->USE_FALLBACK:Ljava/lang/String;
-Landroid/icu/impl/number/ConstantMultiFieldModifier;->strong:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->compactCustomData:Ljava/util/Map;
-Landroid/icu/impl/number/DecimalFormatProperties;->compactStyle:Landroid/icu/text/CompactDecimalFormat$CompactStyle;
-Landroid/icu/impl/number/DecimalFormatProperties;->currency:Landroid/icu/util/Currency;
-Landroid/icu/impl/number/DecimalFormatProperties;->currencyPluralInfo:Landroid/icu/text/CurrencyPluralInfo;
-Landroid/icu/impl/number/DecimalFormatProperties;->currencyUsage:Landroid/icu/util/Currency$CurrencyUsage;
-Landroid/icu/impl/number/DecimalFormatProperties;->decimalPatternMatchRequired:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->decimalSeparatorAlwaysShown:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->DEFAULT:Landroid/icu/impl/number/DecimalFormatProperties;
-Landroid/icu/impl/number/DecimalFormatProperties;->exponentSignAlwaysShown:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->formatWidth:I
-Landroid/icu/impl/number/DecimalFormatProperties;->groupingSize:I
-Landroid/icu/impl/number/DecimalFormatProperties;->magnitudeMultiplier:I
-Landroid/icu/impl/number/DecimalFormatProperties;->mathContext:Ljava/math/MathContext;
-Landroid/icu/impl/number/DecimalFormatProperties;->maximumFractionDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->maximumIntegerDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->maximumSignificantDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->minimumExponentDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->minimumFractionDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->minimumGroupingDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->minimumIntegerDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->minimumSignificantDigits:I
-Landroid/icu/impl/number/DecimalFormatProperties;->multiplier:Ljava/math/BigDecimal;
-Landroid/icu/impl/number/DecimalFormatProperties;->negativePrefix:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->negativePrefixPattern:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->negativeSuffix:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->negativeSuffixPattern:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->padPosition:Landroid/icu/impl/number/Padder$PadPosition;
-Landroid/icu/impl/number/DecimalFormatProperties;->padString:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->parseCaseSensitive:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->parseGroupingMode:Landroid/icu/impl/number/Parse$GroupingMode;
-Landroid/icu/impl/number/DecimalFormatProperties;->parseIntegerOnly:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->parseMode:Landroid/icu/impl/number/Parse$ParseMode;
-Landroid/icu/impl/number/DecimalFormatProperties;->parseNoExponent:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->parseToBigDecimal:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->pluralRules:Landroid/icu/text/PluralRules;
-Landroid/icu/impl/number/DecimalFormatProperties;->positivePrefix:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->positivePrefixPattern:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->positiveSuffix:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->positiveSuffixPattern:Ljava/lang/String;
-Landroid/icu/impl/number/DecimalFormatProperties;->readObjectImpl(Ljava/io/ObjectInputStream;)V
-Landroid/icu/impl/number/DecimalFormatProperties;->roundingIncrement:Ljava/math/BigDecimal;
-Landroid/icu/impl/number/DecimalFormatProperties;->roundingMode:Ljava/math/RoundingMode;
-Landroid/icu/impl/number/DecimalFormatProperties;->secondaryGroupingSize:I
-Landroid/icu/impl/number/DecimalFormatProperties;->signAlwaysShown:Z
-Landroid/icu/impl/number/DecimalFormatProperties;->writeObjectImpl(Ljava/io/ObjectOutputStream;)V
-Landroid/icu/impl/number/DecimalFormatProperties;->_clear()Landroid/icu/impl/number/DecimalFormatProperties;
-Landroid/icu/impl/number/DecimalFormatProperties;->_copyFrom(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/DecimalFormatProperties;
-Landroid/icu/impl/number/DecimalFormatProperties;->_equals(Landroid/icu/impl/number/DecimalFormatProperties;)Z
-Landroid/icu/impl/number/DecimalFormatProperties;->_equalsHelper(II)Z
-Landroid/icu/impl/number/DecimalFormatProperties;->_equalsHelper(Ljava/lang/Object;Ljava/lang/Object;)Z
-Landroid/icu/impl/number/DecimalFormatProperties;->_equalsHelper(ZZ)Z
-Landroid/icu/impl/number/DecimalFormatProperties;->_hashCode()I
-Landroid/icu/impl/number/DecimalFormatProperties;->_hashCodeHelper(I)I
-Landroid/icu/impl/number/DecimalFormatProperties;->_hashCodeHelper(Ljava/lang/Object;)I
-Landroid/icu/impl/number/DecimalFormatProperties;->_hashCodeHelper(Z)I
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->convertToAccurateDouble()V
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->DOUBLE_MULTIPLIERS:[D
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->fractionCount()I
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->fractionCountWithoutTrailingZeros()I
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->safeSubtract(II)I
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->SECTION_LOWER_EDGE:I
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->SECTION_UPPER_EDGE:I
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToBigDecimal(Ljava/math/BigDecimal;)V
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToBigInteger(Ljava/math/BigInteger;)V
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToDoubleFast(D)V
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToInt(I)V
-Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToLong(J)V
-Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->bcdBytes:[B
-Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->bcdLong:J
-Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->ensureCapacity()V
-Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->ensureCapacity(I)V
-Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->switchStorage()V
-Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->usingBytes:Z
-Landroid/icu/impl/number/MicroProps;->exhausted:Z
-Landroid/icu/impl/number/MicroProps;->immutable:Z
-Landroid/icu/impl/number/MultiplierImpl;-><init>(Landroid/icu/impl/number/MultiplierImpl;Landroid/icu/impl/number/MicroPropsGenerator;)V
-Landroid/icu/impl/number/MultiplierImpl;->bigDecimalMultiplier:Ljava/math/BigDecimal;
-Landroid/icu/impl/number/MultiplierImpl;->magnitudeMultiplier:I
-Landroid/icu/impl/number/MultiplierImpl;->parent:Landroid/icu/impl/number/MicroPropsGenerator;
-Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;-><init>(Landroid/icu/impl/number/ParameterizedModifier;Landroid/icu/text/PluralRules;Landroid/icu/impl/number/MicroPropsGenerator;)V
-Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->parent:Landroid/icu/impl/number/MicroPropsGenerator;
-Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->pm:Landroid/icu/impl/number/ParameterizedModifier;
-Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->rules:Landroid/icu/text/PluralRules;
-Landroid/icu/impl/number/MutablePatternModifier;->createConstantModifier(Landroid/icu/impl/number/NumberStringBuilder;Landroid/icu/impl/number/NumberStringBuilder;)Landroid/icu/impl/number/ConstantMultiFieldModifier;
-Landroid/icu/impl/number/MutablePatternModifier;->currency:Landroid/icu/util/Currency;
-Landroid/icu/impl/number/MutablePatternModifier;->enterCharSequenceMode(Z)V
-Landroid/icu/impl/number/MutablePatternModifier;->exitCharSequenceMode()V
-Landroid/icu/impl/number/MutablePatternModifier;->flags:I
-Landroid/icu/impl/number/MutablePatternModifier;->inCharSequenceMode:Z
-Landroid/icu/impl/number/MutablePatternModifier;->insertPrefix(Landroid/icu/impl/number/NumberStringBuilder;I)I
-Landroid/icu/impl/number/MutablePatternModifier;->insertSuffix(Landroid/icu/impl/number/NumberStringBuilder;I)I
-Landroid/icu/impl/number/MutablePatternModifier;->isNegative:Z
-Landroid/icu/impl/number/MutablePatternModifier;->isStrong:Z
-Landroid/icu/impl/number/MutablePatternModifier;->length:I
-Landroid/icu/impl/number/MutablePatternModifier;->parent:Landroid/icu/impl/number/MicroPropsGenerator;
-Landroid/icu/impl/number/MutablePatternModifier;->patternInfo:Landroid/icu/impl/number/AffixPatternProvider;
-Landroid/icu/impl/number/MutablePatternModifier;->perMilleReplacesPercent:Z
-Landroid/icu/impl/number/MutablePatternModifier;->plural:Landroid/icu/impl/StandardPlural;
-Landroid/icu/impl/number/MutablePatternModifier;->plusReplacesMinusSign:Z
-Landroid/icu/impl/number/MutablePatternModifier;->prependSign:Z
-Landroid/icu/impl/number/MutablePatternModifier;->rules:Landroid/icu/text/PluralRules;
-Landroid/icu/impl/number/MutablePatternModifier;->signDisplay:Landroid/icu/number/NumberFormatter$SignDisplay;
-Landroid/icu/impl/number/MutablePatternModifier;->symbols:Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/impl/number/MutablePatternModifier;->unitWidth:Landroid/icu/number/NumberFormatter$UnitWidth;
-Landroid/icu/impl/number/NumberStringBuilder;->chars:[C
-Landroid/icu/impl/number/NumberStringBuilder;->fields:[Landroid/icu/text/NumberFormat$Field;
-Landroid/icu/impl/number/NumberStringBuilder;->fieldToDebugChar:Ljava/util/Map;
-Landroid/icu/impl/number/NumberStringBuilder;->getCapacity()I
-Landroid/icu/impl/number/NumberStringBuilder;->length:I
-Landroid/icu/impl/number/NumberStringBuilder;->prepareForInsert(II)I
-Landroid/icu/impl/number/NumberStringBuilder;->prepareForInsertHelper(II)I
-Landroid/icu/impl/number/NumberStringBuilder;->zero:I
-Landroid/icu/impl/number/Padder;->addPaddingHelper(Ljava/lang/String;ILandroid/icu/impl/number/NumberStringBuilder;I)I
-Landroid/icu/impl/number/Padder;->paddingString:Ljava/lang/String;
-Landroid/icu/impl/number/Padder;->position:Landroid/icu/impl/number/Padder$PadPosition;
-Landroid/icu/impl/number/Padder;->targetWidth:I
-Landroid/icu/impl/number/ParameterizedModifier;->frozen:Z
-Landroid/icu/impl/number/ParameterizedModifier;->getModIndex(ZLandroid/icu/impl/StandardPlural;)I
-Landroid/icu/impl/number/ParameterizedModifier;->mods:[Landroid/icu/impl/number/Modifier;
-Landroid/icu/impl/number/ParameterizedModifier;->negative:Landroid/icu/impl/number/Modifier;
-Landroid/icu/impl/number/ParameterizedModifier;->positive:Landroid/icu/impl/number/Modifier;
-Landroid/icu/impl/number/Parse$AffixHolder;-><init>(Ljava/lang/String;Ljava/lang/String;ZZ)V
-Landroid/icu/impl/number/Parse$AffixHolder;->addToState(Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/DecimalFormatProperties;)V
-Landroid/icu/impl/number/Parse$AffixHolder;->EMPTY_NEGATIVE:Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$AffixHolder;->EMPTY_POSITIVE:Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$AffixHolder;->fromPropertiesNegativePattern(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$AffixHolder;->fromPropertiesNegativeString(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$AffixHolder;->fromPropertiesPositivePattern(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$AffixHolder;->fromPropertiesPositiveString(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$AffixHolder;->getInstance(Ljava/lang/String;Ljava/lang/String;ZZ)Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$AffixHolder;->negative:Z
-Landroid/icu/impl/number/Parse$AffixHolder;->p:Ljava/lang/String;
-Landroid/icu/impl/number/Parse$AffixHolder;->s:Ljava/lang/String;
-Landroid/icu/impl/number/Parse$AffixHolder;->strings:Z
-Landroid/icu/impl/number/Parse$CurrencyAffixPatterns;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/impl/number/Parse$CurrencyAffixPatterns;->addPattern(Ljava/lang/String;)V
-Landroid/icu/impl/number/Parse$CurrencyAffixPatterns;->addToState(Landroid/icu/util/ULocale;Landroid/icu/impl/number/Parse$ParserState;)V
-Landroid/icu/impl/number/Parse$CurrencyAffixPatterns;->currencyAffixPatterns:Ljava/util/concurrent/ConcurrentHashMap;
-Landroid/icu/impl/number/Parse$CurrencyAffixPatterns;->set:Ljava/util/Set;
-Landroid/icu/impl/number/Parse$CurrencyAffixPatterns;->threadLocalProperties:Ljava/lang/ThreadLocal;
-Landroid/icu/impl/number/Parse$DigitType;->EXPONENT:Landroid/icu/impl/number/Parse$DigitType;
-Landroid/icu/impl/number/Parse$DigitType;->FRACTION:Landroid/icu/impl/number/Parse$DigitType;
-Landroid/icu/impl/number/Parse$DigitType;->INTEGER:Landroid/icu/impl/number/Parse$DigitType;
-Landroid/icu/impl/number/Parse$DigitType;->valueOf(Ljava/lang/String;)Landroid/icu/impl/number/Parse$DigitType;
-Landroid/icu/impl/number/Parse$DigitType;->values()[Landroid/icu/impl/number/Parse$DigitType;
-Landroid/icu/impl/number/Parse$ParserState;-><init>()V
-Landroid/icu/impl/number/Parse$ParserState;->affixHolders:Ljava/util/Set;
-Landroid/icu/impl/number/Parse$ParserState;->caseSensitive:Z
-Landroid/icu/impl/number/Parse$ParserState;->clear()Landroid/icu/impl/number/Parse$ParserState;
-Landroid/icu/impl/number/Parse$ParserState;->decimalCp1:I
-Landroid/icu/impl/number/Parse$ParserState;->decimalCp2:I
-Landroid/icu/impl/number/Parse$ParserState;->decimalType1:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$ParserState;->decimalType2:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$ParserState;->digitTrie:Landroid/icu/impl/TextTrieMap;
-Landroid/icu/impl/number/Parse$ParserState;->getItem(I)Landroid/icu/impl/number/Parse$StateItem;
-Landroid/icu/impl/number/Parse$ParserState;->getNext()Landroid/icu/impl/number/Parse$StateItem;
-Landroid/icu/impl/number/Parse$ParserState;->groupingCp1:I
-Landroid/icu/impl/number/Parse$ParserState;->groupingCp2:I
-Landroid/icu/impl/number/Parse$ParserState;->groupingMode:Landroid/icu/impl/number/Parse$GroupingMode;
-Landroid/icu/impl/number/Parse$ParserState;->groupingType1:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$ParserState;->groupingType2:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$ParserState;->items:[Landroid/icu/impl/number/Parse$StateItem;
-Landroid/icu/impl/number/Parse$ParserState;->lastInsertedIndex()I
-Landroid/icu/impl/number/Parse$ParserState;->length:I
-Landroid/icu/impl/number/Parse$ParserState;->mode:Landroid/icu/impl/number/Parse$ParseMode;
-Landroid/icu/impl/number/Parse$ParserState;->parseCurrency:Z
-Landroid/icu/impl/number/Parse$ParserState;->prevItems:[Landroid/icu/impl/number/Parse$StateItem;
-Landroid/icu/impl/number/Parse$ParserState;->prevLength:I
-Landroid/icu/impl/number/Parse$ParserState;->properties:Landroid/icu/impl/number/DecimalFormatProperties;
-Landroid/icu/impl/number/Parse$ParserState;->swap()V
-Landroid/icu/impl/number/Parse$ParserState;->swapBack()V
-Landroid/icu/impl/number/Parse$ParserState;->symbols:Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/impl/number/Parse$SeparatorType;->COMMA_LIKE:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$SeparatorType;->fromCp(ILandroid/icu/impl/number/Parse$ParseMode;)Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$SeparatorType;->OTHER_GROUPING:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$SeparatorType;->PERIOD_LIKE:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$SeparatorType;->UNKNOWN:Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$SeparatorType;->valueOf(Ljava/lang/String;)Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$SeparatorType;->values()[Landroid/icu/impl/number/Parse$SeparatorType;
-Landroid/icu/impl/number/Parse$StateItem;-><init>(C)V
-Landroid/icu/impl/number/Parse$StateItem;->affix:Landroid/icu/impl/number/Parse$AffixHolder;
-Landroid/icu/impl/number/Parse$StateItem;->appendDigit(BLandroid/icu/impl/number/Parse$DigitType;)V
-Landroid/icu/impl/number/Parse$StateItem;->clear()Landroid/icu/impl/number/Parse$StateItem;
-Landroid/icu/impl/number/Parse$StateItem;->copyFrom(Landroid/icu/impl/number/Parse$StateItem;Landroid/icu/impl/number/Parse$StateName;I)Landroid/icu/impl/number/Parse$StateItem;
-Landroid/icu/impl/number/Parse$StateItem;->currentAffixPattern:Ljava/lang/CharSequence;
-Landroid/icu/impl/number/Parse$StateItem;->currentCurrencyTrieState:Landroid/icu/impl/TextTrieMap$ParseState;
-Landroid/icu/impl/number/Parse$StateItem;->currentDigitTrieState:Landroid/icu/impl/TextTrieMap$ParseState;
-Landroid/icu/impl/number/Parse$StateItem;->currentDigitType:Landroid/icu/impl/number/Parse$DigitType;
-Landroid/icu/impl/number/Parse$StateItem;->currentOffset:I
-Landroid/icu/impl/number/Parse$StateItem;->currentStepwiseParserTag:J
-Landroid/icu/impl/number/Parse$StateItem;->currentString:Ljava/lang/CharSequence;
-Landroid/icu/impl/number/Parse$StateItem;->currentTrailing:Z
-Landroid/icu/impl/number/Parse$StateItem;->exponent:I
-Landroid/icu/impl/number/Parse$StateItem;->fq:Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;
-Landroid/icu/impl/number/Parse$StateItem;->groupingCp:I
-Landroid/icu/impl/number/Parse$StateItem;->groupingWidths:J
-Landroid/icu/impl/number/Parse$StateItem;->hasNumber()Z
-Landroid/icu/impl/number/Parse$StateItem;->id:C
-Landroid/icu/impl/number/Parse$StateItem;->isoCode:Ljava/lang/String;
-Landroid/icu/impl/number/Parse$StateItem;->name:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateItem;->numDigits:I
-Landroid/icu/impl/number/Parse$StateItem;->path:Ljava/lang/String;
-Landroid/icu/impl/number/Parse$StateItem;->returnTo1:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateItem;->returnTo2:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateItem;->sawCurrency:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawDecimalPoint:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawExponentDigit:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawInfinity:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawNaN:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawNegative:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawNegativeExponent:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawPrefix:Z
-Landroid/icu/impl/number/Parse$StateItem;->sawSuffix:Z
-Landroid/icu/impl/number/Parse$StateItem;->score:I
-Landroid/icu/impl/number/Parse$StateItem;->toCurrencyAmount(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/util/CurrencyAmount;
-Landroid/icu/impl/number/Parse$StateItem;->toNumber(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/lang/Number;
-Landroid/icu/impl/number/Parse$StateItem;->trailingCount:I
-Landroid/icu/impl/number/Parse$StateItem;->trailingZeros:I
-Landroid/icu/impl/number/Parse$StateName;->AFTER_EXPONENT_DIGIT:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->AFTER_EXPONENT_SEPARATOR:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->AFTER_FRACTION_DIGIT:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->AFTER_INTEGER_DIGIT:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->AFTER_PREFIX:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->AFTER_SUFFIX:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->BEFORE_PREFIX:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->BEFORE_SUFFIX:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->BEFORE_SUFFIX_SEEN_EXPONENT:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->INSIDE_AFFIX_PATTERN:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->INSIDE_CURRENCY:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->INSIDE_DIGIT:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->INSIDE_STRING:Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->valueOf(Ljava/lang/String;)Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse$StateName;->values()[Landroid/icu/impl/number/Parse$StateName;
-Landroid/icu/impl/number/Parse;->acceptAffixHolder(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Landroid/icu/impl/number/Parse$AffixHolder;Z)V
-Landroid/icu/impl/number/Parse;->acceptAffixPattern(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Ljava/lang/CharSequence;J)J
-Landroid/icu/impl/number/Parse;->acceptAffixPatternHelper(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Ljava/lang/CharSequence;J)J
-Landroid/icu/impl/number/Parse;->acceptAffixPatternNonIgnorable(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Ljava/lang/CharSequence;IJJ)J
-Landroid/icu/impl/number/Parse;->acceptAffixPatternOffset(ILandroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)J
-Landroid/icu/impl/number/Parse;->acceptBidi(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptCurrency(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptCurrency(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)J
-Landroid/icu/impl/number/Parse;->acceptCurrencyHelper(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Landroid/icu/impl/TextTrieMap$ParseState;)J
-Landroid/icu/impl/number/Parse;->acceptCurrencyOffset(ILandroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptDecimalPoint(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptDigitHelper(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Landroid/icu/impl/number/Parse$DigitType;)V
-Landroid/icu/impl/number/Parse;->acceptDigitTrie(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Landroid/icu/impl/number/Parse$DigitType;)J
-Landroid/icu/impl/number/Parse;->acceptDigitTrieHelper(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Landroid/icu/impl/number/Parse$DigitType;Landroid/icu/impl/TextTrieMap$ParseState;)J
-Landroid/icu/impl/number/Parse;->acceptDigitTrieOffset(ILandroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptExponentDigit(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptExponentSeparator(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptFractionDigit(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptGrouping(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptInfinity(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptIntegerDigit(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptMinusOrPlusSign(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Z)V
-Landroid/icu/impl/number/Parse;->acceptMinusSign(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Z)J
-Landroid/icu/impl/number/Parse;->acceptNan(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptPadding(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptPlusSign(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Z)J
-Landroid/icu/impl/number/Parse;->acceptPrefix(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptString(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Ljava/lang/CharSequence;IZ)J
-Landroid/icu/impl/number/Parse;->acceptStringHelper(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Ljava/lang/CharSequence;IZ)J
-Landroid/icu/impl/number/Parse;->acceptStringNonIgnorable(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Ljava/lang/CharSequence;ZIJJ)J
-Landroid/icu/impl/number/Parse;->acceptStringOffset(ILandroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)J
-Landroid/icu/impl/number/Parse;->acceptStringOrAffixPatternWithIgnorables(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;Ljava/lang/CharSequence;JZZ)J
-Landroid/icu/impl/number/Parse;->acceptSuffix(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->acceptWhitespace(ILandroid/icu/impl/number/Parse$StateName;Landroid/icu/impl/number/Parse$ParserState;Landroid/icu/impl/number/Parse$StateItem;)V
-Landroid/icu/impl/number/Parse;->codePointEquals(IILandroid/icu/impl/number/Parse$ParserState;)Z
-Landroid/icu/impl/number/Parse;->isIgnorable(ILandroid/icu/impl/number/Parse$ParserState;)Z
-Landroid/icu/impl/number/Parse;->makeDigitTrie([Ljava/lang/String;)Landroid/icu/impl/TextTrieMap;
-Landroid/icu/impl/number/Parse;->MAX_LONG_AS_BIG_DECIMAL:Ljava/math/BigDecimal;
-Landroid/icu/impl/number/Parse;->MIN_LONG_AS_BIG_DECIMAL:Ljava/math/BigDecimal;
-Landroid/icu/impl/number/Parse;->recordDigit(Landroid/icu/impl/number/Parse$StateItem;BLandroid/icu/impl/number/Parse$DigitType;)V
-Landroid/icu/impl/number/Parse;->UNISET_BIDI:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/number/Parse;->UNISET_COMMA_LIKE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/number/Parse;->UNISET_OTHER_GROUPING_SEPARATORS:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/number/Parse;->UNISET_PERIOD_LIKE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/number/Parse;->UNISET_STRICT_COMMA_LIKE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/number/Parse;->UNISET_STRICT_PERIOD_LIKE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/number/Parse;->UNISET_WHITESPACE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/number/Parse;->_parse(Ljava/lang/CharSequence;Ljava/text/ParsePosition;ZLandroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/impl/number/Parse$StateItem;
-Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;-><init>(Ljava/lang/String;)V
-Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;->getEndpoints(I)J
-Landroid/icu/impl/number/PatternStringParser$ParserState;-><init>(Ljava/lang/String;)V
-Landroid/icu/impl/number/PatternStringParser$ParserState;->next()I
-Landroid/icu/impl/number/PatternStringParser$ParserState;->offset:I
-Landroid/icu/impl/number/PatternStringParser$ParserState;->pattern:Ljava/lang/String;
-Landroid/icu/impl/number/PatternStringParser$ParserState;->peek()I
-Landroid/icu/impl/number/PatternStringParser$ParserState;->toParseException(Ljava/lang/String;)Ljava/lang/IllegalArgumentException;
-Landroid/icu/impl/number/PatternStringParser;->consumeAffix(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)J
-Landroid/icu/impl/number/PatternStringParser;->consumeExponent(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-Landroid/icu/impl/number/PatternStringParser;->consumeFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-Landroid/icu/impl/number/PatternStringParser;->consumeFractionFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-Landroid/icu/impl/number/PatternStringParser;->consumeIntegerFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-Landroid/icu/impl/number/PatternStringParser;->consumeLiteral(Landroid/icu/impl/number/PatternStringParser$ParserState;)V
-Landroid/icu/impl/number/PatternStringParser;->consumePadding(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;Landroid/icu/impl/number/Padder$PadPosition;)V
-Landroid/icu/impl/number/PatternStringParser;->consumePattern(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;)V
-Landroid/icu/impl/number/PatternStringParser;->consumeSubpattern(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V
-Landroid/icu/impl/number/PatternStringParser;->parseToExistingPropertiesImpl(Ljava/lang/String;Landroid/icu/impl/number/DecimalFormatProperties;I)V
-Landroid/icu/impl/number/PatternStringParser;->patternInfoToProperties(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;I)V
-Landroid/icu/impl/PatternTokenizer;->AFTER_QUOTE:I
-Landroid/icu/impl/PatternTokenizer;->appendEscaped(Ljava/lang/StringBuffer;I)V
-Landroid/icu/impl/PatternTokenizer;->escapeCharacters:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/PatternTokenizer;->extraQuotingCharacters:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/PatternTokenizer;->HEX:I
-Landroid/icu/impl/PatternTokenizer;->ignorableCharacters:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/PatternTokenizer;->IN_QUOTE:I
-Landroid/icu/impl/PatternTokenizer;->limit:I
-Landroid/icu/impl/PatternTokenizer;->needingQuoteCharacters:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/PatternTokenizer;->NONE:I
-Landroid/icu/impl/PatternTokenizer;->NORMAL_QUOTE:I
-Landroid/icu/impl/PatternTokenizer;->NO_QUOTE:I
-Landroid/icu/impl/PatternTokenizer;->pattern:Ljava/lang/String;
-Landroid/icu/impl/PatternTokenizer;->SLASH_START:I
-Landroid/icu/impl/PatternTokenizer;->start:I
-Landroid/icu/impl/PatternTokenizer;->START_QUOTE:I
-Landroid/icu/impl/PatternTokenizer;->syntaxCharacters:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/PatternTokenizer;->usingQuote:Z
-Landroid/icu/impl/PatternTokenizer;->usingSlash:Z
-Landroid/icu/impl/PluralRulesLoader;-><init>()V
-Landroid/icu/impl/PluralRulesLoader;->checkBuildRulesIdMaps()V
-Landroid/icu/impl/PluralRulesLoader;->getLocaleIdToRulesIdMap(Landroid/icu/text/PluralRules$PluralType;)Ljava/util/Map;
-Landroid/icu/impl/PluralRulesLoader;->getRulesIdToEquivalentULocaleMap()Ljava/util/Map;
-Landroid/icu/impl/PluralRulesLoader;->localeIdToCardinalRulesId:Ljava/util/Map;
-Landroid/icu/impl/PluralRulesLoader;->localeIdToOrdinalRulesId:Ljava/util/Map;
-Landroid/icu/impl/PluralRulesLoader;->localeIdToPluralRanges:Ljava/util/Map;
-Landroid/icu/impl/PluralRulesLoader;->rulesIdToEquivalentULocale:Ljava/util/Map;
-Landroid/icu/impl/PluralRulesLoader;->rulesIdToRules:Ljava/util/Map;
-Landroid/icu/impl/PluralRulesLoader;->UNKNOWN_RANGE:Landroid/icu/text/PluralRanges;
-Landroid/icu/impl/Relation$SimpleEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-Landroid/icu/impl/Relation$SimpleEntry;-><init>(Ljava/util/Map$Entry;)V
-Landroid/icu/impl/Relation$SimpleEntry;->key:Ljava/lang/Object;
-Landroid/icu/impl/Relation$SimpleEntry;->value:Ljava/lang/Object;
-Landroid/icu/impl/Relation;->data:Ljava/util/Map;
-Landroid/icu/impl/Relation;->frozen:Z
-Landroid/icu/impl/Relation;->newSet()Ljava/util/Set;
-Landroid/icu/impl/Relation;->setComparatorParam:[Ljava/lang/Object;
-Landroid/icu/impl/Relation;->setCreator:Ljava/lang/reflect/Constructor;
-Landroid/icu/impl/RuleCharacterIterator;->buf:[C
-Landroid/icu/impl/RuleCharacterIterator;->bufPos:I
-Landroid/icu/impl/RuleCharacterIterator;->isEscaped:Z
-Landroid/icu/impl/RuleCharacterIterator;->pos:Ljava/text/ParsePosition;
-Landroid/icu/impl/RuleCharacterIterator;->sym:Landroid/icu/text/SymbolTable;
-Landroid/icu/impl/RuleCharacterIterator;->text:Ljava/lang/String;
-Landroid/icu/impl/RuleCharacterIterator;->_advance(I)V
-Landroid/icu/impl/RuleCharacterIterator;->_current()I
-Landroid/icu/impl/SimpleCache;->cacheRef:Ljava/lang/ref/Reference;
-Landroid/icu/impl/SimpleCache;->capacity:I
-Landroid/icu/impl/SimpleCache;->DEFAULT_CAPACITY:I
-Landroid/icu/impl/SimpleCache;->type:I
-Landroid/icu/impl/SoftCache;->map:Ljava/util/concurrent/ConcurrentHashMap;
-Landroid/icu/impl/StandardPlural;->keyword:Ljava/lang/String;
-Landroid/icu/impl/TextTrieMap$CharIterator;-><init>(Ljava/lang/CharSequence;IZ)V
-Landroid/icu/impl/TextTrieMap$CharIterator;->_ignoreCase:Z
-Landroid/icu/impl/TextTrieMap$CharIterator;->_nextIdx:I
-Landroid/icu/impl/TextTrieMap$CharIterator;->_remainingChar:Ljava/lang/Character;
-Landroid/icu/impl/TextTrieMap$CharIterator;->_startIdx:I
-Landroid/icu/impl/TextTrieMap$CharIterator;->_text:Ljava/lang/CharSequence;
-Landroid/icu/impl/TextTrieMap$LongestMatchHandler;-><init>()V
-Landroid/icu/impl/TextTrieMap$LongestMatchHandler;->getMatches()Ljava/util/Iterator;
-Landroid/icu/impl/TextTrieMap$LongestMatchHandler;->getMatchLength()I
-Landroid/icu/impl/TextTrieMap$LongestMatchHandler;->length:I
-Landroid/icu/impl/TextTrieMap$LongestMatchHandler;->matches:Ljava/util/Iterator;
-Landroid/icu/impl/TextTrieMap$Node$StepResult;->node:Landroid/icu/impl/TextTrieMap$Node;
-Landroid/icu/impl/TextTrieMap$Node$StepResult;->offset:I
-Landroid/icu/impl/TextTrieMap$Node;->add(Landroid/icu/impl/TextTrieMap$CharIterator;Ljava/lang/Object;)V
-Landroid/icu/impl/TextTrieMap$Node;->add([CILjava/lang/Object;)V
-Landroid/icu/impl/TextTrieMap$Node;->addValue(Ljava/util/List;Ljava/lang/Object;)Ljava/util/List;
-Landroid/icu/impl/TextTrieMap$Node;->charCount()I
-Landroid/icu/impl/TextTrieMap$Node;->findMatch(Landroid/icu/impl/TextTrieMap$CharIterator;)Landroid/icu/impl/TextTrieMap$Node;
-Landroid/icu/impl/TextTrieMap$Node;->hasChildFor(C)Z
-Landroid/icu/impl/TextTrieMap$Node;->lenMatches([CI)I
-Landroid/icu/impl/TextTrieMap$Node;->matchFollowing(Landroid/icu/impl/TextTrieMap$CharIterator;)Z
-Landroid/icu/impl/TextTrieMap$Node;->split(I)V
-Landroid/icu/impl/TextTrieMap$Node;->takeStep(CILandroid/icu/impl/TextTrieMap$Node$StepResult;)V
-Landroid/icu/impl/TextTrieMap$Node;->values()Ljava/util/Iterator;
-Landroid/icu/impl/TextTrieMap$Node;->_children:Ljava/util/List;
-Landroid/icu/impl/TextTrieMap$Node;->_text:[C
-Landroid/icu/impl/TextTrieMap$Node;->_values:Ljava/util/List;
-Landroid/icu/impl/TextTrieMap$ParseState;->node:Landroid/icu/impl/TextTrieMap$Node;
-Landroid/icu/impl/TextTrieMap$ParseState;->offset:I
-Landroid/icu/impl/TextTrieMap$ParseState;->result:Landroid/icu/impl/TextTrieMap$Node$StepResult;
-Landroid/icu/impl/TextTrieMap;->find(Landroid/icu/impl/TextTrieMap$Node;Landroid/icu/impl/TextTrieMap$CharIterator;Landroid/icu/impl/TextTrieMap$ResultHandler;)V
-Landroid/icu/impl/TextTrieMap;->subArray([CI)[C
-Landroid/icu/impl/TextTrieMap;->subArray([CII)[C
-Landroid/icu/impl/TextTrieMap;->toCharArray(Ljava/lang/CharSequence;)[C
-Landroid/icu/impl/TextTrieMap;->_ignoreCase:Z
-Landroid/icu/impl/TextTrieMap;->_root:Landroid/icu/impl/TextTrieMap$Node;
-Landroid/icu/impl/TimeZoneGenericNames$Cache;-><init>()V
-Landroid/icu/impl/TimeZoneGenericNames$Cache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/impl/TimeZoneGenericNames$Cache;->createInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/impl/TimeZoneGenericNames;
-Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;-><init>(Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;Ljava/lang/String;I)V
-Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;-><init>(Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;Ljava/lang/String;ILandroid/icu/text/TimeZoneFormat$TimeType;)V
-Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;->matchLength:I
-Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;->nameType:Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;
-Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;->timeType:Landroid/icu/text/TimeZoneFormat$TimeType;
-Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;->tzID:Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;-><init>(Ljava/util/EnumSet;)V
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;->getMatches()Ljava/util/Collection;
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;->getMaxMatchLen()I
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;->handlePrefixMatch(ILjava/util/Iterator;)Z
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;->resetResults()V
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;->_matches:Ljava/util/Collection;
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;->_maxMatchLen:I
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameSearchHandler;->_types:Ljava/util/EnumSet;
-Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;->_fallbackTypeOf:[Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames$NameInfo;-><init>(Ljava/lang/String;Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;)V
-Landroid/icu/impl/TimeZoneGenericNames$NameInfo;->type:Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;
-Landroid/icu/impl/TimeZoneGenericNames$NameInfo;->tzID:Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames$Pattern;->defaultValue()Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames$Pattern;->key()Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames$Pattern;->_defaultVal:Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames$Pattern;->_key:Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/impl/TimeZoneGenericNames;->createGenericMatchInfo(Landroid/icu/text/TimeZoneNames$MatchInfo;)Landroid/icu/impl/TimeZoneGenericNames$GenericMatchInfo;
-Landroid/icu/impl/TimeZoneGenericNames;->DST_CHECK_RANGE:J
-Landroid/icu/impl/TimeZoneGenericNames;->findLocal(Ljava/lang/String;ILjava/util/EnumSet;)Ljava/util/Collection;
-Landroid/icu/impl/TimeZoneGenericNames;->findTimeZoneNames(Ljava/lang/String;ILjava/util/EnumSet;)Ljava/util/Collection;
-Landroid/icu/impl/TimeZoneGenericNames;->formatGenericNonLocationName(Landroid/icu/util/TimeZone;Landroid/icu/impl/TimeZoneGenericNames$GenericNameType;J)Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames;->GENERIC_NAMES_CACHE:Landroid/icu/impl/TimeZoneGenericNames$Cache;
-Landroid/icu/impl/TimeZoneGenericNames;->GENERIC_NON_LOCATION_TYPES:[Landroid/icu/text/TimeZoneNames$NameType;
-Landroid/icu/impl/TimeZoneGenericNames;->getLocaleDisplayNames()Landroid/icu/text/LocaleDisplayNames;
-Landroid/icu/impl/TimeZoneGenericNames;->getPartialLocationName(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames;->getTargetRegion()Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames;->init()V
-Landroid/icu/impl/TimeZoneGenericNames;->loadStrings(Ljava/lang/String;)V
-Landroid/icu/impl/TimeZoneGenericNames;->_frozen:Z
-Landroid/icu/impl/TimeZoneGenericNames;->_genericLocationNamesMap:Ljava/util/concurrent/ConcurrentHashMap;
-Landroid/icu/impl/TimeZoneGenericNames;->_genericPartialLocationNamesMap:Ljava/util/concurrent/ConcurrentHashMap;
-Landroid/icu/impl/TimeZoneGenericNames;->_gnamesTrie:Landroid/icu/impl/TextTrieMap;
-Landroid/icu/impl/TimeZoneGenericNames;->_gnamesTrieFullyLoaded:Z
-Landroid/icu/impl/TimeZoneGenericNames;->_locale:Landroid/icu/util/ULocale;
-Landroid/icu/impl/TimeZoneGenericNames;->_localeDisplayNamesRef:Ljava/lang/ref/WeakReference;
-Landroid/icu/impl/TimeZoneGenericNames;->_patternFormatters:[Ljava/text/MessageFormat;
-Landroid/icu/impl/TimeZoneGenericNames;->_region:Ljava/lang/String;
-Landroid/icu/impl/TimeZoneGenericNames;->_tznames:Landroid/icu/text/TimeZoneNames;
-Landroid/icu/impl/Trie$DefaultGetFoldingOffset;-><init>()V
-Landroid/icu/impl/Trie2$CharSequenceIterator;->fResults:Landroid/icu/impl/Trie2$CharSequenceValues;
-Landroid/icu/impl/Trie2$CharSequenceIterator;->index:I
-Landroid/icu/impl/Trie2$CharSequenceIterator;->text:Ljava/lang/CharSequence;
-Landroid/icu/impl/Trie2$CharSequenceIterator;->textLength:I
-Landroid/icu/impl/Trie2$Trie2Iterator;->doingCodePoints:Z
-Landroid/icu/impl/Trie2$Trie2Iterator;->doLeadSurrogates:Z
-Landroid/icu/impl/Trie2$Trie2Iterator;->limitCP:I
-Landroid/icu/impl/Trie2$Trie2Iterator;->mapper:Landroid/icu/impl/Trie2$ValueMapper;
-Landroid/icu/impl/Trie2$Trie2Iterator;->nextStart:I
-Landroid/icu/impl/Trie2$Trie2Iterator;->rangeEndLS(C)I
-Landroid/icu/impl/Trie2$Trie2Iterator;->returnValue:Landroid/icu/impl/Trie2$Range;
-Landroid/icu/impl/Trie2$UTrie2Header;-><init>()V
-Landroid/icu/impl/Trie2$UTrie2Header;->dataNullOffset:I
-Landroid/icu/impl/Trie2$UTrie2Header;->index2NullOffset:I
-Landroid/icu/impl/Trie2$UTrie2Header;->indexLength:I
-Landroid/icu/impl/Trie2$UTrie2Header;->options:I
-Landroid/icu/impl/Trie2$UTrie2Header;->shiftedDataLength:I
-Landroid/icu/impl/Trie2$UTrie2Header;->shiftedHighStart:I
-Landroid/icu/impl/Trie2$UTrie2Header;->signature:I
-Landroid/icu/impl/Trie2$ValueWidth;->BITS_16:Landroid/icu/impl/Trie2$ValueWidth;
-Landroid/icu/impl/Trie2$ValueWidth;->BITS_32:Landroid/icu/impl/Trie2$ValueWidth;
-Landroid/icu/impl/Trie2$ValueWidth;->valueOf(Ljava/lang/String;)Landroid/icu/impl/Trie2$ValueWidth;
-Landroid/icu/impl/Trie2$ValueWidth;->values()[Landroid/icu/impl/Trie2$ValueWidth;
-Landroid/icu/impl/Trie2;->data16:I
-Landroid/icu/impl/Trie2;->data32:[I
-Landroid/icu/impl/Trie2;->dataLength:I
-Landroid/icu/impl/Trie2;->dataNullOffset:I
-Landroid/icu/impl/Trie2;->defaultValueMapper:Landroid/icu/impl/Trie2$ValueMapper;
-Landroid/icu/impl/Trie2;->errorValue:I
-Landroid/icu/impl/Trie2;->fHash:I
-Landroid/icu/impl/Trie2;->hashByte(II)I
-Landroid/icu/impl/Trie2;->hashInt(II)I
-Landroid/icu/impl/Trie2;->hashUChar32(II)I
-Landroid/icu/impl/Trie2;->header:Landroid/icu/impl/Trie2$UTrie2Header;
-Landroid/icu/impl/Trie2;->highStart:I
-Landroid/icu/impl/Trie2;->highValueIndex:I
-Landroid/icu/impl/Trie2;->index2NullOffset:I
-Landroid/icu/impl/Trie2;->index:[C
-Landroid/icu/impl/Trie2;->indexLength:I
-Landroid/icu/impl/Trie2;->initHash()I
-Landroid/icu/impl/Trie2;->initialValue:I
-Landroid/icu/impl/Trie2;->rangeEnd(III)I
-Landroid/icu/impl/Trie2;->UNEWTRIE2_INDEX_1_LENGTH:I
-Landroid/icu/impl/Trie2;->UNEWTRIE2_INDEX_GAP_LENGTH:I
-Landroid/icu/impl/Trie2;->UNEWTRIE2_INDEX_GAP_OFFSET:I
-Landroid/icu/impl/Trie2;->UNEWTRIE2_MAX_DATA_LENGTH:I
-Landroid/icu/impl/Trie2;->UNEWTRIE2_MAX_INDEX_2_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_BAD_UTF8_DATA_OFFSET:I
-Landroid/icu/impl/Trie2;->UTRIE2_CP_PER_INDEX_1_ENTRY:I
-Landroid/icu/impl/Trie2;->UTRIE2_DATA_BLOCK_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_DATA_GRANULARITY:I
-Landroid/icu/impl/Trie2;->UTRIE2_DATA_MASK:I
-Landroid/icu/impl/Trie2;->UTRIE2_DATA_START_OFFSET:I
-Landroid/icu/impl/Trie2;->UTRIE2_INDEX_1_OFFSET:I
-Landroid/icu/impl/Trie2;->UTRIE2_INDEX_2_BLOCK_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_INDEX_2_BMP_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_INDEX_2_MASK:I
-Landroid/icu/impl/Trie2;->UTRIE2_INDEX_2_OFFSET:I
-Landroid/icu/impl/Trie2;->UTRIE2_INDEX_SHIFT:I
-Landroid/icu/impl/Trie2;->UTRIE2_LSCP_INDEX_2_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_LSCP_INDEX_2_OFFSET:I
-Landroid/icu/impl/Trie2;->UTRIE2_MAX_INDEX_1_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_OMITTED_BMP_INDEX_1_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_OPTIONS_VALUE_BITS_MASK:I
-Landroid/icu/impl/Trie2;->UTRIE2_SHIFT_1:I
-Landroid/icu/impl/Trie2;->UTRIE2_SHIFT_1_2:I
-Landroid/icu/impl/Trie2;->UTRIE2_SHIFT_2:I
-Landroid/icu/impl/Trie2;->UTRIE2_UTF8_2B_INDEX_2_LENGTH:I
-Landroid/icu/impl/Trie2;->UTRIE2_UTF8_2B_INDEX_2_OFFSET:I
-Landroid/icu/impl/Trie2Writable;->allocDataBlock(I)I
-Landroid/icu/impl/Trie2Writable;->allocIndex2Block()I
-Landroid/icu/impl/Trie2Writable;->compactData()V
-Landroid/icu/impl/Trie2Writable;->compactIndex2()V
-Landroid/icu/impl/Trie2Writable;->compactTrie()V
-Landroid/icu/impl/Trie2Writable;->data:[I
-Landroid/icu/impl/Trie2Writable;->dataCapacity:I
-Landroid/icu/impl/Trie2Writable;->equal_int([IIII)Z
-Landroid/icu/impl/Trie2Writable;->fillBlock(IIIIIZ)V
-Landroid/icu/impl/Trie2Writable;->findHighStart(I)I
-Landroid/icu/impl/Trie2Writable;->findSameDataBlock(III)I
-Landroid/icu/impl/Trie2Writable;->findSameIndex2Block(II)I
-Landroid/icu/impl/Trie2Writable;->firstFreeBlock:I
-Landroid/icu/impl/Trie2Writable;->freeze(Landroid/icu/impl/Trie2;Landroid/icu/impl/Trie2$ValueWidth;)V
-Landroid/icu/impl/Trie2Writable;->get(IZ)I
-Landroid/icu/impl/Trie2Writable;->getDataBlock(IZ)I
-Landroid/icu/impl/Trie2Writable;->getIndex2Block(IZ)I
-Landroid/icu/impl/Trie2Writable;->index1:[I
-Landroid/icu/impl/Trie2Writable;->index2:[I
-Landroid/icu/impl/Trie2Writable;->index2Length:I
-Landroid/icu/impl/Trie2Writable;->index2NullOffset:I
-Landroid/icu/impl/Trie2Writable;->init(II)V
-Landroid/icu/impl/Trie2Writable;->isCompacted:Z
-Landroid/icu/impl/Trie2Writable;->isInNullBlock(IZ)Z
-Landroid/icu/impl/Trie2Writable;->isWritableBlock(I)Z
-Landroid/icu/impl/Trie2Writable;->map:[I
-Landroid/icu/impl/Trie2Writable;->releaseDataBlock(I)V
-Landroid/icu/impl/Trie2Writable;->set(IZI)Landroid/icu/impl/Trie2Writable;
-Landroid/icu/impl/Trie2Writable;->setIndex2Entry(II)V
-Landroid/icu/impl/Trie2Writable;->uncompact()V
-Landroid/icu/impl/Trie2Writable;->UNEWTRIE2_DATA_0800_OFFSET:I
-Landroid/icu/impl/Trie2Writable;->UNEWTRIE2_DATA_NULL_OFFSET:I
-Landroid/icu/impl/Trie2Writable;->UNEWTRIE2_DATA_START_OFFSET:I
-Landroid/icu/impl/Trie2Writable;->UNEWTRIE2_INDEX_2_NULL_OFFSET:I
-Landroid/icu/impl/Trie2Writable;->UNEWTRIE2_INDEX_2_START_OFFSET:I
-Landroid/icu/impl/Trie2Writable;->UNEWTRIE2_INITIAL_DATA_LENGTH:I
-Landroid/icu/impl/Trie2Writable;->UNEWTRIE2_MEDIUM_DATA_LENGTH:I
-Landroid/icu/impl/Trie2Writable;->UTRIE2_DEBUG:Z
-Landroid/icu/impl/Trie2Writable;->UTRIE2_MAX_DATA_LENGTH:I
-Landroid/icu/impl/Trie2Writable;->UTRIE2_MAX_INDEX_LENGTH:I
-Landroid/icu/impl/Trie2Writable;->writeBlock(II)V
-Landroid/icu/impl/Trie2_16;-><init>()V
-Landroid/icu/impl/Trie2_16;->rangeEnd(III)I
-Landroid/icu/impl/Trie2_32;-><init>()V
-Landroid/icu/impl/Trie2_32;->rangeEnd(III)I
-Landroid/icu/impl/Trie;->checkHeader(I)Z
-Landroid/icu/impl/Trie;->HEADER_OPTIONS_SHIFT_MASK_:I
-Landroid/icu/impl/Trie;->m_isLatin1Linear_:Z
-Landroid/icu/impl/Trie;->m_options_:I
-Landroid/icu/impl/UBiDiProps$IsAcceptable;-><init>()V
-Landroid/icu/impl/UBiDiProps;-><init>()V
-Landroid/icu/impl/UBiDiProps;->BIDI_CONTROL_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->BPT_MASK:I
-Landroid/icu/impl/UBiDiProps;->BPT_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->CLASS_MASK:I
-Landroid/icu/impl/UBiDiProps;->DATA_FILE_NAME:Ljava/lang/String;
-Landroid/icu/impl/UBiDiProps;->DATA_NAME:Ljava/lang/String;
-Landroid/icu/impl/UBiDiProps;->DATA_TYPE:Ljava/lang/String;
-Landroid/icu/impl/UBiDiProps;->ESC_MIRROR_DELTA:I
-Landroid/icu/impl/UBiDiProps;->FMT:I
-Landroid/icu/impl/UBiDiProps;->getClassFromProps(I)I
-Landroid/icu/impl/UBiDiProps;->getFlagFromProps(II)Z
-Landroid/icu/impl/UBiDiProps;->getMirror(II)I
-Landroid/icu/impl/UBiDiProps;->getMirrorCodePoint(I)I
-Landroid/icu/impl/UBiDiProps;->getMirrorDeltaFromProps(I)I
-Landroid/icu/impl/UBiDiProps;->getMirrorIndex(I)I
-Landroid/icu/impl/UBiDiProps;->indexes:[I
-Landroid/icu/impl/UBiDiProps;->IS_MIRRORED_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->IX_JG_LIMIT2:I
-Landroid/icu/impl/UBiDiProps;->IX_JG_LIMIT:I
-Landroid/icu/impl/UBiDiProps;->IX_JG_START2:I
-Landroid/icu/impl/UBiDiProps;->IX_JG_START:I
-Landroid/icu/impl/UBiDiProps;->IX_MAX_VALUES:I
-Landroid/icu/impl/UBiDiProps;->IX_MIRROR_LENGTH:I
-Landroid/icu/impl/UBiDiProps;->IX_TOP:I
-Landroid/icu/impl/UBiDiProps;->IX_TRIE_SIZE:I
-Landroid/icu/impl/UBiDiProps;->jgArray2:[B
-Landroid/icu/impl/UBiDiProps;->jgArray:[B
-Landroid/icu/impl/UBiDiProps;->JOIN_CONTROL_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->JT_MASK:I
-Landroid/icu/impl/UBiDiProps;->JT_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->MAX_JG_MASK:I
-Landroid/icu/impl/UBiDiProps;->MAX_JG_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->mirrors:[I
-Landroid/icu/impl/UBiDiProps;->MIRROR_DELTA_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->MIRROR_INDEX_SHIFT:I
-Landroid/icu/impl/UBiDiProps;->readData(Ljava/nio/ByteBuffer;)V
-Landroid/icu/impl/UBiDiProps;->trie:Landroid/icu/impl/Trie2_16;
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;-><init>()V
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->addOffset(I)V
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->addOffsetAndCount(II)V
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->clear()V
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->containsOffset(I)Z
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->hasCountAtOffset(II)Z
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->isEmpty()Z
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->length:I
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->list:[I
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->popMinimum(Landroid/icu/util/OutputInt;)I
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->setMaxLength(I)V
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->shift(I)V
-Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;->start:I
-Landroid/icu/impl/UnicodeSetStringSpan;->addToSpanNotSet(I)V
-Landroid/icu/impl/UnicodeSetStringSpan;->all:Z
-Landroid/icu/impl/UnicodeSetStringSpan;->ALL_CP_CONTAINED:S
-Landroid/icu/impl/UnicodeSetStringSpan;->LONG_SPAN:S
-Landroid/icu/impl/UnicodeSetStringSpan;->makeSpanLengthByte(I)S
-Landroid/icu/impl/UnicodeSetStringSpan;->matches16(Ljava/lang/CharSequence;ILjava/lang/String;I)Z
-Landroid/icu/impl/UnicodeSetStringSpan;->matches16CPB(Ljava/lang/CharSequence;IILjava/lang/String;I)Z
-Landroid/icu/impl/UnicodeSetStringSpan;->maxLength16:I
-Landroid/icu/impl/UnicodeSetStringSpan;->offsets:Landroid/icu/impl/UnicodeSetStringSpan$OffsetList;
-Landroid/icu/impl/UnicodeSetStringSpan;->someRelevant:Z
-Landroid/icu/impl/UnicodeSetStringSpan;->spanContainedAndCount(Ljava/lang/CharSequence;ILandroid/icu/util/OutputInt;)I
-Landroid/icu/impl/UnicodeSetStringSpan;->spanLengths:[S
-Landroid/icu/impl/UnicodeSetStringSpan;->spanNot(Ljava/lang/CharSequence;ILandroid/icu/util/OutputInt;)I
-Landroid/icu/impl/UnicodeSetStringSpan;->spanNotBack(Ljava/lang/CharSequence;I)I
-Landroid/icu/impl/UnicodeSetStringSpan;->spanNotSet:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/UnicodeSetStringSpan;->spanOne(Landroid/icu/text/UnicodeSet;Ljava/lang/CharSequence;II)I
-Landroid/icu/impl/UnicodeSetStringSpan;->spanOneBack(Landroid/icu/text/UnicodeSet;Ljava/lang/CharSequence;I)I
-Landroid/icu/impl/UnicodeSetStringSpan;->spanSet:Landroid/icu/text/UnicodeSet;
-Landroid/icu/impl/UnicodeSetStringSpan;->spanWithStrings(Ljava/lang/CharSequence;IILandroid/icu/text/UnicodeSet$SpanCondition;)I
-Landroid/icu/impl/UnicodeSetStringSpan;->strings:Ljava/util/ArrayList;
-Landroid/icu/impl/UResource$Key;-><init>([BII)V
-Landroid/icu/impl/UResource$Key;->bytes:[B
-Landroid/icu/impl/UResource$Key;->internalSubString(II)Ljava/lang/String;
-Landroid/icu/impl/UResource$Key;->length:I
-Landroid/icu/impl/UResource$Key;->offset:I
-Landroid/icu/impl/UResource$Key;->regionMatches(ILjava/lang/CharSequence;I)Z
-Landroid/icu/impl/UResource$Key;->regionMatches([BII)Z
-Landroid/icu/impl/UResource$Key;->s:Ljava/lang/String;
-Landroid/icu/lang/CharSequences;-><init>()V
-Landroid/icu/lang/CharSequences;->codePointLength(Ljava/lang/CharSequence;)I
-Landroid/icu/lang/CharSequences;->codePoints(Ljava/lang/CharSequence;)[I
-Landroid/icu/lang/CharSequences;->compare(ILjava/lang/CharSequence;)I
-Landroid/icu/lang/CharSequences;->compare(Ljava/lang/CharSequence;I)I
-Landroid/icu/lang/CharSequences;->compare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I
-Landroid/icu/lang/CharSequences;->equals(ILjava/lang/CharSequence;)Z
-Landroid/icu/lang/CharSequences;->equals(Ljava/lang/CharSequence;I)Z
-Landroid/icu/lang/CharSequences;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
-Landroid/icu/lang/CharSequences;->equalsChars(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
-Landroid/icu/lang/CharSequences;->getSingleCodePoint(Ljava/lang/CharSequence;)I
-Landroid/icu/lang/CharSequences;->indexOf(Ljava/lang/CharSequence;I)I
-Landroid/icu/lang/CharSequences;->matchAfter(Ljava/lang/CharSequence;Ljava/lang/CharSequence;II)I
-Landroid/icu/lang/CharSequences;->onCharacterBoundary(Ljava/lang/CharSequence;I)Z
-Landroid/icu/lang/UCharacter$BidiPairedBracketType;->COUNT:I
-Landroid/icu/lang/UCharacter$DecompositionType;->COUNT:I
-Landroid/icu/lang/UCharacter$DummyValueIterator;-><init>()V
-Landroid/icu/lang/UCharacter$EastAsianWidth;->COUNT:I
-Landroid/icu/lang/UCharacter$GraphemeClusterBreak;->COUNT:I
-Landroid/icu/lang/UCharacter$HangulSyllableType;->COUNT:I
-Landroid/icu/lang/UCharacter$JoiningGroup;->COUNT:I
-Landroid/icu/lang/UCharacter$JoiningType;->COUNT:I
-Landroid/icu/lang/UCharacter$LineBreak;->COUNT:I
-Landroid/icu/lang/UCharacter$NumericType;->COUNT:I
-Landroid/icu/lang/UCharacter$SentenceBreak;->COUNT:I
-Landroid/icu/lang/UCharacter$UCharacterTypeIterator$MaskType;-><init>()V
-Landroid/icu/lang/UCharacter$UCharacterTypeIterator;-><init>()V
-Landroid/icu/lang/UCharacter$UCharacterTypeIterator;->MASK_TYPE:Landroid/icu/lang/UCharacter$UCharacterTypeIterator$MaskType;
-Landroid/icu/lang/UCharacter$UCharacterTypeIterator;->range:Landroid/icu/impl/Trie2$Range;
-Landroid/icu/lang/UCharacter$UCharacterTypeIterator;->trieIterator:Ljava/util/Iterator;
-Landroid/icu/lang/UCharacter$UnicodeBlock;-><init>(Ljava/lang/String;I)V
-Landroid/icu/lang/UCharacter$UnicodeBlock;->BLOCKS_:[Landroid/icu/lang/UCharacter$UnicodeBlock;
-Landroid/icu/lang/UCharacter$UnicodeBlock;->COUNT:I
-Landroid/icu/lang/UCharacter$UnicodeBlock;->mref:Ljava/lang/ref/SoftReference;
-Landroid/icu/lang/UCharacter$UnicodeBlock;->m_id_:I
-Landroid/icu/lang/UCharacter$UnicodeBlock;->trimBlockName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/lang/UCharacter$WordBreak;->COUNT:I
-Landroid/icu/lang/UCharacter;-><init>()V
-Landroid/icu/lang/UCharacter;->APPLICATION_PROGRAM_COMMAND_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_EIGHT_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_FIVE_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_FOUR_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_HUNDRED_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_NINE_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_ONE_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_SEVEN_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_SIX_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_TEN_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_THOUSAND_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_THREE_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_TWO_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_COMPLEX_ZERO_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_EIGHTH_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_FIFTH_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_FIRST_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_FOURTH_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_HUNDRED_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_HUNDRED_MILLION_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_NINETH_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_SECOND_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_SEVENTH_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_SIXTH_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_TEN_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_TEN_THOUSAND_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_THIRD_:I
-Landroid/icu/lang/UCharacter;->CJK_IDEOGRAPH_THOUSAND_:I
-Landroid/icu/lang/UCharacter;->DELETE_:I
-Landroid/icu/lang/UCharacter;->FIGURE_SPACE_:I
-Landroid/icu/lang/UCharacter;->getCaseLocale(Landroid/icu/util/ULocale;)I
-Landroid/icu/lang/UCharacter;->getCaseLocale(Ljava/util/Locale;)I
-Landroid/icu/lang/UCharacter;->getCharFromName1_0(Ljava/lang/String;)I
-Landroid/icu/lang/UCharacter;->getDefaultCaseLocale()I
-Landroid/icu/lang/UCharacter;->getISOComment(I)Ljava/lang/String;
-Landroid/icu/lang/UCharacter;->getName1_0(I)Ljava/lang/String;
-Landroid/icu/lang/UCharacter;->getName1_0Iterator()Landroid/icu/util/ValueIterator;
-Landroid/icu/lang/UCharacter;->getPropertyValueEnumNoThrow(ILjava/lang/CharSequence;)I
-Landroid/icu/lang/UCharacter;->getStringPropertyValue(III)Ljava/lang/String;
-Landroid/icu/lang/UCharacter;->IDEOGRAPHIC_NUMBER_ZERO_:I
-Landroid/icu/lang/UCharacter;->isJavaLetter(I)Z
-Landroid/icu/lang/UCharacter;->isJavaLetterOrDigit(I)Z
-Landroid/icu/lang/UCharacter;->isSpace(I)Z
-Landroid/icu/lang/UCharacter;->LAST_CHAR_MASK_:I
-Landroid/icu/lang/UCharacter;->NARROW_NO_BREAK_SPACE_:I
-Landroid/icu/lang/UCharacter;->NO_BREAK_SPACE_:I
-Landroid/icu/lang/UCharacter;->toTitleFirst(Landroid/icu/util/ULocale;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/lang/UCharacter;->TO_TITLE_WHOLE_STRING_NO_LOWERCASE:Landroid/icu/text/CaseMap$Title;
-Landroid/icu/lang/UCharacter;->UNIT_SEPARATOR_:I
-Landroid/icu/lang/UCharacterCategory;-><init>()V
-Landroid/icu/lang/UCharacterDirection;-><init>()V
-Landroid/icu/lang/UCharacterEnums$ECharacterCategory;->CHAR_CATEGORY_COUNT:B
-Landroid/icu/lang/UCharacterEnums$ECharacterDirection;->CHAR_DIRECTION_COUNT:I
-Landroid/icu/lang/UCharacterEnums;-><init>()V
-Landroid/icu/lang/UProperty$NameChoice;->COUNT:I
-Landroid/icu/lang/UProperty;->BINARY_LIMIT:I
-Landroid/icu/lang/UProperty;->DOUBLE_LIMIT:I
-Landroid/icu/lang/UProperty;->INT_LIMIT:I
-Landroid/icu/lang/UProperty;->ISO_COMMENT:I
-Landroid/icu/lang/UProperty;->MASK_LIMIT:I
-Landroid/icu/lang/UProperty;->OTHER_PROPERTY_LIMIT:I
-Landroid/icu/lang/UProperty;->STRING_LIMIT:I
-Landroid/icu/lang/UProperty;->UNDEFINED:I
-Landroid/icu/lang/UProperty;->UNICODE_1_NAME:I
-Landroid/icu/lang/UScript$ScriptMetadata;-><init>()V
-Landroid/icu/lang/UScript$ScriptMetadata;->CASED:I
-Landroid/icu/lang/UScript$ScriptMetadata;->EXCLUSION:I
-Landroid/icu/lang/UScript$ScriptMetadata;->getScriptProps(I)I
-Landroid/icu/lang/UScript$ScriptMetadata;->LB_LETTERS:I
-Landroid/icu/lang/UScript$ScriptMetadata;->LIMITED_USE:I
-Landroid/icu/lang/UScript$ScriptMetadata;->RECOMMENDED:I
-Landroid/icu/lang/UScript$ScriptMetadata;->RTL:I
-Landroid/icu/lang/UScript$ScriptMetadata;->SCRIPT_PROPS:[I
-Landroid/icu/lang/UScript$ScriptMetadata;->UNKNOWN:I
-Landroid/icu/lang/UScript;-><init>()V
-Landroid/icu/lang/UScript;->CODE_LIMIT:I
-Landroid/icu/lang/UScript;->DUPLOYAN_SHORTAND:I
-Landroid/icu/lang/UScript;->findCodeFromLocale(Landroid/icu/util/ULocale;)[I
-Landroid/icu/lang/UScript;->getCodesFromLocale(Landroid/icu/util/ULocale;)[I
-Landroid/icu/lang/UScript;->usageValues:[Landroid/icu/lang/UScript$ScriptUsage;
-Landroid/icu/lang/UScriptRun$ParenStackEntry;-><init>(II)V
-Landroid/icu/lang/UScriptRun$ParenStackEntry;->pairIndex:I
-Landroid/icu/lang/UScriptRun$ParenStackEntry;->scriptCode:I
-Landroid/icu/lang/UScriptRun;-><init>()V
-Landroid/icu/lang/UScriptRun;-><init>(Ljava/lang/String;)V
-Landroid/icu/lang/UScriptRun;-><init>(Ljava/lang/String;II)V
-Landroid/icu/lang/UScriptRun;-><init>([C)V
-Landroid/icu/lang/UScriptRun;-><init>([CII)V
-Landroid/icu/lang/UScriptRun;->dec(I)I
-Landroid/icu/lang/UScriptRun;->dec(II)I
-Landroid/icu/lang/UScriptRun;->emptyCharArray:[C
-Landroid/icu/lang/UScriptRun;->fixup(I)V
-Landroid/icu/lang/UScriptRun;->fixupCount:I
-Landroid/icu/lang/UScriptRun;->getPairIndex(I)I
-Landroid/icu/lang/UScriptRun;->getScriptCode()I
-Landroid/icu/lang/UScriptRun;->getScriptLimit()I
-Landroid/icu/lang/UScriptRun;->getScriptStart()I
-Landroid/icu/lang/UScriptRun;->highBit(I)B
-Landroid/icu/lang/UScriptRun;->inc(I)I
-Landroid/icu/lang/UScriptRun;->inc(II)I
-Landroid/icu/lang/UScriptRun;->limitInc(I)I
-Landroid/icu/lang/UScriptRun;->mod(I)I
-Landroid/icu/lang/UScriptRun;->next()Z
-Landroid/icu/lang/UScriptRun;->pairedCharExtra:I
-Landroid/icu/lang/UScriptRun;->pairedCharPower:I
-Landroid/icu/lang/UScriptRun;->pairedChars:[I
-Landroid/icu/lang/UScriptRun;->parenSP:I
-Landroid/icu/lang/UScriptRun;->parenStack:[Landroid/icu/lang/UScriptRun$ParenStackEntry;
-Landroid/icu/lang/UScriptRun;->PAREN_STACK_DEPTH:I
-Landroid/icu/lang/UScriptRun;->pop()V
-Landroid/icu/lang/UScriptRun;->push(II)V
-Landroid/icu/lang/UScriptRun;->pushCount:I
-Landroid/icu/lang/UScriptRun;->reset()V
-Landroid/icu/lang/UScriptRun;->reset(II)V
-Landroid/icu/lang/UScriptRun;->reset(Ljava/lang/String;)V
-Landroid/icu/lang/UScriptRun;->reset(Ljava/lang/String;II)V
-Landroid/icu/lang/UScriptRun;->reset([C)V
-Landroid/icu/lang/UScriptRun;->reset([CII)V
-Landroid/icu/lang/UScriptRun;->sameScript(II)Z
-Landroid/icu/lang/UScriptRun;->scriptCode:I
-Landroid/icu/lang/UScriptRun;->scriptLimit:I
-Landroid/icu/lang/UScriptRun;->scriptStart:I
-Landroid/icu/lang/UScriptRun;->stackIsEmpty()Z
-Landroid/icu/lang/UScriptRun;->stackIsNotEmpty()Z
-Landroid/icu/lang/UScriptRun;->syncFixup()V
-Landroid/icu/lang/UScriptRun;->text:[C
-Landroid/icu/lang/UScriptRun;->textIndex:I
-Landroid/icu/lang/UScriptRun;->textLimit:I
-Landroid/icu/lang/UScriptRun;->textStart:I
-Landroid/icu/lang/UScriptRun;->top()Landroid/icu/lang/UScriptRun$ParenStackEntry;
-Landroid/icu/math/BigDecimal;-><init>()V
-Landroid/icu/math/BigDecimal;->allzero([BI)Z
-Landroid/icu/math/BigDecimal;->bad([C)V
-Landroid/icu/math/BigDecimal;->badarg(Ljava/lang/String;ILjava/lang/String;)V
-Landroid/icu/math/BigDecimal;->byteaddsub([BI[BIIZ)[B
-Landroid/icu/math/BigDecimal;->bytecar:[B
-Landroid/icu/math/BigDecimal;->bytedig:[B
-Landroid/icu/math/BigDecimal;->checkdigits(Landroid/icu/math/BigDecimal;I)V
-Landroid/icu/math/BigDecimal;->clone(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;
-Landroid/icu/math/BigDecimal;->diginit()[B
-Landroid/icu/math/BigDecimal;->dodivide(CLandroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;I)Landroid/icu/math/BigDecimal;
-Landroid/icu/math/BigDecimal;->exp:I
-Landroid/icu/math/BigDecimal;->extend([BI)[B
-Landroid/icu/math/BigDecimal;->finish(Landroid/icu/math/MathContext;Z)Landroid/icu/math/BigDecimal;
-Landroid/icu/math/BigDecimal;->form:B
-Landroid/icu/math/BigDecimal;->ind:B
-Landroid/icu/math/BigDecimal;->intcheck(II)I
-Landroid/icu/math/BigDecimal;->isneg:B
-Landroid/icu/math/BigDecimal;->ispos:B
-Landroid/icu/math/BigDecimal;->iszero:B
-Landroid/icu/math/BigDecimal;->layout()[C
-Landroid/icu/math/BigDecimal;->mant:[B
-Landroid/icu/math/BigDecimal;->MaxArg:I
-Landroid/icu/math/BigDecimal;->MaxExp:I
-Landroid/icu/math/BigDecimal;->MinArg:I
-Landroid/icu/math/BigDecimal;->MinExp:I
-Landroid/icu/math/BigDecimal;->plainMC:Landroid/icu/math/MathContext;
-Landroid/icu/math/BigDecimal;->round(II)Landroid/icu/math/BigDecimal;
-Landroid/icu/math/BigDecimal;->round(Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;
-Landroid/icu/math/MathContext;->DEFAULT_DIGITS:I
-Landroid/icu/math/MathContext;->DEFAULT_FORM:I
-Landroid/icu/math/MathContext;->DEFAULT_LOSTDIGITS:Z
-Landroid/icu/math/MathContext;->DEFAULT_ROUNDINGMODE:I
-Landroid/icu/math/MathContext;->digits:I
-Landroid/icu/math/MathContext;->form:I
-Landroid/icu/math/MathContext;->isValidRound(I)Z
-Landroid/icu/math/MathContext;->lostDigits:Z
-Landroid/icu/math/MathContext;->MAX_DIGITS:I
-Landroid/icu/math/MathContext;->MIN_DIGITS:I
-Landroid/icu/math/MathContext;->roundingMode:I
-Landroid/icu/math/MathContext;->ROUNDS:[I
-Landroid/icu/math/MathContext;->ROUNDWORDS:[Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex$Bucket;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;)V
-Landroid/icu/text/AlphabeticIndex$Bucket;->displayBucket:Landroid/icu/text/AlphabeticIndex$Bucket;
-Landroid/icu/text/AlphabeticIndex$Bucket;->displayIndex:I
-Landroid/icu/text/AlphabeticIndex$Bucket;->label:Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex$Bucket;->labelType:Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;
-Landroid/icu/text/AlphabeticIndex$Bucket;->lowerBoundary:Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex$Bucket;->records:Ljava/util/List;
-Landroid/icu/text/AlphabeticIndex$BucketList;-><init>(Ljava/util/ArrayList;Ljava/util/ArrayList;)V
-Landroid/icu/text/AlphabeticIndex$BucketList;->bucketList:Ljava/util/ArrayList;
-Landroid/icu/text/AlphabeticIndex$BucketList;->fullIterator()Ljava/util/Iterator;
-Landroid/icu/text/AlphabeticIndex$BucketList;->getBucketCount()I
-Landroid/icu/text/AlphabeticIndex$BucketList;->getBucketIndex(Ljava/lang/CharSequence;Landroid/icu/text/Collator;)I
-Landroid/icu/text/AlphabeticIndex$BucketList;->immutableVisibleList:Ljava/util/List;
-Landroid/icu/text/AlphabeticIndex$ImmutableIndex;-><init>(Landroid/icu/text/AlphabeticIndex$BucketList;Landroid/icu/text/Collator;)V
-Landroid/icu/text/AlphabeticIndex$ImmutableIndex;->buckets:Landroid/icu/text/AlphabeticIndex$BucketList;
-Landroid/icu/text/AlphabeticIndex$ImmutableIndex;->collatorPrimaryOnly:Landroid/icu/text/Collator;
-Landroid/icu/text/AlphabeticIndex$Record;-><init>(Ljava/lang/CharSequence;Ljava/lang/Object;)V
-Landroid/icu/text/AlphabeticIndex$Record;->data:Ljava/lang/Object;
-Landroid/icu/text/AlphabeticIndex$Record;->name:Ljava/lang/CharSequence;
-Landroid/icu/text/AlphabeticIndex;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/RuleBasedCollator;)V
-Landroid/icu/text/AlphabeticIndex;->addChineseIndexCharacters()Z
-Landroid/icu/text/AlphabeticIndex;->addIndexExemplars(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/AlphabeticIndex;->BASE:Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex;->binaryCmp:Ljava/util/Comparator;
-Landroid/icu/text/AlphabeticIndex;->buckets:Landroid/icu/text/AlphabeticIndex$BucketList;
-Landroid/icu/text/AlphabeticIndex;->CGJ:C
-Landroid/icu/text/AlphabeticIndex;->collatorExternal:Landroid/icu/text/RuleBasedCollator;
-Landroid/icu/text/AlphabeticIndex;->collatorOriginal:Landroid/icu/text/RuleBasedCollator;
-Landroid/icu/text/AlphabeticIndex;->collatorPrimaryOnly:Landroid/icu/text/RuleBasedCollator;
-Landroid/icu/text/AlphabeticIndex;->createBucketList()Landroid/icu/text/AlphabeticIndex$BucketList;
-Landroid/icu/text/AlphabeticIndex;->firstCharsInScripts:Ljava/util/List;
-Landroid/icu/text/AlphabeticIndex;->fixLabel(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex;->GC_CN_MASK:I
-Landroid/icu/text/AlphabeticIndex;->GC_LL_MASK:I
-Landroid/icu/text/AlphabeticIndex;->GC_LM_MASK:I
-Landroid/icu/text/AlphabeticIndex;->GC_LO_MASK:I
-Landroid/icu/text/AlphabeticIndex;->GC_LT_MASK:I
-Landroid/icu/text/AlphabeticIndex;->GC_LU_MASK:I
-Landroid/icu/text/AlphabeticIndex;->GC_L_MASK:I
-Landroid/icu/text/AlphabeticIndex;->getFirstCharactersInScripts()Ljava/util/List;
-Landroid/icu/text/AlphabeticIndex;->hasMultiplePrimaryWeights(Landroid/icu/text/RuleBasedCollator;JLjava/lang/String;)Z
-Landroid/icu/text/AlphabeticIndex;->inflowLabel:Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex;->initBuckets()V
-Landroid/icu/text/AlphabeticIndex;->initialLabels:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/AlphabeticIndex;->initLabels()Ljava/util/List;
-Landroid/icu/text/AlphabeticIndex;->inputList:Ljava/util/List;
-Landroid/icu/text/AlphabeticIndex;->isOneLabelBetterThanOther(Landroid/icu/text/Normalizer2;Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/icu/text/AlphabeticIndex;->maxLabelCount:I
-Landroid/icu/text/AlphabeticIndex;->overflowLabel:Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex;->recordComparator:Ljava/util/Comparator;
-Landroid/icu/text/AlphabeticIndex;->separated(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/AlphabeticIndex;->underflowLabel:Ljava/lang/String;
-Landroid/icu/text/ArabicShaping;->ALEFTYPE:I
-Landroid/icu/text/ArabicShaping;->araLink:[I
-Landroid/icu/text/ArabicShaping;->calculateSize([CII)I
-Landroid/icu/text/ArabicShaping;->changeLamAlef(C)C
-Landroid/icu/text/ArabicShaping;->convertFEto06:[I
-Landroid/icu/text/ArabicShaping;->convertNormalizedLamAlef:[C
-Landroid/icu/text/ArabicShaping;->countSpacesLeft([CII)I
-Landroid/icu/text/ArabicShaping;->countSpacesRight([CII)I
-Landroid/icu/text/ArabicShaping;->countSpaceSub([CIC)I
-Landroid/icu/text/ArabicShaping;->deshapeNormalize([CII)I
-Landroid/icu/text/ArabicShaping;->deShapeUnicode([CIII)I
-Landroid/icu/text/ArabicShaping;->DESHAPE_MODE:I
-Landroid/icu/text/ArabicShaping;->DIGITS_AN2EN:I
-Landroid/icu/text/ArabicShaping;->DIGITS_EN2AN:I
-Landroid/icu/text/ArabicShaping;->DIGITS_EN2AN_INIT_AL:I
-Landroid/icu/text/ArabicShaping;->DIGITS_EN2AN_INIT_LR:I
-Landroid/icu/text/ArabicShaping;->DIGITS_MASK:I
-Landroid/icu/text/ArabicShaping;->DIGITS_NOOP:I
-Landroid/icu/text/ArabicShaping;->DIGIT_TYPE_AN:I
-Landroid/icu/text/ArabicShaping;->DIGIT_TYPE_AN_EXTENDED:I
-Landroid/icu/text/ArabicShaping;->DIGIT_TYPE_MASK:I
-Landroid/icu/text/ArabicShaping;->expandCompositChar([CIIII)I
-Landroid/icu/text/ArabicShaping;->expandCompositCharAtBegin([CIII)Z
-Landroid/icu/text/ArabicShaping;->expandCompositCharAtEnd([CIII)Z
-Landroid/icu/text/ArabicShaping;->expandCompositCharAtNear([CIIIII)Z
-Landroid/icu/text/ArabicShaping;->flipArray([CIII)I
-Landroid/icu/text/ArabicShaping;->getLink(C)I
-Landroid/icu/text/ArabicShaping;->HAMZA06_CHAR:C
-Landroid/icu/text/ArabicShaping;->HAMZAFE_CHAR:C
-Landroid/icu/text/ArabicShaping;->handleGeneratedSpaces([CII)I
-Landroid/icu/text/ArabicShaping;->handleTashkeelWithTatweel([CI)I
-Landroid/icu/text/ArabicShaping;->internalShape([CII[CII)I
-Landroid/icu/text/ArabicShaping;->invertBuffer([CII)V
-Landroid/icu/text/ArabicShaping;->IRRELEVANT:I
-Landroid/icu/text/ArabicShaping;->irrelevantPos:[I
-Landroid/icu/text/ArabicShaping;->isAlefChar(C)Z
-Landroid/icu/text/ArabicShaping;->isIsolatedTashkeelChar(C)I
-Landroid/icu/text/ArabicShaping;->isLamAlefChar(C)Z
-Landroid/icu/text/ArabicShaping;->isLogical:Z
-Landroid/icu/text/ArabicShaping;->isNormalizedLamAlefChar(C)Z
-Landroid/icu/text/ArabicShaping;->isSeenFamilyChar(C)I
-Landroid/icu/text/ArabicShaping;->isTashkeelChar(C)Z
-Landroid/icu/text/ArabicShaping;->isTashkeelCharFE(C)Z
-Landroid/icu/text/ArabicShaping;->isTashkeelOnTatweelChar(C)I
-Landroid/icu/text/ArabicShaping;->LAMALEF_AUTO:I
-Landroid/icu/text/ArabicShaping;->LAMALEF_BEGIN:I
-Landroid/icu/text/ArabicShaping;->LAMALEF_END:I
-Landroid/icu/text/ArabicShaping;->LAMALEF_MASK:I
-Landroid/icu/text/ArabicShaping;->LAMALEF_NEAR:I
-Landroid/icu/text/ArabicShaping;->LAMALEF_RESIZE:I
-Landroid/icu/text/ArabicShaping;->LAMALEF_SPACE_SUB:C
-Landroid/icu/text/ArabicShaping;->LAMTYPE:I
-Landroid/icu/text/ArabicShaping;->LAM_CHAR:C
-Landroid/icu/text/ArabicShaping;->LENGTH_FIXED_SPACES_AT_BEGINNING:I
-Landroid/icu/text/ArabicShaping;->LENGTH_FIXED_SPACES_AT_END:I
-Landroid/icu/text/ArabicShaping;->LENGTH_FIXED_SPACES_NEAR:I
-Landroid/icu/text/ArabicShaping;->LENGTH_GROW_SHRINK:I
-Landroid/icu/text/ArabicShaping;->LENGTH_MASK:I
-Landroid/icu/text/ArabicShaping;->LETTERS_MASK:I
-Landroid/icu/text/ArabicShaping;->LETTERS_NOOP:I
-Landroid/icu/text/ArabicShaping;->LETTERS_SHAPE:I
-Landroid/icu/text/ArabicShaping;->LETTERS_SHAPE_TASHKEEL_ISOLATED:I
-Landroid/icu/text/ArabicShaping;->LETTERS_UNSHAPE:I
-Landroid/icu/text/ArabicShaping;->LINKL:I
-Landroid/icu/text/ArabicShaping;->LINKR:I
-Landroid/icu/text/ArabicShaping;->LINK_MASK:I
-Landroid/icu/text/ArabicShaping;->NEW_TAIL_CHAR:C
-Landroid/icu/text/ArabicShaping;->normalize([CII)I
-Landroid/icu/text/ArabicShaping;->OLD_TAIL_CHAR:C
-Landroid/icu/text/ArabicShaping;->options:I
-Landroid/icu/text/ArabicShaping;->presLink:[I
-Landroid/icu/text/ArabicShaping;->SEEN_MASK:I
-Landroid/icu/text/ArabicShaping;->SEEN_TWOCELL_NEAR:I
-Landroid/icu/text/ArabicShaping;->SHADDA06_CHAR:C
-Landroid/icu/text/ArabicShaping;->SHADDA_CHAR:C
-Landroid/icu/text/ArabicShaping;->SHADDA_TATWEEL_CHAR:C
-Landroid/icu/text/ArabicShaping;->shape([CII)V
-Landroid/icu/text/ArabicShaping;->shape([CII[CII)I
-Landroid/icu/text/ArabicShaping;->shapeTable:[[[I
-Landroid/icu/text/ArabicShaping;->shapeToArabicDigitsWithContext([CIICZ)V
-Landroid/icu/text/ArabicShaping;->shapeUnicode([CIIII)I
-Landroid/icu/text/ArabicShaping;->SHAPE_MODE:I
-Landroid/icu/text/ArabicShaping;->SHAPE_TAIL_NEW_UNICODE:I
-Landroid/icu/text/ArabicShaping;->SHAPE_TAIL_TYPE_MASK:I
-Landroid/icu/text/ArabicShaping;->shiftArray([CIIC)V
-Landroid/icu/text/ArabicShaping;->spacesRelativeToTextBeginEnd:Z
-Landroid/icu/text/ArabicShaping;->SPACES_RELATIVE_TO_TEXT_BEGIN_END:I
-Landroid/icu/text/ArabicShaping;->SPACES_RELATIVE_TO_TEXT_MASK:I
-Landroid/icu/text/ArabicShaping;->SPACE_CHAR:C
-Landroid/icu/text/ArabicShaping;->specialChar(C)I
-Landroid/icu/text/ArabicShaping;->tailChar:C
-Landroid/icu/text/ArabicShaping;->tailFamilyIsolatedFinal:[I
-Landroid/icu/text/ArabicShaping;->tashkeelMedial:[I
-Landroid/icu/text/ArabicShaping;->TASHKEEL_BEGIN:I
-Landroid/icu/text/ArabicShaping;->TASHKEEL_END:I
-Landroid/icu/text/ArabicShaping;->TASHKEEL_MASK:I
-Landroid/icu/text/ArabicShaping;->TASHKEEL_REPLACE_BY_TATWEEL:I
-Landroid/icu/text/ArabicShaping;->TASHKEEL_RESIZE:I
-Landroid/icu/text/ArabicShaping;->TASHKEEL_SPACE_SUB:C
-Landroid/icu/text/ArabicShaping;->TATWEEL_CHAR:C
-Landroid/icu/text/ArabicShaping;->TEXT_DIRECTION_LOGICAL:I
-Landroid/icu/text/ArabicShaping;->TEXT_DIRECTION_MASK:I
-Landroid/icu/text/ArabicShaping;->TEXT_DIRECTION_VISUAL_LTR:I
-Landroid/icu/text/ArabicShaping;->TEXT_DIRECTION_VISUAL_RTL:I
-Landroid/icu/text/ArabicShaping;->yehHamzaToYeh:[C
-Landroid/icu/text/ArabicShaping;->YEHHAMZA_MASK:I
-Landroid/icu/text/ArabicShaping;->YEHHAMZA_TWOCELL_NEAR:I
-Landroid/icu/text/ArabicShaping;->YEH_HAMZAFE_CHAR:C
-Landroid/icu/text/ArabicShaping;->YEH_HAMZA_CHAR:C
-Landroid/icu/text/ArabicShapingException;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/Bidi$BracketData;-><init>()V
-Landroid/icu/text/Bidi$BracketData;->isNumbersSpecial:Z
-Landroid/icu/text/Bidi$BracketData;->isoRunLast:I
-Landroid/icu/text/Bidi$BracketData;->isoRuns:[Landroid/icu/text/Bidi$IsoRun;
-Landroid/icu/text/Bidi$BracketData;->openings:[Landroid/icu/text/Bidi$Opening;
-Landroid/icu/text/Bidi$ImpTabPair;-><init>([[B[[B[S[S)V
-Landroid/icu/text/Bidi$ImpTabPair;->impact:[[S
-Landroid/icu/text/Bidi$ImpTabPair;->imptab:[[[B
-Landroid/icu/text/Bidi$InsertPoints;-><init>()V
-Landroid/icu/text/Bidi$InsertPoints;->confirmed:I
-Landroid/icu/text/Bidi$InsertPoints;->points:[Landroid/icu/text/Bidi$Point;
-Landroid/icu/text/Bidi$InsertPoints;->size:I
-Landroid/icu/text/Bidi$Isolate;-><init>()V
-Landroid/icu/text/Bidi$Isolate;->start1:I
-Landroid/icu/text/Bidi$Isolate;->startON:I
-Landroid/icu/text/Bidi$Isolate;->state:S
-Landroid/icu/text/Bidi$Isolate;->stateImp:S
-Landroid/icu/text/Bidi$IsoRun;-><init>()V
-Landroid/icu/text/Bidi$IsoRun;->contextDir:B
-Landroid/icu/text/Bidi$IsoRun;->contextPos:I
-Landroid/icu/text/Bidi$IsoRun;->lastBase:B
-Landroid/icu/text/Bidi$IsoRun;->lastStrong:B
-Landroid/icu/text/Bidi$IsoRun;->level:B
-Landroid/icu/text/Bidi$IsoRun;->limit:S
-Landroid/icu/text/Bidi$IsoRun;->start:S
-Landroid/icu/text/Bidi$LevState;-><init>()V
-Landroid/icu/text/Bidi$LevState;->impAct:[S
-Landroid/icu/text/Bidi$LevState;->impTab:[[B
-Landroid/icu/text/Bidi$LevState;->lastStrongRTL:I
-Landroid/icu/text/Bidi$LevState;->runLevel:B
-Landroid/icu/text/Bidi$LevState;->runStart:I
-Landroid/icu/text/Bidi$LevState;->startL2EN:I
-Landroid/icu/text/Bidi$LevState;->startON:I
-Landroid/icu/text/Bidi$LevState;->state:S
-Landroid/icu/text/Bidi$Opening;-><init>()V
-Landroid/icu/text/Bidi$Opening;->contextDir:B
-Landroid/icu/text/Bidi$Opening;->contextPos:I
-Landroid/icu/text/Bidi$Opening;->flags:S
-Landroid/icu/text/Bidi$Opening;->match:I
-Landroid/icu/text/Bidi$Opening;->position:I
-Landroid/icu/text/Bidi$Point;-><init>()V
-Landroid/icu/text/Bidi$Point;->flag:I
-Landroid/icu/text/Bidi$Point;->pos:I
-Landroid/icu/text/Bidi;-><init>()V
-Landroid/icu/text/Bidi;-><init>(II)V
-Landroid/icu/text/Bidi;-><init>(Ljava/lang/String;I)V
-Landroid/icu/text/Bidi;-><init>(Ljava/text/AttributedCharacterIterator;)V
-Landroid/icu/text/Bidi;-><init>([CI[BIII)V
-Landroid/icu/text/Bidi;->addPoint(II)V
-Landroid/icu/text/Bidi;->adjustWSLevels()V
-Landroid/icu/text/Bidi;->AL:B
-Landroid/icu/text/Bidi;->AN:B
-Landroid/icu/text/Bidi;->B:B
-Landroid/icu/text/Bidi;->baseIsLeftToRight()Z
-Landroid/icu/text/Bidi;->bdp:Landroid/icu/impl/UBiDiProps;
-Landroid/icu/text/Bidi;->Bidi_Abs(I)I
-Landroid/icu/text/Bidi;->Bidi_Min(II)I
-Landroid/icu/text/Bidi;->BN:B
-Landroid/icu/text/Bidi;->bracketAddOpening(Landroid/icu/text/Bidi$BracketData;CI)V
-Landroid/icu/text/Bidi;->bracketInit(Landroid/icu/text/Bidi$BracketData;)V
-Landroid/icu/text/Bidi;->bracketProcessB(Landroid/icu/text/Bidi$BracketData;B)V
-Landroid/icu/text/Bidi;->bracketProcessBoundary(Landroid/icu/text/Bidi$BracketData;IBB)V
-Landroid/icu/text/Bidi;->bracketProcessChar(Landroid/icu/text/Bidi$BracketData;I)V
-Landroid/icu/text/Bidi;->bracketProcessClosing(Landroid/icu/text/Bidi$BracketData;II)B
-Landroid/icu/text/Bidi;->bracketProcessLRI_RLI(Landroid/icu/text/Bidi$BracketData;B)V
-Landroid/icu/text/Bidi;->bracketProcessPDI(Landroid/icu/text/Bidi$BracketData;)V
-Landroid/icu/text/Bidi;->checkExplicitLevels()B
-Landroid/icu/text/Bidi;->checkParaCount()V
-Landroid/icu/text/Bidi;->CLASS_DEFAULT:I
-Landroid/icu/text/Bidi;->controlCount:I
-Landroid/icu/text/Bidi;->countParagraphs()I
-Landroid/icu/text/Bidi;->countRuns()I
-Landroid/icu/text/Bidi;->CR:C
-Landroid/icu/text/Bidi;->createLineBidi(II)Landroid/icu/text/Bidi;
-Landroid/icu/text/Bidi;->CS:B
-Landroid/icu/text/Bidi;->customClassifier:Landroid/icu/text/BidiClassifier;
-Landroid/icu/text/Bidi;->defaultParaLevel:B
-Landroid/icu/text/Bidi;->direction:B
-Landroid/icu/text/Bidi;->directionFromFlags()B
-Landroid/icu/text/Bidi;->DIRECTION_DEFAULT_LEFT_TO_RIGHT:I
-Landroid/icu/text/Bidi;->DIRECTION_DEFAULT_RIGHT_TO_LEFT:I
-Landroid/icu/text/Bidi;->DIRECTION_LEFT_TO_RIGHT:I
-Landroid/icu/text/Bidi;->DIRECTION_RIGHT_TO_LEFT:I
-Landroid/icu/text/Bidi;->DirFromStrong(B)B
-Landroid/icu/text/Bidi;->DirPropFlag(B)I
-Landroid/icu/text/Bidi;->DirPropFlagE(B)I
-Landroid/icu/text/Bidi;->DirPropFlagE:[I
-Landroid/icu/text/Bidi;->DirPropFlagLR(B)I
-Landroid/icu/text/Bidi;->DirPropFlagLR:[I
-Landroid/icu/text/Bidi;->DirPropFlagMultiRuns:I
-Landroid/icu/text/Bidi;->DirPropFlagO(B)I
-Landroid/icu/text/Bidi;->DirPropFlagO:[I
-Landroid/icu/text/Bidi;->dirProps:[B
-Landroid/icu/text/Bidi;->dirPropsMemory:[B
-Landroid/icu/text/Bidi;->DO_MIRRORING:S
-Landroid/icu/text/Bidi;->EN:B
-Landroid/icu/text/Bidi;->ENL:B
-Landroid/icu/text/Bidi;->ENR:B
-Landroid/icu/text/Bidi;->epilogue:Ljava/lang/String;
-Landroid/icu/text/Bidi;->ES:B
-Landroid/icu/text/Bidi;->ET:B
-Landroid/icu/text/Bidi;->FIRSTALLOC:I
-Landroid/icu/text/Bidi;->firstL_R_AL()B
-Landroid/icu/text/Bidi;->firstL_R_AL_EN_AN()B
-Landroid/icu/text/Bidi;->fixN0c(Landroid/icu/text/Bidi$BracketData;IIB)V
-Landroid/icu/text/Bidi;->flags:I
-Landroid/icu/text/Bidi;->FOUND_L:B
-Landroid/icu/text/Bidi;->FOUND_R:B
-Landroid/icu/text/Bidi;->FSI:B
-Landroid/icu/text/Bidi;->GetAction(B)S
-Landroid/icu/text/Bidi;->GetActionProps(S)S
-Landroid/icu/text/Bidi;->getBaseDirection(Ljava/lang/CharSequence;)B
-Landroid/icu/text/Bidi;->getBaseLevel()I
-Landroid/icu/text/Bidi;->getCustomClassifier()Landroid/icu/text/BidiClassifier;
-Landroid/icu/text/Bidi;->getCustomizedClass(I)I
-Landroid/icu/text/Bidi;->getDirection()B
-Landroid/icu/text/Bidi;->getDirProps()V
-Landroid/icu/text/Bidi;->getDirPropsMemory(I)V
-Landroid/icu/text/Bidi;->getDirPropsMemory(ZI)V
-Landroid/icu/text/Bidi;->getInitialDirPropsMemory(I)V
-Landroid/icu/text/Bidi;->getInitialLevelsMemory(I)V
-Landroid/icu/text/Bidi;->getInitialRunsMemory(I)V
-Landroid/icu/text/Bidi;->getLength()I
-Landroid/icu/text/Bidi;->getLevelAt(I)B
-Landroid/icu/text/Bidi;->getLevels()[B
-Landroid/icu/text/Bidi;->getLevelsMemory(I)V
-Landroid/icu/text/Bidi;->getLevelsMemory(ZI)V
-Landroid/icu/text/Bidi;->getLogicalIndex(I)I
-Landroid/icu/text/Bidi;->getLogicalMap()[I
-Landroid/icu/text/Bidi;->getLogicalRun(I)Landroid/icu/text/BidiRun;
-Landroid/icu/text/Bidi;->getLogicalToVisualRunsMap()V
-Landroid/icu/text/Bidi;->GetLRFromLevel(B)B
-Landroid/icu/text/Bidi;->getMemory(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;ZI)Ljava/lang/Object;
-Landroid/icu/text/Bidi;->getParagraph(I)Landroid/icu/text/BidiRun;
-Landroid/icu/text/Bidi;->getParagraphByIndex(I)Landroid/icu/text/BidiRun;
-Landroid/icu/text/Bidi;->getParagraphIndex(I)I
-Landroid/icu/text/Bidi;->getParaLevel()B
-Landroid/icu/text/Bidi;->GetParaLevelAt(I)B
-Landroid/icu/text/Bidi;->getProcessedLength()I
-Landroid/icu/text/Bidi;->getReorderingMode()I
-Landroid/icu/text/Bidi;->getReorderingOptions()I
-Landroid/icu/text/Bidi;->getResultLength()I
-Landroid/icu/text/Bidi;->getRunCount()I
-Landroid/icu/text/Bidi;->getRunLevel(I)I
-Landroid/icu/text/Bidi;->getRunLimit(I)I
-Landroid/icu/text/Bidi;->getRunsMemory(I)V
-Landroid/icu/text/Bidi;->getRunsMemory(ZI)V
-Landroid/icu/text/Bidi;->getRunStart(I)I
-Landroid/icu/text/Bidi;->GetState(B)S
-Landroid/icu/text/Bidi;->GetStateProps(S)S
-Landroid/icu/text/Bidi;->getText()[C
-Landroid/icu/text/Bidi;->getTextAsString()Ljava/lang/String;
-Landroid/icu/text/Bidi;->getVisualIndex(I)I
-Landroid/icu/text/Bidi;->getVisualMap()[I
-Landroid/icu/text/Bidi;->getVisualRun(I)Landroid/icu/text/BidiRun;
-Landroid/icu/text/Bidi;->groupProp:[S
-Landroid/icu/text/Bidi;->impAct0:[S
-Landroid/icu/text/Bidi;->impAct1:[S
-Landroid/icu/text/Bidi;->impAct2:[S
-Landroid/icu/text/Bidi;->impAct3:[S
-Landroid/icu/text/Bidi;->IMPTABLEVELS_COLUMNS:I
-Landroid/icu/text/Bidi;->IMPTABLEVELS_RES:I
-Landroid/icu/text/Bidi;->impTabL_DEFAULT:[[B
-Landroid/icu/text/Bidi;->impTabL_GROUP_NUMBERS_WITH_R:[[B
-Landroid/icu/text/Bidi;->impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS:[[B
-Landroid/icu/text/Bidi;->impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS:[[B
-Landroid/icu/text/Bidi;->impTabL_INVERSE_NUMBERS_AS_L:[[B
-Landroid/icu/text/Bidi;->impTabL_NUMBERS_SPECIAL:[[B
-Landroid/icu/text/Bidi;->impTabPair:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTabProps:[[S
-Landroid/icu/text/Bidi;->IMPTABPROPS_COLUMNS:I
-Landroid/icu/text/Bidi;->IMPTABPROPS_RES:I
-Landroid/icu/text/Bidi;->impTabR_DEFAULT:[[B
-Landroid/icu/text/Bidi;->impTabR_GROUP_NUMBERS_WITH_R:[[B
-Landroid/icu/text/Bidi;->impTabR_INVERSE_LIKE_DIRECT:[[B
-Landroid/icu/text/Bidi;->impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS:[[B
-Landroid/icu/text/Bidi;->impTabR_INVERSE_NUMBERS_AS_L:[[B
-Landroid/icu/text/Bidi;->impTab_DEFAULT:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTab_GROUP_NUMBERS_WITH_R:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTab_INVERSE_FOR_NUMBERS_SPECIAL:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTab_INVERSE_LIKE_DIRECT:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTab_INVERSE_LIKE_DIRECT_WITH_MARKS:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTab_INVERSE_NUMBERS_AS_L:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->impTab_NUMBERS_SPECIAL:Landroid/icu/text/Bidi$ImpTabPair;
-Landroid/icu/text/Bidi;->insertPoints:Landroid/icu/text/Bidi$InsertPoints;
-Landroid/icu/text/Bidi;->INSERT_LRM_FOR_NUMERIC:S
-Landroid/icu/text/Bidi;->invertMap([I)[I
-Landroid/icu/text/Bidi;->IsBidiControlChar(I)Z
-Landroid/icu/text/Bidi;->IsDefaultLevel(B)Z
-Landroid/icu/text/Bidi;->isGoodLogicalToVisualRunsMap:Z
-Landroid/icu/text/Bidi;->isInverse()Z
-Landroid/icu/text/Bidi;->isInverse:Z
-Landroid/icu/text/Bidi;->isLeftToRight()Z
-Landroid/icu/text/Bidi;->isMixed()Z
-Landroid/icu/text/Bidi;->ISOLATE:I
-Landroid/icu/text/Bidi;->isolateCount:I
-Landroid/icu/text/Bidi;->isolates:[Landroid/icu/text/Bidi$Isolate;
-Landroid/icu/text/Bidi;->isOrderParagraphsLTR()Z
-Landroid/icu/text/Bidi;->isRightToLeft()Z
-Landroid/icu/text/Bidi;->KEEP_BASE_COMBINING:S
-Landroid/icu/text/Bidi;->L:B
-Landroid/icu/text/Bidi;->lastArabicPos:I
-Landroid/icu/text/Bidi;->lastL_R_AL()B
-Landroid/icu/text/Bidi;->length:I
-Landroid/icu/text/Bidi;->levels:[B
-Landroid/icu/text/Bidi;->levelsMemory:[B
-Landroid/icu/text/Bidi;->LEVEL_DEFAULT_LTR:B
-Landroid/icu/text/Bidi;->LEVEL_DEFAULT_RTL:B
-Landroid/icu/text/Bidi;->LEVEL_OVERRIDE:B
-Landroid/icu/text/Bidi;->LF:C
-Landroid/icu/text/Bidi;->logicalToVisualRunsMap:[I
-Landroid/icu/text/Bidi;->LOOKING_FOR_PDI:I
-Landroid/icu/text/Bidi;->LRE:B
-Landroid/icu/text/Bidi;->LRI:B
-Landroid/icu/text/Bidi;->LRM_AFTER:I
-Landroid/icu/text/Bidi;->LRM_BEFORE:I
-Landroid/icu/text/Bidi;->LRO:B
-Landroid/icu/text/Bidi;->LTR:B
-Landroid/icu/text/Bidi;->MAP_NOWHERE:I
-Landroid/icu/text/Bidi;->MASK_BN_EXPLICIT:I
-Landroid/icu/text/Bidi;->MASK_B_S:I
-Landroid/icu/text/Bidi;->MASK_EMBEDDING:I
-Landroid/icu/text/Bidi;->MASK_EXPLICIT:I
-Landroid/icu/text/Bidi;->MASK_ISO:I
-Landroid/icu/text/Bidi;->MASK_LTR:I
-Landroid/icu/text/Bidi;->MASK_POSSIBLE_N:I
-Landroid/icu/text/Bidi;->MASK_RTL:I
-Landroid/icu/text/Bidi;->MASK_R_AL:I
-Landroid/icu/text/Bidi;->MASK_STRONG_EN_AN:I
-Landroid/icu/text/Bidi;->MASK_WS:I
-Landroid/icu/text/Bidi;->MAX_EXPLICIT_LEVEL:B
-Landroid/icu/text/Bidi;->mayAllocateRuns:Z
-Landroid/icu/text/Bidi;->mayAllocateText:Z
-Landroid/icu/text/Bidi;->MIXED:B
-Landroid/icu/text/Bidi;->NEUTRAL:B
-Landroid/icu/text/Bidi;->NoOverride(B)B
-Landroid/icu/text/Bidi;->NOT_SEEKING_STRONG:I
-Landroid/icu/text/Bidi;->NSM:B
-Landroid/icu/text/Bidi;->ON:B
-Landroid/icu/text/Bidi;->OPTION_DEFAULT:I
-Landroid/icu/text/Bidi;->OPTION_INSERT_MARKS:I
-Landroid/icu/text/Bidi;->OPTION_REMOVE_CONTROLS:I
-Landroid/icu/text/Bidi;->OPTION_STREAMING:I
-Landroid/icu/text/Bidi;->orderParagraphsLTR(Z)V
-Landroid/icu/text/Bidi;->orderParagraphsLTR:Z
-Landroid/icu/text/Bidi;->originalLength:I
-Landroid/icu/text/Bidi;->OUTPUT_REVERSE:S
-Landroid/icu/text/Bidi;->paraBidi:Landroid/icu/text/Bidi;
-Landroid/icu/text/Bidi;->paraCount:I
-Landroid/icu/text/Bidi;->paraLevel:B
-Landroid/icu/text/Bidi;->paras_level:[B
-Landroid/icu/text/Bidi;->paras_limit:[I
-Landroid/icu/text/Bidi;->PDF:B
-Landroid/icu/text/Bidi;->PDI:B
-Landroid/icu/text/Bidi;->processPropertySeq(Landroid/icu/text/Bidi$LevState;SII)V
-Landroid/icu/text/Bidi;->prologue:Ljava/lang/String;
-Landroid/icu/text/Bidi;->R:B
-Landroid/icu/text/Bidi;->REMOVE_BIDI_CONTROLS:S
-Landroid/icu/text/Bidi;->reorderingMode:I
-Landroid/icu/text/Bidi;->reorderingOptions:I
-Landroid/icu/text/Bidi;->reorderLogical([B)[I
-Landroid/icu/text/Bidi;->reorderVisual([B)[I
-Landroid/icu/text/Bidi;->reorderVisually([BI[Ljava/lang/Object;II)V
-Landroid/icu/text/Bidi;->REORDER_COUNT:S
-Landroid/icu/text/Bidi;->REORDER_DEFAULT:S
-Landroid/icu/text/Bidi;->REORDER_GROUP_NUMBERS_WITH_R:S
-Landroid/icu/text/Bidi;->REORDER_INVERSE_FOR_NUMBERS_SPECIAL:S
-Landroid/icu/text/Bidi;->REORDER_INVERSE_LIKE_DIRECT:S
-Landroid/icu/text/Bidi;->REORDER_INVERSE_NUMBERS_AS_L:S
-Landroid/icu/text/Bidi;->REORDER_LAST_LOGICAL_TO_VISUAL:S
-Landroid/icu/text/Bidi;->REORDER_NUMBERS_SPECIAL:S
-Landroid/icu/text/Bidi;->REORDER_RUNS_ONLY:S
-Landroid/icu/text/Bidi;->requiresBidi([CII)Z
-Landroid/icu/text/Bidi;->resolveExplicitLevels()B
-Landroid/icu/text/Bidi;->resolveImplicitLevels(IISS)V
-Landroid/icu/text/Bidi;->resultLength:I
-Landroid/icu/text/Bidi;->RLE:B
-Landroid/icu/text/Bidi;->RLI:B
-Landroid/icu/text/Bidi;->RLM_AFTER:I
-Landroid/icu/text/Bidi;->RLM_BEFORE:I
-Landroid/icu/text/Bidi;->RLO:B
-Landroid/icu/text/Bidi;->RTL:B
-Landroid/icu/text/Bidi;->runCount:I
-Landroid/icu/text/Bidi;->runs:[Landroid/icu/text/BidiRun;
-Landroid/icu/text/Bidi;->runsMemory:[Landroid/icu/text/BidiRun;
-Landroid/icu/text/Bidi;->S:B
-Landroid/icu/text/Bidi;->SEEKING_STRONG_FOR_FSI:I
-Landroid/icu/text/Bidi;->SEEKING_STRONG_FOR_PARA:I
-Landroid/icu/text/Bidi;->setContext(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/Bidi;->setCustomClassifier(Landroid/icu/text/BidiClassifier;)V
-Landroid/icu/text/Bidi;->setInverse(Z)V
-Landroid/icu/text/Bidi;->setLevelsOutsideIsolates(IIB)V
-Landroid/icu/text/Bidi;->setLine(II)Landroid/icu/text/Bidi;
-Landroid/icu/text/Bidi;->setPara(Ljava/lang/String;B[B)V
-Landroid/icu/text/Bidi;->setPara(Ljava/text/AttributedCharacterIterator;)V
-Landroid/icu/text/Bidi;->setPara([CB[B)V
-Landroid/icu/text/Bidi;->setParaRunsOnly([CB)V
-Landroid/icu/text/Bidi;->setParaSuccess()V
-Landroid/icu/text/Bidi;->setReorderingMode(I)V
-Landroid/icu/text/Bidi;->setReorderingOptions(I)V
-Landroid/icu/text/Bidi;->simpleRuns:[Landroid/icu/text/BidiRun;
-Landroid/icu/text/Bidi;->SIMPLE_OPENINGS_COUNT:I
-Landroid/icu/text/Bidi;->SIMPLE_PARAS_COUNT:I
-Landroid/icu/text/Bidi;->testDirPropFlagAt(II)Z
-Landroid/icu/text/Bidi;->text:[C
-Landroid/icu/text/Bidi;->trailingWSStart:I
-Landroid/icu/text/Bidi;->verifyRange(III)V
-Landroid/icu/text/Bidi;->verifyValidPara()V
-Landroid/icu/text/Bidi;->verifyValidParaOrLine()V
-Landroid/icu/text/Bidi;->writeReordered(I)Ljava/lang/String;
-Landroid/icu/text/Bidi;->writeReverse(Ljava/lang/String;I)Ljava/lang/String;
-Landroid/icu/text/Bidi;->WS:B
-Landroid/icu/text/Bidi;->_AN:S
-Landroid/icu/text/Bidi;->_B:S
-Landroid/icu/text/Bidi;->_EN:S
-Landroid/icu/text/Bidi;->_L:S
-Landroid/icu/text/Bidi;->_ON:S
-Landroid/icu/text/Bidi;->_R:S
-Landroid/icu/text/Bidi;->_S:S
-Landroid/icu/text/BidiClassifier;-><init>(Ljava/lang/Object;)V
-Landroid/icu/text/BidiClassifier;->classify(I)I
-Landroid/icu/text/BidiClassifier;->context:Ljava/lang/Object;
-Landroid/icu/text/BidiClassifier;->getContext()Ljava/lang/Object;
-Landroid/icu/text/BidiClassifier;->setContext(Ljava/lang/Object;)V
-Landroid/icu/text/BidiRun;-><init>()V
-Landroid/icu/text/BidiRun;-><init>(IIB)V
-Landroid/icu/text/BidiRun;->copyFrom(Landroid/icu/text/BidiRun;)V
-Landroid/icu/text/BidiRun;->getDirection()B
-Landroid/icu/text/BidiRun;->getEmbeddingLevel()B
-Landroid/icu/text/BidiRun;->getLength()I
-Landroid/icu/text/BidiRun;->getLimit()I
-Landroid/icu/text/BidiRun;->getStart()I
-Landroid/icu/text/BidiRun;->insertRemove:I
-Landroid/icu/text/BidiRun;->isEvenRun()Z
-Landroid/icu/text/BidiRun;->isOddRun()Z
-Landroid/icu/text/BidiRun;->level:B
-Landroid/icu/text/BidiRun;->limit:I
-Landroid/icu/text/BidiRun;->start:I
-Landroid/icu/text/BidiTransform$Mirroring;->OFF:Landroid/icu/text/BidiTransform$Mirroring;
-Landroid/icu/text/BidiTransform$Mirroring;->ON:Landroid/icu/text/BidiTransform$Mirroring;
-Landroid/icu/text/BidiTransform$Mirroring;->valueOf(Ljava/lang/String;)Landroid/icu/text/BidiTransform$Mirroring;
-Landroid/icu/text/BidiTransform$Mirroring;->values()[Landroid/icu/text/BidiTransform$Mirroring;
-Landroid/icu/text/BidiTransform$Order;->LOGICAL:Landroid/icu/text/BidiTransform$Order;
-Landroid/icu/text/BidiTransform$Order;->valueOf(Ljava/lang/String;)Landroid/icu/text/BidiTransform$Order;
-Landroid/icu/text/BidiTransform$Order;->values()[Landroid/icu/text/BidiTransform$Order;
-Landroid/icu/text/BidiTransform$Order;->VISUAL:Landroid/icu/text/BidiTransform$Order;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->doTransform(Landroid/icu/text/BidiTransform;)V
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_LTR_TO_LOG_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_LTR_TO_LOG_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_LTR_TO_VIS_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_LTR_TO_VIS_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_RTL_TO_LOG_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_RTL_TO_LOG_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_RTL_TO_VIS_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->LOG_RTL_TO_VIS_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->matches(BLandroid/icu/text/BidiTransform$Order;BLandroid/icu/text/BidiTransform$Order;)Z
-Landroid/icu/text/BidiTransform$ReorderingScheme;->valueOf(Ljava/lang/String;)Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->values()[Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_LTR_TO_LOG_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_LTR_TO_LOG_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_LTR_TO_VIS_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_LTR_TO_VIS_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_RTL_TO_LOG_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_RTL_TO_LOG_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_RTL_TO_VIS_LTR:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform$ReorderingScheme;->VIS_RTL_TO_VIS_RTL:Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform;-><init>()V
-Landroid/icu/text/BidiTransform;->bidi:Landroid/icu/text/Bidi;
-Landroid/icu/text/BidiTransform;->findMatchingScheme(BLandroid/icu/text/BidiTransform$Order;BLandroid/icu/text/BidiTransform$Order;)Landroid/icu/text/BidiTransform$ReorderingScheme;
-Landroid/icu/text/BidiTransform;->IsLogical(Landroid/icu/text/BidiTransform$Order;)Z
-Landroid/icu/text/BidiTransform;->IsLTR(B)Z
-Landroid/icu/text/BidiTransform;->IsRTL(B)Z
-Landroid/icu/text/BidiTransform;->IsVisual(Landroid/icu/text/BidiTransform$Order;)Z
-Landroid/icu/text/BidiTransform;->mirror()V
-Landroid/icu/text/BidiTransform;->reorder()V
-Landroid/icu/text/BidiTransform;->reorderingOptions:I
-Landroid/icu/text/BidiTransform;->resolve(BI)V
-Landroid/icu/text/BidiTransform;->resolveBaseDirection([B)V
-Landroid/icu/text/BidiTransform;->reverse()V
-Landroid/icu/text/BidiTransform;->shapeArabic(I)V
-Landroid/icu/text/BidiTransform;->shapeArabic(II)V
-Landroid/icu/text/BidiTransform;->shapingOptions:I
-Landroid/icu/text/BidiTransform;->text:Ljava/lang/String;
-Landroid/icu/text/BidiTransform;->transform(Ljava/lang/CharSequence;BLandroid/icu/text/BidiTransform$Order;BLandroid/icu/text/BidiTransform$Order;Landroid/icu/text/BidiTransform$Mirroring;I)Ljava/lang/String;
-Landroid/icu/text/BreakIterator$BreakIteratorCache;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/BreakIterator;)V
-Landroid/icu/text/BreakIterator$BreakIteratorCache;->createBreakInstance()Landroid/icu/text/BreakIterator;
-Landroid/icu/text/BreakIterator$BreakIteratorCache;->getLocale()Landroid/icu/util/ULocale;
-Landroid/icu/text/BreakIterator$BreakIteratorCache;->iter:Landroid/icu/text/BreakIterator;
-Landroid/icu/text/BreakIterator$BreakIteratorCache;->where:Landroid/icu/util/ULocale;
-Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;-><init>()V
-Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;->createBreakIterator(Landroid/icu/util/ULocale;I)Landroid/icu/text/BreakIterator;
-Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;->getAvailableLocales()[Ljava/util/Locale;
-Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;->registerInstance(Landroid/icu/text/BreakIterator;Landroid/icu/util/ULocale;I)Ljava/lang/Object;
-Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/text/BreakIterator;->actualLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/BreakIterator;->DEBUG:Z
-Landroid/icu/text/BreakIterator;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/BreakIterator;->getBreakInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/BreakIterator;
-Landroid/icu/text/BreakIterator;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-Landroid/icu/text/BreakIterator;->getShim()Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;
-Landroid/icu/text/BreakIterator;->iterCache:[Landroid/icu/impl/CacheValue;
-Landroid/icu/text/BreakIterator;->KIND_COUNT:I
-Landroid/icu/text/BreakIterator;->registerInstance(Landroid/icu/text/BreakIterator;Landroid/icu/util/ULocale;I)Ljava/lang/Object;
-Landroid/icu/text/BreakIterator;->registerInstance(Landroid/icu/text/BreakIterator;Ljava/util/Locale;I)Ljava/lang/Object;
-Landroid/icu/text/BreakIterator;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/BreakIterator;->setText(Ljava/lang/CharSequence;)V
-Landroid/icu/text/BreakIterator;->shim:Landroid/icu/text/BreakIterator$BreakIteratorServiceShim;
-Landroid/icu/text/BreakIterator;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/text/BreakIterator;->validLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/CanonicalIterator;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/CanonicalIterator;->buffer:Ljava/lang/StringBuilder;
-Landroid/icu/text/CanonicalIterator;->current:[I
-Landroid/icu/text/CanonicalIterator;->done:Z
-Landroid/icu/text/CanonicalIterator;->extract(ILjava/lang/String;ILjava/lang/StringBuffer;)Ljava/util/Set;
-Landroid/icu/text/CanonicalIterator;->getEquivalents(Ljava/lang/String;)[Ljava/lang/String;
-Landroid/icu/text/CanonicalIterator;->getEquivalents2(Ljava/lang/String;)Ljava/util/Set;
-Landroid/icu/text/CanonicalIterator;->getSource()Ljava/lang/String;
-Landroid/icu/text/CanonicalIterator;->next()Ljava/lang/String;
-Landroid/icu/text/CanonicalIterator;->nfcImpl:Landroid/icu/impl/Normalizer2Impl;
-Landroid/icu/text/CanonicalIterator;->nfd:Landroid/icu/text/Normalizer2;
-Landroid/icu/text/CanonicalIterator;->permute(Ljava/lang/String;ZLjava/util/Set;)V
-Landroid/icu/text/CanonicalIterator;->pieces:[[Ljava/lang/String;
-Landroid/icu/text/CanonicalIterator;->PROGRESS:Z
-Landroid/icu/text/CanonicalIterator;->reset()V
-Landroid/icu/text/CanonicalIterator;->setSource(Ljava/lang/String;)V
-Landroid/icu/text/CanonicalIterator;->SET_WITH_NULL_STRING:Ljava/util/Set;
-Landroid/icu/text/CanonicalIterator;->SKIP_ZEROS:Z
-Landroid/icu/text/CanonicalIterator;->source:Ljava/lang/String;
-Landroid/icu/text/CaseMap$Fold;-><init>(I)V
-Landroid/icu/text/CaseMap$Fold;->apply(Ljava/lang/CharSequence;)Ljava/lang/String;
-Landroid/icu/text/CaseMap$Fold;->apply(Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;
-Landroid/icu/text/CaseMap$Fold;->DEFAULT:Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap$Fold;->omitUnchangedText()Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap$Fold;->OMIT_UNCHANGED:Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap$Fold;->turkic()Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap$Fold;->TURKIC:Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap$Fold;->TURKIC_OMIT_UNCHANGED:Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap$Lower;-><init>(I)V
-Landroid/icu/text/CaseMap$Lower;->apply(Ljava/util/Locale;Ljava/lang/CharSequence;)Ljava/lang/String;
-Landroid/icu/text/CaseMap$Lower;->apply(Ljava/util/Locale;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;
-Landroid/icu/text/CaseMap$Lower;->DEFAULT:Landroid/icu/text/CaseMap$Lower;
-Landroid/icu/text/CaseMap$Lower;->omitUnchangedText()Landroid/icu/text/CaseMap$Lower;
-Landroid/icu/text/CaseMap$Lower;->OMIT_UNCHANGED:Landroid/icu/text/CaseMap$Lower;
-Landroid/icu/text/CaseMap$Title;-><init>(I)V
-Landroid/icu/text/CaseMap$Title;->adjustToCased()Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Title;->apply(Ljava/util/Locale;Landroid/icu/text/BreakIterator;Ljava/lang/CharSequence;)Ljava/lang/String;
-Landroid/icu/text/CaseMap$Title;->apply(Ljava/util/Locale;Landroid/icu/text/BreakIterator;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;
-Landroid/icu/text/CaseMap$Title;->DEFAULT:Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Title;->noBreakAdjustment()Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Title;->noLowercase()Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Title;->omitUnchangedText()Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Title;->OMIT_UNCHANGED:Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Title;->sentences()Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Title;->wholeString()Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap$Upper;-><init>(I)V
-Landroid/icu/text/CaseMap$Upper;->apply(Ljava/util/Locale;Ljava/lang/CharSequence;)Ljava/lang/String;
-Landroid/icu/text/CaseMap$Upper;->apply(Ljava/util/Locale;Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable;
-Landroid/icu/text/CaseMap$Upper;->DEFAULT:Landroid/icu/text/CaseMap$Upper;
-Landroid/icu/text/CaseMap$Upper;->omitUnchangedText()Landroid/icu/text/CaseMap$Upper;
-Landroid/icu/text/CaseMap$Upper;->OMIT_UNCHANGED:Landroid/icu/text/CaseMap$Upper;
-Landroid/icu/text/CaseMap;-><init>(I)V
-Landroid/icu/text/CaseMap;->fold()Landroid/icu/text/CaseMap$Fold;
-Landroid/icu/text/CaseMap;->getCaseLocale(Ljava/util/Locale;)I
-Landroid/icu/text/CaseMap;->internalOptions:I
-Landroid/icu/text/CaseMap;->omitUnchangedText()Landroid/icu/text/CaseMap;
-Landroid/icu/text/CaseMap;->toLower()Landroid/icu/text/CaseMap$Lower;
-Landroid/icu/text/CaseMap;->toTitle()Landroid/icu/text/CaseMap$Title;
-Landroid/icu/text/CaseMap;->toUpper()Landroid/icu/text/CaseMap$Upper;
-Landroid/icu/text/CharsetDetector$CSRecognizerInfo;-><init>(Landroid/icu/text/CharsetRecognizer;Z)V
-Landroid/icu/text/CharsetDetector$CSRecognizerInfo;->isDefaultEnabled:Z
-Landroid/icu/text/CharsetDetector$CSRecognizerInfo;->recognizer:Landroid/icu/text/CharsetRecognizer;
-Landroid/icu/text/CharsetDetector;-><init>()V
-Landroid/icu/text/CharsetDetector;->ALL_CS_RECOGNIZERS:Ljava/util/List;
-Landroid/icu/text/CharsetDetector;->detect()Landroid/icu/text/CharsetMatch;
-Landroid/icu/text/CharsetDetector;->detectAll()[Landroid/icu/text/CharsetMatch;
-Landroid/icu/text/CharsetDetector;->enableInputFilter(Z)Z
-Landroid/icu/text/CharsetDetector;->fByteStats:[S
-Landroid/icu/text/CharsetDetector;->fC1Bytes:Z
-Landroid/icu/text/CharsetDetector;->fDeclaredEncoding:Ljava/lang/String;
-Landroid/icu/text/CharsetDetector;->fEnabledRecognizers:[Z
-Landroid/icu/text/CharsetDetector;->fInputBytes:[B
-Landroid/icu/text/CharsetDetector;->fInputLen:I
-Landroid/icu/text/CharsetDetector;->fInputStream:Ljava/io/InputStream;
-Landroid/icu/text/CharsetDetector;->fRawInput:[B
-Landroid/icu/text/CharsetDetector;->fRawLength:I
-Landroid/icu/text/CharsetDetector;->fStripTags:Z
-Landroid/icu/text/CharsetDetector;->getAllDetectableCharsets()[Ljava/lang/String;
-Landroid/icu/text/CharsetDetector;->getDetectableCharsets()[Ljava/lang/String;
-Landroid/icu/text/CharsetDetector;->getReader(Ljava/io/InputStream;Ljava/lang/String;)Ljava/io/Reader;
-Landroid/icu/text/CharsetDetector;->getString([BLjava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/CharsetDetector;->inputFilterEnabled()Z
-Landroid/icu/text/CharsetDetector;->kBufSize:I
-Landroid/icu/text/CharsetDetector;->MungeInput()V
-Landroid/icu/text/CharsetDetector;->setDeclaredEncoding(Ljava/lang/String;)Landroid/icu/text/CharsetDetector;
-Landroid/icu/text/CharsetDetector;->setDetectableCharset(Ljava/lang/String;Z)Landroid/icu/text/CharsetDetector;
-Landroid/icu/text/CharsetDetector;->setText(Ljava/io/InputStream;)Landroid/icu/text/CharsetDetector;
-Landroid/icu/text/CharsetDetector;->setText([B)Landroid/icu/text/CharsetDetector;
-Landroid/icu/text/CharsetMatch;-><init>(Landroid/icu/text/CharsetDetector;Landroid/icu/text/CharsetRecognizer;I)V
-Landroid/icu/text/CharsetMatch;-><init>(Landroid/icu/text/CharsetDetector;Landroid/icu/text/CharsetRecognizer;ILjava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/CharsetMatch;->compareTo(Landroid/icu/text/CharsetMatch;)I
-Landroid/icu/text/CharsetMatch;->fCharsetName:Ljava/lang/String;
-Landroid/icu/text/CharsetMatch;->fConfidence:I
-Landroid/icu/text/CharsetMatch;->fInputStream:Ljava/io/InputStream;
-Landroid/icu/text/CharsetMatch;->fLang:Ljava/lang/String;
-Landroid/icu/text/CharsetMatch;->fRawInput:[B
-Landroid/icu/text/CharsetMatch;->fRawLength:I
-Landroid/icu/text/CharsetMatch;->getConfidence()I
-Landroid/icu/text/CharsetMatch;->getLanguage()Ljava/lang/String;
-Landroid/icu/text/CharsetMatch;->getName()Ljava/lang/String;
-Landroid/icu/text/CharsetMatch;->getReader()Ljava/io/Reader;
-Landroid/icu/text/CharsetMatch;->getString()Ljava/lang/String;
-Landroid/icu/text/CharsetMatch;->getString(I)Ljava/lang/String;
-Landroid/icu/text/CharsetRecognizer;-><init>()V
-Landroid/icu/text/CharsetRecognizer;->getLanguage()Ljava/lang/String;
-Landroid/icu/text/CharsetRecognizer;->getName()Ljava/lang/String;
-Landroid/icu/text/CharsetRecognizer;->match(Landroid/icu/text/CharsetDetector;)Landroid/icu/text/CharsetMatch;
-Landroid/icu/text/ChineseDateFormat$Field;-><init>(Ljava/lang/String;I)V
-Landroid/icu/text/ChineseDateFormat$Field;->IS_LEAP_MONTH:Landroid/icu/text/ChineseDateFormat$Field;
-Landroid/icu/text/ChineseDateFormat$Field;->ofCalendarField(I)Landroid/icu/text/DateFormat$Field;
-Landroid/icu/text/ChineseDateFormat;-><init>(Ljava/lang/String;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/ChineseDateFormat;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/ChineseDateFormat;-><init>(Ljava/lang/String;Ljava/util/Locale;)V
-Landroid/icu/text/ChineseDateFormat;->subFormat(Ljava/lang/StringBuffer;CIIILandroid/icu/text/DisplayContext;Ljava/text/FieldPosition;Landroid/icu/util/Calendar;)V
-Landroid/icu/text/ChineseDateFormatSymbols;-><init>()V
-Landroid/icu/text/ChineseDateFormatSymbols;-><init>(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/ChineseDateFormatSymbols;-><init>(Landroid/icu/util/Calendar;Ljava/util/Locale;)V
-Landroid/icu/text/ChineseDateFormatSymbols;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/ChineseDateFormatSymbols;-><init>(Ljava/util/Locale;)V
-Landroid/icu/text/ChineseDateFormatSymbols;->getLeapMonth(I)Ljava/lang/String;
-Landroid/icu/text/ChineseDateFormatSymbols;->initializeData(Landroid/icu/text/DateFormatSymbols;)V
-Landroid/icu/text/ChineseDateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-Landroid/icu/text/ChineseDateFormatSymbols;->initializeIsLeapMonth()V
-Landroid/icu/text/ChineseDateFormatSymbols;->isLeapMonth:[Ljava/lang/String;
-Landroid/icu/text/CollationElementIterator$MaxExpSink;-><init>(Ljava/util/Map;)V
-Landroid/icu/text/CollationElementIterator$MaxExpSink;->maxExpansions:Ljava/util/Map;
-Landroid/icu/text/CollationElementIterator;-><init>(Landroid/icu/text/RuleBasedCollator;)V
-Landroid/icu/text/CollationElementIterator;-><init>(Landroid/icu/text/UCharacterIterator;Landroid/icu/text/RuleBasedCollator;)V
-Landroid/icu/text/CollationElementIterator;-><init>(Ljava/lang/String;Landroid/icu/text/RuleBasedCollator;)V
-Landroid/icu/text/CollationElementIterator;-><init>(Ljava/text/CharacterIterator;Landroid/icu/text/RuleBasedCollator;)V
-Landroid/icu/text/CollationElementIterator;->ceNeedsTwoParts(J)Z
-Landroid/icu/text/CollationElementIterator;->computeMaxExpansions(Landroid/icu/impl/coll/CollationData;)Ljava/util/Map;
-Landroid/icu/text/CollationElementIterator;->dir_:B
-Landroid/icu/text/CollationElementIterator;->getFirstHalf(JI)I
-Landroid/icu/text/CollationElementIterator;->getMaxExpansion(Ljava/util/Map;I)I
-Landroid/icu/text/CollationElementIterator;->getRuleBasedCollator()Landroid/icu/text/RuleBasedCollator;
-Landroid/icu/text/CollationElementIterator;->getSecondHalf(JI)I
-Landroid/icu/text/CollationElementIterator;->iter_:Landroid/icu/impl/coll/CollationIterator;
-Landroid/icu/text/CollationElementIterator;->normalizeDir()B
-Landroid/icu/text/CollationElementIterator;->offsets_:Landroid/icu/impl/coll/UVector32;
-Landroid/icu/text/CollationElementIterator;->otherHalf_:I
-Landroid/icu/text/CollationElementIterator;->rbc_:Landroid/icu/text/RuleBasedCollator;
-Landroid/icu/text/CollationElementIterator;->string_:Ljava/lang/String;
-Landroid/icu/text/CollationKey$BoundMode;-><init>()V
-Landroid/icu/text/CollationKey$BoundMode;->COUNT:I
-Landroid/icu/text/CollationKey;-><init>(Ljava/lang/String;Landroid/icu/text/RawCollationKey;)V
-Landroid/icu/text/CollationKey;-><init>(Ljava/lang/String;[BI)V
-Landroid/icu/text/CollationKey;->getLength()I
-Landroid/icu/text/CollationKey;->MERGE_SEPERATOR_:I
-Landroid/icu/text/CollationKey;->m_hashCode_:I
-Landroid/icu/text/CollationKey;->m_key_:[B
-Landroid/icu/text/CollationKey;->m_length_:I
-Landroid/icu/text/CollationKey;->m_source_:Ljava/lang/String;
-Landroid/icu/text/Collator$ASCII;-><init>()V
-Landroid/icu/text/Collator$ASCII;->equalIgnoreCase(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
-Landroid/icu/text/Collator$CollatorFactory;-><init>()V
-Landroid/icu/text/Collator$CollatorFactory;->createCollator(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;
-Landroid/icu/text/Collator$CollatorFactory;->createCollator(Ljava/util/Locale;)Landroid/icu/text/Collator;
-Landroid/icu/text/Collator$CollatorFactory;->getDisplayName(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/text/Collator$CollatorFactory;->getDisplayName(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;
-Landroid/icu/text/Collator$CollatorFactory;->getSupportedLocaleIDs()Ljava/util/Set;
-Landroid/icu/text/Collator$CollatorFactory;->visible()Z
-Landroid/icu/text/Collator$KeywordsSink;-><init>()V
-Landroid/icu/text/Collator$KeywordsSink;->hasDefault:Z
-Landroid/icu/text/Collator$KeywordsSink;->values:Ljava/util/LinkedList;
-Landroid/icu/text/Collator$ReorderCodes;->LIMIT:I
-Landroid/icu/text/Collator$ServiceShim;-><init>()V
-Landroid/icu/text/Collator$ServiceShim;->getAvailableLocales()[Ljava/util/Locale;
-Landroid/icu/text/Collator$ServiceShim;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/Collator$ServiceShim;->getDisplayName(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/text/Collator$ServiceShim;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;
-Landroid/icu/text/Collator$ServiceShim;->registerFactory(Landroid/icu/text/Collator$CollatorFactory;)Ljava/lang/Object;
-Landroid/icu/text/Collator$ServiceShim;->registerInstance(Landroid/icu/text/Collator;Landroid/icu/util/ULocale;)Ljava/lang/Object;
-Landroid/icu/text/Collator$ServiceShim;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/text/Collator;->BASE:Ljava/lang/String;
-Landroid/icu/text/Collator;->checkNotFrozen()V
-Landroid/icu/text/Collator;->DEBUG:Z
-Landroid/icu/text/Collator;->doCompare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I
-Landroid/icu/text/Collator;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
-Landroid/icu/text/Collator;->getRawCollationKey(Ljava/lang/String;Landroid/icu/text/RawCollationKey;)Landroid/icu/text/RawCollationKey;
-Landroid/icu/text/Collator;->getReorderCode(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/Collator;->getShim()Landroid/icu/text/Collator$ServiceShim;
-Landroid/icu/text/Collator;->getYesOrNo(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/icu/text/Collator;->KEYWORDS:[Ljava/lang/String;
-Landroid/icu/text/Collator;->registerFactory(Landroid/icu/text/Collator$CollatorFactory;)Ljava/lang/Object;
-Landroid/icu/text/Collator;->registerInstance(Landroid/icu/text/Collator;Landroid/icu/util/ULocale;)Ljava/lang/Object;
-Landroid/icu/text/Collator;->RESOURCE:Ljava/lang/String;
-Landroid/icu/text/Collator;->setAttributesFromKeywords(Landroid/icu/util/ULocale;Landroid/icu/text/Collator;Landroid/icu/text/RuleBasedCollator;)V
-Landroid/icu/text/Collator;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/Collator;->setStrength2(I)Landroid/icu/text/Collator;
-Landroid/icu/text/Collator;->setVariableTop(I)V
-Landroid/icu/text/Collator;->setVariableTop(Ljava/lang/String;)I
-Landroid/icu/text/Collator;->shim:Landroid/icu/text/Collator$ServiceShim;
-Landroid/icu/text/Collator;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/text/CompactDecimalFormat;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/CompactDecimalFormat$CompactStyle;)V
-Landroid/icu/text/ComposedCharIter;-><init>()V
-Landroid/icu/text/ComposedCharIter;-><init>(ZI)V
-Landroid/icu/text/ComposedCharIter;->curChar:I
-Landroid/icu/text/ComposedCharIter;->decompBuf:Ljava/lang/String;
-Landroid/icu/text/ComposedCharIter;->decomposition()Ljava/lang/String;
-Landroid/icu/text/ComposedCharIter;->DONE:C
-Landroid/icu/text/ComposedCharIter;->findNextChar()V
-Landroid/icu/text/ComposedCharIter;->hasNext()Z
-Landroid/icu/text/ComposedCharIter;->n2impl:Landroid/icu/impl/Normalizer2Impl;
-Landroid/icu/text/ComposedCharIter;->next()C
-Landroid/icu/text/ComposedCharIter;->nextChar:I
-Landroid/icu/text/CurrencyDisplayNames;-><init>()V
-Landroid/icu/text/CurrencyDisplayNames;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/CurrencyDisplayNames;
-Landroid/icu/text/CurrencyDisplayNames;->getInstance(Landroid/icu/util/ULocale;Z)Landroid/icu/text/CurrencyDisplayNames;
-Landroid/icu/text/CurrencyDisplayNames;->getInstance(Ljava/util/Locale;)Landroid/icu/text/CurrencyDisplayNames;
-Landroid/icu/text/CurrencyDisplayNames;->getInstance(Ljava/util/Locale;Z)Landroid/icu/text/CurrencyDisplayNames;
-Landroid/icu/text/CurrencyDisplayNames;->getName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/CurrencyDisplayNames;->getPluralName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/CurrencyDisplayNames;->getSymbol(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/CurrencyDisplayNames;->getULocale()Landroid/icu/util/ULocale;
-Landroid/icu/text/CurrencyDisplayNames;->hasData()Z
-Landroid/icu/text/CurrencyDisplayNames;->nameMap()Ljava/util/Map;
-Landroid/icu/text/CurrencyDisplayNames;->symbolMap()Ljava/util/Map;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;-><init>(II)V
-Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;->fractionDigits:I
-Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;->roundingIncrement:I
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;-><init>(Ljava/lang/String;Ljava/lang/String;JJZ)V
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->all()Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->ALL:Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->currency:Ljava/lang/String;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->equals(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Z
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->equals(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->from:J
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->now()Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onCurrency(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onDate(J)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onDate(Ljava/util/Date;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onDateRange(JJ)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onDateRange(Ljava/util/Date;Ljava/util/Date;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onRegion(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->onTender()Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->region:Ljava/lang/String;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->tenderOnly:Z
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->to:J
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withCurrency(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withDate(J)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withDate(Ljava/util/Date;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withDateRange(JJ)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withDateRange(Ljava/util/Date;Ljava/util/Date;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withRegion(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;->withTender()Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;-><init>(Ljava/lang/String;Ljava/lang/String;JJI)V
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;-><init>(Ljava/lang/String;Ljava/lang/String;JJIZ)V
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;->code:Ljava/lang/String;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;->from:J
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;->isTender()Z
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;->priority:I
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;->region:Ljava/lang/String;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;->tender:Z
-Landroid/icu/text/CurrencyMetaInfo$CurrencyInfo;->to:J
-Landroid/icu/text/CurrencyMetaInfo;-><init>()V
-Landroid/icu/text/CurrencyMetaInfo;->currencies(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-Landroid/icu/text/CurrencyMetaInfo;->currencyDigits(Ljava/lang/String;)Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;
-Landroid/icu/text/CurrencyMetaInfo;->currencyDigits(Ljava/lang/String;Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;
-Landroid/icu/text/CurrencyMetaInfo;->currencyInfo(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-Landroid/icu/text/CurrencyMetaInfo;->dateString(J)Ljava/lang/String;
-Landroid/icu/text/CurrencyMetaInfo;->debugString(Ljava/lang/Object;)Ljava/lang/String;
-Landroid/icu/text/CurrencyMetaInfo;->defaultDigits:Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;
-Landroid/icu/text/CurrencyMetaInfo;->getInstance()Landroid/icu/text/CurrencyMetaInfo;
-Landroid/icu/text/CurrencyMetaInfo;->getInstance(Z)Landroid/icu/text/CurrencyMetaInfo;
-Landroid/icu/text/CurrencyMetaInfo;->hasData()Z
-Landroid/icu/text/CurrencyMetaInfo;->hasData:Z
-Landroid/icu/text/CurrencyMetaInfo;->impl:Landroid/icu/text/CurrencyMetaInfo;
-Landroid/icu/text/CurrencyMetaInfo;->regions(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-Landroid/icu/text/CurrencyPluralInfo;->defaultCurrencyPluralPattern:Ljava/lang/String;
-Landroid/icu/text/CurrencyPluralInfo;->defaultCurrencyPluralPatternChar:[C
-Landroid/icu/text/CurrencyPluralInfo;->initialize(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/CurrencyPluralInfo;->pluralCountToCurrencyUnitPattern:Ljava/util/Map;
-Landroid/icu/text/CurrencyPluralInfo;->pluralPatternIterator()Ljava/util/Iterator;
-Landroid/icu/text/CurrencyPluralInfo;->pluralRules:Landroid/icu/text/PluralRules;
-Landroid/icu/text/CurrencyPluralInfo;->select(D)Ljava/lang/String;
-Landroid/icu/text/CurrencyPluralInfo;->select(Landroid/icu/text/PluralRules$FixedDecimal;)Ljava/lang/String;
-Landroid/icu/text/CurrencyPluralInfo;->setupCurrencyPluralPattern(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/CurrencyPluralInfo;->tripleCurrencySign:[C
-Landroid/icu/text/CurrencyPluralInfo;->tripleCurrencyStr:Ljava/lang/String;
-Landroid/icu/text/CurrencyPluralInfo;->ulocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DateFormat$BooleanAttribute;->PARSE_PARTIAL_MATCH:Landroid/icu/text/DateFormat$BooleanAttribute;
-Landroid/icu/text/DateFormat$Field;->calendarField:I
-Landroid/icu/text/DateFormat$Field;->CAL_FIELDS:[Landroid/icu/text/DateFormat$Field;
-Landroid/icu/text/DateFormat$Field;->CAL_FIELD_COUNT:I
-Landroid/icu/text/DateFormat$Field;->FIELD_NAME_MAP:Ljava/util/Map;
-Landroid/icu/text/DateFormat$Field;->RELATED_YEAR:Landroid/icu/text/DateFormat$Field;
-Landroid/icu/text/DateFormat$Field;->TIME_SEPARATOR:Landroid/icu/text/DateFormat$Field;
-Landroid/icu/text/DateFormat;->ABBR_STANDALONE_MONTH:Ljava/lang/String;
-Landroid/icu/text/DateFormat;->booleanAttributes:Ljava/util/EnumSet;
-Landroid/icu/text/DateFormat;->capitalizationSetting:Landroid/icu/text/DisplayContext;
-Landroid/icu/text/DateFormat;->currentSerialVersion:I
-Landroid/icu/text/DateFormat;->DATE_SKELETONS:Ljava/util/List;
-Landroid/icu/text/DateFormat;->FIELD_COUNT:I
-Landroid/icu/text/DateFormat;->fixNumberFormatForDates(Landroid/icu/text/NumberFormat;)V
-Landroid/icu/text/DateFormat;->get(IILandroid/icu/util/ULocale;Landroid/icu/util/Calendar;)Landroid/icu/text/DateFormat;
-Landroid/icu/text/DateFormat;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/DateFormat;->getInstance(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-Landroid/icu/text/DateFormat;->HOUR_GENERIC_TZ:Ljava/lang/String;
-Landroid/icu/text/DateFormat;->HOUR_MINUTE_GENERIC_TZ:Ljava/lang/String;
-Landroid/icu/text/DateFormat;->HOUR_MINUTE_TZ:Ljava/lang/String;
-Landroid/icu/text/DateFormat;->HOUR_TZ:Ljava/lang/String;
-Landroid/icu/text/DateFormat;->RELATED_YEAR:I
-Landroid/icu/text/DateFormat;->serialVersionOnStream:I
-Landroid/icu/text/DateFormat;->STANDALONE_MONTH:Ljava/lang/String;
-Landroid/icu/text/DateFormat;->TIME_SEPARATOR:I
-Landroid/icu/text/DateFormat;->TIME_SKELETONS:Ljava/util/List;
-Landroid/icu/text/DateFormat;->ZONE_SKELETONS:Ljava/util/List;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;->DIFFERENT_CALENDAR:Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;->GREGORIAN:Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;->NONE:Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;->SAME_CALENDAR:Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;->valueOf(Ljava/lang/String;)Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;->values()[Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;-><init>()V
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->aliasPathPairs:Ljava/util/List;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->aliasRelativePath:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->arrays:Ljava/util/Map;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->CALENDAR_ALIAS_PREFIX:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->currentCalendarType:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->maps:Ljava/util/Map;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->nextCalendarType:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->preEnumerate(Ljava/lang/String;)V
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->processAliasFromValue(Ljava/lang/String;Landroid/icu/impl/UResource$Value;)Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->processResource(Ljava/lang/String;Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->resourcesToVisit:Ljava/util/Set;
-Landroid/icu/text/DateFormatSymbols$CalendarDataSink;->visitAllResources()V
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->DAY_FORMAT:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->DAY_NARROW:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->DAY_STANDALONE:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->ERA_ABBREV:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->ERA_NARROW:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->ERA_WIDE:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->METAZONE_LONG:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->METAZONE_SHORT:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->MONTH_FORMAT:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->MONTH_NARROW:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->MONTH_STANDALONE:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->OTHER:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->valueOf(Ljava/lang/String;)Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->values()[Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->ZONE_LONG:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;->ZONE_SHORT:Landroid/icu/text/DateFormatSymbols$CapitalizationContextUsage;
-Landroid/icu/text/DateFormatSymbols;-><init>(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-Landroid/icu/text/DateFormatSymbols;-><init>(Landroid/icu/util/ULocale;Ljava/lang/String;)V
-Landroid/icu/text/DateFormatSymbols;->abbreviatedDayPeriods:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->actualLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DateFormatSymbols;->ALTERNATE_TIME_SEPARATOR:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->ampms:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->ampmsNarrow:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->arrayOfArrayEquals([[Ljava/lang/Object;[[Ljava/lang/Object;)Z
-Landroid/icu/text/DateFormatSymbols;->CALENDAR_CLASSES:[[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->capitalization:Ljava/util/Map;
-Landroid/icu/text/DateFormatSymbols;->contextUsageTypeMap:Ljava/util/Map;
-Landroid/icu/text/DateFormatSymbols;->DAY_PERIOD_KEYS:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->DEFAULT_TIME_SEPARATOR:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->DFSCACHE:Landroid/icu/impl/CacheBase;
-Landroid/icu/text/DateFormatSymbols;->DT_CONTEXT_COUNT:I
-Landroid/icu/text/DateFormatSymbols;->DT_LEAP_MONTH_PATTERN_FORMAT_ABBREV:I
-Landroid/icu/text/DateFormatSymbols;->DT_LEAP_MONTH_PATTERN_FORMAT_NARROW:I
-Landroid/icu/text/DateFormatSymbols;->DT_LEAP_MONTH_PATTERN_FORMAT_WIDE:I
-Landroid/icu/text/DateFormatSymbols;->DT_LEAP_MONTH_PATTERN_NUMERIC:I
-Landroid/icu/text/DateFormatSymbols;->DT_LEAP_MONTH_PATTERN_STANDALONE_ABBREV:I
-Landroid/icu/text/DateFormatSymbols;->DT_LEAP_MONTH_PATTERN_STANDALONE_NARROW:I
-Landroid/icu/text/DateFormatSymbols;->DT_LEAP_MONTH_PATTERN_STANDALONE_WIDE:I
-Landroid/icu/text/DateFormatSymbols;->DT_MONTH_PATTERN_COUNT:I
-Landroid/icu/text/DateFormatSymbols;->DT_WIDTH_COUNT:I
-Landroid/icu/text/DateFormatSymbols;->duplicate([Ljava/lang/String;)[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->duplicate([[Ljava/lang/String;)[[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->eraNames:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->eras:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/DateFormatSymbols;->getDateFormatBundle(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)Ljava/util/ResourceBundle;
-Landroid/icu/text/DateFormatSymbols;->getDateFormatBundle(Landroid/icu/util/Calendar;Ljava/util/Locale;)Ljava/util/ResourceBundle;
-Landroid/icu/text/DateFormatSymbols;->getDateFormatBundle(Ljava/lang/Class;Landroid/icu/util/ULocale;)Ljava/util/ResourceBundle;
-Landroid/icu/text/DateFormatSymbols;->getDateFormatBundle(Ljava/lang/Class;Ljava/util/Locale;)Ljava/util/ResourceBundle;
-Landroid/icu/text/DateFormatSymbols;->getLeapMonthPattern(II)Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->getNarrowEras()[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->getTimeSeparatorString()Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/text/DateFormatSymbols;)V
-Landroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V
-Landroid/icu/text/DateFormatSymbols;->leapMonthPatterns:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->LEAP_MONTH_PATTERNS_PATHS:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->loadDayPeriodStrings(Ljava/util/Map;)[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->localPatternChars:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->millisPerHour:I
-Landroid/icu/text/DateFormatSymbols;->months:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->narrowDayPeriods:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->narrowEras:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->narrowMonths:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->narrowWeekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->NUMERIC:I
-Landroid/icu/text/DateFormatSymbols;->patternChars:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->quarters:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->requestedLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DateFormatSymbols;->setLeapMonthPattern(Ljava/lang/String;II)V
-Landroid/icu/text/DateFormatSymbols;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateFormatSymbols;->setTimeSeparatorString(Ljava/lang/String;)V
-Landroid/icu/text/DateFormatSymbols;->shorterWeekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->shortMonths:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->shortQuarters:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->shortWeekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->shortYearNames:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->shortZodiacNames:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneAbbreviatedDayPeriods:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneMonths:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneNarrowDayPeriods:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneNarrowMonths:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneNarrowWeekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneQuarters:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneShorterWeekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneShortMonths:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneShortQuarters:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneShortWeekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneWeekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->standaloneWideDayPeriods:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->timeSeparator:Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->validLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DateFormatSymbols;->weekdays:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->wideDayPeriods:[Ljava/lang/String;
-Landroid/icu/text/DateFormatSymbols;->zoneStrings:[[Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat$BestMatchInfo;-><init>(Ljava/lang/String;I)V
-Landroid/icu/text/DateIntervalFormat$BestMatchInfo;->bestMatchDistanceInfo:I
-Landroid/icu/text/DateIntervalFormat$BestMatchInfo;->bestMatchSkeleton:Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;->bestMatchSkeleton:Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;->skeleton:Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DateIntervalInfo;Landroid/icu/text/SimpleDateFormat;)V
-Landroid/icu/text/DateIntervalFormat;-><init>(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/text/SimpleDateFormat;)V
-Landroid/icu/text/DateIntervalFormat;->adjustFieldWidth(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;->adjustPosition(Ljava/lang/String;Ljava/lang/String;Ljava/text/FieldPosition;Ljava/lang/String;Ljava/text/FieldPosition;Ljava/text/FieldPosition;)V
-Landroid/icu/text/DateIntervalFormat;->concatSingleDate2TimeInterval(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;)V
-Landroid/icu/text/DateIntervalFormat;->fallbackFormat(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;ZLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-Landroid/icu/text/DateIntervalFormat;->fallbackFormat(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;ZLjava/lang/StringBuffer;Ljava/text/FieldPosition;Ljava/lang/String;)Ljava/lang/StringBuffer;
-Landroid/icu/text/DateIntervalFormat;->fDateFormat:Landroid/icu/text/SimpleDateFormat;
-Landroid/icu/text/DateIntervalFormat;->fDatePattern:Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;->fDateTimeFormat:Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;->fFromCalendar:Landroid/icu/util/Calendar;
-Landroid/icu/text/DateIntervalFormat;->fieldExistsInSkeleton(ILjava/lang/String;)Z
-Landroid/icu/text/DateIntervalFormat;->fInfo:Landroid/icu/text/DateIntervalInfo;
-Landroid/icu/text/DateIntervalFormat;->fIntervalPatterns:Ljava/util/Map;
-Landroid/icu/text/DateIntervalFormat;->fSkeleton:Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;->fTimePattern:Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;->fToCalendar:Landroid/icu/util/Calendar;
-Landroid/icu/text/DateIntervalFormat;->genFallbackPattern(ILjava/lang/String;Ljava/util/Map;Landroid/icu/text/DateTimePatternGenerator;)V
-Landroid/icu/text/DateIntervalFormat;->genIntervalPattern(ILjava/lang/String;Ljava/lang/String;ILjava/util/Map;)Landroid/icu/text/DateIntervalFormat$SkeletonAndItsBestMatch;
-Landroid/icu/text/DateIntervalFormat;->genSeparateDateTimePtn(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Landroid/icu/text/DateTimePatternGenerator;)Z
-Landroid/icu/text/DateIntervalFormat;->getConcatenationPattern(Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;->getDateTimeSkeleton(Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;)V
-Landroid/icu/text/DateIntervalFormat;->getPatterns(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Landroid/icu/util/Output;)Ljava/lang/String;
-Landroid/icu/text/DateIntervalFormat;->getRawPatterns()Ljava/util/Map;
-Landroid/icu/text/DateIntervalFormat;->initializeIntervalPattern(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/util/Map;
-Landroid/icu/text/DateIntervalFormat;->initializePattern(Landroid/icu/impl/ICUCache;)V
-Landroid/icu/text/DateIntervalFormat;->isDateIntervalInfoDefault:Z
-Landroid/icu/text/DateIntervalFormat;->LOCAL_PATTERN_CACHE:Landroid/icu/impl/ICUCache;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;-><init>(Landroid/icu/text/DateIntervalInfo;)V
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->ACCEPTED_PATTERN_LETTERS:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->dateIntervalInfo:Landroid/icu/text/DateIntervalInfo;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->DATE_INTERVAL_PATH_PREFIX:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->DATE_INTERVAL_PATH_SUFFIX:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->getAndResetNextCalendarType()Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->getCalendarTypeFromPath(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->nextCalendarType:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->processSkeletonTable(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->setIntervalPatternIfAbsent(Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/DateIntervalInfo$DateIntervalSink;->validateAndProcessPatternLetter(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
-Landroid/icu/text/DateIntervalInfo$PatternInfo;->currentSerialVersion:I
-Landroid/icu/text/DateIntervalInfo$PatternInfo;->fFirstDateInPtnIsLaterDate:Z
-Landroid/icu/text/DateIntervalInfo$PatternInfo;->fIntervalPatternFirstPart:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo$PatternInfo;->fIntervalPatternSecondPart:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;-><init>()V
-Landroid/icu/text/DateIntervalInfo;->CALENDAR_FIELD_TO_PATTERN_LETTER:[Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;->CALENDAR_KEY:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;->cloneIntervalPatterns(Ljava/util/Map;)Ljava/util/Map;
-Landroid/icu/text/DateIntervalInfo;->cloneUnfrozenDII()Ljava/lang/Object;
-Landroid/icu/text/DateIntervalInfo;->currentSerialVersion:I
-Landroid/icu/text/DateIntervalInfo;->DIICACHE:Landroid/icu/impl/ICUCache;
-Landroid/icu/text/DateIntervalInfo;->EARLIEST_FIRST_PREFIX:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;->FALLBACK_STRING:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;->fFallbackIntervalPattern:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;->fFirstDateInPtnIsLaterDate:Z
-Landroid/icu/text/DateIntervalInfo;->fIntervalPatterns:Ljava/util/Map;
-Landroid/icu/text/DateIntervalInfo;->fIntervalPatternsReadOnly:Z
-Landroid/icu/text/DateIntervalInfo;->frozen:Z
-Landroid/icu/text/DateIntervalInfo;->genPatternInfo(Ljava/lang/String;Z)Landroid/icu/text/DateIntervalInfo$PatternInfo;
-Landroid/icu/text/DateIntervalInfo;->getBestSkeleton(Ljava/lang/String;)Landroid/icu/text/DateIntervalFormat$BestMatchInfo;
-Landroid/icu/text/DateIntervalInfo;->getPatterns()Ljava/util/Map;
-Landroid/icu/text/DateIntervalInfo;->getRawPatterns()Ljava/util/Map;
-Landroid/icu/text/DateIntervalInfo;->initializeData(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateIntervalInfo;->initializeFromReadOnlyPatterns(Landroid/icu/text/DateIntervalInfo;)V
-Landroid/icu/text/DateIntervalInfo;->INTERVAL_FORMATS_KEY:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;->LATEST_FIRST_PREFIX:Ljava/lang/String;
-Landroid/icu/text/DateIntervalInfo;->MINIMUM_SUPPORTED_CALENDAR_FIELD:I
-Landroid/icu/text/DateIntervalInfo;->parseSkeleton(Ljava/lang/String;[I)V
-Landroid/icu/text/DateIntervalInfo;->setIntervalPattern(Ljava/lang/String;Ljava/lang/String;Landroid/icu/text/DateIntervalInfo$PatternInfo;)V
-Landroid/icu/text/DateIntervalInfo;->setIntervalPatternInternally(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/DateIntervalInfo$PatternInfo;
-Landroid/icu/text/DateIntervalInfo;->setup(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateIntervalInfo;->splitPatternInto2Part(Ljava/lang/String;)I
-Landroid/icu/text/DateIntervalInfo;->stringNumeric(IIC)Z
-Landroid/icu/text/DateTimePatternGenerator$AvailableFormatsSink;->returnInfo:Landroid/icu/text/DateTimePatternGenerator$PatternInfo;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;-><init>()V
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->addedDefaultDayPeriod:Z
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->baseOriginal:Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->compareTo(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)I
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->extractFrom(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;I)V
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->fieldIsNumeric(I)Z
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getBasePattern()Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getDistance(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;)I
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getFieldMask()I
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->original:Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->set(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$FormatParser;Z)Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->toCanonicalString()Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->type:[I
-Landroid/icu/text/DateTimePatternGenerator$DayPeriodAllowedHoursSink;-><init>(Ljava/util/HashMap;)V
-Landroid/icu/text/DateTimePatternGenerator$DayPeriodAllowedHoursSink;->tempMap:Ljava/util/HashMap;
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;->addExtra(I)V
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;->addMissing(I)V
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;->clear()V
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;->extraFieldMask:I
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;->missingFieldMask:I
-Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;->setTo(Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;)V
-Landroid/icu/text/DateTimePatternGenerator$DTPGflags;->FIX_FRACTIONAL_SECONDS:Landroid/icu/text/DateTimePatternGenerator$DTPGflags;
-Landroid/icu/text/DateTimePatternGenerator$DTPGflags;->SKELETON_USES_CAP_J:Landroid/icu/text/DateTimePatternGenerator$DTPGflags;
-Landroid/icu/text/DateTimePatternGenerator$DTPGflags;->valueOf(Ljava/lang/String;)Landroid/icu/text/DateTimePatternGenerator$DTPGflags;
-Landroid/icu/text/DateTimePatternGenerator$DTPGflags;->values()[Landroid/icu/text/DateTimePatternGenerator$DTPGflags;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;-><init>()V
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->addVariable(Ljava/lang/StringBuffer;Z)V
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->getItems()Ljava/util/List;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->hasDateAndTimeFields()Z
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->items:Ljava/util/List;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->quoteLiteral(Ljava/lang/String;)Ljava/lang/Object;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->QUOTING_CHARS:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->set(Ljava/lang/String;)Landroid/icu/text/DateTimePatternGenerator$FormatParser;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->set(Ljava/lang/String;Z)Landroid/icu/text/DateTimePatternGenerator$FormatParser;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->SYNTAX_CHARS:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->tokenizer:Landroid/icu/impl/PatternTokenizer;
-Landroid/icu/text/DateTimePatternGenerator$FormatParser;->toString(II)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;-><init>(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)V
-Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;->matcherWithSkeleton:Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;
-Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;->pattern:Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag;-><init>(Ljava/lang/String;Z)V
-Landroid/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag;->pattern:Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag;->skeletonWasSpecified:Z
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;-><init>()V
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->appendFieldTo(ILjava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->appendFieldTo(ILjava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->appendTo(Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->appendTo(Ljava/lang/StringBuilder;ZZ)Ljava/lang/StringBuilder;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->chars:[B
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->clear()V
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->clearField(I)V
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->compareTo(Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;)I
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->copyFieldFrom(Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;I)V
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->DEFAULT_CHAR:B
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->DEFAULT_LENGTH:B
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->getFieldChar(I)C
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->getFieldLength(I)I
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->isFieldEmpty(I)Z
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->lengths:[B
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->populate(ICI)V
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->populate(ILjava/lang/String;)V
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->toCanonicalString()Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->toCanonicalString(Z)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;->toString(Z)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$VariableField;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/DateTimePatternGenerator$VariableField;-><init>(Ljava/lang/String;Z)V
-Landroid/icu/text/DateTimePatternGenerator$VariableField;->canonicalIndex:I
-Landroid/icu/text/DateTimePatternGenerator$VariableField;->getCanonicalCode(I)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator$VariableField;->getCanonicalIndex()I
-Landroid/icu/text/DateTimePatternGenerator$VariableField;->getType()I
-Landroid/icu/text/DateTimePatternGenerator$VariableField;->isNumeric()Z
-Landroid/icu/text/DateTimePatternGenerator$VariableField;->string:Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->addCanonicalItems()V
-Landroid/icu/text/DateTimePatternGenerator;->addCLDRData(Landroid/icu/text/DateTimePatternGenerator$PatternInfo;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateTimePatternGenerator;->addICUPatterns(Landroid/icu/text/DateTimePatternGenerator$PatternInfo;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateTimePatternGenerator;->addPatternWithSkeleton(Ljava/lang/String;Ljava/lang/String;ZLandroid/icu/text/DateTimePatternGenerator$PatternInfo;)Landroid/icu/text/DateTimePatternGenerator;
-Landroid/icu/text/DateTimePatternGenerator;->adjustFieldTypes(Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;Ljava/util/EnumSet;I)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->allowedHourFormats:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->appendItemFormats:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->appendItemNames:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->basePattern_pattern:Ljava/util/TreeMap;
-Landroid/icu/text/DateTimePatternGenerator;->CANONICAL_ITEMS:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->CANONICAL_SET:Ljava/util/Set;
-Landroid/icu/text/DateTimePatternGenerator;->checkFrozen()V
-Landroid/icu/text/DateTimePatternGenerator;->cldrAvailableFormatKeys:Ljava/util/Set;
-Landroid/icu/text/DateTimePatternGenerator;->CLDR_FIELD_APPEND:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->CLDR_FIELD_NAME:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->consumeShortTimePattern(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$PatternInfo;)V
-Landroid/icu/text/DateTimePatternGenerator;->current:Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;
-Landroid/icu/text/DateTimePatternGenerator;->dateTimeFormat:Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->DATE_MASK:I
-Landroid/icu/text/DateTimePatternGenerator;->DEBUG:Z
-Landroid/icu/text/DateTimePatternGenerator;->decimal:Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->defaultHourFormatChar:C
-Landroid/icu/text/DateTimePatternGenerator;->DELTA:I
-Landroid/icu/text/DateTimePatternGenerator;->DTPNG_CACHE:Landroid/icu/impl/ICUCache;
-Landroid/icu/text/DateTimePatternGenerator;->EXTRA_FIELD:I
-Landroid/icu/text/DateTimePatternGenerator;->FIELD_NAME:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->fillInMissing()V
-Landroid/icu/text/DateTimePatternGenerator;->fp:Landroid/icu/text/DateTimePatternGenerator$FormatParser;
-Landroid/icu/text/DateTimePatternGenerator;->FRACTIONAL_MASK:I
-Landroid/icu/text/DateTimePatternGenerator;->frozen:Z
-Landroid/icu/text/DateTimePatternGenerator;->getAllowedHourFormats(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateTimePatternGenerator;->getAppendFormat(I)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getAppendFormatNumber(Landroid/icu/impl/UResource$Key;)I
-Landroid/icu/text/DateTimePatternGenerator;->getAppendFormatNumber(Ljava/lang/String;)I
-Landroid/icu/text/DateTimePatternGenerator;->getAppendName(I)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getBestAppending(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;Ljava/util/EnumSet;I)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;I)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getBestRaw(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;
-Landroid/icu/text/DateTimePatternGenerator;->getCalendarTypeToUse(Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getCanonicalChar(IC)C
-Landroid/icu/text/DateTimePatternGenerator;->getCanonicalIndex(Ljava/lang/String;Z)I
-Landroid/icu/text/DateTimePatternGenerator;->getCanonicalSkeletonAllowingDuplicates(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getCLDRFieldNumber(Landroid/icu/impl/UResource$Key;)I
-Landroid/icu/text/DateTimePatternGenerator;->getDefaultHourFormatChar()C
-Landroid/icu/text/DateTimePatternGenerator;->getFields(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getFilteredPattern(Landroid/icu/text/DateTimePatternGenerator$FormatParser;Ljava/util/BitSet;)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getFrozenInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DateTimePatternGenerator;
-Landroid/icu/text/DateTimePatternGenerator;->getName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getRedundants(Ljava/util/Collection;)Ljava/util/Collection;
-Landroid/icu/text/DateTimePatternGenerator;->getSet(Ljava/lang/String;)Ljava/util/TreeSet;
-Landroid/icu/text/DateTimePatternGenerator;->getSkeletonAllowingDuplicates(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->getTopBitNumber(I)I
-Landroid/icu/text/DateTimePatternGenerator;->hackTimes(Landroid/icu/text/DateTimePatternGenerator$PatternInfo;Ljava/lang/String;)V
-Landroid/icu/text/DateTimePatternGenerator;->initData(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateTimePatternGenerator;->isAvailableFormatSet(Ljava/lang/String;)Z
-Landroid/icu/text/DateTimePatternGenerator;->isSingleField(Ljava/lang/String;)Z
-Landroid/icu/text/DateTimePatternGenerator;->LAST_RESORT_ALLOWED_HOUR_FORMAT:[Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->LOCALE_TO_ALLOWED_HOUR:Ljava/util/Map;
-Landroid/icu/text/DateTimePatternGenerator;->LONG:I
-Landroid/icu/text/DateTimePatternGenerator;->mapSkeletonMetacharacters(Ljava/lang/String;Ljava/util/EnumSet;)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->MATCH_MINUTE_FIELD_LENGTH:I
-Landroid/icu/text/DateTimePatternGenerator;->MATCH_SECOND_FIELD_LENGTH:I
-Landroid/icu/text/DateTimePatternGenerator;->MISSING_FIELD:I
-Landroid/icu/text/DateTimePatternGenerator;->NARROW:I
-Landroid/icu/text/DateTimePatternGenerator;->NONE:I
-Landroid/icu/text/DateTimePatternGenerator;->NUMERIC:I
-Landroid/icu/text/DateTimePatternGenerator;->SECOND_AND_FRACTIONAL_MASK:I
-Landroid/icu/text/DateTimePatternGenerator;->setAvailableFormat(Ljava/lang/String;)V
-Landroid/icu/text/DateTimePatternGenerator;->setDateTimeFromCalendar(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateTimePatternGenerator;->setDecimalSymbols(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DateTimePatternGenerator;->setDefaultHourFormatChar(C)V
-Landroid/icu/text/DateTimePatternGenerator;->SHORT:I
-Landroid/icu/text/DateTimePatternGenerator;->SHORTER:I
-Landroid/icu/text/DateTimePatternGenerator;->showMask(I)Ljava/lang/String;
-Landroid/icu/text/DateTimePatternGenerator;->skeleton2pattern:Ljava/util/TreeMap;
-Landroid/icu/text/DateTimePatternGenerator;->skeletonsAreSimilar(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/icu/text/DateTimePatternGenerator;->TIME_MASK:I
-Landroid/icu/text/DateTimePatternGenerator;->types:[[I
-Landroid/icu/text/DateTimePatternGenerator;->TYPE_LIMIT:I
-Landroid/icu/text/DateTimePatternGenerator;->_distanceInfo:Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;
-Landroid/icu/text/DecimalFormat$PropertySetter;->set(Landroid/icu/impl/number/DecimalFormatProperties;)V
-Landroid/icu/text/DecimalFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;I)V
-Landroid/icu/text/DecimalFormat;->exportedProperties:Landroid/icu/impl/number/DecimalFormatProperties;
-Landroid/icu/text/DecimalFormat;->formatter:Landroid/icu/number/LocalizedNumberFormatter;
-Landroid/icu/text/DecimalFormat;->getDefaultSymbols()Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DecimalFormat;->getFixedDecimal(D)Landroid/icu/text/PluralRules$IFixedDecimal;
-Landroid/icu/text/DecimalFormat;->getMinimumGroupingDigits()I
-Landroid/icu/text/DecimalFormat;->getParseCaseSensitive()Z
-Landroid/icu/text/DecimalFormat;->getParseNoExponent()Z
-Landroid/icu/text/DecimalFormat;->getSignAlwaysShown()Z
-Landroid/icu/text/DecimalFormat;->icuMathContextForm:I
-Landroid/icu/text/DecimalFormat;->properties:Landroid/icu/impl/number/DecimalFormatProperties;
-Landroid/icu/text/DecimalFormat;->refreshFormatter()V
-Landroid/icu/text/DecimalFormat;->safeConvertBigDecimal(Ljava/math/BigDecimal;)Ljava/lang/Number;
-Landroid/icu/text/DecimalFormat;->serialVersionOnStream:I
-Landroid/icu/text/DecimalFormat;->setMinimumGroupingDigits(I)V
-Landroid/icu/text/DecimalFormat;->setParseCaseSensitive(Z)V
-Landroid/icu/text/DecimalFormat;->setParseNoExponent(Z)V
-Landroid/icu/text/DecimalFormat;->setProperties(Landroid/icu/text/DecimalFormat$PropertySetter;)V
-Landroid/icu/text/DecimalFormat;->setPropertiesFromPattern(Ljava/lang/String;I)V
-Landroid/icu/text/DecimalFormat;->setSignAlwaysShown(Z)V
-Landroid/icu/text/DecimalFormat;->symbols:Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DecimalFormat;->threadLocalProperties:Ljava/lang/ThreadLocal;
-Landroid/icu/text/DecimalFormat;->toNumberFormatter()Landroid/icu/number/LocalizedNumberFormatter;
-Landroid/icu/text/DecimalFormat;->useCurrency(Landroid/icu/impl/number/DecimalFormatProperties;)Z
-Landroid/icu/text/DecimalFormatSymbols$CacheData;-><init>(Landroid/icu/util/ULocale;[Ljava/lang/String;[Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormatSymbols$CacheData;->digits:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols$CacheData;->numberElements:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols$CacheData;->validLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DecimalFormatSymbols$DecFmtDataSink;-><init>([Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormatSymbols$DecFmtDataSink;->numberElements:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)V
-Landroid/icu/text/DecimalFormatSymbols;-><init>(Ljava/util/Locale;Landroid/icu/text/NumberingSystem;)V
-Landroid/icu/text/DecimalFormatSymbols;->actualLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DecimalFormatSymbols;->cachedLocaleData:Landroid/icu/impl/CacheBase;
-Landroid/icu/text/DecimalFormatSymbols;->codePointZero:I
-Landroid/icu/text/DecimalFormatSymbols;->currency:Landroid/icu/util/Currency;
-Landroid/icu/text/DecimalFormatSymbols;->currencyPattern:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->currencySpcAfterSym:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->currencySpcBeforeSym:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->currencySymbol:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->currentSerialVersion:I
-Landroid/icu/text/DecimalFormatSymbols;->decimalSeparator:C
-Landroid/icu/text/DecimalFormatSymbols;->decimalSeparatorString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->DEF_DECIMAL_SEPARATOR:C
-Landroid/icu/text/DecimalFormatSymbols;->DEF_DIGIT_CHARS_ARRAY:[C
-Landroid/icu/text/DecimalFormatSymbols;->DEF_DIGIT_STRINGS_ARRAY:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->DEF_GROUPING_SEPARATOR:C
-Landroid/icu/text/DecimalFormatSymbols;->DEF_MINUS_SIGN:C
-Landroid/icu/text/DecimalFormatSymbols;->DEF_PERCENT:C
-Landroid/icu/text/DecimalFormatSymbols;->DEF_PERMILL:C
-Landroid/icu/text/DecimalFormatSymbols;->DEF_PLUS_SIGN:C
-Landroid/icu/text/DecimalFormatSymbols;->digit:C
-Landroid/icu/text/DecimalFormatSymbols;->digits:[C
-Landroid/icu/text/DecimalFormatSymbols;->digitStrings:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->exponential:C
-Landroid/icu/text/DecimalFormatSymbols;->exponentMultiplicationSign:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->exponentSeparator:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->forNumberingSystem(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DecimalFormatSymbols;->forNumberingSystem(Ljava/util/Locale;Landroid/icu/text/NumberingSystem;)Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DecimalFormatSymbols;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/DecimalFormatSymbols;->getCodePointZero()I
-Landroid/icu/text/DecimalFormatSymbols;->getCurrencyPattern()Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->getDigitStringsLocal()[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->groupingSeparator:C
-Landroid/icu/text/DecimalFormatSymbols;->groupingSeparatorString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->infinity:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->initialize(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)V
-Landroid/icu/text/DecimalFormatSymbols;->initSpacingInfo(Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;)V
-Landroid/icu/text/DecimalFormatSymbols;->intlCurrencySymbol:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->LATIN_NUMBERING_SYSTEM:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->loadData(Landroid/icu/util/ULocale;)Landroid/icu/text/DecimalFormatSymbols$CacheData;
-Landroid/icu/text/DecimalFormatSymbols;->minusSign:C
-Landroid/icu/text/DecimalFormatSymbols;->minusString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->monetaryGroupingSeparator:C
-Landroid/icu/text/DecimalFormatSymbols;->monetaryGroupingSeparatorString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->monetarySeparator:C
-Landroid/icu/text/DecimalFormatSymbols;->monetarySeparatorString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->NaN:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->NUMBER_ELEMENTS:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->padEscape:C
-Landroid/icu/text/DecimalFormatSymbols;->patternSeparator:C
-Landroid/icu/text/DecimalFormatSymbols;->percent:C
-Landroid/icu/text/DecimalFormatSymbols;->percentString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->perMill:C
-Landroid/icu/text/DecimalFormatSymbols;->perMillString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->plusSign:C
-Landroid/icu/text/DecimalFormatSymbols;->plusString:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->requestedLocale:Ljava/util/Locale;
-Landroid/icu/text/DecimalFormatSymbols;->serialVersionOnStream:I
-Landroid/icu/text/DecimalFormatSymbols;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DecimalFormatSymbols;->sigDigit:C
-Landroid/icu/text/DecimalFormatSymbols;->SYMBOLS:Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->SYMBOL_DEFAULTS:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->SYMBOL_KEYS:[Ljava/lang/String;
-Landroid/icu/text/DecimalFormatSymbols;->ulocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DecimalFormatSymbols;->validLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/DecimalFormatSymbols;->zeroDigit:C
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->getNegPrefix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->getNegSuffix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->getPatternType()I
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->getPosPrefix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->getPosSuffix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->negPrefixPatternForCurrency:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->negSuffixPatternForCurrency:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->patternType:I
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->posPrefixPatternForCurrency:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$AffixForCurrency;->posSuffixPatternForCurrency:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$Unit;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android$Unit;->prefix:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$Unit;->suffix:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android$Unit;->writePrefix(Ljava/lang/StringBuffer;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android$Unit;->writeSuffix(Ljava/lang/StringBuffer;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;-><init>()V
-Landroid/icu/text/DecimalFormat_ICU58_Android;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;-><init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;-><init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;-><init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/CurrencyPluralInfo;I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->actualRoundingIncrement:Ljava/math/BigDecimal;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->actualRoundingIncrementICU:Landroid/icu/math/BigDecimal;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->addAttribute(Landroid/icu/text/NumberFormat$Field;II)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->addPadding(Ljava/lang/StringBuffer;Ljava/text/FieldPosition;II)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->adjustNumberAsInFormatting(D)D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->affixPatternsForCurrency:Ljava/util/Set;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->appendAffix(Ljava/lang/StringBuffer;ZZLjava/text/FieldPosition;Z)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->appendAffixPattern(Ljava/lang/StringBuffer;ZZZ)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->applyLocalizedPattern(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->applyPattern(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->applyPattern(Ljava/lang/String;Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->applyPatternWithoutExpandAffix(Ljava/lang/String;Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->areSignificantDigitsUsed()Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->attributes:Ljava/util/ArrayList;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->commaEquivalents:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->compareAffix(Ljava/lang/String;IZZLjava/lang/String;ZI[Landroid/icu/util/Currency;)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->compareComplexAffix(Ljava/lang/String;Ljava/lang/String;II[Landroid/icu/util/Currency;)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->compareSimpleAffix(Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->create(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/CurrencyPluralInfo;I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->createFromPatternAndSymbols(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->currencyChoice:Ljava/text/ChoiceFormat;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->currencyPluralInfo:Landroid/icu/text/CurrencyPluralInfo;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->currencySignCount:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->currencyUsage:Landroid/icu/util/Currency$CurrencyUsage;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->CURRENCY_SIGN:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->CURRENCY_SIGN_COUNT_IN_ISO_FORMAT:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->CURRENCY_SIGN_COUNT_IN_PLURAL_FORMAT:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->CURRENCY_SIGN_COUNT_IN_SYMBOL_FORMAT:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->CURRENCY_SIGN_COUNT_ZERO:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->currentSerialVersion:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->decimalSeparatorAlwaysShown:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->defaultGroupingSeparators:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->digitList:Landroid/icu/text/DigitList_Android;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->dotEquivalents:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->DOUBLE_FRACTION_DIGITS:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->DOUBLE_INTEGER_DIGITS:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->epsilon:D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->equals(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->equalWithSignCompatibility(II)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->expandAffix(Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringBuffer;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->expandAffixAdjustWidth(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->expandAffixes(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->exponentSignAlwaysShown:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;Z)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;Z)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->format(Ljava/math/BigDecimal;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Z)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->format(Ljava/math/BigInteger;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Z)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->formatAffix2Attribute(ZLandroid/icu/text/NumberFormat$Field;Ljava/lang/StringBuffer;II)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->formatPattern:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->formatToCharacterIterator(Ljava/lang/Object;Landroid/icu/text/DecimalFormat_ICU58_Android$Unit;)Ljava/text/AttributedCharacterIterator;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->formatWidth:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getCurrencyPluralInfo()Landroid/icu/text/CurrencyPluralInfo;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getCurrencyUsage()Landroid/icu/util/Currency$CurrencyUsage;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getEffectiveCurrency()Landroid/icu/util/Currency;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getEquivalentDecimals(Ljava/lang/String;Z)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getFixedDecimal(D)Landroid/icu/text/PluralRules$FixedDecimal;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getFixedDecimal(DLandroid/icu/text/DigitList_Android;)Landroid/icu/text/PluralRules$FixedDecimal;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getFormatWidth()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getGroupingSize()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getMathContext()Ljava/math/MathContext;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getMathContextICU()Landroid/icu/math/MathContext;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getMaximumSignificantDigits()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getMinimumExponentDigits()B
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getMinimumSignificantDigits()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getMultiplier()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getNegativePrefix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getNegativeSuffix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getPadCharacter()C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getPadPosition()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getParseMaxDigits()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getPositivePrefix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getPositiveSuffix()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getRoundingIncrement()Ljava/math/BigDecimal;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->getSecondaryGroupingSize()I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->groupingSize2:B
-Landroid/icu/text/DecimalFormat_ICU58_Android;->groupingSize:B
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isBidiMark(I)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isDecimalPatternMatchRequired()Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isDecimalSeparatorAlwaysShown()Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isExponentSignAlwaysShown()Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isGroupingPosition(I)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isNegative(D)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isNumberNegative(D)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isParseBigDecimal()Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isReadyForParsing:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->isScientificNotation()Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->match(Ljava/lang/String;II)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->match(Ljava/lang/String;ILjava/lang/String;)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->matchesDigit(Ljava/lang/String;I[I)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->mathContext:Landroid/icu/math/MathContext;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->maxSignificantDigits:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->MAX_INTEGER_DIGITS:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->MAX_SCIENTIFIC_INTEGER_DIGITS:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->minExponentDigits:B
-Landroid/icu/text/DecimalFormat_ICU58_Android;->minSignificantDigits:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->minusSigns:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->multiplier:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->multiply(D)D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->negativePrefix:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->negativeSuffix:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->negPrefixPattern:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->negSuffixPattern:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->NULL_UNIT:Landroid/icu/text/DecimalFormat_ICU58_Android$Unit;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->pad:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->padPosition:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PAD_AFTER_PREFIX:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PAD_AFTER_SUFFIX:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PAD_BEFORE_PREFIX:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PAD_BEFORE_SUFFIX:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->parse(Ljava/lang/String;Ljava/text/ParsePosition;[Landroid/icu/util/Currency;)Ljava/lang/Object;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->parseBigDecimal:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->parseForCurrency(Ljava/lang/String;Ljava/text/ParsePosition;[Landroid/icu/util/Currency;[Z)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->parseRequireDecimalPoint:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PARSE_MAX_EXPONENT:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->patternError(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_DECIMAL_SEPARATOR:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_EIGHT_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_EXPONENT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_FIVE_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_FOUR_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_GROUPING_SEPARATOR:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_MINUS_SIGN:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_NINE_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_ONE_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_PAD_ESCAPE:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_PERCENT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_PER_MILLE:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_PLUS_SIGN:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_SEPARATOR:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_SEVEN_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_SIGNIFICANT_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_SIX_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_THREE_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_TWO_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->PATTERN_ZERO_DIGIT:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->plusSigns:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->positivePrefix:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->positiveSuffix:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->posPrefixPattern:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->posSuffixPattern:Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->precision(Z)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->QUOTE:C
-Landroid/icu/text/DecimalFormat_ICU58_Android;->resetActualRounding()V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->round(D)D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->round(DDDIZ)D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->roundingDouble:D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->roundingDoubleReciprocal:D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->roundingIncrement:Ljava/math/BigDecimal;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->roundingIncrementEpsilon:D
-Landroid/icu/text/DecimalFormat_ICU58_Android;->roundingIncrementICU:Landroid/icu/math/BigDecimal;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->roundingMode:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->serialVersionOnStream:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setCurrencyForSymbols()V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setCurrencyPluralInfo(Landroid/icu/text/CurrencyPluralInfo;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setCurrencyUsage(Landroid/icu/util/Currency$CurrencyUsage;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setDecimalFormatSymbols(Landroid/icu/text/DecimalFormatSymbols;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setDecimalPatternMatchRequired(Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setDecimalSeparatorAlwaysShown(Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setExponentSignAlwaysShown(Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setFormatWidth(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setGroupingSize(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setInternalRoundingIncrement(Landroid/icu/math/BigDecimal;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setMathContext(Ljava/math/MathContext;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setMathContextICU(Landroid/icu/math/MathContext;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setMaximumSignificantDigits(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setMinimumExponentDigits(B)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setMinimumSignificantDigits(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setMultiplier(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setNegativePrefix(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setNegativeSuffix(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setPadCharacter(C)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setPadPosition(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setParseBigDecimal(Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setParseMaxDigits(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setPositivePrefix(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setPositiveSuffix(Ljava/lang/String;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setRoundingDouble(D)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setRoundingIncrement(D)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setRoundingIncrement(Landroid/icu/math/BigDecimal;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setRoundingIncrement(Ljava/math/BigDecimal;)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setScientificNotation(Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setSecondaryGroupingSize(I)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setSignificantDigitsUsed(Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->setupCurrencyAffixForAllPatterns()V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->skipBidiMarks(Ljava/lang/String;I)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->skipExtendedSeparatorParsing:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->skipPadding(Ljava/lang/String;I)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->skipPatternWhiteSpace(Ljava/lang/String;I)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->skipUWhiteSpace(Ljava/lang/String;I)I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->STATUS_INFINITE:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->STATUS_LENGTH:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->STATUS_POSITIVE:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->STATUS_UNDERFLOW:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->strictCommaEquivalents:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->strictDefaultGroupingSeparators:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->strictDotEquivalents:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->style:I
-Landroid/icu/text/DecimalFormat_ICU58_Android;->subformat(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;ZZZ)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->subformat(ILjava/lang/StringBuffer;Ljava/text/FieldPosition;ZZZ)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->subformat(Ljava/lang/String;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;ZZZ)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->subformat(Ljava/lang/StringBuffer;Ljava/text/FieldPosition;ZZZ)Ljava/lang/StringBuffer;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->subformatExponential(Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Z)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->subformatFixed(Ljava/lang/StringBuffer;Ljava/text/FieldPosition;ZZ)V
-Landroid/icu/text/DecimalFormat_ICU58_Android;->subparse(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/DigitList_Android;[Z[Landroid/icu/util/Currency;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZI)Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->symbols:Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->toDigitList(D)Landroid/icu/text/DigitList_Android;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->toLocalizedPattern()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->toPattern()Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->toPattern(Z)Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->trimMarksFromAffix(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->unquote(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/DecimalFormat_ICU58_Android;->useExponentialNotation:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->useSignificantDigits:Z
-Landroid/icu/text/DecimalFormat_ICU58_Android;->_setMaximumFractionDigits(I)V
-Landroid/icu/text/DictionaryBreakEngine$DequeI;-><init>()V
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->contains(I)Z
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->data:[I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->elementAt(I)I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->firstIdx:I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->grow()V
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->isEmpty()Z
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->lastIdx:I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->offer(I)V
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->peek()I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->peekLast()I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->pollLast()I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->pop()I
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->push(I)V
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->removeAllElements()V
-Landroid/icu/text/DictionaryBreakEngine$DequeI;->size()I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;-><init>()V
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->acceptMarked(Ljava/text/CharacterIterator;)I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->backUp(Ljava/text/CharacterIterator;)Z
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->candidates(Ljava/text/CharacterIterator;Landroid/icu/text/DictionaryMatcher;I)I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->count:[I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->current:I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->lengths:[I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->longestPrefix()I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->mark:I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->markCurrent()V
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->offset:I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->POSSIBLE_WORD_LIST_MAX:I
-Landroid/icu/text/DictionaryBreakEngine$PossibleWord;->prefix:I
-Landroid/icu/text/DictionaryBreakEngine;->divideUpDictionaryRange(Ljava/text/CharacterIterator;IILandroid/icu/text/DictionaryBreakEngine$DequeI;)I
-Landroid/icu/text/DictionaryBreakEngine;->findBreaks(Ljava/text/CharacterIterator;IIILandroid/icu/text/DictionaryBreakEngine$DequeI;)I
-Landroid/icu/text/DictionaryBreakEngine;->fSet:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/DictionaryBreakEngine;->fTypes:Ljava/util/BitSet;
-Landroid/icu/text/DictionaryBreakEngine;->handles(II)Z
-Landroid/icu/text/DictionaryBreakEngine;->setCharacters(Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/DictionaryMatcher;-><init>()V
-Landroid/icu/text/DictionaryMatcher;->getType()I
-Landroid/icu/text/DictionaryMatcher;->matches(Ljava/text/CharacterIterator;I[I[II)I
-Landroid/icu/text/DictionaryMatcher;->matches(Ljava/text/CharacterIterator;I[I[II[I)I
-Landroid/icu/text/DigitList_Android;-><init>()V
-Landroid/icu/text/DigitList_Android;->append(I)V
-Landroid/icu/text/DigitList_Android;->count:I
-Landroid/icu/text/DigitList_Android;->DBL_DIG:I
-Landroid/icu/text/DigitList_Android;->decimalAt:I
-Landroid/icu/text/DigitList_Android;->didRound:Z
-Landroid/icu/text/DigitList_Android;->digits:[B
-Landroid/icu/text/DigitList_Android;->ensureCapacity(II)V
-Landroid/icu/text/DigitList_Android;->getBigDecimalICU(Z)Landroid/icu/math/BigDecimal;
-Landroid/icu/text/DigitList_Android;->getBigInteger(Z)Ljava/math/BigInteger;
-Landroid/icu/text/DigitList_Android;->getDigitValue(I)B
-Landroid/icu/text/DigitList_Android;->getDouble()D
-Landroid/icu/text/DigitList_Android;->getLong()J
-Landroid/icu/text/DigitList_Android;->getStringRep(Z)Ljava/lang/String;
-Landroid/icu/text/DigitList_Android;->isIntegral()Z
-Landroid/icu/text/DigitList_Android;->isLongMIN_VALUE()Z
-Landroid/icu/text/DigitList_Android;->isZero()Z
-Landroid/icu/text/DigitList_Android;->LONG_MIN_REP:[B
-Landroid/icu/text/DigitList_Android;->MAX_LONG_DIGITS:I
-Landroid/icu/text/DigitList_Android;->round(I)V
-Landroid/icu/text/DigitList_Android;->set(DIZ)V
-Landroid/icu/text/DigitList_Android;->set(J)V
-Landroid/icu/text/DigitList_Android;->set(JI)V
-Landroid/icu/text/DigitList_Android;->set(Landroid/icu/math/BigDecimal;IZ)V
-Landroid/icu/text/DigitList_Android;->set(Ljava/lang/String;I)V
-Landroid/icu/text/DigitList_Android;->set(Ljava/math/BigDecimal;IZ)V
-Landroid/icu/text/DigitList_Android;->set(Ljava/math/BigInteger;I)V
-Landroid/icu/text/DigitList_Android;->setBigDecimalDigits(Ljava/lang/String;IZ)V
-Landroid/icu/text/DigitList_Android;->shouldRoundUp(I)Z
-Landroid/icu/text/DigitList_Android;->wasRounded()Z
-Landroid/icu/text/DisplayContext;->type:Landroid/icu/text/DisplayContext$Type;
-Landroid/icu/text/DisplayContext;->value:I
-Landroid/icu/text/DurationFormat;-><init>()V
-Landroid/icu/text/DurationFormat;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/DurationFormat;->formatDurationFrom(JJ)Ljava/lang/String;
-Landroid/icu/text/DurationFormat;->formatDurationFromNow(J)Ljava/lang/String;
-Landroid/icu/text/DurationFormat;->formatDurationFromNowTo(Ljava/util/Date;)Ljava/lang/String;
-Landroid/icu/text/DurationFormat;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DurationFormat;
-Landroid/icu/text/Edits$Iterator;-><init>([CIZZ)V
-Landroid/icu/text/Edits$Iterator;->array:[C
-Landroid/icu/text/Edits$Iterator;->changed:Z
-Landroid/icu/text/Edits$Iterator;->coarse:Z
-Landroid/icu/text/Edits$Iterator;->destinationIndex()I
-Landroid/icu/text/Edits$Iterator;->destinationIndexFromSourceIndex(I)I
-Landroid/icu/text/Edits$Iterator;->destIndex:I
-Landroid/icu/text/Edits$Iterator;->dir:I
-Landroid/icu/text/Edits$Iterator;->findDestinationIndex(I)Z
-Landroid/icu/text/Edits$Iterator;->findIndex(IZ)I
-Landroid/icu/text/Edits$Iterator;->findSourceIndex(I)Z
-Landroid/icu/text/Edits$Iterator;->hasChange()Z
-Landroid/icu/text/Edits$Iterator;->index:I
-Landroid/icu/text/Edits$Iterator;->length:I
-Landroid/icu/text/Edits$Iterator;->newLength()I
-Landroid/icu/text/Edits$Iterator;->newLength_:I
-Landroid/icu/text/Edits$Iterator;->next()Z
-Landroid/icu/text/Edits$Iterator;->next(Z)Z
-Landroid/icu/text/Edits$Iterator;->noNext()Z
-Landroid/icu/text/Edits$Iterator;->oldLength()I
-Landroid/icu/text/Edits$Iterator;->oldLength_:I
-Landroid/icu/text/Edits$Iterator;->onlyChanges_:Z
-Landroid/icu/text/Edits$Iterator;->previous()Z
-Landroid/icu/text/Edits$Iterator;->readLength(I)I
-Landroid/icu/text/Edits$Iterator;->remaining:I
-Landroid/icu/text/Edits$Iterator;->replacementIndex()I
-Landroid/icu/text/Edits$Iterator;->replIndex:I
-Landroid/icu/text/Edits$Iterator;->sourceIndex()I
-Landroid/icu/text/Edits$Iterator;->sourceIndexFromDestinationIndex(I)I
-Landroid/icu/text/Edits$Iterator;->srcIndex:I
-Landroid/icu/text/Edits$Iterator;->updateNextIndexes()V
-Landroid/icu/text/Edits$Iterator;->updatePreviousIndexes()V
-Landroid/icu/text/Edits;-><init>()V
-Landroid/icu/text/Edits;->addReplace(II)V
-Landroid/icu/text/Edits;->addUnchanged(I)V
-Landroid/icu/text/Edits;->append(I)V
-Landroid/icu/text/Edits;->array:[C
-Landroid/icu/text/Edits;->delta:I
-Landroid/icu/text/Edits;->getCoarseChangesIterator()Landroid/icu/text/Edits$Iterator;
-Landroid/icu/text/Edits;->getCoarseIterator()Landroid/icu/text/Edits$Iterator;
-Landroid/icu/text/Edits;->getFineChangesIterator()Landroid/icu/text/Edits$Iterator;
-Landroid/icu/text/Edits;->getFineIterator()Landroid/icu/text/Edits$Iterator;
-Landroid/icu/text/Edits;->growArray()Z
-Landroid/icu/text/Edits;->hasChanges()Z
-Landroid/icu/text/Edits;->lastUnit()I
-Landroid/icu/text/Edits;->length:I
-Landroid/icu/text/Edits;->lengthDelta()I
-Landroid/icu/text/Edits;->LENGTH_IN_1TRAIL:I
-Landroid/icu/text/Edits;->LENGTH_IN_2TRAIL:I
-Landroid/icu/text/Edits;->MAX_SHORT_CHANGE:I
-Landroid/icu/text/Edits;->MAX_SHORT_CHANGE_NEW_LENGTH:I
-Landroid/icu/text/Edits;->MAX_SHORT_CHANGE_OLD_LENGTH:I
-Landroid/icu/text/Edits;->MAX_UNCHANGED:I
-Landroid/icu/text/Edits;->MAX_UNCHANGED_LENGTH:I
-Landroid/icu/text/Edits;->mergeAndAppend(Landroid/icu/text/Edits;Landroid/icu/text/Edits;)Landroid/icu/text/Edits;
-Landroid/icu/text/Edits;->numberOfChanges()I
-Landroid/icu/text/Edits;->numChanges:I
-Landroid/icu/text/Edits;->reset()V
-Landroid/icu/text/Edits;->setLastUnit(I)V
-Landroid/icu/text/Edits;->SHORT_CHANGE_NUM_MASK:I
-Landroid/icu/text/Edits;->STACK_CAPACITY:I
-Landroid/icu/text/FilteredBreakIteratorBuilder;-><init>()V
-Landroid/icu/text/FilteredBreakIteratorBuilder;->getEmptyInstance()Landroid/icu/text/FilteredBreakIteratorBuilder;
-Landroid/icu/text/FilteredBreakIteratorBuilder;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/FilteredBreakIteratorBuilder;
-Landroid/icu/text/FilteredBreakIteratorBuilder;->getInstance(Ljava/util/Locale;)Landroid/icu/text/FilteredBreakIteratorBuilder;
-Landroid/icu/text/FilteredBreakIteratorBuilder;->suppressBreakAfter(Ljava/lang/CharSequence;)Z
-Landroid/icu/text/FilteredBreakIteratorBuilder;->unsuppressBreakAfter(Ljava/lang/CharSequence;)Z
-Landroid/icu/text/FilteredBreakIteratorBuilder;->wrapIteratorWithFilter(Landroid/icu/text/BreakIterator;)Landroid/icu/text/BreakIterator;
-Landroid/icu/text/FilteredNormalizer2;-><init>(Landroid/icu/text/Normalizer2;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/FilteredNormalizer2;->norm2:Landroid/icu/text/Normalizer2;
-Landroid/icu/text/FilteredNormalizer2;->normalize(Ljava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/UnicodeSet$SpanCondition;)Ljava/lang/Appendable;
-Landroid/icu/text/FilteredNormalizer2;->normalizeSecondAndAppend(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;Z)Ljava/lang/StringBuilder;
-Landroid/icu/text/FilteredNormalizer2;->set:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/IDNA$Info;->errors:Ljava/util/EnumSet;
-Landroid/icu/text/IDNA$Info;->isBiDi:Z
-Landroid/icu/text/IDNA$Info;->isOkBiDi:Z
-Landroid/icu/text/IDNA$Info;->isTransDiff:Z
-Landroid/icu/text/IDNA$Info;->labelErrors:Ljava/util/EnumSet;
-Landroid/icu/text/IDNA$Info;->reset()V
-Landroid/icu/text/IDNA;-><init>()V
-Landroid/icu/text/IDNA;->addError(Landroid/icu/text/IDNA$Info;Landroid/icu/text/IDNA$Error;)V
-Landroid/icu/text/IDNA;->addLabelError(Landroid/icu/text/IDNA$Info;Landroid/icu/text/IDNA$Error;)V
-Landroid/icu/text/IDNA;->ALLOW_UNASSIGNED:I
-Landroid/icu/text/IDNA;->compare(Landroid/icu/text/UCharacterIterator;Landroid/icu/text/UCharacterIterator;I)I
-Landroid/icu/text/IDNA;->compare(Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/icu/text/IDNA;->compare(Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;I)I
-Landroid/icu/text/IDNA;->convertIDNToASCII(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertIDNToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertIDNToASCII(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertIDNToUnicode(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertIDNToUnicode(Ljava/lang/String;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertIDNToUnicode(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertToASCII(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertToASCII(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertToUnicode(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertToUnicode(Ljava/lang/String;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->convertToUnicode(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/IDNA;->hasCertainErrors(Landroid/icu/text/IDNA$Info;Ljava/util/EnumSet;)Z
-Landroid/icu/text/IDNA;->hasCertainLabelErrors(Landroid/icu/text/IDNA$Info;Ljava/util/EnumSet;)Z
-Landroid/icu/text/IDNA;->isBiDi(Landroid/icu/text/IDNA$Info;)Z
-Landroid/icu/text/IDNA;->isOkBiDi(Landroid/icu/text/IDNA$Info;)Z
-Landroid/icu/text/IDNA;->promoteAndResetLabelErrors(Landroid/icu/text/IDNA$Info;)V
-Landroid/icu/text/IDNA;->resetInfo(Landroid/icu/text/IDNA$Info;)V
-Landroid/icu/text/IDNA;->setBiDi(Landroid/icu/text/IDNA$Info;)V
-Landroid/icu/text/IDNA;->setNotOkBiDi(Landroid/icu/text/IDNA$Info;)V
-Landroid/icu/text/IDNA;->setTransitionalDifferent(Landroid/icu/text/IDNA$Info;)V
-Landroid/icu/text/LanguageBreakEngine;->findBreaks(Ljava/text/CharacterIterator;IIILandroid/icu/text/DictionaryBreakEngine$DequeI;)I
-Landroid/icu/text/LanguageBreakEngine;->handles(II)Z
-Landroid/icu/text/ListFormatter$Cache;-><init>()V
-Landroid/icu/text/ListFormatter$Cache;->cache:Landroid/icu/impl/ICUCache;
-Landroid/icu/text/ListFormatter$Cache;->get(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/text/ListFormatter;
-Landroid/icu/text/ListFormatter$Cache;->load(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/text/ListFormatter;
-Landroid/icu/text/ListFormatter$FormattedListBuilder;-><init>(Ljava/lang/Object;Z)V
-Landroid/icu/text/ListFormatter$FormattedListBuilder;->append(Ljava/lang/String;Ljava/lang/Object;Z)Landroid/icu/text/ListFormatter$FormattedListBuilder;
-Landroid/icu/text/ListFormatter$FormattedListBuilder;->current:Ljava/lang/StringBuilder;
-Landroid/icu/text/ListFormatter$FormattedListBuilder;->getOffset()I
-Landroid/icu/text/ListFormatter$FormattedListBuilder;->offset:I
-Landroid/icu/text/ListFormatter$FormattedListBuilder;->offsetRecorded()Z
-Landroid/icu/text/ListFormatter$Style;->DURATION:Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/ListFormatter$Style;->DURATION_NARROW:Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/ListFormatter$Style;->DURATION_SHORT:Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/ListFormatter$Style;->getName()Ljava/lang/String;
-Landroid/icu/text/ListFormatter$Style;->name:Ljava/lang/String;
-Landroid/icu/text/ListFormatter$Style;->STANDARD:Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/ListFormatter$Style;->valueOf(Ljava/lang/String;)Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/ListFormatter$Style;->values()[Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/ListFormatter;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/ListFormatter;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/ListFormatter;->cache:Landroid/icu/text/ListFormatter$Cache;
-Landroid/icu/text/ListFormatter;->compilePattern(Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/String;
-Landroid/icu/text/ListFormatter;->end:Ljava/lang/String;
-Landroid/icu/text/ListFormatter;->format(Ljava/util/Collection;I)Landroid/icu/text/ListFormatter$FormattedListBuilder;
-Landroid/icu/text/ListFormatter;->getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/ListFormatter$Style;)Landroid/icu/text/ListFormatter;
-Landroid/icu/text/ListFormatter;->getLocale()Landroid/icu/util/ULocale;
-Landroid/icu/text/ListFormatter;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/ListFormatter;->middle:Ljava/lang/String;
-Landroid/icu/text/ListFormatter;->start:Ljava/lang/String;
-Landroid/icu/text/ListFormatter;->two:Ljava/lang/String;
-Landroid/icu/text/LocaleDisplayNames$LastResortLocaleDisplayNames;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/LocaleDisplayNames$DialectHandling;)V
-Landroid/icu/text/LocaleDisplayNames$LastResortLocaleDisplayNames;->contexts:[Landroid/icu/text/DisplayContext;
-Landroid/icu/text/LocaleDisplayNames$LastResortLocaleDisplayNames;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/LocaleDisplayNames$UiListItem$UiListItemComparator;-><init>(Ljava/util/Comparator;Z)V
-Landroid/icu/text/LocaleDisplayNames$UiListItem$UiListItemComparator;->collator:Ljava/util/Comparator;
-Landroid/icu/text/LocaleDisplayNames$UiListItem$UiListItemComparator;->compare(Landroid/icu/text/LocaleDisplayNames$UiListItem;Landroid/icu/text/LocaleDisplayNames$UiListItem;)I
-Landroid/icu/text/LocaleDisplayNames$UiListItem$UiListItemComparator;->useSelf:Z
-Landroid/icu/text/LocaleDisplayNames;-><init>()V
-Landroid/icu/text/LocaleDisplayNames;->FACTORY_DIALECTHANDLING:Ljava/lang/reflect/Method;
-Landroid/icu/text/LocaleDisplayNames;->FACTORY_DISPLAYCONTEXT:Ljava/lang/reflect/Method;
-Landroid/icu/text/LocaleDisplayNames;->scriptDisplayNameInContext(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$FormatWidth;->currencyStyle:I
-Landroid/icu/text/MeasureFormat$FormatWidth;->getCurrencyStyle()I
-Landroid/icu/text/MeasureFormat$FormatWidth;->getListFormatterStyle()Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/MeasureFormat$FormatWidth;->INDEX_COUNT:I
-Landroid/icu/text/MeasureFormat$FormatWidth;->listFormatterStyle:Landroid/icu/text/ListFormatter$Style;
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;-><init>(Landroid/icu/text/NumberFormat;)V
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;->format(Landroid/icu/util/CurrencyAmount;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;->format(Ljava/lang/Number;)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;->format(Ljava/lang/Number;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;->get()Landroid/icu/text/NumberFormat;
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;->getPrefix(Z)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;->getSuffix(Z)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;->nf:Landroid/icu/text/NumberFormat;
-Landroid/icu/text/MeasureFormat$MeasureFormatData;-><init>()V
-Landroid/icu/text/MeasureFormat$MeasureFormatData;->hasPerFormatter(Landroid/icu/text/MeasureFormat$FormatWidth;)Z
-Landroid/icu/text/MeasureFormat$MeasureFormatData;->PATTERN_COUNT:I
-Landroid/icu/text/MeasureFormat$MeasureFormatData;->PER_UNIT_INDEX:I
-Landroid/icu/text/MeasureFormat$MeasureFormatData;->styleToPerPattern:Ljava/util/EnumMap;
-Landroid/icu/text/MeasureFormat$MeasureFormatData;->unitToStyleToDnam:Ljava/util/Map;
-Landroid/icu/text/MeasureFormat$MeasureFormatData;->unitToStyleToPatterns:Ljava/util/Map;
-Landroid/icu/text/MeasureFormat$MeasureFormatData;->widthFallback:[Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat$MeasureProxy;-><init>()V
-Landroid/icu/text/MeasureFormat$MeasureProxy;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$FormatWidth;Landroid/icu/text/NumberFormat;I)V
-Landroid/icu/text/MeasureFormat$MeasureProxy;->createTimeUnitFormat()Landroid/icu/text/TimeUnitFormat;
-Landroid/icu/text/MeasureFormat$MeasureProxy;->formatWidth:Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat$MeasureProxy;->keyValues:Ljava/util/HashMap;
-Landroid/icu/text/MeasureFormat$MeasureProxy;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/MeasureFormat$MeasureProxy;->numberFormat:Landroid/icu/text/NumberFormat;
-Landroid/icu/text/MeasureFormat$MeasureProxy;->subClass:I
-Landroid/icu/text/MeasureFormat$NumericFormatters;-><init>(Landroid/icu/text/DateFormat;Landroid/icu/text/DateFormat;Landroid/icu/text/DateFormat;)V
-Landroid/icu/text/MeasureFormat$NumericFormatters;->getHourMinute()Landroid/icu/text/DateFormat;
-Landroid/icu/text/MeasureFormat$NumericFormatters;->getHourMinuteSecond()Landroid/icu/text/DateFormat;
-Landroid/icu/text/MeasureFormat$NumericFormatters;->getMinuteSecond()Landroid/icu/text/DateFormat;
-Landroid/icu/text/MeasureFormat$NumericFormatters;->hourMinute:Landroid/icu/text/DateFormat;
-Landroid/icu/text/MeasureFormat$NumericFormatters;->hourMinuteSecond:Landroid/icu/text/DateFormat;
-Landroid/icu/text/MeasureFormat$NumericFormatters;->minuteSecond:Landroid/icu/text/DateFormat;
-Landroid/icu/text/MeasureFormat$PatternData;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/MeasureFormat$PatternData;->prefix:Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$PatternData;->suffix:Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$UnitDataSink;-><init>(Landroid/icu/text/MeasureFormat$MeasureFormatData;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->cacheData:Landroid/icu/text/MeasureFormat$MeasureFormatData;
-Landroid/icu/text/MeasureFormat$UnitDataSink;->consumeAlias(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->consumeCompoundPattern(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->consumePattern(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->consumeSubtypeTable(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->consumeTable(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->consumeUnitTypesTable(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->patterns:[Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$UnitDataSink;->sb:Ljava/lang/StringBuilder;
-Landroid/icu/text/MeasureFormat$UnitDataSink;->setDnamIfAbsent(Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->setFormatterIfAbsent(ILandroid/icu/impl/UResource$Value;I)V
-Landroid/icu/text/MeasureFormat$UnitDataSink;->type:Ljava/lang/String;
-Landroid/icu/text/MeasureFormat$UnitDataSink;->unit:Landroid/icu/util/MeasureUnit;
-Landroid/icu/text/MeasureFormat$UnitDataSink;->width:Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat$UnitDataSink;->widthFromAlias(Landroid/icu/impl/UResource$Value;)Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat$UnitDataSink;->widthFromKey(Landroid/icu/impl/UResource$Key;)Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat;-><init>()V
-Landroid/icu/text/MeasureFormat;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$MeasureFormatData;Landroid/icu/text/MeasureFormat$FormatWidth;Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;Landroid/icu/text/PluralRules;Landroid/icu/text/MeasureFormat$NumericFormatters;Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;)V
-Landroid/icu/text/MeasureFormat;->appendReplacingCurrency(Ljava/lang/String;Landroid/icu/util/Currency;Landroid/icu/impl/StandardPlural;Ljava/lang/StringBuilder;)V
-Landroid/icu/text/MeasureFormat;->cache:Landroid/icu/text/MeasureFormat$MeasureFormatData;
-Landroid/icu/text/MeasureFormat;->currencyFormat:Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;
-Landroid/icu/text/MeasureFormat;->CURRENCY_FORMAT:I
-Landroid/icu/text/MeasureFormat;->formatMeasure(Landroid/icu/util/Measure;Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat;->formatMeasure(Landroid/icu/util/Measure;Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;Ljava/lang/StringBuilder;Ljava/text/FieldPosition;)Ljava/lang/StringBuilder;
-Landroid/icu/text/MeasureFormat;->formatMeasureRange(Landroid/icu/util/Measure;Landroid/icu/util/Measure;)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat;->formatNumeric(Ljava/util/Date;Landroid/icu/text/DateFormat;Landroid/icu/text/DateFormat$Field;Ljava/lang/Number;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-Landroid/icu/text/MeasureFormat;->formatNumeric([Ljava/lang/Number;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
-Landroid/icu/text/MeasureFormat;->formatWidth:Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat;->fromFormatWidthOrdinal(I)Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat;->getFormatter(Landroid/icu/util/MeasureUnit;Landroid/icu/text/MeasureFormat$FormatWidth;I)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat;->getFormatterOrNull(Landroid/icu/util/MeasureUnit;Landroid/icu/text/MeasureFormat$FormatWidth;I)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat;->getPerFormatter(Landroid/icu/text/MeasureFormat$FormatWidth;)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat;->getPluralFormatter(Landroid/icu/util/MeasureUnit;Landroid/icu/text/MeasureFormat$FormatWidth;I)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat;->getRangeFormat(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$FormatWidth;)Ljava/lang/String;
-Landroid/icu/text/MeasureFormat;->getRegularWidth(Landroid/icu/text/MeasureFormat$FormatWidth;)Landroid/icu/text/MeasureFormat$FormatWidth;
-Landroid/icu/text/MeasureFormat;->hmsTo012:Ljava/util/Map;
-Landroid/icu/text/MeasureFormat;->integerFormat:Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;
-Landroid/icu/text/MeasureFormat;->loadLocaleData(Landroid/icu/util/ULocale;)Landroid/icu/text/MeasureFormat$MeasureFormatData;
-Landroid/icu/text/MeasureFormat;->loadNumericDurationFormat(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)Landroid/icu/text/DateFormat;
-Landroid/icu/text/MeasureFormat;->loadNumericFormatters(Landroid/icu/util/ULocale;)Landroid/icu/text/MeasureFormat$NumericFormatters;
-Landroid/icu/text/MeasureFormat;->localeIdToRangeFormat:Ljava/util/Map;
-Landroid/icu/text/MeasureFormat;->localeMeasureFormatData:Landroid/icu/impl/SimpleCache;
-Landroid/icu/text/MeasureFormat;->localeToNumericDurationFormatters:Landroid/icu/impl/SimpleCache;
-Landroid/icu/text/MeasureFormat;->MEASURE_FORMAT:I
-Landroid/icu/text/MeasureFormat;->numberFormat:Landroid/icu/text/MeasureFormat$ImmutableNumberFormat;
-Landroid/icu/text/MeasureFormat;->numericFormatters:Landroid/icu/text/MeasureFormat$NumericFormatters;
-Landroid/icu/text/MeasureFormat;->rules:Landroid/icu/text/PluralRules;
-Landroid/icu/text/MeasureFormat;->TIME_UNIT_FORMAT:I
-Landroid/icu/text/MeasureFormat;->toCurrencyProxy()Ljava/lang/Object;
-Landroid/icu/text/MeasureFormat;->toHMS([Landroid/icu/util/Measure;)[Ljava/lang/Number;
-Landroid/icu/text/MeasureFormat;->toTimeUnitProxy()Ljava/lang/Object;
-Landroid/icu/text/MeasureFormat;->withLocale(Landroid/icu/util/ULocale;)Landroid/icu/text/MeasureFormat;
-Landroid/icu/text/MeasureFormat;->withNumberFormat(Landroid/icu/text/NumberFormat;)Landroid/icu/text/MeasureFormat;
-Landroid/icu/text/MeasureFormat;->withPerUnitAndAppend(Ljava/lang/CharSequence;Landroid/icu/util/MeasureUnit;Ljava/lang/StringBuilder;)I
-Landroid/icu/text/MessageFormat$AppendableWrapper;-><init>(Ljava/lang/StringBuffer;)V
-Landroid/icu/text/MessageFormat$AppendableWrapper;-><init>(Ljava/lang/StringBuilder;)V
-Landroid/icu/text/MessageFormat$AppendableWrapper;->app:Ljava/lang/Appendable;
-Landroid/icu/text/MessageFormat$AppendableWrapper;->append(Ljava/lang/Appendable;Ljava/text/CharacterIterator;)I
-Landroid/icu/text/MessageFormat$AppendableWrapper;->append(Ljava/lang/CharSequence;)V
-Landroid/icu/text/MessageFormat$AppendableWrapper;->append(Ljava/lang/CharSequence;II)V
-Landroid/icu/text/MessageFormat$AppendableWrapper;->append(Ljava/text/CharacterIterator;)V
-Landroid/icu/text/MessageFormat$AppendableWrapper;->attributes:Ljava/util/List;
-Landroid/icu/text/MessageFormat$AppendableWrapper;->formatAndAppend(Ljava/text/Format;Ljava/lang/Object;)V
-Landroid/icu/text/MessageFormat$AppendableWrapper;->formatAndAppend(Ljava/text/Format;Ljava/lang/Object;Ljava/lang/String;)V
-Landroid/icu/text/MessageFormat$AppendableWrapper;->length:I
-Landroid/icu/text/MessageFormat$AppendableWrapper;->useAttributes()V
-Landroid/icu/text/MessageFormat$AttributeAndPosition;-><init>(Ljava/lang/Object;II)V
-Landroid/icu/text/MessageFormat$AttributeAndPosition;-><init>(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;II)V
-Landroid/icu/text/MessageFormat$AttributeAndPosition;->init(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;II)V
-Landroid/icu/text/MessageFormat$AttributeAndPosition;->key:Ljava/text/AttributedCharacterIterator$Attribute;
-Landroid/icu/text/MessageFormat$AttributeAndPosition;->limit:I
-Landroid/icu/text/MessageFormat$AttributeAndPosition;->start:I
-Landroid/icu/text/MessageFormat$AttributeAndPosition;->value:Ljava/lang/Object;
-Landroid/icu/text/MessageFormat$PluralSelectorContext;-><init>(ILjava/lang/String;Ljava/lang/Number;D)V
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->argName:Ljava/lang/String;
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->formatter:Ljava/text/Format;
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->forReplaceNumber:Z
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->number:Ljava/lang/Number;
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->numberArgIndex:I
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->numberString:Ljava/lang/String;
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->offset:D
-Landroid/icu/text/MessageFormat$PluralSelectorContext;->startIndex:I
-Landroid/icu/text/MessageFormat$PluralSelectorProvider;-><init>(Landroid/icu/text/MessageFormat;Landroid/icu/text/PluralRules$PluralType;)V
-Landroid/icu/text/MessageFormat$PluralSelectorProvider;->msgFormat:Landroid/icu/text/MessageFormat;
-Landroid/icu/text/MessageFormat$PluralSelectorProvider;->rules:Landroid/icu/text/PluralRules;
-Landroid/icu/text/MessageFormat$PluralSelectorProvider;->select(Ljava/lang/Object;D)Ljava/lang/String;
-Landroid/icu/text/MessageFormat$PluralSelectorProvider;->type:Landroid/icu/text/PluralRules$PluralType;
-Landroid/icu/text/MessageFormat;->argNameMatches(ILjava/lang/String;I)Z
-Landroid/icu/text/MessageFormat;->cachedFormatters:Ljava/util/Map;
-Landroid/icu/text/MessageFormat;->cacheExplicitFormats()V
-Landroid/icu/text/MessageFormat;->createAppropriateFormat(Ljava/lang/String;Ljava/lang/String;)Ljava/text/Format;
-Landroid/icu/text/MessageFormat;->CURLY_BRACE_LEFT:C
-Landroid/icu/text/MessageFormat;->CURLY_BRACE_RIGHT:C
-Landroid/icu/text/MessageFormat;->customFormatArgStarts:Ljava/util/Set;
-Landroid/icu/text/MessageFormat;->dateModifierList:[Ljava/lang/String;
-Landroid/icu/text/MessageFormat;->DATE_MODIFIER_EMPTY:I
-Landroid/icu/text/MessageFormat;->DATE_MODIFIER_FULL:I
-Landroid/icu/text/MessageFormat;->DATE_MODIFIER_LONG:I
-Landroid/icu/text/MessageFormat;->DATE_MODIFIER_MEDIUM:I
-Landroid/icu/text/MessageFormat;->DATE_MODIFIER_SHORT:I
-Landroid/icu/text/MessageFormat;->findChoiceSubMessage(Landroid/icu/text/MessagePattern;ID)I
-Landroid/icu/text/MessageFormat;->findFirstPluralNumberArg(ILjava/lang/String;)I
-Landroid/icu/text/MessageFormat;->findKeyword(Ljava/lang/String;[Ljava/lang/String;)I
-Landroid/icu/text/MessageFormat;->findOtherSubMessage(I)I
-Landroid/icu/text/MessageFormat;->format(ILandroid/icu/text/MessageFormat$PluralSelectorContext;[Ljava/lang/Object;Ljava/util/Map;Landroid/icu/text/MessageFormat$AppendableWrapper;Ljava/text/FieldPosition;)V
-Landroid/icu/text/MessageFormat;->format(Ljava/lang/Object;Landroid/icu/text/MessageFormat$AppendableWrapper;Ljava/text/FieldPosition;)V
-Landroid/icu/text/MessageFormat;->format([Ljava/lang/Object;Ljava/util/Map;Landroid/icu/text/MessageFormat$AppendableWrapper;Ljava/text/FieldPosition;)V
-Landroid/icu/text/MessageFormat;->formatComplexSubMessage(ILandroid/icu/text/MessageFormat$PluralSelectorContext;[Ljava/lang/Object;Ljava/util/Map;Landroid/icu/text/MessageFormat$AppendableWrapper;)V
-Landroid/icu/text/MessageFormat;->getArgName(I)Ljava/lang/String;
-Landroid/icu/text/MessageFormat;->getLiteralStringUntilNextArgument(I)Ljava/lang/String;
-Landroid/icu/text/MessageFormat;->getStockDateFormatter()Landroid/icu/text/DateFormat;
-Landroid/icu/text/MessageFormat;->getStockNumberFormatter()Landroid/icu/text/NumberFormat;
-Landroid/icu/text/MessageFormat;->matchStringUntilLimitPart(Landroid/icu/text/MessagePattern;IILjava/lang/String;I)I
-Landroid/icu/text/MessageFormat;->modifierList:[Ljava/lang/String;
-Landroid/icu/text/MessageFormat;->MODIFIER_CURRENCY:I
-Landroid/icu/text/MessageFormat;->MODIFIER_EMPTY:I
-Landroid/icu/text/MessageFormat;->MODIFIER_INTEGER:I
-Landroid/icu/text/MessageFormat;->MODIFIER_PERCENT:I
-Landroid/icu/text/MessageFormat;->msgPattern:Landroid/icu/text/MessagePattern;
-Landroid/icu/text/MessageFormat;->nextTopLevelArgStart(I)I
-Landroid/icu/text/MessageFormat;->ordinalProvider:Landroid/icu/text/MessageFormat$PluralSelectorProvider;
-Landroid/icu/text/MessageFormat;->parse(ILjava/lang/String;Ljava/text/ParsePosition;[Ljava/lang/Object;Ljava/util/Map;)V
-Landroid/icu/text/MessageFormat;->parseChoiceArgument(Landroid/icu/text/MessagePattern;ILjava/lang/String;Ljava/text/ParsePosition;)D
-Landroid/icu/text/MessageFormat;->pluralProvider:Landroid/icu/text/MessageFormat$PluralSelectorProvider;
-Landroid/icu/text/MessageFormat;->resetPattern()V
-Landroid/icu/text/MessageFormat;->rootLocale:Ljava/util/Locale;
-Landroid/icu/text/MessageFormat;->setArgStartFormat(ILjava/text/Format;)V
-Landroid/icu/text/MessageFormat;->setCustomArgStartFormat(ILjava/text/Format;)V
-Landroid/icu/text/MessageFormat;->SINGLE_QUOTE:C
-Landroid/icu/text/MessageFormat;->STATE_INITIAL:I
-Landroid/icu/text/MessageFormat;->STATE_IN_QUOTE:I
-Landroid/icu/text/MessageFormat;->STATE_MSG_ELEMENT:I
-Landroid/icu/text/MessageFormat;->STATE_SINGLE_QUOTE:I
-Landroid/icu/text/MessageFormat;->stockDateFormatter:Landroid/icu/text/DateFormat;
-Landroid/icu/text/MessageFormat;->stockNumberFormatter:Landroid/icu/text/NumberFormat;
-Landroid/icu/text/MessageFormat;->typeList:[Ljava/lang/String;
-Landroid/icu/text/MessageFormat;->TYPE_DATE:I
-Landroid/icu/text/MessageFormat;->TYPE_DURATION:I
-Landroid/icu/text/MessageFormat;->TYPE_NUMBER:I
-Landroid/icu/text/MessageFormat;->TYPE_ORDINAL:I
-Landroid/icu/text/MessageFormat;->TYPE_SPELLOUT:I
-Landroid/icu/text/MessageFormat;->TYPE_TIME:I
-Landroid/icu/text/MessageFormat;->ulocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/MessageFormat;->updateMetaData(Landroid/icu/text/MessageFormat$AppendableWrapper;ILjava/text/FieldPosition;Ljava/lang/Object;)Ljava/text/FieldPosition;
-Landroid/icu/text/MessagePattern$Part;-><init>(Landroid/icu/text/MessagePattern$Part$Type;III)V
-Landroid/icu/text/MessagePattern$Part;->index:I
-Landroid/icu/text/MessagePattern$Part;->length:C
-Landroid/icu/text/MessagePattern$Part;->limitPartIndex:I
-Landroid/icu/text/MessagePattern$Part;->MAX_LENGTH:I
-Landroid/icu/text/MessagePattern$Part;->MAX_VALUE:I
-Landroid/icu/text/MessagePattern$Part;->type:Landroid/icu/text/MessagePattern$Part$Type;
-Landroid/icu/text/MessagePattern$Part;->value:S
-Landroid/icu/text/MessagePattern;->addArgDoublePart(DII)V
-Landroid/icu/text/MessagePattern;->addLimitPart(ILandroid/icu/text/MessagePattern$Part$Type;III)V
-Landroid/icu/text/MessagePattern;->addPart(Landroid/icu/text/MessagePattern$Part$Type;III)V
-Landroid/icu/text/MessagePattern;->aposMode:Landroid/icu/text/MessagePattern$ApostropheMode;
-Landroid/icu/text/MessagePattern;->appendReducedApostrophes(Ljava/lang/String;IILjava/lang/StringBuilder;)V
-Landroid/icu/text/MessagePattern;->argTypes:[Landroid/icu/text/MessagePattern$ArgType;
-Landroid/icu/text/MessagePattern;->defaultAposMode:Landroid/icu/text/MessagePattern$ApostropheMode;
-Landroid/icu/text/MessagePattern;->frozen:Z
-Landroid/icu/text/MessagePattern;->hasArgNames:Z
-Landroid/icu/text/MessagePattern;->hasArgNumbers:Z
-Landroid/icu/text/MessagePattern;->inMessageFormatPattern(I)Z
-Landroid/icu/text/MessagePattern;->inTopLevelChoiceMessage(ILandroid/icu/text/MessagePattern$ArgType;)Z
-Landroid/icu/text/MessagePattern;->isArgTypeChar(I)Z
-Landroid/icu/text/MessagePattern;->isChoice(I)Z
-Landroid/icu/text/MessagePattern;->isOrdinal(I)Z
-Landroid/icu/text/MessagePattern;->isPlural(I)Z
-Landroid/icu/text/MessagePattern;->isSelect(I)Z
-Landroid/icu/text/MessagePattern;->jdkAposMode()Z
-Landroid/icu/text/MessagePattern;->MAX_PREFIX_LENGTH:I
-Landroid/icu/text/MessagePattern;->msg:Ljava/lang/String;
-Landroid/icu/text/MessagePattern;->needsAutoQuoting:Z
-Landroid/icu/text/MessagePattern;->numericValues:Ljava/util/ArrayList;
-Landroid/icu/text/MessagePattern;->parseArg(III)I
-Landroid/icu/text/MessagePattern;->parseArgNumber(II)I
-Landroid/icu/text/MessagePattern;->parseArgNumber(Ljava/lang/CharSequence;II)I
-Landroid/icu/text/MessagePattern;->parseChoiceStyle(II)I
-Landroid/icu/text/MessagePattern;->parseDouble(IIZ)V
-Landroid/icu/text/MessagePattern;->parseMessage(IIILandroid/icu/text/MessagePattern$ArgType;)I
-Landroid/icu/text/MessagePattern;->parsePluralOrSelectStyle(Landroid/icu/text/MessagePattern$ArgType;II)I
-Landroid/icu/text/MessagePattern;->parseSimpleStyle(I)I
-Landroid/icu/text/MessagePattern;->parts:Ljava/util/ArrayList;
-Landroid/icu/text/MessagePattern;->postParse()V
-Landroid/icu/text/MessagePattern;->prefix()Ljava/lang/String;
-Landroid/icu/text/MessagePattern;->prefix(I)Ljava/lang/String;
-Landroid/icu/text/MessagePattern;->prefix(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/MessagePattern;->prefix(Ljava/lang/String;I)Ljava/lang/String;
-Landroid/icu/text/MessagePattern;->preParse(Ljava/lang/String;)V
-Landroid/icu/text/MessagePattern;->skipDouble(I)I
-Landroid/icu/text/MessagePattern;->skipIdentifier(I)I
-Landroid/icu/text/MessagePattern;->skipWhiteSpace(I)I
-Landroid/icu/text/MessagePatternUtil$ArgNode;-><init>()V
-Landroid/icu/text/MessagePatternUtil$ArgNode;->argType:Landroid/icu/text/MessagePattern$ArgType;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->complexStyle:Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->createArgNode()Landroid/icu/text/MessagePatternUtil$ArgNode;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->getArgType()Landroid/icu/text/MessagePattern$ArgType;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->getComplexStyle()Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->getName()Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->getNumber()I
-Landroid/icu/text/MessagePatternUtil$ArgNode;->getSimpleStyle()Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->getTypeName()Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->name:Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->number:I
-Landroid/icu/text/MessagePatternUtil$ArgNode;->style:Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$ArgNode;->typeName:Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;-><init>(Landroid/icu/text/MessagePattern$ArgType;)V
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->addVariant(Landroid/icu/text/MessagePatternUtil$VariantNode;)V
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->argType:Landroid/icu/text/MessagePattern$ArgType;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->explicitOffset:Z
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->freeze()Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->getArgType()Landroid/icu/text/MessagePattern$ArgType;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->getOffset()D
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->getVariants()Ljava/util/List;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->getVariantsByType(Ljava/util/List;Ljava/util/List;)Landroid/icu/text/MessagePatternUtil$VariantNode;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->hasExplicitOffset()Z
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->list:Ljava/util/List;
-Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;->offset:D
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;->ARG:Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;->REPLACE_NUMBER:Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;->TEXT:Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;->valueOf(Ljava/lang/String;)Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;->values()[Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode;-><init>(Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;)V
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode;->createReplaceNumberNode()Landroid/icu/text/MessagePatternUtil$MessageContentsNode;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode;->getType()Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageContentsNode;->type:Landroid/icu/text/MessagePatternUtil$MessageContentsNode$Type;
-Landroid/icu/text/MessagePatternUtil$MessageNode;-><init>()V
-Landroid/icu/text/MessagePatternUtil$MessageNode;->addContentsNode(Landroid/icu/text/MessagePatternUtil$MessageContentsNode;)V
-Landroid/icu/text/MessagePatternUtil$MessageNode;->freeze()Landroid/icu/text/MessagePatternUtil$MessageNode;
-Landroid/icu/text/MessagePatternUtil$MessageNode;->getContents()Ljava/util/List;
-Landroid/icu/text/MessagePatternUtil$MessageNode;->list:Ljava/util/List;
-Landroid/icu/text/MessagePatternUtil$Node;-><init>()V
-Landroid/icu/text/MessagePatternUtil$TextNode;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/MessagePatternUtil$TextNode;->getText()Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$TextNode;->text:Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$VariantNode;-><init>()V
-Landroid/icu/text/MessagePatternUtil$VariantNode;->getMessage()Landroid/icu/text/MessagePatternUtil$MessageNode;
-Landroid/icu/text/MessagePatternUtil$VariantNode;->getSelector()Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil$VariantNode;->getSelectorValue()D
-Landroid/icu/text/MessagePatternUtil$VariantNode;->isSelectorNumeric()Z
-Landroid/icu/text/MessagePatternUtil$VariantNode;->msgNode:Landroid/icu/text/MessagePatternUtil$MessageNode;
-Landroid/icu/text/MessagePatternUtil$VariantNode;->numericValue:D
-Landroid/icu/text/MessagePatternUtil$VariantNode;->selector:Ljava/lang/String;
-Landroid/icu/text/MessagePatternUtil;-><init>()V
-Landroid/icu/text/MessagePatternUtil;->buildArgNode(Landroid/icu/text/MessagePattern;II)Landroid/icu/text/MessagePatternUtil$ArgNode;
-Landroid/icu/text/MessagePatternUtil;->buildChoiceStyleNode(Landroid/icu/text/MessagePattern;II)Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;
-Landroid/icu/text/MessagePatternUtil;->buildMessageNode(Landroid/icu/text/MessagePattern;)Landroid/icu/text/MessagePatternUtil$MessageNode;
-Landroid/icu/text/MessagePatternUtil;->buildMessageNode(Landroid/icu/text/MessagePattern;II)Landroid/icu/text/MessagePatternUtil$MessageNode;
-Landroid/icu/text/MessagePatternUtil;->buildMessageNode(Ljava/lang/String;)Landroid/icu/text/MessagePatternUtil$MessageNode;
-Landroid/icu/text/MessagePatternUtil;->buildPluralStyleNode(Landroid/icu/text/MessagePattern;IILandroid/icu/text/MessagePattern$ArgType;)Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;
-Landroid/icu/text/MessagePatternUtil;->buildSelectStyleNode(Landroid/icu/text/MessagePattern;II)Landroid/icu/text/MessagePatternUtil$ComplexArgStyleNode;
-Landroid/icu/text/NFRule;-><init>(Landroid/icu/text/RuleBasedNumberFormat;Ljava/lang/String;)V
-Landroid/icu/text/NFRule;->allIgnorable(Ljava/lang/String;)Z
-Landroid/icu/text/NFRule;->baseValue:J
-Landroid/icu/text/NFRule;->decimalPoint:C
-Landroid/icu/text/NFRule;->doFormat(DLjava/lang/StringBuilder;II)V
-Landroid/icu/text/NFRule;->doFormat(JLjava/lang/StringBuilder;II)V
-Landroid/icu/text/NFRule;->doParse(Ljava/lang/String;Ljava/text/ParsePosition;ZD)Ljava/lang/Number;
-Landroid/icu/text/NFRule;->expectedExponent()S
-Landroid/icu/text/NFRule;->exponent:S
-Landroid/icu/text/NFRule;->extractSubstitution(Landroid/icu/text/NFRuleSet;Landroid/icu/text/NFRule;)Landroid/icu/text/NFSubstitution;
-Landroid/icu/text/NFRule;->extractSubstitutions(Landroid/icu/text/NFRuleSet;Ljava/lang/String;Landroid/icu/text/NFRule;)V
-Landroid/icu/text/NFRule;->findText(Ljava/lang/String;Ljava/lang/String;Landroid/icu/text/PluralFormat;I)[I
-Landroid/icu/text/NFRule;->formatter:Landroid/icu/text/RuleBasedNumberFormat;
-Landroid/icu/text/NFRule;->getBaseValue()J
-Landroid/icu/text/NFRule;->getDecimalPoint()C
-Landroid/icu/text/NFRule;->getDivisor()J
-Landroid/icu/text/NFRule;->IMPROPER_FRACTION_RULE:I
-Landroid/icu/text/NFRule;->indexOfAnyRulePrefix(Ljava/lang/String;)I
-Landroid/icu/text/NFRule;->INFINITY_RULE:I
-Landroid/icu/text/NFRule;->makeRules(Ljava/lang/String;Landroid/icu/text/NFRuleSet;Landroid/icu/text/NFRule;Landroid/icu/text/RuleBasedNumberFormat;Ljava/util/List;)V
-Landroid/icu/text/NFRule;->MASTER_RULE:I
-Landroid/icu/text/NFRule;->matchToDelimiter(Ljava/lang/String;IDLjava/lang/String;Landroid/icu/text/PluralFormat;Ljava/text/ParsePosition;Landroid/icu/text/NFSubstitution;D)Ljava/lang/Number;
-Landroid/icu/text/NFRule;->NAN_RULE:I
-Landroid/icu/text/NFRule;->NEGATIVE_NUMBER_RULE:I
-Landroid/icu/text/NFRule;->parseRuleDescriptor(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/NFRule;->power(JS)J
-Landroid/icu/text/NFRule;->prefixLength(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/NFRule;->PROPER_FRACTION_RULE:I
-Landroid/icu/text/NFRule;->radix:I
-Landroid/icu/text/NFRule;->rulePatternFormat:Landroid/icu/text/PluralFormat;
-Landroid/icu/text/NFRule;->ruleText:Ljava/lang/String;
-Landroid/icu/text/NFRule;->RULE_PREFIXES:[Ljava/lang/String;
-Landroid/icu/text/NFRule;->setBaseValue(J)V
-Landroid/icu/text/NFRule;->setDecimalFormatSymbols(Landroid/icu/text/DecimalFormatSymbols;)V
-Landroid/icu/text/NFRule;->shouldRollBack(J)Z
-Landroid/icu/text/NFRule;->stripPrefix(Ljava/lang/String;Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/String;
-Landroid/icu/text/NFRule;->sub1:Landroid/icu/text/NFSubstitution;
-Landroid/icu/text/NFRule;->sub2:Landroid/icu/text/NFSubstitution;
-Landroid/icu/text/NFRule;->ZERO:Ljava/lang/Long;
-Landroid/icu/text/NFRuleSet;-><init>(Landroid/icu/text/RuleBasedNumberFormat;[Ljava/lang/String;I)V
-Landroid/icu/text/NFRuleSet;->findFractionRuleSetRule(D)Landroid/icu/text/NFRule;
-Landroid/icu/text/NFRuleSet;->findNormalRule(J)Landroid/icu/text/NFRule;
-Landroid/icu/text/NFRuleSet;->findRule(D)Landroid/icu/text/NFRule;
-Landroid/icu/text/NFRuleSet;->format(DLjava/lang/StringBuilder;II)V
-Landroid/icu/text/NFRuleSet;->format(JLjava/lang/StringBuilder;II)V
-Landroid/icu/text/NFRuleSet;->fractionRules:Ljava/util/LinkedList;
-Landroid/icu/text/NFRuleSet;->getName()Ljava/lang/String;
-Landroid/icu/text/NFRuleSet;->IMPROPER_FRACTION_RULE_INDEX:I
-Landroid/icu/text/NFRuleSet;->INFINITY_RULE_INDEX:I
-Landroid/icu/text/NFRuleSet;->isFractionRuleSet:Z
-Landroid/icu/text/NFRuleSet;->isFractionSet()Z
-Landroid/icu/text/NFRuleSet;->isParseable()Z
-Landroid/icu/text/NFRuleSet;->isParseable:Z
-Landroid/icu/text/NFRuleSet;->isPublic()Z
-Landroid/icu/text/NFRuleSet;->lcm(JJ)J
-Landroid/icu/text/NFRuleSet;->makeIntoFractionRuleSet()V
-Landroid/icu/text/NFRuleSet;->MASTER_RULE_INDEX:I
-Landroid/icu/text/NFRuleSet;->name:Ljava/lang/String;
-Landroid/icu/text/NFRuleSet;->NAN_RULE_INDEX:I
-Landroid/icu/text/NFRuleSet;->NEGATIVE_RULE_INDEX:I
-Landroid/icu/text/NFRuleSet;->nonNumericalRules:[Landroid/icu/text/NFRule;
-Landroid/icu/text/NFRuleSet;->owner:Landroid/icu/text/RuleBasedNumberFormat;
-Landroid/icu/text/NFRuleSet;->parse(Ljava/lang/String;Ljava/text/ParsePosition;D)Ljava/lang/Number;
-Landroid/icu/text/NFRuleSet;->parseRules(Ljava/lang/String;)V
-Landroid/icu/text/NFRuleSet;->PROPER_FRACTION_RULE_INDEX:I
-Landroid/icu/text/NFRuleSet;->RECURSION_LIMIT:I
-Landroid/icu/text/NFRuleSet;->rules:[Landroid/icu/text/NFRule;
-Landroid/icu/text/NFRuleSet;->setBestFractionRule(ILandroid/icu/text/NFRule;Z)V
-Landroid/icu/text/NFRuleSet;->setDecimalFormatSymbols(Landroid/icu/text/DecimalFormatSymbols;)V
-Landroid/icu/text/NFRuleSet;->setNonNumericalRule(Landroid/icu/text/NFRule;)V
-Landroid/icu/text/NFSubstitution;-><init>(ILandroid/icu/text/NFRuleSet;Ljava/lang/String;)V
-Landroid/icu/text/NFSubstitution;->calcUpperBound(D)D
-Landroid/icu/text/NFSubstitution;->composeRuleValue(DD)D
-Landroid/icu/text/NFSubstitution;->doParse(Ljava/lang/String;Ljava/text/ParsePosition;DDZ)Ljava/lang/Number;
-Landroid/icu/text/NFSubstitution;->doSubstitution(DLjava/lang/StringBuilder;II)V
-Landroid/icu/text/NFSubstitution;->doSubstitution(JLjava/lang/StringBuilder;II)V
-Landroid/icu/text/NFSubstitution;->getPos()I
-Landroid/icu/text/NFSubstitution;->isModulusSubstitution()Z
-Landroid/icu/text/NFSubstitution;->makeSubstitution(ILandroid/icu/text/NFRule;Landroid/icu/text/NFRule;Landroid/icu/text/NFRuleSet;Landroid/icu/text/RuleBasedNumberFormat;Ljava/lang/String;)Landroid/icu/text/NFSubstitution;
-Landroid/icu/text/NFSubstitution;->MAX_INT64_IN_DOUBLE:J
-Landroid/icu/text/NFSubstitution;->numberFormat:Landroid/icu/text/DecimalFormat;
-Landroid/icu/text/NFSubstitution;->pos:I
-Landroid/icu/text/NFSubstitution;->ruleSet:Landroid/icu/text/NFRuleSet;
-Landroid/icu/text/NFSubstitution;->setDecimalFormatSymbols(Landroid/icu/text/DecimalFormatSymbols;)V
-Landroid/icu/text/NFSubstitution;->setDivisor(IS)V
-Landroid/icu/text/NFSubstitution;->tokenChar()C
-Landroid/icu/text/NFSubstitution;->transformNumber(D)D
-Landroid/icu/text/NFSubstitution;->transformNumber(J)J
-Landroid/icu/text/Normalizer$CharsAppendable;-><init>([CII)V
-Landroid/icu/text/Normalizer$CharsAppendable;->chars:[C
-Landroid/icu/text/Normalizer$CharsAppendable;->length()I
-Landroid/icu/text/Normalizer$CharsAppendable;->limit:I
-Landroid/icu/text/Normalizer$CharsAppendable;->offset:I
-Landroid/icu/text/Normalizer$CharsAppendable;->start:I
-Landroid/icu/text/Normalizer$CmpEquivLevel;-><init>()V
-Landroid/icu/text/Normalizer$CmpEquivLevel;->cs:Ljava/lang/CharSequence;
-Landroid/icu/text/Normalizer$CmpEquivLevel;->s:I
-Landroid/icu/text/Normalizer$FCD32ModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$FCD32ModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$FCDMode;-><init>()V
-Landroid/icu/text/Normalizer$FCDMode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$FCDModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$FCDModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$Mode;-><init>()V
-Landroid/icu/text/Normalizer$Mode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$ModeImpl;-><init>(Landroid/icu/text/Normalizer2;)V
-Landroid/icu/text/Normalizer$ModeImpl;->normalizer2:Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$NFC32ModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFC32ModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFCMode;-><init>()V
-Landroid/icu/text/Normalizer$NFCMode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$NFCModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFCModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFD32ModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFD32ModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFDMode;-><init>()V
-Landroid/icu/text/Normalizer$NFDMode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$NFDModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFDModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFKC32ModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFKC32ModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFKCMode;-><init>()V
-Landroid/icu/text/Normalizer$NFKCMode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$NFKCModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFKCModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFKD32ModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFKD32ModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFKDMode;-><init>()V
-Landroid/icu/text/Normalizer$NFKDMode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$NFKDModeImpl;-><init>()V
-Landroid/icu/text/Normalizer$NFKDModeImpl;->INSTANCE:Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NONEMode;-><init>()V
-Landroid/icu/text/Normalizer$NONEMode;->getNormalizer2(I)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$QuickCheckResult;-><init>(I)V
-Landroid/icu/text/Normalizer$Unicode32;-><init>()V
-Landroid/icu/text/Normalizer$Unicode32;->INSTANCE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/Normalizer2;-><init>()V
-Landroid/icu/text/Normalizer;-><init>(Landroid/icu/text/UCharacterIterator;Landroid/icu/text/Normalizer$Mode;I)V
-Landroid/icu/text/Normalizer;-><init>(Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;I)V
-Landroid/icu/text/Normalizer;-><init>(Ljava/text/CharacterIterator;Landroid/icu/text/Normalizer$Mode;I)V
-Landroid/icu/text/Normalizer;->buffer:Ljava/lang/StringBuilder;
-Landroid/icu/text/Normalizer;->bufferPos:I
-Landroid/icu/text/Normalizer;->clearBuffer()V
-Landroid/icu/text/Normalizer;->cmpEquivFold(Ljava/lang/CharSequence;Ljava/lang/CharSequence;I)I
-Landroid/icu/text/Normalizer;->COMPARE_EQUIV:I
-Landroid/icu/text/Normalizer;->COMPARE_NORM_OPTIONS_SHIFT:I
-Landroid/icu/text/Normalizer;->compose(Ljava/lang/String;Z)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->compose(Ljava/lang/String;ZI)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->compose([CII[CIIZI)I
-Landroid/icu/text/Normalizer;->compose([C[CZI)I
-Landroid/icu/text/Normalizer;->COMPOSE:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->COMPOSE_COMPAT:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->concatenate(Ljava/lang/String;Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;I)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->concatenate([CII[CII[CIILandroid/icu/text/Normalizer$Mode;I)I
-Landroid/icu/text/Normalizer;->concatenate([C[CLandroid/icu/text/Normalizer$Mode;I)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->createCmpEquivLevelStack()[Landroid/icu/text/Normalizer$CmpEquivLevel;
-Landroid/icu/text/Normalizer;->current()I
-Landroid/icu/text/Normalizer;->currentIndex:I
-Landroid/icu/text/Normalizer;->DECOMP:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->decompose(Ljava/lang/String;Z)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->decompose(Ljava/lang/String;ZI)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->decompose([CII[CIIZI)I
-Landroid/icu/text/Normalizer;->decompose([C[CZI)I
-Landroid/icu/text/Normalizer;->DECOMP_COMPAT:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->DEFAULT:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->DONE:I
-Landroid/icu/text/Normalizer;->endIndex()I
-Landroid/icu/text/Normalizer;->FCD:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->first()I
-Landroid/icu/text/Normalizer;->getBeginIndex()I
-Landroid/icu/text/Normalizer;->getComposeNormalizer2(ZI)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer;->getDecomposeNormalizer2(ZI)Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer;->getEndIndex()I
-Landroid/icu/text/Normalizer;->getFC_NFKC_Closure(I)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->getFC_NFKC_Closure(I[C)I
-Landroid/icu/text/Normalizer;->getIndex()I
-Landroid/icu/text/Normalizer;->getLength()I
-Landroid/icu/text/Normalizer;->getMode()Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->getOption(I)I
-Landroid/icu/text/Normalizer;->getText()Ljava/lang/String;
-Landroid/icu/text/Normalizer;->getText([C)I
-Landroid/icu/text/Normalizer;->IGNORE_HANGUL:I
-Landroid/icu/text/Normalizer;->internalCompare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;I)I
-Landroid/icu/text/Normalizer;->isNormalized(ILandroid/icu/text/Normalizer$Mode;I)Z
-Landroid/icu/text/Normalizer;->isNormalized(Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;I)Z
-Landroid/icu/text/Normalizer;->isNormalized([CIILandroid/icu/text/Normalizer$Mode;I)Z
-Landroid/icu/text/Normalizer;->last()I
-Landroid/icu/text/Normalizer;->mode:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->next()I
-Landroid/icu/text/Normalizer;->nextIndex:I
-Landroid/icu/text/Normalizer;->nextNormalize()Z
-Landroid/icu/text/Normalizer;->NFC:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->NFD:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->NFKC:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->NFKD:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->NONE:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->norm2:Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer;->normalize(ILandroid/icu/text/Normalizer$Mode;)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->normalize(ILandroid/icu/text/Normalizer$Mode;I)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->normalize(Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->normalize(Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;I)Ljava/lang/String;
-Landroid/icu/text/Normalizer;->normalize([CII[CIILandroid/icu/text/Normalizer$Mode;I)I
-Landroid/icu/text/Normalizer;->normalize([C[CLandroid/icu/text/Normalizer$Mode;I)I
-Landroid/icu/text/Normalizer;->NO_OP:Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer;->options:I
-Landroid/icu/text/Normalizer;->previous()I
-Landroid/icu/text/Normalizer;->previousNormalize()Z
-Landroid/icu/text/Normalizer;->quickCheck(Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;)Landroid/icu/text/Normalizer$QuickCheckResult;
-Landroid/icu/text/Normalizer;->quickCheck(Ljava/lang/String;Landroid/icu/text/Normalizer$Mode;I)Landroid/icu/text/Normalizer$QuickCheckResult;
-Landroid/icu/text/Normalizer;->quickCheck([CIILandroid/icu/text/Normalizer$Mode;I)Landroid/icu/text/Normalizer$QuickCheckResult;
-Landroid/icu/text/Normalizer;->quickCheck([CLandroid/icu/text/Normalizer$Mode;I)Landroid/icu/text/Normalizer$QuickCheckResult;
-Landroid/icu/text/Normalizer;->reset()V
-Landroid/icu/text/Normalizer;->setIndex(I)I
-Landroid/icu/text/Normalizer;->setIndexOnly(I)V
-Landroid/icu/text/Normalizer;->setMode(Landroid/icu/text/Normalizer$Mode;)V
-Landroid/icu/text/Normalizer;->setOption(IZ)V
-Landroid/icu/text/Normalizer;->setText(Landroid/icu/text/UCharacterIterator;)V
-Landroid/icu/text/Normalizer;->setText(Ljava/lang/String;)V
-Landroid/icu/text/Normalizer;->setText(Ljava/lang/StringBuffer;)V
-Landroid/icu/text/Normalizer;->setText(Ljava/text/CharacterIterator;)V
-Landroid/icu/text/Normalizer;->setText([C)V
-Landroid/icu/text/Normalizer;->startIndex()I
-Landroid/icu/text/Normalizer;->text:Landroid/icu/text/UCharacterIterator;
-Landroid/icu/text/Normalizer;->UNICODE_3_2:I
-Landroid/icu/text/NumberFormat$NumberFormatFactory;-><init>()V
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->createFormat(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->createFormat(Ljava/util/Locale;I)Landroid/icu/text/NumberFormat;
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->FORMAT_CURRENCY:I
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->FORMAT_INTEGER:I
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->FORMAT_NUMBER:I
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->FORMAT_PERCENT:I
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->FORMAT_SCIENTIFIC:I
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->getSupportedLocaleNames()Ljava/util/Set;
-Landroid/icu/text/NumberFormat$NumberFormatFactory;->visible()Z
-Landroid/icu/text/NumberFormat$NumberFormatShim;-><init>()V
-Landroid/icu/text/NumberFormat$NumberFormatShim;->createInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;
-Landroid/icu/text/NumberFormat$NumberFormatShim;->getAvailableLocales()[Ljava/util/Locale;
-Landroid/icu/text/NumberFormat$NumberFormatShim;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/NumberFormat$NumberFormatShim;->registerFactory(Landroid/icu/text/NumberFormat$NumberFormatFactory;)Ljava/lang/Object;
-Landroid/icu/text/NumberFormat$NumberFormatShim;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;-><init>(Landroid/icu/util/ULocale;Z)V
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;-><init>(Ljava/util/Locale;)V
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;-><init>(Ljava/util/Locale;Z)V
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;->getSupportedLocaleNames()Ljava/util/Set;
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;->localeNames:Ljava/util/Set;
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;->visible()Z
-Landroid/icu/text/NumberFormat$SimpleNumberFormatFactory;->visible:Z
-Landroid/icu/text/NumberFormat;->capitalizationSetting:Landroid/icu/text/DisplayContext;
-Landroid/icu/text/NumberFormat;->createInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;
-Landroid/icu/text/NumberFormat;->currency:Landroid/icu/util/Currency;
-Landroid/icu/text/NumberFormat;->currentSerialVersion:I
-Landroid/icu/text/NumberFormat;->doubleCurrencySign:[C
-Landroid/icu/text/NumberFormat;->doubleCurrencyStr:Ljava/lang/String;
-Landroid/icu/text/NumberFormat;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/NumberFormat;->getEffectiveCurrency()Landroid/icu/util/Currency;
-Landroid/icu/text/NumberFormat;->getPattern(Ljava/util/Locale;I)Ljava/lang/String;
-Landroid/icu/text/NumberFormat;->getPatternForStyle(Landroid/icu/util/ULocale;I)Ljava/lang/String;
-Landroid/icu/text/NumberFormat;->getPatternForStyleAndNumberingSystem(Landroid/icu/util/ULocale;Ljava/lang/String;I)Ljava/lang/String;
-Landroid/icu/text/NumberFormat;->getShim()Landroid/icu/text/NumberFormat$NumberFormatShim;
-Landroid/icu/text/NumberFormat;->groupingUsed:Z
-Landroid/icu/text/NumberFormat;->maxFractionDigits:B
-Landroid/icu/text/NumberFormat;->maximumFractionDigits:I
-Landroid/icu/text/NumberFormat;->maximumIntegerDigits:I
-Landroid/icu/text/NumberFormat;->maxIntegerDigits:B
-Landroid/icu/text/NumberFormat;->minFractionDigits:B
-Landroid/icu/text/NumberFormat;->minimumFractionDigits:I
-Landroid/icu/text/NumberFormat;->minimumIntegerDigits:I
-Landroid/icu/text/NumberFormat;->minIntegerDigits:B
-Landroid/icu/text/NumberFormat;->parseIntegerOnly:Z
-Landroid/icu/text/NumberFormat;->parseStrict:Z
-Landroid/icu/text/NumberFormat;->registerFactory(Landroid/icu/text/NumberFormat$NumberFormatFactory;)Ljava/lang/Object;
-Landroid/icu/text/NumberFormat;->serialVersionOnStream:I
-Landroid/icu/text/NumberFormat;->shim:Landroid/icu/text/NumberFormat$NumberFormatShim;
-Landroid/icu/text/NumberFormat;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/text/NumberingSystem$LocaleLookupData;-><init>(Landroid/icu/util/ULocale;Ljava/lang/String;)V
-Landroid/icu/text/NumberingSystem$LocaleLookupData;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/NumberingSystem$LocaleLookupData;->numbersKeyword:Ljava/lang/String;
-Landroid/icu/text/NumberingSystem;->algorithmic:Z
-Landroid/icu/text/NumberingSystem;->cachedLocaleData:Landroid/icu/impl/CacheBase;
-Landroid/icu/text/NumberingSystem;->cachedStringData:Landroid/icu/impl/CacheBase;
-Landroid/icu/text/NumberingSystem;->desc:Ljava/lang/String;
-Landroid/icu/text/NumberingSystem;->getInstance(Ljava/lang/String;IZLjava/lang/String;)Landroid/icu/text/NumberingSystem;
-Landroid/icu/text/NumberingSystem;->LATIN:Landroid/icu/text/NumberingSystem;
-Landroid/icu/text/NumberingSystem;->lookupInstanceByLocale(Landroid/icu/text/NumberingSystem$LocaleLookupData;)Landroid/icu/text/NumberingSystem;
-Landroid/icu/text/NumberingSystem;->lookupInstanceByName(Ljava/lang/String;)Landroid/icu/text/NumberingSystem;
-Landroid/icu/text/NumberingSystem;->name:Ljava/lang/String;
-Landroid/icu/text/NumberingSystem;->OTHER_NS_KEYWORDS:[Ljava/lang/String;
-Landroid/icu/text/NumberingSystem;->radix:I
-Landroid/icu/text/PluralFormat$PluralSelector;->select(Ljava/lang/Object;D)Ljava/lang/String;
-Landroid/icu/text/PluralFormat$PluralSelectorAdapter;->select(Ljava/lang/Object;D)Ljava/lang/String;
-Landroid/icu/text/PluralFormat;-><init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;Ljava/lang/String;Landroid/icu/text/NumberFormat;)V
-Landroid/icu/text/PluralFormat;->findSubMessage(Landroid/icu/text/MessagePattern;ILandroid/icu/text/PluralFormat$PluralSelector;Ljava/lang/Object;D)I
-Landroid/icu/text/PluralFormat;->format(Ljava/lang/Number;D)Ljava/lang/String;
-Landroid/icu/text/PluralFormat;->init(Landroid/icu/text/PluralRules;Landroid/icu/text/PluralRules$PluralType;Landroid/icu/util/ULocale;Landroid/icu/text/NumberFormat;)V
-Landroid/icu/text/PluralFormat;->msgPattern:Landroid/icu/text/MessagePattern;
-Landroid/icu/text/PluralFormat;->numberFormat:Landroid/icu/text/NumberFormat;
-Landroid/icu/text/PluralFormat;->offset:D
-Landroid/icu/text/PluralFormat;->parsedValues:Ljava/util/Map;
-Landroid/icu/text/PluralFormat;->parseType(Ljava/lang/String;Landroid/icu/text/RbnfLenientScanner;Ljava/text/FieldPosition;)Ljava/lang/String;
-Landroid/icu/text/PluralFormat;->pattern:Ljava/lang/String;
-Landroid/icu/text/PluralFormat;->pluralRules:Landroid/icu/text/PluralRules;
-Landroid/icu/text/PluralFormat;->pluralRulesWrapper:Landroid/icu/text/PluralFormat$PluralSelectorAdapter;
-Landroid/icu/text/PluralFormat;->resetPattern()V
-Landroid/icu/text/PluralFormat;->setLocale(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/PluralFormat;->ulocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/PluralRanges$Matrix;-><init>()V
-Landroid/icu/text/PluralRanges$Matrix;->compareTo(Landroid/icu/text/PluralRanges$Matrix;)I
-Landroid/icu/text/PluralRanges$Matrix;->data:[B
-Landroid/icu/text/PluralRanges$Matrix;->endSame(Landroid/icu/impl/StandardPlural;)Landroid/icu/impl/StandardPlural;
-Landroid/icu/text/PluralRanges$Matrix;->get(Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;)Landroid/icu/impl/StandardPlural;
-Landroid/icu/text/PluralRanges$Matrix;->set(Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;)V
-Landroid/icu/text/PluralRanges$Matrix;->setIfNew(Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;)V
-Landroid/icu/text/PluralRanges$Matrix;->startSame(Landroid/icu/impl/StandardPlural;Ljava/util/EnumSet;Landroid/icu/util/Output;)Landroid/icu/impl/StandardPlural;
-Landroid/icu/text/PluralRanges;-><init>()V
-Landroid/icu/text/PluralRanges;->add(Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;)V
-Landroid/icu/text/PluralRanges;->compareTo(Landroid/icu/text/PluralRanges;)I
-Landroid/icu/text/PluralRanges;->explicit:[Z
-Landroid/icu/text/PluralRanges;->get(Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;)Landroid/icu/impl/StandardPlural;
-Landroid/icu/text/PluralRanges;->isExplicit(Landroid/icu/impl/StandardPlural;Landroid/icu/impl/StandardPlural;)Z
-Landroid/icu/text/PluralRanges;->isExplicitlySet(Landroid/icu/impl/StandardPlural;)Z
-Landroid/icu/text/PluralRanges;->isFrozen:Z
-Landroid/icu/text/PluralRanges;->matrix:Landroid/icu/text/PluralRanges$Matrix;
-Landroid/icu/text/PluralRules$AndConstraint;-><init>(Landroid/icu/text/PluralRules$Constraint;Landroid/icu/text/PluralRules$Constraint;)V
-Landroid/icu/text/PluralRules$AndConstraint;->isFulfilled(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-Landroid/icu/text/PluralRules$AndConstraint;->isLimited(Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules$BinaryConstraint;-><init>(Landroid/icu/text/PluralRules$Constraint;Landroid/icu/text/PluralRules$Constraint;)V
-Landroid/icu/text/PluralRules$BinaryConstraint;->a:Landroid/icu/text/PluralRules$Constraint;
-Landroid/icu/text/PluralRules$BinaryConstraint;->b:Landroid/icu/text/PluralRules$Constraint;
-Landroid/icu/text/PluralRules$Constraint;->isFulfilled(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-Landroid/icu/text/PluralRules$Constraint;->isLimited(Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules$Factory;-><init>()V
-Landroid/icu/text/PluralRules$Factory;->forLocale(Landroid/icu/util/ULocale;)Landroid/icu/text/PluralRules;
-Landroid/icu/text/PluralRules$Factory;->forLocale(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)Landroid/icu/text/PluralRules;
-Landroid/icu/text/PluralRules$Factory;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/PluralRules$Factory;->getDefaultFactory()Landroid/icu/impl/PluralRulesLoader;
-Landroid/icu/text/PluralRules$Factory;->getFunctionalEquivalent(Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;
-Landroid/icu/text/PluralRules$Factory;->hasOverride(Landroid/icu/util/ULocale;)Z
-Landroid/icu/text/PluralRules$FixedDecimal;-><init>(D)V
-Landroid/icu/text/PluralRules$FixedDecimal;-><init>(DI)V
-Landroid/icu/text/PluralRules$FixedDecimal;-><init>(DIJ)V
-Landroid/icu/text/PluralRules$FixedDecimal;-><init>(J)V
-Landroid/icu/text/PluralRules$FixedDecimal;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/PluralRules$FixedDecimal;->baseFactor:I
-Landroid/icu/text/PluralRules$FixedDecimal;->compareTo(Landroid/icu/text/PluralRules$FixedDecimal;)I
-Landroid/icu/text/PluralRules$FixedDecimal;->decimalDigits:J
-Landroid/icu/text/PluralRules$FixedDecimal;->decimalDigitsWithoutTrailingZeros:J
-Landroid/icu/text/PluralRules$FixedDecimal;->decimals(D)I
-Landroid/icu/text/PluralRules$FixedDecimal;->getBaseFactor()I
-Landroid/icu/text/PluralRules$FixedDecimal;->getDecimalDigits()J
-Landroid/icu/text/PluralRules$FixedDecimal;->getDecimalDigitsWithoutTrailingZeros()J
-Landroid/icu/text/PluralRules$FixedDecimal;->getFractionalDigits(DI)I
-Landroid/icu/text/PluralRules$FixedDecimal;->getIntegerValue()J
-Landroid/icu/text/PluralRules$FixedDecimal;->getOperand(Ljava/lang/String;)Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$FixedDecimal;->getPluralOperand(Landroid/icu/text/PluralRules$Operand;)D
-Landroid/icu/text/PluralRules$FixedDecimal;->getShiftedValue()J
-Landroid/icu/text/PluralRules$FixedDecimal;->getSource()D
-Landroid/icu/text/PluralRules$FixedDecimal;->getVisibleDecimalDigitCount()I
-Landroid/icu/text/PluralRules$FixedDecimal;->getVisibleDecimalDigitCountWithoutTrailingZeros()I
-Landroid/icu/text/PluralRules$FixedDecimal;->getVisibleFractionCount(Ljava/lang/String;)I
-Landroid/icu/text/PluralRules$FixedDecimal;->hasIntegerValue()Z
-Landroid/icu/text/PluralRules$FixedDecimal;->hasIntegerValue:Z
-Landroid/icu/text/PluralRules$FixedDecimal;->integerValue:J
-Landroid/icu/text/PluralRules$FixedDecimal;->isHasIntegerValue()Z
-Landroid/icu/text/PluralRules$FixedDecimal;->isInfinite()Z
-Landroid/icu/text/PluralRules$FixedDecimal;->isNaN()Z
-Landroid/icu/text/PluralRules$FixedDecimal;->isNegative()Z
-Landroid/icu/text/PluralRules$FixedDecimal;->isNegative:Z
-Landroid/icu/text/PluralRules$FixedDecimal;->MAX:J
-Landroid/icu/text/PluralRules$FixedDecimal;->MAX_INTEGER_PART:J
-Landroid/icu/text/PluralRules$FixedDecimal;->source:D
-Landroid/icu/text/PluralRules$FixedDecimal;->visibleDecimalDigitCount:I
-Landroid/icu/text/PluralRules$FixedDecimal;->visibleDecimalDigitCountWithoutTrailingZeros:I
-Landroid/icu/text/PluralRules$FixedDecimalRange;-><init>(Landroid/icu/text/PluralRules$FixedDecimal;Landroid/icu/text/PluralRules$FixedDecimal;)V
-Landroid/icu/text/PluralRules$FixedDecimalRange;->end:Landroid/icu/text/PluralRules$FixedDecimal;
-Landroid/icu/text/PluralRules$FixedDecimalRange;->start:Landroid/icu/text/PluralRules$FixedDecimal;
-Landroid/icu/text/PluralRules$FixedDecimalSamples;-><init>(Landroid/icu/text/PluralRules$SampleType;Ljava/util/Set;Z)V
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->addSamples(Ljava/util/Set;)Ljava/util/Set;
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->bounded:Z
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->checkDecimal(Landroid/icu/text/PluralRules$SampleType;Landroid/icu/text/PluralRules$FixedDecimal;)V
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->getSamples()Ljava/util/Set;
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->getStartEndSamples(Ljava/util/Set;)V
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->parse(Ljava/lang/String;)Landroid/icu/text/PluralRules$FixedDecimalSamples;
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->samples:Ljava/util/Set;
-Landroid/icu/text/PluralRules$FixedDecimalSamples;->sampleType:Landroid/icu/text/PluralRules$SampleType;
-Landroid/icu/text/PluralRules$IFixedDecimal;->getPluralOperand(Landroid/icu/text/PluralRules$Operand;)D
-Landroid/icu/text/PluralRules$IFixedDecimal;->isInfinite()Z
-Landroid/icu/text/PluralRules$IFixedDecimal;->isNaN()Z
-Landroid/icu/text/PluralRules$KeywordStatus;->BOUNDED:Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$KeywordStatus;->INVALID:Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$KeywordStatus;->SUPPRESSED:Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$KeywordStatus;->UNBOUNDED:Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$KeywordStatus;->UNIQUE:Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$KeywordStatus;->valueOf(Ljava/lang/String;)Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$KeywordStatus;->values()[Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules$Operand;->f:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->i:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->j:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->n:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->t:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->v:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->valueOf(Ljava/lang/String;)Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->values()[Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$Operand;->w:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$OrConstraint;-><init>(Landroid/icu/text/PluralRules$Constraint;Landroid/icu/text/PluralRules$Constraint;)V
-Landroid/icu/text/PluralRules$OrConstraint;->isFulfilled(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-Landroid/icu/text/PluralRules$OrConstraint;->isLimited(Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules$RangeConstraint;-><init>(IZLandroid/icu/text/PluralRules$Operand;ZDD[J)V
-Landroid/icu/text/PluralRules$RangeConstraint;->inRange:Z
-Landroid/icu/text/PluralRules$RangeConstraint;->integersOnly:Z
-Landroid/icu/text/PluralRules$RangeConstraint;->isFulfilled(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-Landroid/icu/text/PluralRules$RangeConstraint;->isLimited(Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules$RangeConstraint;->lowerBound:D
-Landroid/icu/text/PluralRules$RangeConstraint;->mod:I
-Landroid/icu/text/PluralRules$RangeConstraint;->operand:Landroid/icu/text/PluralRules$Operand;
-Landroid/icu/text/PluralRules$RangeConstraint;->range_list:[J
-Landroid/icu/text/PluralRules$RangeConstraint;->upperBound:D
-Landroid/icu/text/PluralRules$Rule;-><init>(Ljava/lang/String;Landroid/icu/text/PluralRules$Constraint;Landroid/icu/text/PluralRules$FixedDecimalSamples;Landroid/icu/text/PluralRules$FixedDecimalSamples;)V
-Landroid/icu/text/PluralRules$Rule;->and(Landroid/icu/text/PluralRules$Constraint;)Landroid/icu/text/PluralRules$Rule;
-Landroid/icu/text/PluralRules$Rule;->appliesTo(Landroid/icu/text/PluralRules$IFixedDecimal;)Z
-Landroid/icu/text/PluralRules$Rule;->constraint:Landroid/icu/text/PluralRules$Constraint;
-Landroid/icu/text/PluralRules$Rule;->decimalSamples:Landroid/icu/text/PluralRules$FixedDecimalSamples;
-Landroid/icu/text/PluralRules$Rule;->getConstraint()Ljava/lang/String;
-Landroid/icu/text/PluralRules$Rule;->getKeyword()Ljava/lang/String;
-Landroid/icu/text/PluralRules$Rule;->integerSamples:Landroid/icu/text/PluralRules$FixedDecimalSamples;
-Landroid/icu/text/PluralRules$Rule;->isLimited(Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules$Rule;->keyword:Ljava/lang/String;
-Landroid/icu/text/PluralRules$Rule;->or(Landroid/icu/text/PluralRules$Constraint;)Landroid/icu/text/PluralRules$Rule;
-Landroid/icu/text/PluralRules$RuleList;-><init>()V
-Landroid/icu/text/PluralRules$RuleList;->addRule(Landroid/icu/text/PluralRules$Rule;)Landroid/icu/text/PluralRules$RuleList;
-Landroid/icu/text/PluralRules$RuleList;->computeLimited(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules$RuleList;->finish()Landroid/icu/text/PluralRules$RuleList;
-Landroid/icu/text/PluralRules$RuleList;->getDecimalSamples(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Landroid/icu/text/PluralRules$FixedDecimalSamples;
-Landroid/icu/text/PluralRules$RuleList;->getKeywords()Ljava/util/Set;
-Landroid/icu/text/PluralRules$RuleList;->getRules(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/PluralRules$RuleList;->hasExplicitBoundingInfo:Z
-Landroid/icu/text/PluralRules$RuleList;->isLimited(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules$RuleList;->rules:Ljava/util/List;
-Landroid/icu/text/PluralRules$RuleList;->select(Landroid/icu/text/PluralRules$IFixedDecimal;)Ljava/lang/String;
-Landroid/icu/text/PluralRules$RuleList;->select(Landroid/icu/text/PluralRules$IFixedDecimal;Ljava/lang/String;)Z
-Landroid/icu/text/PluralRules$RuleList;->selectRule(Landroid/icu/text/PluralRules$IFixedDecimal;)Landroid/icu/text/PluralRules$Rule;
-Landroid/icu/text/PluralRules$SampleType;->DECIMAL:Landroid/icu/text/PluralRules$SampleType;
-Landroid/icu/text/PluralRules$SampleType;->INTEGER:Landroid/icu/text/PluralRules$SampleType;
-Landroid/icu/text/PluralRules$SampleType;->valueOf(Ljava/lang/String;)Landroid/icu/text/PluralRules$SampleType;
-Landroid/icu/text/PluralRules$SampleType;->values()[Landroid/icu/text/PluralRules$SampleType;
-Landroid/icu/text/PluralRules$SimpleTokenizer;-><init>()V
-Landroid/icu/text/PluralRules$SimpleTokenizer;->BREAK_AND_IGNORE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/PluralRules$SimpleTokenizer;->BREAK_AND_KEEP:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/PluralRules$SimpleTokenizer;->split(Ljava/lang/String;)[Ljava/lang/String;
-Landroid/icu/text/PluralRules;-><init>(Landroid/icu/text/PluralRules$RuleList;)V
-Landroid/icu/text/PluralRules;->addConditional(Ljava/util/Set;Ljava/util/Set;D)Z
-Landroid/icu/text/PluralRules;->addRange(Ljava/lang/StringBuilder;DDZ)V
-Landroid/icu/text/PluralRules;->addSample(Ljava/lang/String;Ljava/lang/Number;ILjava/util/Set;)Z
-Landroid/icu/text/PluralRules;->ALLOWED_ID:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/PluralRules;->AND_SEPARATED:Ljava/util/regex/Pattern;
-Landroid/icu/text/PluralRules;->AT_SEPARATED:Ljava/util/regex/Pattern;
-Landroid/icu/text/PluralRules;->CATEGORY_SEPARATOR:Ljava/lang/String;
-Landroid/icu/text/PluralRules;->COMMA_SEPARATED:Ljava/util/regex/Pattern;
-Landroid/icu/text/PluralRules;->compareTo(Landroid/icu/text/PluralRules;)I
-Landroid/icu/text/PluralRules;->computeLimited(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules;->DEFAULT_RULE:Landroid/icu/text/PluralRules$Rule;
-Landroid/icu/text/PluralRules;->DOTDOT_SEPARATED:Ljava/util/regex/Pattern;
-Landroid/icu/text/PluralRules;->format(D)Ljava/lang/String;
-Landroid/icu/text/PluralRules;->getAllKeywordValues(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Ljava/util/Collection;
-Landroid/icu/text/PluralRules;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/PluralRules;->getDecimalSamples(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Landroid/icu/text/PluralRules$FixedDecimalSamples;
-Landroid/icu/text/PluralRules;->getFunctionalEquivalent(Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;
-Landroid/icu/text/PluralRules;->getKeywordStatus(Ljava/lang/String;ILjava/util/Set;Landroid/icu/util/Output;)Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules;->getKeywordStatus(Ljava/lang/String;ILjava/util/Set;Landroid/icu/util/Output;Landroid/icu/text/PluralRules$SampleType;)Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralRules;->getRules(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/PluralRules;->getSamples(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Ljava/util/Collection;
-Landroid/icu/text/PluralRules;->isLimited(Ljava/lang/String;)Ljava/lang/Boolean;
-Landroid/icu/text/PluralRules;->isLimited(Ljava/lang/String;Landroid/icu/text/PluralRules$SampleType;)Z
-Landroid/icu/text/PluralRules;->isValidKeyword(Ljava/lang/String;)Z
-Landroid/icu/text/PluralRules;->keywords:Ljava/util/Set;
-Landroid/icu/text/PluralRules;->KEYWORD_RULE_SEPARATOR:Ljava/lang/String;
-Landroid/icu/text/PluralRules;->matches(Landroid/icu/text/PluralRules$FixedDecimal;Ljava/lang/String;)Z
-Landroid/icu/text/PluralRules;->nextToken([Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/PluralRules;->NO_CONSTRAINT:Landroid/icu/text/PluralRules$Constraint;
-Landroid/icu/text/PluralRules;->OR_SEPARATED:Ljava/util/regex/Pattern;
-Landroid/icu/text/PluralRules;->parseConstraint(Ljava/lang/String;)Landroid/icu/text/PluralRules$Constraint;
-Landroid/icu/text/PluralRules;->parseRule(Ljava/lang/String;)Landroid/icu/text/PluralRules$Rule;
-Landroid/icu/text/PluralRules;->parseRuleChain(Ljava/lang/String;)Landroid/icu/text/PluralRules$RuleList;
-Landroid/icu/text/PluralRules;->rules:Landroid/icu/text/PluralRules$RuleList;
-Landroid/icu/text/PluralRules;->select(DIJ)Ljava/lang/String;
-Landroid/icu/text/PluralRules;->select(Landroid/icu/text/PluralRules$IFixedDecimal;)Ljava/lang/String;
-Landroid/icu/text/PluralRules;->SEMI_SEPARATED:Ljava/util/regex/Pattern;
-Landroid/icu/text/PluralRules;->TILDE_SEPARATED:Ljava/util/regex/Pattern;
-Landroid/icu/text/PluralRules;->unexpected(Ljava/lang/String;Ljava/lang/String;)Ljava/text/ParseException;
-Landroid/icu/text/PluralSamples;-><init>(Landroid/icu/text/PluralRules;)V
-Landroid/icu/text/PluralSamples;->addIfNotPresent(DLjava/util/Set;Ljava/util/Map;)Z
-Landroid/icu/text/PluralSamples;->addRelation(Ljava/util/Map;Ljava/lang/String;Landroid/icu/text/PluralRules$FixedDecimal;)V
-Landroid/icu/text/PluralSamples;->addSimpleSamples(Landroid/icu/text/PluralRules;ILjava/util/Map;ID)I
-Landroid/icu/text/PluralSamples;->fractions(Ljava/util/Set;)Ljava/util/Set;
-Landroid/icu/text/PluralSamples;->getAllKeywordValues(Ljava/lang/String;)Ljava/util/Collection;
-Landroid/icu/text/PluralSamples;->getDifferentCategory(Ljava/util/List;Ljava/lang/String;)Ljava/lang/Integer;
-Landroid/icu/text/PluralSamples;->getFractionSamples()Ljava/util/Set;
-Landroid/icu/text/PluralSamples;->getKeyFractionSamplesMap()Ljava/util/Map;
-Landroid/icu/text/PluralSamples;->getKeySamplesMap()Ljava/util/Map;
-Landroid/icu/text/PluralSamples;->getStatus(Ljava/lang/String;ILjava/util/Set;Landroid/icu/util/Output;)Landroid/icu/text/PluralRules$KeywordStatus;
-Landroid/icu/text/PluralSamples;->LIMIT_FRACTION_SAMPLES:I
-Landroid/icu/text/PluralSamples;->pluralRules:Landroid/icu/text/PluralRules;
-Landroid/icu/text/PluralSamples;->TENS:[I
-Landroid/icu/text/PluralSamples;->_fractionSamples:Ljava/util/Set;
-Landroid/icu/text/PluralSamples;->_keyFractionSamplesMap:Ljava/util/Map;
-Landroid/icu/text/PluralSamples;->_keyLimitedMap:Ljava/util/Map;
-Landroid/icu/text/PluralSamples;->_keySamplesMap:Ljava/util/Map;
-Landroid/icu/text/RawCollationKey;-><init>()V
-Landroid/icu/text/RawCollationKey;-><init>(I)V
-Landroid/icu/text/RawCollationKey;-><init>([B)V
-Landroid/icu/text/RawCollationKey;-><init>([BI)V
-Landroid/icu/text/RawCollationKey;->compareTo(Landroid/icu/text/RawCollationKey;)I
-Landroid/icu/text/RBBIDataWrapper$IsAcceptable;-><init>()V
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;-><init>()V
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fCatCount:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fFormatVersion:[B
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fFTable:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fFTableLen:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fLength:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fMagic:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fRTable:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fRTableLen:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fRuleSource:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fRuleSourceLen:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fSFTable:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fSFTableLen:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fSRTable:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fSRTableLen:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fStatusTable:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fStatusTableLen:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fTrie:I
-Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;->fTrieLen:I
-Landroid/icu/text/RBBIDataWrapper;-><init>()V
-Landroid/icu/text/RBBIDataWrapper;->ACCEPTING:I
-Landroid/icu/text/RBBIDataWrapper;->DATA_FORMAT:I
-Landroid/icu/text/RBBIDataWrapper;->DH_CATCOUNT:I
-Landroid/icu/text/RBBIDataWrapper;->DH_FORMATVERSION:I
-Landroid/icu/text/RBBIDataWrapper;->DH_FTABLE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_FTABLELEN:I
-Landroid/icu/text/RBBIDataWrapper;->DH_LENGTH:I
-Landroid/icu/text/RBBIDataWrapper;->DH_MAGIC:I
-Landroid/icu/text/RBBIDataWrapper;->DH_RTABLE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_RTABLELEN:I
-Landroid/icu/text/RBBIDataWrapper;->DH_RULESOURCE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_RULESOURCELEN:I
-Landroid/icu/text/RBBIDataWrapper;->DH_SFTABLE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_SFTABLELEN:I
-Landroid/icu/text/RBBIDataWrapper;->DH_SIZE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_SRTABLE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_SRTABLELEN:I
-Landroid/icu/text/RBBIDataWrapper;->DH_STATUSTABLE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_STATUSTABLELEN:I
-Landroid/icu/text/RBBIDataWrapper;->DH_TRIE:I
-Landroid/icu/text/RBBIDataWrapper;->DH_TRIELEN:I
-Landroid/icu/text/RBBIDataWrapper;->dump(Ljava/io/PrintStream;)V
-Landroid/icu/text/RBBIDataWrapper;->dumpCharCategories(Ljava/io/PrintStream;)V
-Landroid/icu/text/RBBIDataWrapper;->dumpRow(Ljava/io/PrintStream;[SI)V
-Landroid/icu/text/RBBIDataWrapper;->dumpTable(Ljava/io/PrintStream;[S)V
-Landroid/icu/text/RBBIDataWrapper;->fFTable:[S
-Landroid/icu/text/RBBIDataWrapper;->fHeader:Landroid/icu/text/RBBIDataWrapper$RBBIDataHeader;
-Landroid/icu/text/RBBIDataWrapper;->FLAGS:I
-Landroid/icu/text/RBBIDataWrapper;->FORMAT_VERSION:I
-Landroid/icu/text/RBBIDataWrapper;->fRTable:[S
-Landroid/icu/text/RBBIDataWrapper;->fRuleSource:Ljava/lang/String;
-Landroid/icu/text/RBBIDataWrapper;->fSFTable:[S
-Landroid/icu/text/RBBIDataWrapper;->fSRTable:[S
-Landroid/icu/text/RBBIDataWrapper;->fStatusTable:[I
-Landroid/icu/text/RBBIDataWrapper;->fTrie:Landroid/icu/impl/Trie2;
-Landroid/icu/text/RBBIDataWrapper;->get(Ljava/nio/ByteBuffer;)Landroid/icu/text/RBBIDataWrapper;
-Landroid/icu/text/RBBIDataWrapper;->getRowIndex(I)I
-Landroid/icu/text/RBBIDataWrapper;->getStateTableFlags([S)I
-Landroid/icu/text/RBBIDataWrapper;->getStateTableNumStates([S)I
-Landroid/icu/text/RBBIDataWrapper;->intToHexString(II)Ljava/lang/String;
-Landroid/icu/text/RBBIDataWrapper;->intToString(II)Ljava/lang/String;
-Landroid/icu/text/RBBIDataWrapper;->isBigEndian:Z
-Landroid/icu/text/RBBIDataWrapper;->IS_ACCEPTABLE:Landroid/icu/text/RBBIDataWrapper$IsAcceptable;
-Landroid/icu/text/RBBIDataWrapper;->LOOKAHEAD:I
-Landroid/icu/text/RBBIDataWrapper;->NEXTSTATES:I
-Landroid/icu/text/RBBIDataWrapper;->NUMSTATES:I
-Landroid/icu/text/RBBIDataWrapper;->RBBI_BOF_REQUIRED:I
-Landroid/icu/text/RBBIDataWrapper;->RBBI_LOOKAHEAD_HARD_BREAK:I
-Landroid/icu/text/RBBIDataWrapper;->RESERVED:I
-Landroid/icu/text/RBBIDataWrapper;->ROWLEN:I
-Landroid/icu/text/RBBIDataWrapper;->ROW_DATA:I
-Landroid/icu/text/RBBIDataWrapper;->TAGIDX:I
-Landroid/icu/text/RbnfLenientScanner;->allIgnorable(Ljava/lang/String;)Z
-Landroid/icu/text/RbnfLenientScanner;->findText(Ljava/lang/String;Ljava/lang/String;I)[I
-Landroid/icu/text/RbnfLenientScanner;->prefixLength(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/RbnfLenientScannerProvider;->get(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/text/RbnfLenientScanner;
-Landroid/icu/text/RBNFPostProcessor;->init(Landroid/icu/text/RuleBasedNumberFormat;Ljava/lang/String;)V
-Landroid/icu/text/RBNFPostProcessor;->process(Ljava/lang/StringBuilder;Landroid/icu/text/NFRuleSet;)V
-Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;->QUARTER:Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$Cache;-><init>()V
-Landroid/icu/text/RelativeDateTimeFormatter$Cache;->cache:Landroid/icu/impl/CacheBase;
-Landroid/icu/text/RelativeDateTimeFormatter$Cache;->get(Landroid/icu/util/ULocale;)Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;
-Landroid/icu/text/RelativeDateTimeFormatter$Loader;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/RelativeDateTimeFormatter$Loader;->getDateTimePattern(Landroid/icu/impl/ICUResourceBundle;)Ljava/lang/String;
-Landroid/icu/text/RelativeDateTimeFormatter$Loader;->load()Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;
-Landroid/icu/text/RelativeDateTimeFormatter$Loader;->ulocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;-><init>(Ljava/util/EnumMap;Ljava/util/EnumMap;Ljava/lang/String;)V
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;->dateTimePattern:Ljava/lang/String;
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;->qualitativeUnitMap:Ljava/util/EnumMap;
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeFormatterData;->relUnitPatternMap:Ljava/util/EnumMap;
-Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;->QUARTERS:Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->absUnit:Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->DAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->FRIDAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->HOUR:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->MINUTE:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->MONDAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->MONTH:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->orNullFromString(Ljava/lang/CharSequence;)Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->QUARTER:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->relUnit:Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->SATURDAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->SECOND:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->SUNDAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->THURSDAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->TUESDAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->values()[Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->WEDNESDAY:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->WEEK:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;->YEAR:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;-><init>()V
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTableRelative(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTableRelativeTime(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTimeDetail(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->consumeTimeUnit(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->handleAlias(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;Z)V
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->handlePlainDirection(Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->pastFutureIndex:I
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->qualitativeUnitMap:Ljava/util/EnumMap;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->sb:Ljava/lang/StringBuilder;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->style:Landroid/icu/text/RelativeDateTimeFormatter$Style;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->styleFromAlias(Landroid/icu/impl/UResource$Value;)Landroid/icu/text/RelativeDateTimeFormatter$Style;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->styleFromKey(Landroid/icu/impl/UResource$Key;)Landroid/icu/text/RelativeDateTimeFormatter$Style;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->styleRelUnitPatterns:Ljava/util/EnumMap;
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->styleSuffixLength(Landroid/icu/text/RelativeDateTimeFormatter$Style;)I
-Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink;->unit:Landroid/icu/text/RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit;
-Landroid/icu/text/RelativeDateTimeFormatter$Style;->INDEX_COUNT:I
-Landroid/icu/text/RelativeDateTimeFormatter;-><init>(Ljava/util/EnumMap;Ljava/util/EnumMap;Ljava/lang/String;Landroid/icu/text/PluralRules;Landroid/icu/text/NumberFormat;Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/DisplayContext;Landroid/icu/text/BreakIterator;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/RelativeDateTimeFormatter;->adjustForContext(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/RelativeDateTimeFormatter;->breakIterator:Landroid/icu/text/BreakIterator;
-Landroid/icu/text/RelativeDateTimeFormatter;->cache:Landroid/icu/text/RelativeDateTimeFormatter$Cache;
-Landroid/icu/text/RelativeDateTimeFormatter;->capitalizationContext:Landroid/icu/text/DisplayContext;
-Landroid/icu/text/RelativeDateTimeFormatter;->combinedDateAndTime:Ljava/lang/String;
-Landroid/icu/text/RelativeDateTimeFormatter;->dateFormatSymbols:Landroid/icu/text/DateFormatSymbols;
-Landroid/icu/text/RelativeDateTimeFormatter;->fallbackCache:[Landroid/icu/text/RelativeDateTimeFormatter$Style;
-Landroid/icu/text/RelativeDateTimeFormatter;->getAbsoluteUnitString(Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;Landroid/icu/text/RelativeDateTimeFormatter$Direction;)Ljava/lang/String;
-Landroid/icu/text/RelativeDateTimeFormatter;->getRelativeUnitPattern(Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;ILandroid/icu/impl/StandardPlural;)Ljava/lang/String;
-Landroid/icu/text/RelativeDateTimeFormatter;->getRelativeUnitPluralPattern(Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;ILandroid/icu/impl/StandardPlural;)Ljava/lang/String;
-Landroid/icu/text/RelativeDateTimeFormatter;->keyToDirection(Landroid/icu/impl/UResource$Key;)Landroid/icu/text/RelativeDateTimeFormatter$Direction;
-Landroid/icu/text/RelativeDateTimeFormatter;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/RelativeDateTimeFormatter;->numberFormat:Landroid/icu/text/NumberFormat;
-Landroid/icu/text/RelativeDateTimeFormatter;->patternMap:Ljava/util/EnumMap;
-Landroid/icu/text/RelativeDateTimeFormatter;->pluralRules:Landroid/icu/text/PluralRules;
-Landroid/icu/text/RelativeDateTimeFormatter;->qualitativeUnitMap:Ljava/util/EnumMap;
-Landroid/icu/text/RelativeDateTimeFormatter;->style:Landroid/icu/text/RelativeDateTimeFormatter$Style;
-Landroid/icu/text/RelativeDateTimeFormatter;->styleToDateFormatSymbolsWidth:[I
-Landroid/icu/text/ReplaceableString;-><init>()V
-Landroid/icu/text/ReplaceableString;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/ReplaceableString;-><init>(Ljava/lang/StringBuffer;)V
-Landroid/icu/text/ReplaceableString;->buf:Ljava/lang/StringBuffer;
-Landroid/icu/text/ReplaceableString;->substring(II)Ljava/lang/String;
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->addFollowing(IIZ)V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->addPreceding(IIZ)Z
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->CACHE_SIZE:I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->current()I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->dumpCache()V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->fBoundaries:[I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->fBufIdx:I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->fEndBufIdx:I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->following(I)V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->fSideBuffer:Landroid/icu/text/DictionaryBreakEngine$DequeI;
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->fStartBufIdx:I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->fStatuses:[S
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->fTextIdx:I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->modChunkSize(I)I
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->next()V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->populateFollowing()Z
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->populateNear(I)Z
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->populatePreceding()Z
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->preceding(I)V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->previous()V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->reset()V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->reset(II)V
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->RetainCachePosition:Z
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->seek(I)Z
-Landroid/icu/text/RuleBasedBreakIterator$BreakCache;->UpdateCachePosition:Z
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fBoundary:I
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fBreaks:Landroid/icu/text/DictionaryBreakEngine$DequeI;
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fFirstRuleStatusIndex:I
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fLimit:I
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->following(I)Z
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fOtherRuleStatusIndex:I
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fPositionInCache:I
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fStart:I
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->fStatusIndex:I
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->populateDictionary(IIII)V
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->preceding(I)Z
-Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;->reset()V
-Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;-><init>()V
-Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;->fKeys:[I
-Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;->fPositions:[I
-Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;->fUsedSlotLimit:I
-Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;->getPosition(I)I
-Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;->reset()V
-Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;->setPosition(II)V
-Landroid/icu/text/RuleBasedBreakIterator;-><init>()V
-Landroid/icu/text/RuleBasedBreakIterator;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/RuleBasedBreakIterator;->checkOffset(ILjava/text/CharacterIterator;)V
-Landroid/icu/text/RuleBasedBreakIterator;->CISetIndex32(Ljava/text/CharacterIterator;I)I
-Landroid/icu/text/RuleBasedBreakIterator;->compileRules(Ljava/lang/String;Ljava/io/OutputStream;)V
-Landroid/icu/text/RuleBasedBreakIterator;->dump(Ljava/io/PrintStream;)V
-Landroid/icu/text/RuleBasedBreakIterator;->fBreakCache:Landroid/icu/text/RuleBasedBreakIterator$BreakCache;
-Landroid/icu/text/RuleBasedBreakIterator;->fBreakEngines:Ljava/util/List;
-Landroid/icu/text/RuleBasedBreakIterator;->fBreakType:I
-Landroid/icu/text/RuleBasedBreakIterator;->fDebugEnv:Ljava/lang/String;
-Landroid/icu/text/RuleBasedBreakIterator;->fDictionaryCache:Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache;
-Landroid/icu/text/RuleBasedBreakIterator;->fDictionaryCharCount:I
-Landroid/icu/text/RuleBasedBreakIterator;->fDone:Z
-Landroid/icu/text/RuleBasedBreakIterator;->fLookAheadMatches:Landroid/icu/text/RuleBasedBreakIterator$LookAheadResults;
-Landroid/icu/text/RuleBasedBreakIterator;->fPosition:I
-Landroid/icu/text/RuleBasedBreakIterator;->fRData:Landroid/icu/text/RBBIDataWrapper;
-Landroid/icu/text/RuleBasedBreakIterator;->fRuleStatusIndex:I
-Landroid/icu/text/RuleBasedBreakIterator;->fText:Ljava/text/CharacterIterator;
-Landroid/icu/text/RuleBasedBreakIterator;->gAllBreakEngines:Ljava/util/List;
-Landroid/icu/text/RuleBasedBreakIterator;->getBreakType()I
-Landroid/icu/text/RuleBasedBreakIterator;->getInstanceFromCompiledRules(Ljava/io/InputStream;)Landroid/icu/text/RuleBasedBreakIterator;
-Landroid/icu/text/RuleBasedBreakIterator;->getInstanceFromCompiledRules(Ljava/nio/ByteBuffer;)Landroid/icu/text/RuleBasedBreakIterator;
-Landroid/icu/text/RuleBasedBreakIterator;->getLanguageBreakEngine(I)Landroid/icu/text/LanguageBreakEngine;
-Landroid/icu/text/RuleBasedBreakIterator;->gUnhandledBreakEngine:Landroid/icu/text/UnhandledBreakEngine;
-Landroid/icu/text/RuleBasedBreakIterator;->handleNext()I
-Landroid/icu/text/RuleBasedBreakIterator;->handlePrevious(I)I
-Landroid/icu/text/RuleBasedBreakIterator;->kMaxLookaheads:I
-Landroid/icu/text/RuleBasedBreakIterator;->RBBI_DEBUG_ARG:Ljava/lang/String;
-Landroid/icu/text/RuleBasedBreakIterator;->RBBI_END:I
-Landroid/icu/text/RuleBasedBreakIterator;->RBBI_RUN:I
-Landroid/icu/text/RuleBasedBreakIterator;->RBBI_START:I
-Landroid/icu/text/RuleBasedBreakIterator;->setBreakType(I)V
-Landroid/icu/text/RuleBasedBreakIterator;->START_STATE:I
-Landroid/icu/text/RuleBasedBreakIterator;->STOP_STATE:I
-Landroid/icu/text/RuleBasedBreakIterator;->TRACE:Z
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;-><init>(Landroid/icu/impl/coll/CollationData;)V
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->leftFCDUTF16Iter:Landroid/icu/impl/coll/FCDUTF16CollationIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->leftFCDUTF16NFDIter:Landroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->leftUTF16CollIter:Landroid/icu/impl/coll/UTF16CollationIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->leftUTF16NFDIter:Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->rawCollationKey:Landroid/icu/text/RawCollationKey;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->rightFCDUTF16Iter:Landroid/icu/impl/coll/FCDUTF16CollationIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->rightFCDUTF16NFDIter:Landroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->rightUTF16CollIter:Landroid/icu/impl/coll/UTF16CollationIterator;
-Landroid/icu/text/RuleBasedCollator$CollationBuffer;->rightUTF16NFDIter:Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;
-Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink;-><init>(Landroid/icu/text/RawCollationKey;)V
-Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink;->key_:Landroid/icu/text/RawCollationKey;
-Landroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;-><init>()V
-Landroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;->setText(Landroid/icu/impl/Normalizer2Impl;Ljava/lang/CharSequence;I)V
-Landroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;->str:Ljava/lang/StringBuilder;
-Landroid/icu/text/RuleBasedCollator$NFDIterator;-><init>()V
-Landroid/icu/text/RuleBasedCollator$NFDIterator;->decomp:Ljava/lang/String;
-Landroid/icu/text/RuleBasedCollator$NFDIterator;->index:I
-Landroid/icu/text/RuleBasedCollator$NFDIterator;->nextCodePoint()I
-Landroid/icu/text/RuleBasedCollator$NFDIterator;->nextDecomposedCodePoint(Landroid/icu/impl/Normalizer2Impl;I)I
-Landroid/icu/text/RuleBasedCollator$NFDIterator;->nextRawCodePoint()I
-Landroid/icu/text/RuleBasedCollator$NFDIterator;->reset()V
-Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;-><init>()V
-Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;->nextRawCodePoint()I
-Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;->pos:I
-Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;->s:Ljava/lang/CharSequence;
-Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator;->setText(Ljava/lang/CharSequence;I)V
-Landroid/icu/text/RuleBasedCollator;-><init>(Landroid/icu/impl/coll/CollationTailoring;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/RuleBasedCollator;->actualLocaleIsSameAsValid:Z
-Landroid/icu/text/RuleBasedCollator;->adoptTailoring(Landroid/icu/impl/coll/CollationTailoring;)V
-Landroid/icu/text/RuleBasedCollator;->checkNotFrozen()V
-Landroid/icu/text/RuleBasedCollator;->collationBuffer:Landroid/icu/text/RuleBasedCollator$CollationBuffer;
-Landroid/icu/text/RuleBasedCollator;->compareNFDIter(Landroid/icu/impl/Normalizer2Impl;Landroid/icu/text/RuleBasedCollator$NFDIterator;Landroid/icu/text/RuleBasedCollator$NFDIterator;)I
-Landroid/icu/text/RuleBasedCollator;->data:Landroid/icu/impl/coll/CollationData;
-Landroid/icu/text/RuleBasedCollator;->doCompare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I
-Landroid/icu/text/RuleBasedCollator;->frozenLock:Ljava/util/concurrent/locks/Lock;
-Landroid/icu/text/RuleBasedCollator;->getCollationBuffer()Landroid/icu/text/RuleBasedCollator$CollationBuffer;
-Landroid/icu/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)Landroid/icu/text/CollationKey;
-Landroid/icu/text/RuleBasedCollator;->getDefaultSettings()Landroid/icu/impl/coll/CollationSettings;
-Landroid/icu/text/RuleBasedCollator;->getOwnedSettings()Landroid/icu/impl/coll/CollationSettings;
-Landroid/icu/text/RuleBasedCollator;->getRawCollationKey(Ljava/lang/CharSequence;Landroid/icu/text/RawCollationKey;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)Landroid/icu/text/RawCollationKey;
-Landroid/icu/text/RuleBasedCollator;->getRawCollationKey(Ljava/lang/String;Landroid/icu/text/RawCollationKey;)Landroid/icu/text/RawCollationKey;
-Landroid/icu/text/RuleBasedCollator;->initMaxExpansions()V
-Landroid/icu/text/RuleBasedCollator;->internalAddContractions(ILandroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/RuleBasedCollator;->internalBuildTailoring(Ljava/lang/String;)V
-Landroid/icu/text/RuleBasedCollator;->internalGetCEs(Ljava/lang/CharSequence;)[J
-Landroid/icu/text/RuleBasedCollator;->internalSetVariableTop(J)V
-Landroid/icu/text/RuleBasedCollator;->isHiraganaQuaternary()Z
-Landroid/icu/text/RuleBasedCollator;->isUnsafe(I)Z
-Landroid/icu/text/RuleBasedCollator;->releaseCollationBuffer(Landroid/icu/text/RuleBasedCollator$CollationBuffer;)V
-Landroid/icu/text/RuleBasedCollator;->setFastLatinOptions(Landroid/icu/impl/coll/CollationSettings;)V
-Landroid/icu/text/RuleBasedCollator;->setHiraganaQuaternary(Z)V
-Landroid/icu/text/RuleBasedCollator;->setHiraganaQuaternaryDefault()V
-Landroid/icu/text/RuleBasedCollator;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/RuleBasedCollator;->settings:Landroid/icu/impl/coll/SharedObject$Reference;
-Landroid/icu/text/RuleBasedCollator;->setVariableTop(I)V
-Landroid/icu/text/RuleBasedCollator;->setVariableTop(Ljava/lang/String;)I
-Landroid/icu/text/RuleBasedCollator;->simpleKeyLengthEstimate(Ljava/lang/CharSequence;)I
-Landroid/icu/text/RuleBasedCollator;->tailoring:Landroid/icu/impl/coll/CollationTailoring;
-Landroid/icu/text/RuleBasedCollator;->validLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/RuleBasedCollator;->writeIdenticalLevel(Ljava/lang/CharSequence;Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink;)V
-Landroid/icu/text/RuleBasedCollator;->writeSortKey(Ljava/lang/CharSequence;Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink;Landroid/icu/text/RuleBasedCollator$CollationBuffer;)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(I)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(Landroid/icu/util/ULocale;I)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(Ljava/lang/String;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(Ljava/lang/String;Ljava/util/Locale;)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(Ljava/lang/String;[[Ljava/lang/String;)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(Ljava/lang/String;[[Ljava/lang/String;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/RuleBasedNumberFormat;-><init>(Ljava/util/Locale;I)V
-Landroid/icu/text/RuleBasedNumberFormat;->adjustForContext(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->capitalizationBrkIter:Landroid/icu/text/BreakIterator;
-Landroid/icu/text/RuleBasedNumberFormat;->capitalizationForListOrMenu:Z
-Landroid/icu/text/RuleBasedNumberFormat;->capitalizationForStandAlone:Z
-Landroid/icu/text/RuleBasedNumberFormat;->capitalizationInfoIsSet:Z
-Landroid/icu/text/RuleBasedNumberFormat;->createPluralFormat(Landroid/icu/text/PluralRules$PluralType;Ljava/lang/String;)Landroid/icu/text/PluralFormat;
-Landroid/icu/text/RuleBasedNumberFormat;->DEBUG:Z
-Landroid/icu/text/RuleBasedNumberFormat;->decimalFormat:Landroid/icu/text/DecimalFormat;
-Landroid/icu/text/RuleBasedNumberFormat;->decimalFormatSymbols:Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/RuleBasedNumberFormat;->defaultInfinityRule:Landroid/icu/text/NFRule;
-Landroid/icu/text/RuleBasedNumberFormat;->defaultNaNRule:Landroid/icu/text/NFRule;
-Landroid/icu/text/RuleBasedNumberFormat;->defaultRuleSet:Landroid/icu/text/NFRuleSet;
-Landroid/icu/text/RuleBasedNumberFormat;->DURATION:I
-Landroid/icu/text/RuleBasedNumberFormat;->extractSpecial(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->findRuleSet(Ljava/lang/String;)Landroid/icu/text/NFRuleSet;
-Landroid/icu/text/RuleBasedNumberFormat;->format(DLandroid/icu/text/NFRuleSet;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->format(DLjava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->format(JLandroid/icu/text/NFRuleSet;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->format(JLjava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->getDecimalFormat()Landroid/icu/text/DecimalFormat;
-Landroid/icu/text/RuleBasedNumberFormat;->getDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/RuleBasedNumberFormat;->getDefaultInfinityRule()Landroid/icu/text/NFRule;
-Landroid/icu/text/RuleBasedNumberFormat;->getDefaultNaNRule()Landroid/icu/text/NFRule;
-Landroid/icu/text/RuleBasedNumberFormat;->getDefaultRuleSet()Landroid/icu/text/NFRuleSet;
-Landroid/icu/text/RuleBasedNumberFormat;->getDefaultRuleSetName()Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->getLenientScanner()Landroid/icu/text/RbnfLenientScanner;
-Landroid/icu/text/RuleBasedNumberFormat;->getLenientScannerProvider()Landroid/icu/text/RbnfLenientScannerProvider;
-Landroid/icu/text/RuleBasedNumberFormat;->getNameListForLocale(Landroid/icu/util/ULocale;)[Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->getRuleSetDisplayName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->getRuleSetDisplayName(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->getRuleSetDisplayNameLocales()[Landroid/icu/util/ULocale;
-Landroid/icu/text/RuleBasedNumberFormat;->getRuleSetDisplayNames()[Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->getRuleSetDisplayNames(Landroid/icu/util/ULocale;)[Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->getRuleSetNames()[Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->init(Ljava/lang/String;[[Ljava/lang/String;)V
-Landroid/icu/text/RuleBasedNumberFormat;->initCapitalizationContextInfo(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/RuleBasedNumberFormat;->initLocalizations([[Ljava/lang/String;)V
-Landroid/icu/text/RuleBasedNumberFormat;->lenientParse:Z
-Landroid/icu/text/RuleBasedNumberFormat;->lenientParseEnabled()Z
-Landroid/icu/text/RuleBasedNumberFormat;->lenientParseRules:Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/RuleBasedNumberFormat;->locnames:[Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->lookedForScanner:Z
-Landroid/icu/text/RuleBasedNumberFormat;->MAX_VALUE:Landroid/icu/math/BigDecimal;
-Landroid/icu/text/RuleBasedNumberFormat;->MIN_VALUE:Landroid/icu/math/BigDecimal;
-Landroid/icu/text/RuleBasedNumberFormat;->NUMBERING_SYSTEM:I
-Landroid/icu/text/RuleBasedNumberFormat;->ORDINAL:I
-Landroid/icu/text/RuleBasedNumberFormat;->postProcess(Ljava/lang/StringBuilder;Landroid/icu/text/NFRuleSet;)V
-Landroid/icu/text/RuleBasedNumberFormat;->postProcessor:Landroid/icu/text/RBNFPostProcessor;
-Landroid/icu/text/RuleBasedNumberFormat;->postProcessRules:Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->publicRuleSetNames:[Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->roundingMode:I
-Landroid/icu/text/RuleBasedNumberFormat;->rulenames:[Ljava/lang/String;
-Landroid/icu/text/RuleBasedNumberFormat;->ruleSetDisplayNames:Ljava/util/Map;
-Landroid/icu/text/RuleBasedNumberFormat;->ruleSets:[Landroid/icu/text/NFRuleSet;
-Landroid/icu/text/RuleBasedNumberFormat;->ruleSetsMap:Ljava/util/Map;
-Landroid/icu/text/RuleBasedNumberFormat;->scannerProvider:Landroid/icu/text/RbnfLenientScannerProvider;
-Landroid/icu/text/RuleBasedNumberFormat;->setDecimalFormatSymbols(Landroid/icu/text/DecimalFormatSymbols;)V
-Landroid/icu/text/RuleBasedNumberFormat;->setDefaultRuleSet(Ljava/lang/String;)V
-Landroid/icu/text/RuleBasedNumberFormat;->setLenientParseMode(Z)V
-Landroid/icu/text/RuleBasedNumberFormat;->setLenientScannerProvider(Landroid/icu/text/RbnfLenientScannerProvider;)V
-Landroid/icu/text/RuleBasedNumberFormat;->SPELLOUT:I
-Landroid/icu/text/RuleBasedNumberFormat;->stripWhitespace(Ljava/lang/String;)Ljava/lang/StringBuilder;
-Landroid/icu/text/RuleBasedTransliterator$Data;-><init>()V
-Landroid/icu/text/RuleBasedTransliterator$Data;->lookupMatcher(I)Landroid/icu/text/UnicodeMatcher;
-Landroid/icu/text/RuleBasedTransliterator$Data;->lookupReplacer(I)Landroid/icu/text/UnicodeReplacer;
-Landroid/icu/text/RuleBasedTransliterator$Data;->ruleSet:Landroid/icu/text/TransliterationRuleSet;
-Landroid/icu/text/RuleBasedTransliterator$Data;->variableNames:Ljava/util/Map;
-Landroid/icu/text/RuleBasedTransliterator$Data;->variables:[Ljava/lang/Object;
-Landroid/icu/text/RuleBasedTransliterator$Data;->variablesBase:C
-Landroid/icu/text/RuleBasedTransliterator;-><init>(Ljava/lang/String;Landroid/icu/text/RuleBasedTransliterator$Data;Landroid/icu/text/UnicodeFilter;)V
-Landroid/icu/text/RuleBasedTransliterator;->addSourceTargetSet(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/RuleBasedTransliterator;->data:Landroid/icu/text/RuleBasedTransliterator$Data;
-Landroid/icu/text/RuleBasedTransliterator;->handleTransliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;Z)V
-Landroid/icu/text/RuleBasedTransliterator;->safeClone()Landroid/icu/text/Transliterator;
-Landroid/icu/text/RuleBasedTransliterator;->toRules(Z)Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter$MarkupStyle;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/ScientificNumberFormatter$MarkupStyle;->beginMarkup:Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter$MarkupStyle;->endMarkup:Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter$MarkupStyle;->format(Ljava/text/AttributedCharacterIterator;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter$Style;-><init>()V
-Landroid/icu/text/ScientificNumberFormatter$Style;->append(Ljava/text/AttributedCharacterIterator;IILjava/lang/StringBuilder;)V
-Landroid/icu/text/ScientificNumberFormatter$Style;->format(Ljava/text/AttributedCharacterIterator;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;-><init>()V
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;->char32AtAndAdvance(Ljava/text/AttributedCharacterIterator;)I
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;->copyAsSuperscript(Ljava/text/AttributedCharacterIterator;IILjava/lang/StringBuilder;)V
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;->format(Ljava/text/AttributedCharacterIterator;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;->SUPERSCRIPT_DIGITS:[C
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;->SUPERSCRIPT_MINUS_SIGN:C
-Landroid/icu/text/ScientificNumberFormatter$SuperscriptStyle;->SUPERSCRIPT_PLUS_SIGN:C
-Landroid/icu/text/ScientificNumberFormatter;-><init>(Landroid/icu/text/DecimalFormat;Ljava/lang/String;Landroid/icu/text/ScientificNumberFormatter$Style;)V
-Landroid/icu/text/ScientificNumberFormatter;->fmt:Landroid/icu/text/DecimalFormat;
-Landroid/icu/text/ScientificNumberFormatter;->getInstance(Landroid/icu/text/DecimalFormat;Landroid/icu/text/ScientificNumberFormatter$Style;)Landroid/icu/text/ScientificNumberFormatter;
-Landroid/icu/text/ScientificNumberFormatter;->getInstanceForLocale(Landroid/icu/util/ULocale;Landroid/icu/text/ScientificNumberFormatter$Style;)Landroid/icu/text/ScientificNumberFormatter;
-Landroid/icu/text/ScientificNumberFormatter;->getPreExponent(Landroid/icu/text/DecimalFormatSymbols;)Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter;->preExponent:Ljava/lang/String;
-Landroid/icu/text/ScientificNumberFormatter;->style:Landroid/icu/text/ScientificNumberFormatter$Style;
-Landroid/icu/text/ScientificNumberFormatter;->SUPER_SCRIPT:Landroid/icu/text/ScientificNumberFormatter$Style;
-Landroid/icu/text/SCSU;->ARMENIANINDEX:I
-Landroid/icu/text/SCSU;->COMPRESSIONOFFSET:I
-Landroid/icu/text/SCSU;->GREEKINDEX:I
-Landroid/icu/text/SCSU;->HALFWIDTHKATAKANAINDEX:I
-Landroid/icu/text/SCSU;->HIRAGANAINDEX:I
-Landroid/icu/text/SCSU;->INVALIDCHAR:I
-Landroid/icu/text/SCSU;->INVALIDWINDOW:I
-Landroid/icu/text/SCSU;->IPAEXTENSIONINDEX:I
-Landroid/icu/text/SCSU;->KATAKANAINDEX:I
-Landroid/icu/text/SCSU;->LATININDEX:I
-Landroid/icu/text/SCSU;->MAXINDEX:I
-Landroid/icu/text/SCSU;->NUMSTATICWINDOWS:I
-Landroid/icu/text/SCSU;->NUMWINDOWS:I
-Landroid/icu/text/SCSU;->RESERVEDINDEX:I
-Landroid/icu/text/SCSU;->SCHANGE0:I
-Landroid/icu/text/SCSU;->SCHANGE1:I
-Landroid/icu/text/SCSU;->SCHANGE2:I
-Landroid/icu/text/SCSU;->SCHANGE3:I
-Landroid/icu/text/SCSU;->SCHANGE4:I
-Landroid/icu/text/SCSU;->SCHANGE5:I
-Landroid/icu/text/SCSU;->SCHANGE6:I
-Landroid/icu/text/SCSU;->SCHANGE7:I
-Landroid/icu/text/SCSU;->SCHANGEU:I
-Landroid/icu/text/SCSU;->SDEFINE0:I
-Landroid/icu/text/SCSU;->SDEFINE1:I
-Landroid/icu/text/SCSU;->SDEFINE2:I
-Landroid/icu/text/SCSU;->SDEFINE3:I
-Landroid/icu/text/SCSU;->SDEFINE4:I
-Landroid/icu/text/SCSU;->SDEFINE5:I
-Landroid/icu/text/SCSU;->SDEFINE6:I
-Landroid/icu/text/SCSU;->SDEFINE7:I
-Landroid/icu/text/SCSU;->SDEFINEX:I
-Landroid/icu/text/SCSU;->SINGLEBYTEMODE:I
-Landroid/icu/text/SCSU;->sOffsets:[I
-Landroid/icu/text/SCSU;->sOffsetTable:[I
-Landroid/icu/text/SCSU;->SQUOTE0:I
-Landroid/icu/text/SCSU;->SQUOTE1:I
-Landroid/icu/text/SCSU;->SQUOTE2:I
-Landroid/icu/text/SCSU;->SQUOTE3:I
-Landroid/icu/text/SCSU;->SQUOTE4:I
-Landroid/icu/text/SCSU;->SQUOTE5:I
-Landroid/icu/text/SCSU;->SQUOTE6:I
-Landroid/icu/text/SCSU;->SQUOTE7:I
-Landroid/icu/text/SCSU;->SQUOTEU:I
-Landroid/icu/text/SCSU;->SRESERVED:I
-Landroid/icu/text/SCSU;->UCHANGE0:I
-Landroid/icu/text/SCSU;->UCHANGE1:I
-Landroid/icu/text/SCSU;->UCHANGE2:I
-Landroid/icu/text/SCSU;->UCHANGE3:I
-Landroid/icu/text/SCSU;->UCHANGE4:I
-Landroid/icu/text/SCSU;->UCHANGE5:I
-Landroid/icu/text/SCSU;->UCHANGE6:I
-Landroid/icu/text/SCSU;->UCHANGE7:I
-Landroid/icu/text/SCSU;->UDEFINE0:I
-Landroid/icu/text/SCSU;->UDEFINE1:I
-Landroid/icu/text/SCSU;->UDEFINE2:I
-Landroid/icu/text/SCSU;->UDEFINE3:I
-Landroid/icu/text/SCSU;->UDEFINE4:I
-Landroid/icu/text/SCSU;->UDEFINE5:I
-Landroid/icu/text/SCSU;->UDEFINE6:I
-Landroid/icu/text/SCSU;->UDEFINE7:I
-Landroid/icu/text/SCSU;->UDEFINEX:I
-Landroid/icu/text/SCSU;->UNICODEMODE:I
-Landroid/icu/text/SCSU;->UQUOTEU:I
-Landroid/icu/text/SCSU;->URESERVED:I
-Landroid/icu/text/SearchIterator$Search;->beginIndex()I
-Landroid/icu/text/SearchIterator$Search;->breakIter()Landroid/icu/text/BreakIterator;
-Landroid/icu/text/SearchIterator$Search;->elementComparisonType_:Landroid/icu/text/SearchIterator$ElementComparisonType;
-Landroid/icu/text/SearchIterator$Search;->endIndex()I
-Landroid/icu/text/SearchIterator$Search;->internalBreakIter_:Landroid/icu/text/BreakIterator;
-Landroid/icu/text/SearchIterator$Search;->isCanonicalMatch_:Z
-Landroid/icu/text/SearchIterator$Search;->isForwardSearching_:Z
-Landroid/icu/text/SearchIterator$Search;->isOverlap_:Z
-Landroid/icu/text/SearchIterator$Search;->matchedIndex_:I
-Landroid/icu/text/SearchIterator$Search;->matchedLength()I
-Landroid/icu/text/SearchIterator$Search;->reset_:Z
-Landroid/icu/text/SearchIterator$Search;->setBreakIter(Landroid/icu/text/BreakIterator;)V
-Landroid/icu/text/SearchIterator$Search;->setMatchedLength(I)V
-Landroid/icu/text/SearchIterator$Search;->setTarget(Ljava/text/CharacterIterator;)V
-Landroid/icu/text/SearchIterator$Search;->text()Ljava/text/CharacterIterator;
-Landroid/icu/text/SearchIterator;->search_:Landroid/icu/text/SearchIterator$Search;
-Landroid/icu/text/SearchIterator;->setMatchNotFound()V
-Landroid/icu/text/SelectFormat;->findSubMessage(Landroid/icu/text/MessagePattern;ILjava/lang/String;)I
-Landroid/icu/text/SelectFormat;->msgPattern:Landroid/icu/text/MessagePattern;
-Landroid/icu/text/SelectFormat;->pattern:Ljava/lang/String;
-Landroid/icu/text/SelectFormat;->reset()V
-Landroid/icu/text/SimpleDateFormat$ContextValue;->CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE:Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$ContextValue;->CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE:Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$ContextValue;->CAPITALIZATION_FOR_STANDALONE:Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$ContextValue;->CAPITALIZATION_FOR_UI_LIST_OR_MENU:Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$ContextValue;->UNKNOWN:Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$ContextValue;->valueOf(Ljava/lang/String;)Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$ContextValue;->values()[Landroid/icu/text/SimpleDateFormat$ContextValue;
-Landroid/icu/text/SimpleDateFormat$PatternItem;-><init>(CI)V
-Landroid/icu/text/SimpleDateFormat$PatternItem;->isNumeric:Z
-Landroid/icu/text/SimpleDateFormat$PatternItem;->length:I
-Landroid/icu/text/SimpleDateFormat$PatternItem;->type:C
-Landroid/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
-Landroid/icu/text/SimpleDateFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DateFormatSymbols;Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;ZLjava/lang/String;)V
-Landroid/icu/text/SimpleDateFormat;-><init>(Ljava/lang/String;Landroid/icu/text/DateFormatSymbols;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/SimpleDateFormat;->allowNumericFallback(I)Z
-Landroid/icu/text/SimpleDateFormat;->cachedDefaultLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/SimpleDateFormat;->cachedDefaultPattern:Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->CALENDAR_FIELD_TO_LEVEL:[I
-Landroid/icu/text/SimpleDateFormat;->capitalizationBrkIter:Landroid/icu/text/BreakIterator;
-Landroid/icu/text/SimpleDateFormat;->countDigits(Ljava/lang/String;II)I
-Landroid/icu/text/SimpleDateFormat;->currentSerialVersion:I
-Landroid/icu/text/SimpleDateFormat;->DATE_PATTERN_TYPE:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SimpleDateFormat;->decDigits:[C
-Landroid/icu/text/SimpleDateFormat;->decimalBuf:[C
-Landroid/icu/text/SimpleDateFormat;->DECIMAL_BUF_SIZE:I
-Landroid/icu/text/SimpleDateFormat;->defaultCenturyBase:J
-Landroid/icu/text/SimpleDateFormat;->defaultCenturyStart:Ljava/util/Date;
-Landroid/icu/text/SimpleDateFormat;->defaultCenturyStartYear:I
-Landroid/icu/text/SimpleDateFormat;->DelayedHebrewMonthCheck:Z
-Landroid/icu/text/SimpleDateFormat;->diffCalFieldValue(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;[Ljava/lang/Object;I)Z
-Landroid/icu/text/SimpleDateFormat;->FALLBACKPATTERN:Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->fastZeroPaddingNumber(Ljava/lang/StringBuffer;III)V
-Landroid/icu/text/SimpleDateFormat;->format(Landroid/icu/util/Calendar;Landroid/icu/text/DisplayContext;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Ljava/util/List;)Ljava/lang/StringBuffer;
-Landroid/icu/text/SimpleDateFormat;->formatData:Landroid/icu/text/DateFormatSymbols;
-Landroid/icu/text/SimpleDateFormat;->getDefaultCenturyStart()Ljava/util/Date;
-Landroid/icu/text/SimpleDateFormat;->getDefaultCenturyStartYear()I
-Landroid/icu/text/SimpleDateFormat;->getDefaultPattern()Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->getIndexFromChar(C)I
-Landroid/icu/text/SimpleDateFormat;->getInstance(Landroid/icu/util/Calendar$FormatConfiguration;)Landroid/icu/text/SimpleDateFormat;
-Landroid/icu/text/SimpleDateFormat;->getLevelFromChar(C)I
-Landroid/icu/text/SimpleDateFormat;->getLocale()Landroid/icu/util/ULocale;
-Landroid/icu/text/SimpleDateFormat;->getPatternItems()[Ljava/lang/Object;
-Landroid/icu/text/SimpleDateFormat;->hasMinute:Z
-Landroid/icu/text/SimpleDateFormat;->hasSecond:Z
-Landroid/icu/text/SimpleDateFormat;->HEBREW_CAL_CUR_MILLENIUM_END_YEAR:I
-Landroid/icu/text/SimpleDateFormat;->HEBREW_CAL_CUR_MILLENIUM_START_YEAR:I
-Landroid/icu/text/SimpleDateFormat;->initialize()V
-Landroid/icu/text/SimpleDateFormat;->initializeDefaultCenturyStart(J)V
-Landroid/icu/text/SimpleDateFormat;->initializeTimeZoneFormat(Z)V
-Landroid/icu/text/SimpleDateFormat;->initLocalZeroPaddingNumberFormat()V
-Landroid/icu/text/SimpleDateFormat;->initNumberFormatters(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/SimpleDateFormat;->intervalFormatByAlgorithm(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-Landroid/icu/text/SimpleDateFormat;->isFieldUnitIgnored(I)Z
-Landroid/icu/text/SimpleDateFormat;->isFieldUnitIgnored(Ljava/lang/String;I)Z
-Landroid/icu/text/SimpleDateFormat;->isNumeric(CI)Z
-Landroid/icu/text/SimpleDateFormat;->ISOSpecialEra:I
-Landroid/icu/text/SimpleDateFormat;->isSyntaxChar(C)Z
-Landroid/icu/text/SimpleDateFormat;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/SimpleDateFormat;->lowerLevel([Ljava/lang/Object;II)Z
-Landroid/icu/text/SimpleDateFormat;->matchDayPeriodString(Ljava/lang/String;I[Ljava/lang/String;ILandroid/icu/util/Output;)I
-Landroid/icu/text/SimpleDateFormat;->matchLiteral(Ljava/lang/String;I[Ljava/lang/Object;I[Z)I
-Landroid/icu/text/SimpleDateFormat;->matchString(Ljava/lang/String;II[Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/Calendar;)I
-Landroid/icu/text/SimpleDateFormat;->millisPerHour:I
-Landroid/icu/text/SimpleDateFormat;->numberFormatters:Ljava/util/HashMap;
-Landroid/icu/text/SimpleDateFormat;->NUMERIC_FORMAT_CHARS2:Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->NUMERIC_FORMAT_CHARS:Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->override:Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->overrideMap:Ljava/util/HashMap;
-Landroid/icu/text/SimpleDateFormat;->parseAmbiguousDatesAsAfter(Ljava/util/Date;)V
-Landroid/icu/text/SimpleDateFormat;->PARSED_PATTERN_CACHE:Landroid/icu/impl/ICUCache;
-Landroid/icu/text/SimpleDateFormat;->parseInt(Ljava/lang/String;ILjava/text/ParsePosition;ZLandroid/icu/text/NumberFormat;)Ljava/lang/Number;
-Landroid/icu/text/SimpleDateFormat;->parseInt(Ljava/lang/String;Ljava/text/ParsePosition;ZLandroid/icu/text/NumberFormat;)Ljava/lang/Number;
-Landroid/icu/text/SimpleDateFormat;->parsePattern()V
-Landroid/icu/text/SimpleDateFormat;->pattern:Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->patternItems:[Ljava/lang/Object;
-Landroid/icu/text/SimpleDateFormat;->PATTERN_CHAR_IS_SYNTAX:[Z
-Landroid/icu/text/SimpleDateFormat;->PATTERN_CHAR_TO_INDEX:[I
-Landroid/icu/text/SimpleDateFormat;->PATTERN_CHAR_TO_LEVEL:[I
-Landroid/icu/text/SimpleDateFormat;->PATTERN_INDEX_TO_CALENDAR_FIELD:[I
-Landroid/icu/text/SimpleDateFormat;->PATTERN_INDEX_TO_DATE_FORMAT_ATTRIBUTE:[Landroid/icu/text/DateFormat$Field;
-Landroid/icu/text/SimpleDateFormat;->PATTERN_INDEX_TO_DATE_FORMAT_FIELD:[I
-Landroid/icu/text/SimpleDateFormat;->processOverrideString(Landroid/icu/util/ULocale;Ljava/lang/String;)V
-Landroid/icu/text/SimpleDateFormat;->regionMatchesWithOptionalDot(Ljava/lang/String;ILjava/lang/String;I)I
-Landroid/icu/text/SimpleDateFormat;->safeAppend([Ljava/lang/String;ILjava/lang/StringBuffer;)V
-Landroid/icu/text/SimpleDateFormat;->safeAppendWithMonthPattern([Ljava/lang/String;ILjava/lang/StringBuffer;Ljava/lang/String;)V
-Landroid/icu/text/SimpleDateFormat;->serialVersionOnStream:I
-Landroid/icu/text/SimpleDateFormat;->subFormat(CIIILandroid/icu/text/DisplayContext;Ljava/text/FieldPosition;Landroid/icu/util/Calendar;)Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->subFormat(Ljava/lang/StringBuffer;CIIILandroid/icu/text/DisplayContext;Ljava/text/FieldPosition;Landroid/icu/util/Calendar;)V
-Landroid/icu/text/SimpleDateFormat;->subParse(Ljava/lang/String;ICIZZ[ZLandroid/icu/util/Calendar;Landroid/icu/text/MessageFormat;Landroid/icu/util/Output;)I
-Landroid/icu/text/SimpleDateFormat;->subParse(Ljava/lang/String;ICIZZ[ZLandroid/icu/util/Calendar;Landroid/icu/text/MessageFormat;Landroid/icu/util/Output;Landroid/icu/util/Output;)I
-Landroid/icu/text/SimpleDateFormat;->SUPPRESS_NEGATIVE_PREFIX:Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->translatePattern(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/SimpleDateFormat;->tzFormat()Landroid/icu/text/TimeZoneFormat;
-Landroid/icu/text/SimpleDateFormat;->tzFormat:Landroid/icu/text/TimeZoneFormat;
-Landroid/icu/text/SimpleDateFormat;->useFastFormat:Z
-Landroid/icu/text/SimpleDateFormat;->useLocalZeroPaddingNumberFormat:Z
-Landroid/icu/text/SimpleDateFormat;->zeroPaddingNumber(Landroid/icu/text/NumberFormat;Ljava/lang/StringBuffer;III)V
-Landroid/icu/text/SimpleFormatter;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/SimpleFormatter;->compile(Ljava/lang/CharSequence;)Landroid/icu/text/SimpleFormatter;
-Landroid/icu/text/SimpleFormatter;->compiledPattern:Ljava/lang/String;
-Landroid/icu/text/SimpleFormatter;->compileMinMaxArguments(Ljava/lang/CharSequence;II)Landroid/icu/text/SimpleFormatter;
-Landroid/icu/text/SimpleFormatter;->getArgumentLimit()I
-Landroid/icu/text/SimpleFormatter;->getTextWithNoArguments()Ljava/lang/String;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;->fCharOrStrTableIndex:I
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;->fStr:Ljava/lang/String;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringComparator;-><init>()V
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringComparator;->compare(Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;)I
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringComparator;->INSTANCE:Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringComparator;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;-><init>()V
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;->addString(Ljava/lang/String;)Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;->fHash:Ljava/util/Hashtable;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;->fVec:Ljava/util/Vector;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;->getByIndex(I)Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUString;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;->size()I
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;->sort()V
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;-><init>()V
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->build(Ljava/io/Reader;Landroid/icu/text/SpoofChecker$SpoofData;)V
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->buildConfusableData(Ljava/io/Reader;Landroid/icu/text/SpoofChecker$SpoofData;)V
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fKeySet:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fKeyVec:Ljava/util/ArrayList;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fLineNum:I
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fParseHexNum:Ljava/util/regex/Pattern;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fParseLine:Ljava/util/regex/Pattern;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fStringTable:Ljava/lang/StringBuffer;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fTable:Ljava/util/Hashtable;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->fValueVec:Ljava/util/ArrayList;
-Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder;->stringPool:Landroid/icu/text/SpoofChecker$Builder$ConfusabledataBuilder$SPUStringPool;
-Landroid/icu/text/SpoofChecker$Builder;-><init>()V
-Landroid/icu/text/SpoofChecker$Builder;-><init>(Landroid/icu/text/SpoofChecker;)V
-Landroid/icu/text/SpoofChecker$Builder;->addScriptChars(Landroid/icu/util/ULocale;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/SpoofChecker$Builder;->build()Landroid/icu/text/SpoofChecker;
-Landroid/icu/text/SpoofChecker$Builder;->fAllowedCharsSet:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker$Builder;->fAllowedLocales:Ljava/util/Set;
-Landroid/icu/text/SpoofChecker$Builder;->fChecks:I
-Landroid/icu/text/SpoofChecker$Builder;->fRestrictionLevel:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$Builder;->fSpoofData:Landroid/icu/text/SpoofChecker$SpoofData;
-Landroid/icu/text/SpoofChecker$Builder;->setAllowedChars(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$Builder;->setAllowedJavaLocales(Ljava/util/Set;)Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$Builder;->setAllowedLocales(Ljava/util/Set;)Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$Builder;->setChecks(I)Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$Builder;->setData(Ljava/io/Reader;)Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$Builder;->setData(Ljava/io/Reader;Ljava/io/Reader;)Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$Builder;->setRestrictionLevel(Landroid/icu/text/SpoofChecker$RestrictionLevel;)Landroid/icu/text/SpoofChecker$Builder;
-Landroid/icu/text/SpoofChecker$CheckResult;-><init>()V
-Landroid/icu/text/SpoofChecker$CheckResult;->checks:I
-Landroid/icu/text/SpoofChecker$CheckResult;->numerics:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker$CheckResult;->position:I
-Landroid/icu/text/SpoofChecker$CheckResult;->restrictionLevel:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$ConfusableDataUtils;-><init>()V
-Landroid/icu/text/SpoofChecker$ConfusableDataUtils;->codePointAndLengthToKey(II)I
-Landroid/icu/text/SpoofChecker$ConfusableDataUtils;->FORMAT_VERSION:I
-Landroid/icu/text/SpoofChecker$ConfusableDataUtils;->keyToCodePoint(I)I
-Landroid/icu/text/SpoofChecker$ConfusableDataUtils;->keyToLength(I)I
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->ASCII:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->HIGHLY_RESTRICTIVE:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->MINIMALLY_RESTRICTIVE:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->MODERATELY_RESTRICTIVE:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->SINGLE_SCRIPT_RESTRICTIVE:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->UNRESTRICTIVE:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->valueOf(Ljava/lang/String;)Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$RestrictionLevel;->values()[Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker$ScriptSet;->appendStringTo(Ljava/lang/StringBuilder;)V
-Landroid/icu/text/SpoofChecker$SpoofData$DefaultData;-><init>()V
-Landroid/icu/text/SpoofChecker$SpoofData$DefaultData;->EXCEPTION:Ljava/io/IOException;
-Landroid/icu/text/SpoofChecker$SpoofData$DefaultData;->INSTANCE:Landroid/icu/text/SpoofChecker$SpoofData;
-Landroid/icu/text/SpoofChecker$SpoofData$IsAcceptable;-><init>()V
-Landroid/icu/text/SpoofChecker$SpoofData;-><init>()V
-Landroid/icu/text/SpoofChecker$SpoofData;-><init>(Ljava/nio/ByteBuffer;)V
-Landroid/icu/text/SpoofChecker$SpoofData;->appendValueTo(ILjava/lang/StringBuilder;)V
-Landroid/icu/text/SpoofChecker$SpoofData;->codePointAt(I)I
-Landroid/icu/text/SpoofChecker$SpoofData;->confusableLookup(ILjava/lang/StringBuilder;)V
-Landroid/icu/text/SpoofChecker$SpoofData;->DATA_FORMAT:I
-Landroid/icu/text/SpoofChecker$SpoofData;->fCFUKeys:[I
-Landroid/icu/text/SpoofChecker$SpoofData;->fCFUStrings:Ljava/lang/String;
-Landroid/icu/text/SpoofChecker$SpoofData;->fCFUValues:[S
-Landroid/icu/text/SpoofChecker$SpoofData;->getDefault()Landroid/icu/text/SpoofChecker$SpoofData;
-Landroid/icu/text/SpoofChecker$SpoofData;->IS_ACCEPTABLE:Landroid/icu/text/SpoofChecker$SpoofData$IsAcceptable;
-Landroid/icu/text/SpoofChecker$SpoofData;->length()I
-Landroid/icu/text/SpoofChecker$SpoofData;->readData(Ljava/nio/ByteBuffer;)V
-Landroid/icu/text/SpoofChecker;-><init>()V
-Landroid/icu/text/SpoofChecker;->ALL_CHECKS:I
-Landroid/icu/text/SpoofChecker;->ANY_CASE:I
-Landroid/icu/text/SpoofChecker;->areConfusable(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/SpoofChecker;->ASCII:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker;->CHAR_LIMIT:I
-Landroid/icu/text/SpoofChecker;->CONFUSABLE:I
-Landroid/icu/text/SpoofChecker;->failsChecks(Ljava/lang/String;)Z
-Landroid/icu/text/SpoofChecker;->failsChecks(Ljava/lang/String;Landroid/icu/text/SpoofChecker$CheckResult;)Z
-Landroid/icu/text/SpoofChecker;->fAllowedCharsSet:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker;->fAllowedLocales:Ljava/util/Set;
-Landroid/icu/text/SpoofChecker;->fChecks:I
-Landroid/icu/text/SpoofChecker;->fRestrictionLevel:Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker;->fSpoofData:Landroid/icu/text/SpoofChecker$SpoofData;
-Landroid/icu/text/SpoofChecker;->getAllowedChars()Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker;->getAllowedJavaLocales()Ljava/util/Set;
-Landroid/icu/text/SpoofChecker;->getAllowedLocales()Ljava/util/Set;
-Landroid/icu/text/SpoofChecker;->getAugmentedScriptSet(ILandroid/icu/text/SpoofChecker$ScriptSet;)V
-Landroid/icu/text/SpoofChecker;->getChecks()I
-Landroid/icu/text/SpoofChecker;->getNumerics(Ljava/lang/String;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/SpoofChecker;->getResolvedScriptSet(Ljava/lang/CharSequence;Landroid/icu/text/SpoofChecker$ScriptSet;)V
-Landroid/icu/text/SpoofChecker;->getResolvedScriptSetWithout(Ljava/lang/CharSequence;ILandroid/icu/text/SpoofChecker$ScriptSet;)V
-Landroid/icu/text/SpoofChecker;->getRestrictionLevel()Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker;->getRestrictionLevel(Ljava/lang/String;)Landroid/icu/text/SpoofChecker$RestrictionLevel;
-Landroid/icu/text/SpoofChecker;->getSkeleton(ILjava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/SpoofChecker;->getSkeleton(Ljava/lang/CharSequence;)Ljava/lang/String;
-Landroid/icu/text/SpoofChecker;->INCLUSION:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker;->INVISIBLE:I
-Landroid/icu/text/SpoofChecker;->MIXED_NUMBERS:I
-Landroid/icu/text/SpoofChecker;->MIXED_SCRIPT_CONFUSABLE:I
-Landroid/icu/text/SpoofChecker;->nfdNormalizer:Landroid/icu/text/Normalizer2;
-Landroid/icu/text/SpoofChecker;->RECOMMENDED:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/SpoofChecker;->RESTRICTION_LEVEL:I
-Landroid/icu/text/SpoofChecker;->SINGLE_SCRIPT:I
-Landroid/icu/text/SpoofChecker;->SINGLE_SCRIPT_CONFUSABLE:I
-Landroid/icu/text/SpoofChecker;->WHOLE_SCRIPT_CONFUSABLE:I
-Landroid/icu/text/StringCharacterIterator;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/StringCharacterIterator;-><init>(Ljava/lang/String;I)V
-Landroid/icu/text/StringCharacterIterator;-><init>(Ljava/lang/String;III)V
-Landroid/icu/text/StringCharacterIterator;->begin:I
-Landroid/icu/text/StringCharacterIterator;->end:I
-Landroid/icu/text/StringCharacterIterator;->pos:I
-Landroid/icu/text/StringCharacterIterator;->setText(Ljava/lang/String;)V
-Landroid/icu/text/StringCharacterIterator;->text:Ljava/lang/String;
-Landroid/icu/text/StringMatcher;-><init>(Ljava/lang/String;IIILandroid/icu/text/RuleBasedTransliterator$Data;)V
-Landroid/icu/text/StringMatcher;-><init>(Ljava/lang/String;ILandroid/icu/text/RuleBasedTransliterator$Data;)V
-Landroid/icu/text/StringMatcher;->addReplacementSetTo(Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/StringMatcher;->data:Landroid/icu/text/RuleBasedTransliterator$Data;
-Landroid/icu/text/StringMatcher;->matchLimit:I
-Landroid/icu/text/StringMatcher;->matchStart:I
-Landroid/icu/text/StringMatcher;->pattern:Ljava/lang/String;
-Landroid/icu/text/StringMatcher;->replace(Landroid/icu/text/Replaceable;II[I)I
-Landroid/icu/text/StringMatcher;->resetMatch()V
-Landroid/icu/text/StringMatcher;->segmentNumber:I
-Landroid/icu/text/StringMatcher;->toReplacerPattern(Z)Ljava/lang/String;
-Landroid/icu/text/StringPrep$Values;-><init>()V
-Landroid/icu/text/StringPrep$Values;->isIndex:Z
-Landroid/icu/text/StringPrep$Values;->reset()V
-Landroid/icu/text/StringPrep$Values;->type:I
-Landroid/icu/text/StringPrep$Values;->value:I
-Landroid/icu/text/StringPrep;-><init>(Ljava/io/InputStream;)V
-Landroid/icu/text/StringPrep;-><init>(Ljava/nio/ByteBuffer;)V
-Landroid/icu/text/StringPrep;->ALLOW_UNASSIGNED:I
-Landroid/icu/text/StringPrep;->bdp:Landroid/icu/impl/UBiDiProps;
-Landroid/icu/text/StringPrep;->CACHE:[Ljava/lang/ref/WeakReference;
-Landroid/icu/text/StringPrep;->checkBiDi:Z
-Landroid/icu/text/StringPrep;->CHECK_BIDI_ON:I
-Landroid/icu/text/StringPrep;->DEFAULT:I
-Landroid/icu/text/StringPrep;->DELETE:I
-Landroid/icu/text/StringPrep;->doNFKC:Z
-Landroid/icu/text/StringPrep;->FOUR_UCHARS_MAPPING_INDEX_START:I
-Landroid/icu/text/StringPrep;->getCodePointValue(I)C
-Landroid/icu/text/StringPrep;->getInstance(I)Landroid/icu/text/StringPrep;
-Landroid/icu/text/StringPrep;->getValues(CLandroid/icu/text/StringPrep$Values;)V
-Landroid/icu/text/StringPrep;->getVersionInfo(I)Landroid/icu/util/VersionInfo;
-Landroid/icu/text/StringPrep;->getVersionInfo([B)Landroid/icu/util/VersionInfo;
-Landroid/icu/text/StringPrep;->indexes:[I
-Landroid/icu/text/StringPrep;->INDEX_MAPPING_DATA_SIZE:I
-Landroid/icu/text/StringPrep;->INDEX_TOP:I
-Landroid/icu/text/StringPrep;->map(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/StringPrep;->MAP:I
-Landroid/icu/text/StringPrep;->mappingData:[C
-Landroid/icu/text/StringPrep;->MAX_INDEX_VALUE:I
-Landroid/icu/text/StringPrep;->MAX_PROFILE:I
-Landroid/icu/text/StringPrep;->NORMALIZATION_ON:I
-Landroid/icu/text/StringPrep;->normalize(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;
-Landroid/icu/text/StringPrep;->normCorrVer:Landroid/icu/util/VersionInfo;
-Landroid/icu/text/StringPrep;->NORM_CORRECTNS_LAST_UNI_VERSION:I
-Landroid/icu/text/StringPrep;->ONE_UCHAR_MAPPING_INDEX_START:I
-Landroid/icu/text/StringPrep;->OPTIONS:I
-Landroid/icu/text/StringPrep;->prepare(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/StringPrep;->prepare(Ljava/lang/String;I)Ljava/lang/String;
-Landroid/icu/text/StringPrep;->PROFILE_NAMES:[Ljava/lang/String;
-Landroid/icu/text/StringPrep;->PROHIBITED:I
-Landroid/icu/text/StringPrep;->RFC3491_NAMEPREP:I
-Landroid/icu/text/StringPrep;->RFC3530_NFS4_CIS_PREP:I
-Landroid/icu/text/StringPrep;->RFC3530_NFS4_CS_PREP:I
-Landroid/icu/text/StringPrep;->RFC3530_NFS4_CS_PREP_CI:I
-Landroid/icu/text/StringPrep;->RFC3530_NFS4_MIXED_PREP_PREFIX:I
-Landroid/icu/text/StringPrep;->RFC3530_NFS4_MIXED_PREP_SUFFIX:I
-Landroid/icu/text/StringPrep;->RFC3722_ISCSI:I
-Landroid/icu/text/StringPrep;->RFC3920_NODEPREP:I
-Landroid/icu/text/StringPrep;->RFC3920_RESOURCEPREP:I
-Landroid/icu/text/StringPrep;->RFC4011_MIB:I
-Landroid/icu/text/StringPrep;->RFC4013_SASLPREP:I
-Landroid/icu/text/StringPrep;->RFC4505_TRACE:I
-Landroid/icu/text/StringPrep;->RFC4518_LDAP:I
-Landroid/icu/text/StringPrep;->RFC4518_LDAP_CI:I
-Landroid/icu/text/StringPrep;->sprepTrie:Landroid/icu/impl/CharTrie;
-Landroid/icu/text/StringPrep;->sprepUniVer:Landroid/icu/util/VersionInfo;
-Landroid/icu/text/StringPrep;->THREE_UCHARS_MAPPING_INDEX_START:I
-Landroid/icu/text/StringPrep;->TWO_UCHARS_MAPPING_INDEX_START:I
-Landroid/icu/text/StringPrep;->TYPE_LIMIT:I
-Landroid/icu/text/StringPrep;->TYPE_THRESHOLD:I
-Landroid/icu/text/StringPrep;->UNASSIGNED:I
-Landroid/icu/text/StringPrepParseException;->error:I
-Landroid/icu/text/StringPrepParseException;->line:I
-Landroid/icu/text/StringPrepParseException;->PARSE_CONTEXT_LEN:I
-Landroid/icu/text/StringPrepParseException;->postContext:Ljava/lang/StringBuffer;
-Landroid/icu/text/StringPrepParseException;->preContext:Ljava/lang/StringBuffer;
-Landroid/icu/text/StringPrepParseException;->setContext(Ljava/lang/String;I)V
-Landroid/icu/text/StringPrepParseException;->setPostContext(Ljava/lang/String;I)V
-Landroid/icu/text/StringPrepParseException;->setPostContext([CI)V
-Landroid/icu/text/StringPrepParseException;->setPreContext(Ljava/lang/String;I)V
-Landroid/icu/text/StringPrepParseException;->setPreContext([CI)V
-Landroid/icu/text/StringSearch$CEBuffer;-><init>(Landroid/icu/text/StringSearch;)V
-Landroid/icu/text/StringSearch$CEBuffer;->bufSize_:I
-Landroid/icu/text/StringSearch$CEBuffer;->buf_:[Landroid/icu/text/StringSearch$CEI;
-Landroid/icu/text/StringSearch$CEBuffer;->CEBUFFER_EXTRA:I
-Landroid/icu/text/StringSearch$CEBuffer;->firstIx_:I
-Landroid/icu/text/StringSearch$CEBuffer;->get(I)Landroid/icu/text/StringSearch$CEI;
-Landroid/icu/text/StringSearch$CEBuffer;->getPrevious(I)Landroid/icu/text/StringSearch$CEI;
-Landroid/icu/text/StringSearch$CEBuffer;->limitIx_:I
-Landroid/icu/text/StringSearch$CEBuffer;->MAX_TARGET_IGNORABLES_PER_PAT_JAMO_L:I
-Landroid/icu/text/StringSearch$CEBuffer;->MAX_TARGET_IGNORABLES_PER_PAT_OTHER:I
-Landroid/icu/text/StringSearch$CEBuffer;->MIGHT_BE_JAMO_L(C)Z
-Landroid/icu/text/StringSearch$CEBuffer;->strSearch_:Landroid/icu/text/StringSearch;
-Landroid/icu/text/StringSearch$CEI;-><init>()V
-Landroid/icu/text/StringSearch$CEI;->ce_:J
-Landroid/icu/text/StringSearch$CEI;->highIndex_:I
-Landroid/icu/text/StringSearch$CEI;->lowIndex_:I
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;-><init>()V
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;->bufferIndex_:I
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;->buffer_:[Landroid/icu/text/StringSearch$CollationPCE$PCEI;
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;->empty()Z
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;->get()Landroid/icu/text/StringSearch$CollationPCE$PCEI;
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;->put(JII)V
-Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;->reset()V
-Landroid/icu/text/StringSearch$CollationPCE$PCEI;-><init>()V
-Landroid/icu/text/StringSearch$CollationPCE$PCEI;->ce_:J
-Landroid/icu/text/StringSearch$CollationPCE$PCEI;->high_:I
-Landroid/icu/text/StringSearch$CollationPCE$PCEI;->low_:I
-Landroid/icu/text/StringSearch$CollationPCE$Range;-><init>()V
-Landroid/icu/text/StringSearch$CollationPCE$Range;->ixHigh_:I
-Landroid/icu/text/StringSearch$CollationPCE$Range;->ixLow_:I
-Landroid/icu/text/StringSearch$CollationPCE$RCEBuffer;-><init>()V
-Landroid/icu/text/StringSearch$CollationPCE$RCEBuffer;->bufferIndex_:I
-Landroid/icu/text/StringSearch$CollationPCE$RCEBuffer;->buffer_:[Landroid/icu/text/StringSearch$CollationPCE$RCEI;
-Landroid/icu/text/StringSearch$CollationPCE$RCEBuffer;->empty()Z
-Landroid/icu/text/StringSearch$CollationPCE$RCEBuffer;->get()Landroid/icu/text/StringSearch$CollationPCE$RCEI;
-Landroid/icu/text/StringSearch$CollationPCE$RCEBuffer;->put(III)V
-Landroid/icu/text/StringSearch$CollationPCE$RCEI;-><init>()V
-Landroid/icu/text/StringSearch$CollationPCE$RCEI;->ce_:I
-Landroid/icu/text/StringSearch$CollationPCE$RCEI;->high_:I
-Landroid/icu/text/StringSearch$CollationPCE$RCEI;->low_:I
-Landroid/icu/text/StringSearch$CollationPCE;-><init>(Landroid/icu/text/CollationElementIterator;)V
-Landroid/icu/text/StringSearch$CollationPCE;->BUFFER_GROW:I
-Landroid/icu/text/StringSearch$CollationPCE;->cei_:Landroid/icu/text/CollationElementIterator;
-Landroid/icu/text/StringSearch$CollationPCE;->CONTINUATION_MARKER:I
-Landroid/icu/text/StringSearch$CollationPCE;->DEFAULT_BUFFER_SIZE:I
-Landroid/icu/text/StringSearch$CollationPCE;->init(Landroid/icu/text/CollationElementIterator;)V
-Landroid/icu/text/StringSearch$CollationPCE;->init(Landroid/icu/text/RuleBasedCollator;)V
-Landroid/icu/text/StringSearch$CollationPCE;->isContinuation(I)Z
-Landroid/icu/text/StringSearch$CollationPCE;->isShifted_:Z
-Landroid/icu/text/StringSearch$CollationPCE;->nextProcessed(Landroid/icu/text/StringSearch$CollationPCE$Range;)J
-Landroid/icu/text/StringSearch$CollationPCE;->pceBuffer_:Landroid/icu/text/StringSearch$CollationPCE$PCEBuffer;
-Landroid/icu/text/StringSearch$CollationPCE;->previousProcessed(Landroid/icu/text/StringSearch$CollationPCE$Range;)J
-Landroid/icu/text/StringSearch$CollationPCE;->PRIMARYORDERMASK:I
-Landroid/icu/text/StringSearch$CollationPCE;->processCE(I)J
-Landroid/icu/text/StringSearch$CollationPCE;->PROCESSED_NULLORDER:J
-Landroid/icu/text/StringSearch$CollationPCE;->strength_:I
-Landroid/icu/text/StringSearch$CollationPCE;->toShift_:Z
-Landroid/icu/text/StringSearch$CollationPCE;->variableTop_:I
-Landroid/icu/text/StringSearch$Match;-><init>()V
-Landroid/icu/text/StringSearch$Match;->limit_:I
-Landroid/icu/text/StringSearch$Match;->start_:I
-Landroid/icu/text/StringSearch$Pattern;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/StringSearch$Pattern;->CELength_:I
-Landroid/icu/text/StringSearch$Pattern;->CE_:[I
-Landroid/icu/text/StringSearch$Pattern;->PCELength_:I
-Landroid/icu/text/StringSearch$Pattern;->PCE_:[J
-Landroid/icu/text/StringSearch$Pattern;->text_:Ljava/lang/String;
-Landroid/icu/text/StringSearch;->addToIntArray([IIII)[I
-Landroid/icu/text/StringSearch;->addToLongArray([JIIJI)[J
-Landroid/icu/text/StringSearch;->ceMask_:I
-Landroid/icu/text/StringSearch;->CE_LEVEL2_BASE:I
-Landroid/icu/text/StringSearch;->CE_LEVEL3_BASE:I
-Landroid/icu/text/StringSearch;->CE_MATCH:I
-Landroid/icu/text/StringSearch;->CE_NO_MATCH:I
-Landroid/icu/text/StringSearch;->CE_SKIP_PATN:I
-Landroid/icu/text/StringSearch;->CE_SKIP_TARG:I
-Landroid/icu/text/StringSearch;->checkIdentical(II)Z
-Landroid/icu/text/StringSearch;->codePointAt(Ljava/text/CharacterIterator;I)I
-Landroid/icu/text/StringSearch;->codePointBefore(Ljava/text/CharacterIterator;I)I
-Landroid/icu/text/StringSearch;->collator_:Landroid/icu/text/RuleBasedCollator;
-Landroid/icu/text/StringSearch;->compareCE64s(JJLandroid/icu/text/SearchIterator$ElementComparisonType;)I
-Landroid/icu/text/StringSearch;->getCE(I)I
-Landroid/icu/text/StringSearch;->getMask(I)I
-Landroid/icu/text/StringSearch;->getString(Ljava/text/CharacterIterator;II)Ljava/lang/String;
-Landroid/icu/text/StringSearch;->handleNextCanonical()Z
-Landroid/icu/text/StringSearch;->handleNextCommonImpl()Z
-Landroid/icu/text/StringSearch;->handleNextExact()Z
-Landroid/icu/text/StringSearch;->handlePreviousCanonical()Z
-Landroid/icu/text/StringSearch;->handlePreviousCommonImpl()Z
-Landroid/icu/text/StringSearch;->handlePreviousExact()Z
-Landroid/icu/text/StringSearch;->initialize()V
-Landroid/icu/text/StringSearch;->initializePattern()I
-Landroid/icu/text/StringSearch;->initializePatternCETable()I
-Landroid/icu/text/StringSearch;->initializePatternPCETable()I
-Landroid/icu/text/StringSearch;->INITIAL_ARRAY_SIZE_:I
-Landroid/icu/text/StringSearch;->initTextProcessedIter()Z
-Landroid/icu/text/StringSearch;->isBreakBoundary(I)Z
-Landroid/icu/text/StringSearch;->isOutOfBounds(III)Z
-Landroid/icu/text/StringSearch;->nextBoundaryAfter(I)I
-Landroid/icu/text/StringSearch;->nfd_:Landroid/icu/text/Normalizer2;
-Landroid/icu/text/StringSearch;->pattern_:Landroid/icu/text/StringSearch$Pattern;
-Landroid/icu/text/StringSearch;->PRIMARYORDERMASK:I
-Landroid/icu/text/StringSearch;->search(ILandroid/icu/text/StringSearch$Match;)Z
-Landroid/icu/text/StringSearch;->searchBackwards(ILandroid/icu/text/StringSearch$Match;)Z
-Landroid/icu/text/StringSearch;->SECONDARYORDERMASK:I
-Landroid/icu/text/StringSearch;->setMatchNotFound()V
-Landroid/icu/text/StringSearch;->strength_:I
-Landroid/icu/text/StringSearch;->TERTIARYORDERMASK:I
-Landroid/icu/text/StringSearch;->textIter_:Landroid/icu/text/CollationElementIterator;
-Landroid/icu/text/StringSearch;->textProcessedIter_:Landroid/icu/text/StringSearch$CollationPCE;
-Landroid/icu/text/StringSearch;->toShift_:Z
-Landroid/icu/text/StringSearch;->utilIter_:Landroid/icu/text/CollationElementIterator;
-Landroid/icu/text/StringSearch;->variableTop_:I
-Landroid/icu/text/StringTransform;->transform(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat$TimeUnitFormatSetupSink;-><init>(Ljava/util/Map;ILjava/util/Set;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/TimeUnitFormat$TimeUnitFormatSetupSink;->beenHere:Z
-Landroid/icu/text/TimeUnitFormat$TimeUnitFormatSetupSink;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/TimeUnitFormat$TimeUnitFormatSetupSink;->pluralKeywords:Ljava/util/Set;
-Landroid/icu/text/TimeUnitFormat$TimeUnitFormatSetupSink;->style:I
-Landroid/icu/text/TimeUnitFormat$TimeUnitFormatSetupSink;->timeUnitToCountToPatterns:Ljava/util/Map;
-Landroid/icu/text/TimeUnitFormat;-><init>()V
-Landroid/icu/text/TimeUnitFormat;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/text/TimeUnitFormat;-><init>(Landroid/icu/util/ULocale;I)V
-Landroid/icu/text/TimeUnitFormat;-><init>(Landroid/icu/util/ULocale;ILandroid/icu/text/NumberFormat;)V
-Landroid/icu/text/TimeUnitFormat;-><init>(Ljava/util/Locale;)V
-Landroid/icu/text/TimeUnitFormat;-><init>(Ljava/util/Locale;I)V
-Landroid/icu/text/TimeUnitFormat;->ABBREVIATED_NAME:I
-Landroid/icu/text/TimeUnitFormat;->DEFAULT_PATTERN_FOR_DAY:Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat;->DEFAULT_PATTERN_FOR_HOUR:Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat;->DEFAULT_PATTERN_FOR_MINUTE:Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat;->DEFAULT_PATTERN_FOR_MONTH:Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat;->DEFAULT_PATTERN_FOR_SECOND:Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat;->DEFAULT_PATTERN_FOR_WEEK:Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat;->DEFAULT_PATTERN_FOR_YEAR:Ljava/lang/String;
-Landroid/icu/text/TimeUnitFormat;->format:Landroid/icu/text/NumberFormat;
-Landroid/icu/text/TimeUnitFormat;->FULL_NAME:I
-Landroid/icu/text/TimeUnitFormat;->isReady:Z
-Landroid/icu/text/TimeUnitFormat;->locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/TimeUnitFormat;->mf:Landroid/icu/text/MeasureFormat;
-Landroid/icu/text/TimeUnitFormat;->pluralRules:Landroid/icu/text/PluralRules;
-Landroid/icu/text/TimeUnitFormat;->searchInTree(Ljava/lang/String;ILandroid/icu/util/TimeUnit;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
-Landroid/icu/text/TimeUnitFormat;->setLocale(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeUnitFormat;
-Landroid/icu/text/TimeUnitFormat;->setLocale(Ljava/util/Locale;)Landroid/icu/text/TimeUnitFormat;
-Landroid/icu/text/TimeUnitFormat;->setNumberFormat(Landroid/icu/text/NumberFormat;)Landroid/icu/text/TimeUnitFormat;
-Landroid/icu/text/TimeUnitFormat;->setup()V
-Landroid/icu/text/TimeUnitFormat;->setup(Ljava/lang/String;Ljava/util/Map;ILjava/util/Set;)V
-Landroid/icu/text/TimeUnitFormat;->style:I
-Landroid/icu/text/TimeUnitFormat;->timeUnitToCountToPatterns:Ljava/util/Map;
-Landroid/icu/text/TimeUnitFormat;->TOTAL_STYLES:I
-Landroid/icu/text/TimeZoneFormat$GMTOffsetField;-><init>(CI)V
-Landroid/icu/text/TimeZoneFormat$GMTOffsetField;->getType()C
-Landroid/icu/text/TimeZoneFormat$GMTOffsetField;->getWidth()I
-Landroid/icu/text/TimeZoneFormat$GMTOffsetField;->isValid(CI)Z
-Landroid/icu/text/TimeZoneFormat$GMTOffsetField;->_type:C
-Landroid/icu/text/TimeZoneFormat$GMTOffsetField;->_width:I
-Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;->defaultPattern()Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;->isPositive()Z
-Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;->required()Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;->_defaultPattern:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;->_isPositive:Z
-Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;->_required:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat$OffsetFields;->H:Landroid/icu/text/TimeZoneFormat$OffsetFields;
-Landroid/icu/text/TimeZoneFormat$OffsetFields;->HM:Landroid/icu/text/TimeZoneFormat$OffsetFields;
-Landroid/icu/text/TimeZoneFormat$OffsetFields;->HMS:Landroid/icu/text/TimeZoneFormat$OffsetFields;
-Landroid/icu/text/TimeZoneFormat$OffsetFields;->valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$OffsetFields;
-Landroid/icu/text/TimeZoneFormat$OffsetFields;->values()[Landroid/icu/text/TimeZoneFormat$OffsetFields;
-Landroid/icu/text/TimeZoneFormat$Style;->flag:I
-Landroid/icu/text/TimeZoneFormat$TimeZoneFormatCache;-><init>()V
-Landroid/icu/text/TimeZoneFormat$TimeZoneFormatCache;->createInstance(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneFormat;
-Landroid/icu/text/TimeZoneFormat;->ALL_GENERIC_NAME_TYPES:Ljava/util/EnumSet;
-Landroid/icu/text/TimeZoneFormat;->ALL_SIMPLE_NAME_TYPES:Ljava/util/EnumSet;
-Landroid/icu/text/TimeZoneFormat;->ALT_GMT_STRINGS:[Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->appendOffsetDigits(Ljava/lang/StringBuilder;II)V
-Landroid/icu/text/TimeZoneFormat;->ASCII_DIGITS:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->checkAbuttingHoursAndMinutes()V
-Landroid/icu/text/TimeZoneFormat;->DEFAULT_GMT_DIGITS:[Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->DEFAULT_GMT_OFFSET_SEP:C
-Landroid/icu/text/TimeZoneFormat;->DEFAULT_GMT_PATTERN:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->DEFAULT_GMT_ZERO:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->expandOffsetPattern(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->formatExemplarLocation(Landroid/icu/util/TimeZone;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->formatOffsetISO8601(IZZZZ)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->formatOffsetLocalizedGMT(IZ)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->formatSpecific(Landroid/icu/util/TimeZone;Landroid/icu/text/TimeZoneNames$NameType;Landroid/icu/text/TimeZoneNames$NameType;JLandroid/icu/util/Output;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->getTargetRegion()Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->getTimeType(Landroid/icu/text/TimeZoneNames$NameType;)Landroid/icu/text/TimeZoneFormat$TimeType;
-Landroid/icu/text/TimeZoneFormat;->getTimeZoneForOffset(I)Landroid/icu/util/TimeZone;
-Landroid/icu/text/TimeZoneFormat;->getTimeZoneGenericNames()Landroid/icu/impl/TimeZoneGenericNames;
-Landroid/icu/text/TimeZoneFormat;->getTimeZoneID(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->getTZDBTimeZoneNames()Landroid/icu/text/TimeZoneNames;
-Landroid/icu/text/TimeZoneFormat;->initGMTOffsetPatterns([Ljava/lang/String;)V
-Landroid/icu/text/TimeZoneFormat;->initGMTPattern(Ljava/lang/String;)V
-Landroid/icu/text/TimeZoneFormat;->ISO8601_UTC:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->ISO_LOCAL_STYLE_FLAG:I
-Landroid/icu/text/TimeZoneFormat;->ISO_Z_STYLE_FLAG:I
-Landroid/icu/text/TimeZoneFormat;->MAX_OFFSET:I
-Landroid/icu/text/TimeZoneFormat;->MAX_OFFSET_HOUR:I
-Landroid/icu/text/TimeZoneFormat;->MAX_OFFSET_MINUTE:I
-Landroid/icu/text/TimeZoneFormat;->MAX_OFFSET_SECOND:I
-Landroid/icu/text/TimeZoneFormat;->MILLIS_PER_HOUR:I
-Landroid/icu/text/TimeZoneFormat;->MILLIS_PER_MINUTE:I
-Landroid/icu/text/TimeZoneFormat;->MILLIS_PER_SECOND:I
-Landroid/icu/text/TimeZoneFormat;->parseAbuttingAsciiOffsetFields(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/TimeZoneFormat$OffsetFields;Landroid/icu/text/TimeZoneFormat$OffsetFields;Z)I
-Landroid/icu/text/TimeZoneFormat;->parseAbuttingOffsetFields(Ljava/lang/String;I[I)I
-Landroid/icu/text/TimeZoneFormat;->parseAsciiOffsetFields(Ljava/lang/String;Ljava/text/ParsePosition;CLandroid/icu/text/TimeZoneFormat$OffsetFields;Landroid/icu/text/TimeZoneFormat$OffsetFields;)I
-Landroid/icu/text/TimeZoneFormat;->parseDefaultOffsetFields(Ljava/lang/String;IC[I)I
-Landroid/icu/text/TimeZoneFormat;->parseExemplarLocation(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->parseOffsetDefaultLocalizedGMT(Ljava/lang/String;I[I)I
-Landroid/icu/text/TimeZoneFormat;->parseOffsetFields(Ljava/lang/String;IZ[I)I
-Landroid/icu/text/TimeZoneFormat;->parseOffsetFieldsWithPattern(Ljava/lang/String;I[Ljava/lang/Object;Z[I)I
-Landroid/icu/text/TimeZoneFormat;->parseOffsetFieldWithLocalizedDigits(Ljava/lang/String;IIIII[I)I
-Landroid/icu/text/TimeZoneFormat;->parseOffsetISO8601(Ljava/lang/String;Ljava/text/ParsePosition;ZLandroid/icu/util/Output;)I
-Landroid/icu/text/TimeZoneFormat;->parseOffsetLocalizedGMT(Ljava/lang/String;Ljava/text/ParsePosition;ZLandroid/icu/util/Output;)I
-Landroid/icu/text/TimeZoneFormat;->parseOffsetLocalizedGMTPattern(Ljava/lang/String;IZ[I)I
-Landroid/icu/text/TimeZoneFormat;->parseOffsetPattern(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/Object;
-Landroid/icu/text/TimeZoneFormat;->parseShortZoneID(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->parseSingleLocalizedDigit(Ljava/lang/String;I[I)I
-Landroid/icu/text/TimeZoneFormat;->parseZoneID(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->PARSE_GMT_OFFSET_TYPES:[Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;
-Landroid/icu/text/TimeZoneFormat;->SHORT_ZONE_ID_TRIE:Landroid/icu/impl/TextTrieMap;
-Landroid/icu/text/TimeZoneFormat;->toCodePoints(Ljava/lang/String;)[Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->truncateOffsetPattern(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->TZID_GMT:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->UNKNOWN_LOCATION:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->UNKNOWN_OFFSET:I
-Landroid/icu/text/TimeZoneFormat;->UNKNOWN_SHORT_ZONE_ID:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->UNKNOWN_ZONE_ID:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->unquote(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->ZONE_ID_TRIE:Landroid/icu/impl/TextTrieMap;
-Landroid/icu/text/TimeZoneFormat;->_abuttingOffsetHoursAndMinutes:Z
-Landroid/icu/text/TimeZoneFormat;->_frozen:Z
-Landroid/icu/text/TimeZoneFormat;->_gmtOffsetDigits:[Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->_gmtOffsetPatternItems:[[Ljava/lang/Object;
-Landroid/icu/text/TimeZoneFormat;->_gmtOffsetPatterns:[Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->_gmtPattern:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->_gmtPatternPrefix:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->_gmtPatternSuffix:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->_gmtZeroFormat:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->_gnames:Landroid/icu/impl/TimeZoneGenericNames;
-Landroid/icu/text/TimeZoneFormat;->_locale:Landroid/icu/util/ULocale;
-Landroid/icu/text/TimeZoneFormat;->_parseAllStyles:Z
-Landroid/icu/text/TimeZoneFormat;->_parseTZDBNames:Z
-Landroid/icu/text/TimeZoneFormat;->_region:Ljava/lang/String;
-Landroid/icu/text/TimeZoneFormat;->_tzdbNames:Landroid/icu/text/TimeZoneNames;
-Landroid/icu/text/TimeZoneFormat;->_tzfCache:Landroid/icu/text/TimeZoneFormat$TimeZoneFormatCache;
-Landroid/icu/text/TimeZoneFormat;->_tznames:Landroid/icu/text/TimeZoneNames;
-Landroid/icu/text/TimeZoneNames$Cache;-><init>()V
-Landroid/icu/text/TimeZoneNames$Cache;->createInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;
-Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames$FactoryImpl;->getTimeZoneNames(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;
-Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames;-><init>()V
-Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames;->find(Ljava/lang/CharSequence;ILjava/util/EnumSet;)Ljava/util/Collection;
-Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames;->INSTANCE:Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames;
-Landroid/icu/text/TimeZoneNames$Factory;-><init>()V
-Landroid/icu/text/TimeZoneNames$Factory;->getTimeZoneNames(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;
-Landroid/icu/text/TimeZoneNames$MatchInfo;-><init>(Landroid/icu/text/TimeZoneNames$NameType;Ljava/lang/String;Ljava/lang/String;I)V
-Landroid/icu/text/TimeZoneNames$MatchInfo;->matchLength()I
-Landroid/icu/text/TimeZoneNames$MatchInfo;->mzID()Ljava/lang/String;
-Landroid/icu/text/TimeZoneNames$MatchInfo;->nameType()Landroid/icu/text/TimeZoneNames$NameType;
-Landroid/icu/text/TimeZoneNames$MatchInfo;->tzID()Ljava/lang/String;
-Landroid/icu/text/TimeZoneNames$MatchInfo;->_matchLength:I
-Landroid/icu/text/TimeZoneNames$MatchInfo;->_mzID:Ljava/lang/String;
-Landroid/icu/text/TimeZoneNames$MatchInfo;->_nameType:Landroid/icu/text/TimeZoneNames$NameType;
-Landroid/icu/text/TimeZoneNames$MatchInfo;->_tzID:Ljava/lang/String;
-Landroid/icu/text/TimeZoneNames;-><init>()V
-Landroid/icu/text/TimeZoneNames;->DEFAULT_FACTORY_CLASS:Ljava/lang/String;
-Landroid/icu/text/TimeZoneNames;->FACTORY_NAME_PROP:Ljava/lang/String;
-Landroid/icu/text/TimeZoneNames;->find(Ljava/lang/CharSequence;ILjava/util/EnumSet;)Ljava/util/Collection;
-Landroid/icu/text/TimeZoneNames;->getDisplayNames(Ljava/lang/String;[Landroid/icu/text/TimeZoneNames$NameType;J[Ljava/lang/String;I)V
-Landroid/icu/text/TimeZoneNames;->loadAllDisplayNames()V
-Landroid/icu/text/TimeZoneNames;->TZNAMES_CACHE:Landroid/icu/text/TimeZoneNames$Cache;
-Landroid/icu/text/TimeZoneNames;->TZNAMES_FACTORY:Landroid/icu/text/TimeZoneNames$Factory;
-Landroid/icu/text/Transform;->transform(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/icu/text/TransliterationRule;-><init>(Ljava/lang/String;IILjava/lang/String;II[Landroid/icu/text/UnicodeMatcher;ZZLandroid/icu/text/RuleBasedTransliterator$Data;)V
-Landroid/icu/text/TransliterationRule;->addSourceTargetSet(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/TransliterationRule;->ANCHOR_END:I
-Landroid/icu/text/TransliterationRule;->ANCHOR_START:I
-Landroid/icu/text/TransliterationRule;->anteContext:Landroid/icu/text/StringMatcher;
-Landroid/icu/text/TransliterationRule;->anteContextLength:I
-Landroid/icu/text/TransliterationRule;->data:Landroid/icu/text/RuleBasedTransliterator$Data;
-Landroid/icu/text/TransliterationRule;->flags:B
-Landroid/icu/text/TransliterationRule;->getAnteContextLength()I
-Landroid/icu/text/TransliterationRule;->getIndexValue()I
-Landroid/icu/text/TransliterationRule;->key:Landroid/icu/text/StringMatcher;
-Landroid/icu/text/TransliterationRule;->keyLength:I
-Landroid/icu/text/TransliterationRule;->masks(Landroid/icu/text/TransliterationRule;)Z
-Landroid/icu/text/TransliterationRule;->matchAndReplace(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;Z)I
-Landroid/icu/text/TransliterationRule;->matchesIndexValue(I)Z
-Landroid/icu/text/TransliterationRule;->output:Landroid/icu/text/UnicodeReplacer;
-Landroid/icu/text/TransliterationRule;->pattern:Ljava/lang/String;
-Landroid/icu/text/TransliterationRule;->posAfter(Landroid/icu/text/Replaceable;I)I
-Landroid/icu/text/TransliterationRule;->posBefore(Landroid/icu/text/Replaceable;I)I
-Landroid/icu/text/TransliterationRule;->postContext:Landroid/icu/text/StringMatcher;
-Landroid/icu/text/TransliterationRule;->segments:[Landroid/icu/text/UnicodeMatcher;
-Landroid/icu/text/TransliterationRule;->toRule(Z)Ljava/lang/String;
-Landroid/icu/text/TransliterationRuleSet;-><init>()V
-Landroid/icu/text/TransliterationRuleSet;->addRule(Landroid/icu/text/TransliterationRule;)V
-Landroid/icu/text/TransliterationRuleSet;->addSourceTargetSet(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/TransliterationRuleSet;->freeze()V
-Landroid/icu/text/TransliterationRuleSet;->getMaximumContextLength()I
-Landroid/icu/text/TransliterationRuleSet;->index:[I
-Landroid/icu/text/TransliterationRuleSet;->maxContextLength:I
-Landroid/icu/text/TransliterationRuleSet;->rules:[Landroid/icu/text/TransliterationRule;
-Landroid/icu/text/TransliterationRuleSet;->ruleVector:Ljava/util/List;
-Landroid/icu/text/TransliterationRuleSet;->toRules(Z)Ljava/lang/String;
-Landroid/icu/text/TransliterationRuleSet;->transliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;Z)Z
-Landroid/icu/text/Transliterator$Factory;->getInstance(Ljava/lang/String;)Landroid/icu/text/Transliterator;
-Landroid/icu/text/Transliterator$Position;-><init>()V
-Landroid/icu/text/Transliterator$Position;-><init>(III)V
-Landroid/icu/text/Transliterator$Position;-><init>(IIII)V
-Landroid/icu/text/Transliterator$Position;-><init>(Landroid/icu/text/Transliterator$Position;)V
-Landroid/icu/text/Transliterator$Position;->contextLimit:I
-Landroid/icu/text/Transliterator$Position;->contextStart:I
-Landroid/icu/text/Transliterator$Position;->limit:I
-Landroid/icu/text/Transliterator$Position;->set(Landroid/icu/text/Transliterator$Position;)V
-Landroid/icu/text/Transliterator$Position;->start:I
-Landroid/icu/text/Transliterator$Position;->validate(I)V
-Landroid/icu/text/Transliterator;-><init>(Ljava/lang/String;Landroid/icu/text/UnicodeFilter;)V
-Landroid/icu/text/Transliterator;->addSourceTargetSet(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/Transliterator;->baseToRules(Z)Ljava/lang/String;
-Landroid/icu/text/Transliterator;->DEBUG:Z
-Landroid/icu/text/Transliterator;->displayNameCache:Ljava/util/Map;
-Landroid/icu/text/Transliterator;->filter:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/Transliterator;->filteredTransliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;Z)V
-Landroid/icu/text/Transliterator;->filteredTransliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;ZZ)V
-Landroid/icu/text/Transliterator;->finishTransliteration(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;)V
-Landroid/icu/text/Transliterator;->FORWARD:I
-Landroid/icu/text/Transliterator;->getAvailableIDs()Ljava/util/Enumeration;
-Landroid/icu/text/Transliterator;->getAvailableSources()Ljava/util/Enumeration;
-Landroid/icu/text/Transliterator;->getAvailableTargets(Ljava/lang/String;)Ljava/util/Enumeration;
-Landroid/icu/text/Transliterator;->getAvailableVariants(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Enumeration;
-Landroid/icu/text/Transliterator;->getBasicInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/Transliterator;
-Landroid/icu/text/Transliterator;->getDisplayName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/Transliterator;->getDisplayName(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/text/Transliterator;->getDisplayName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
-Landroid/icu/text/Transliterator;->getElements()[Landroid/icu/text/Transliterator;
-Landroid/icu/text/Transliterator;->getFilter()Landroid/icu/text/UnicodeFilter;
-Landroid/icu/text/Transliterator;->getFilterAsUnicodeSet(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/Transliterator;->getID()Ljava/lang/String;
-Landroid/icu/text/Transliterator;->getInverse()Landroid/icu/text/Transliterator;
-Landroid/icu/text/Transliterator;->getMaximumContextLength()I
-Landroid/icu/text/Transliterator;->getSourceSet()Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/Transliterator;->getTargetSet()Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/Transliterator;->handleGetSourceSet()Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/Transliterator;->handleTransliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;Z)V
-Landroid/icu/text/Transliterator;->ID:Ljava/lang/String;
-Landroid/icu/text/Transliterator;->ID_DELIM:C
-Landroid/icu/text/Transliterator;->ID_SEP:C
-Landroid/icu/text/Transliterator;->maximumContextLength:I
-Landroid/icu/text/Transliterator;->RB_DISPLAY_NAME_PATTERN:Ljava/lang/String;
-Landroid/icu/text/Transliterator;->RB_DISPLAY_NAME_PREFIX:Ljava/lang/String;
-Landroid/icu/text/Transliterator;->RB_RULE_BASED_IDS:Ljava/lang/String;
-Landroid/icu/text/Transliterator;->RB_SCRIPT_DISPLAY_NAME_PREFIX:Ljava/lang/String;
-Landroid/icu/text/Transliterator;->registerAlias(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/Transliterator;->registerAny()V
-Landroid/icu/text/Transliterator;->registerClass(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)V
-Landroid/icu/text/Transliterator;->registerFactory(Ljava/lang/String;Landroid/icu/text/Transliterator$Factory;)V
-Landroid/icu/text/Transliterator;->registerInstance(Landroid/icu/text/Transliterator;)V
-Landroid/icu/text/Transliterator;->registerInstance(Landroid/icu/text/Transliterator;Z)V
-Landroid/icu/text/Transliterator;->registerSpecialInverse(Ljava/lang/String;Ljava/lang/String;Z)V
-Landroid/icu/text/Transliterator;->registry:Landroid/icu/text/TransliteratorRegistry;
-Landroid/icu/text/Transliterator;->REVERSE:I
-Landroid/icu/text/Transliterator;->ROOT:Ljava/lang/String;
-Landroid/icu/text/Transliterator;->setFilter(Landroid/icu/text/UnicodeFilter;)V
-Landroid/icu/text/Transliterator;->setID(Ljava/lang/String;)V
-Landroid/icu/text/Transliterator;->setMaximumContextLength(I)V
-Landroid/icu/text/Transliterator;->toRules(Z)Ljava/lang/String;
-Landroid/icu/text/Transliterator;->transform(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/Transliterator;->transliterate(Landroid/icu/text/Replaceable;)V
-Landroid/icu/text/Transliterator;->transliterate(Landroid/icu/text/Replaceable;II)I
-Landroid/icu/text/Transliterator;->transliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;)V
-Landroid/icu/text/Transliterator;->transliterate(Landroid/icu/text/Replaceable;Landroid/icu/text/Transliterator$Position;I)V
-Landroid/icu/text/Transliterator;->unregister(Ljava/lang/String;)V
-Landroid/icu/text/Transliterator;->VARIANT_SEP:C
-Landroid/icu/text/TransliteratorRegistry$AliasEntry;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/TransliteratorRegistry$AliasEntry;->alias:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$CompoundRBTEntry;-><init>(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/TransliteratorRegistry$CompoundRBTEntry;->compoundFilter:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/TransliteratorRegistry$CompoundRBTEntry;->dataVector:Ljava/util/List;
-Landroid/icu/text/TransliteratorRegistry$CompoundRBTEntry;->getInstance()Landroid/icu/text/Transliterator;
-Landroid/icu/text/TransliteratorRegistry$CompoundRBTEntry;->ID:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$CompoundRBTEntry;->idBlockVector:Ljava/util/List;
-Landroid/icu/text/TransliteratorRegistry$IDEnumeration;-><init>(Ljava/util/Enumeration;)V
-Landroid/icu/text/TransliteratorRegistry$IDEnumeration;->en:Ljava/util/Enumeration;
-Landroid/icu/text/TransliteratorRegistry$LocaleEntry;-><init>(Ljava/lang/String;I)V
-Landroid/icu/text/TransliteratorRegistry$LocaleEntry;->direction:I
-Landroid/icu/text/TransliteratorRegistry$LocaleEntry;->rule:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$ResourceEntry;-><init>(Ljava/lang/String;I)V
-Landroid/icu/text/TransliteratorRegistry$ResourceEntry;->direction:I
-Landroid/icu/text/TransliteratorRegistry$ResourceEntry;->resource:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$Spec;-><init>(Ljava/lang/String;)V
-Landroid/icu/text/TransliteratorRegistry$Spec;->get()Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$Spec;->getBundle()Ljava/util/ResourceBundle;
-Landroid/icu/text/TransliteratorRegistry$Spec;->getTop()Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$Spec;->hasFallback()Z
-Landroid/icu/text/TransliteratorRegistry$Spec;->isLocale()Z
-Landroid/icu/text/TransliteratorRegistry$Spec;->isNextLocale:Z
-Landroid/icu/text/TransliteratorRegistry$Spec;->isSpecLocale:Z
-Landroid/icu/text/TransliteratorRegistry$Spec;->next()Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$Spec;->nextSpec:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$Spec;->res:Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/text/TransliteratorRegistry$Spec;->reset()V
-Landroid/icu/text/TransliteratorRegistry$Spec;->scriptName:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$Spec;->setupNext()V
-Landroid/icu/text/TransliteratorRegistry$Spec;->spec:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry$Spec;->top:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry;-><init>()V
-Landroid/icu/text/TransliteratorRegistry;->ANY:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry;->availableIDs:Ljava/util/List;
-Landroid/icu/text/TransliteratorRegistry;->DEBUG:Z
-Landroid/icu/text/TransliteratorRegistry;->find(Ljava/lang/String;)[Ljava/lang/Object;
-Landroid/icu/text/TransliteratorRegistry;->find(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/Object;
-Landroid/icu/text/TransliteratorRegistry;->findInBundle(Landroid/icu/text/TransliteratorRegistry$Spec;Landroid/icu/text/TransliteratorRegistry$Spec;Ljava/lang/String;I)[Ljava/lang/Object;
-Landroid/icu/text/TransliteratorRegistry;->findInDynamicStore(Landroid/icu/text/TransliteratorRegistry$Spec;Landroid/icu/text/TransliteratorRegistry$Spec;Ljava/lang/String;)[Ljava/lang/Object;
-Landroid/icu/text/TransliteratorRegistry;->findInStaticStore(Landroid/icu/text/TransliteratorRegistry$Spec;Landroid/icu/text/TransliteratorRegistry$Spec;Ljava/lang/String;)[Ljava/lang/Object;
-Landroid/icu/text/TransliteratorRegistry;->get(Ljava/lang/String;Ljava/lang/StringBuffer;)Landroid/icu/text/Transliterator;
-Landroid/icu/text/TransliteratorRegistry;->getAvailableIDs()Ljava/util/Enumeration;
-Landroid/icu/text/TransliteratorRegistry;->getAvailableSources()Ljava/util/Enumeration;
-Landroid/icu/text/TransliteratorRegistry;->getAvailableTargets(Ljava/lang/String;)Ljava/util/Enumeration;
-Landroid/icu/text/TransliteratorRegistry;->getAvailableVariants(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Enumeration;
-Landroid/icu/text/TransliteratorRegistry;->instantiateEntry(Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/StringBuffer;)Landroid/icu/text/Transliterator;
-Landroid/icu/text/TransliteratorRegistry;->LOCALE_SEP:C
-Landroid/icu/text/TransliteratorRegistry;->NO_VARIANT:Ljava/lang/String;
-Landroid/icu/text/TransliteratorRegistry;->put(Ljava/lang/String;Landroid/icu/text/Transliterator$Factory;Z)V
-Landroid/icu/text/TransliteratorRegistry;->put(Ljava/lang/String;Landroid/icu/text/Transliterator;Z)V
-Landroid/icu/text/TransliteratorRegistry;->put(Ljava/lang/String;Ljava/lang/Class;Z)V
-Landroid/icu/text/TransliteratorRegistry;->put(Ljava/lang/String;Ljava/lang/String;IZ)V
-Landroid/icu/text/TransliteratorRegistry;->put(Ljava/lang/String;Ljava/lang/String;Z)V
-Landroid/icu/text/TransliteratorRegistry;->registerEntry(Ljava/lang/String;Ljava/lang/Object;Z)V
-Landroid/icu/text/TransliteratorRegistry;->registerEntry(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)V
-Landroid/icu/text/TransliteratorRegistry;->registerEntry(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)V
-Landroid/icu/text/TransliteratorRegistry;->registerSTV(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/TransliteratorRegistry;->registry:Ljava/util/Map;
-Landroid/icu/text/TransliteratorRegistry;->remove(Ljava/lang/String;)V
-Landroid/icu/text/TransliteratorRegistry;->removeSTV(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/text/TransliteratorRegistry;->specDAG:Ljava/util/Map;
-Landroid/icu/text/UFieldPosition;-><init>()V
-Landroid/icu/text/UFieldPosition;-><init>(I)V
-Landroid/icu/text/UFieldPosition;-><init>(Ljava/text/Format$Field;)V
-Landroid/icu/text/UFieldPosition;-><init>(Ljava/text/Format$Field;I)V
-Landroid/icu/text/UFieldPosition;->countVisibleFractionDigits:I
-Landroid/icu/text/UFieldPosition;->fractionDigits:J
-Landroid/icu/text/UFieldPosition;->getCountVisibleFractionDigits()I
-Landroid/icu/text/UFieldPosition;->getFractionDigits()J
-Landroid/icu/text/UFieldPosition;->setFractionDigits(IJ)V
-Landroid/icu/text/UFormat;->actualLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/UFormat;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-Landroid/icu/text/UFormat;->validLocale:Landroid/icu/util/ULocale;
-Landroid/icu/text/UForwardCharacterIterator;->next()I
-Landroid/icu/text/UForwardCharacterIterator;->nextCodePoint()I
-Landroid/icu/text/UnhandledBreakEngine;-><init>()V
-Landroid/icu/text/UnhandledBreakEngine;->fHandled:Ljava/util/concurrent/atomic/AtomicReferenceArray;
-Landroid/icu/text/UnhandledBreakEngine;->findBreaks(Ljava/text/CharacterIterator;IIILandroid/icu/text/DictionaryBreakEngine$DequeI;)I
-Landroid/icu/text/UnhandledBreakEngine;->handleChar(II)V
-Landroid/icu/text/UnhandledBreakEngine;->handles(II)Z
-Landroid/icu/text/UnicodeCompressor;-><init>()V
-Landroid/icu/text/UnicodeCompressor;->compress(Ljava/lang/String;)[B
-Landroid/icu/text/UnicodeCompressor;->compress([CII)[B
-Landroid/icu/text/UnicodeCompressor;->compress([CII[I[BII)I
-Landroid/icu/text/UnicodeCompressor;->fCurrentWindow:I
-Landroid/icu/text/UnicodeCompressor;->findDynamicWindow(I)I
-Landroid/icu/text/UnicodeCompressor;->fIndexCount:[I
-Landroid/icu/text/UnicodeCompressor;->findStaticWindow(I)I
-Landroid/icu/text/UnicodeCompressor;->fMode:I
-Landroid/icu/text/UnicodeCompressor;->fOffsets:[I
-Landroid/icu/text/UnicodeCompressor;->fTimeStamp:I
-Landroid/icu/text/UnicodeCompressor;->fTimeStamps:[I
-Landroid/icu/text/UnicodeCompressor;->getLRDefinedWindow()I
-Landroid/icu/text/UnicodeCompressor;->inDynamicWindow(II)Z
-Landroid/icu/text/UnicodeCompressor;->inStaticWindow(II)Z
-Landroid/icu/text/UnicodeCompressor;->isCompressible(I)Z
-Landroid/icu/text/UnicodeCompressor;->makeIndex(I)I
-Landroid/icu/text/UnicodeCompressor;->reset()V
-Landroid/icu/text/UnicodeCompressor;->sSingleTagTable:[Z
-Landroid/icu/text/UnicodeCompressor;->sUnicodeTagTable:[Z
-Landroid/icu/text/UnicodeDecompressor;-><init>()V
-Landroid/icu/text/UnicodeDecompressor;->BUFSIZE:I
-Landroid/icu/text/UnicodeDecompressor;->decompress([B)Ljava/lang/String;
-Landroid/icu/text/UnicodeDecompressor;->decompress([BII)[C
-Landroid/icu/text/UnicodeDecompressor;->decompress([BII[I[CII)I
-Landroid/icu/text/UnicodeDecompressor;->fBuffer:[B
-Landroid/icu/text/UnicodeDecompressor;->fBufferLength:I
-Landroid/icu/text/UnicodeDecompressor;->fCurrentWindow:I
-Landroid/icu/text/UnicodeDecompressor;->fMode:I
-Landroid/icu/text/UnicodeDecompressor;->fOffsets:[I
-Landroid/icu/text/UnicodeDecompressor;->reset()V
-Landroid/icu/text/UnicodeFilter;-><init>()V
-Landroid/icu/text/UnicodeReplacer;->addReplacementSetTo(Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/UnicodeReplacer;->replace(Landroid/icu/text/Replaceable;II[I)I
-Landroid/icu/text/UnicodeReplacer;->toReplacerPattern(Z)Ljava/lang/String;
-Landroid/icu/text/UnicodeSet$EntryRange;-><init>()V
-Landroid/icu/text/UnicodeSet$EntryRangeIterator;->pos:I
-Landroid/icu/text/UnicodeSet$EntryRangeIterator;->result:Landroid/icu/text/UnicodeSet$EntryRange;
-Landroid/icu/text/UnicodeSet$Filter;->contains(I)Z
-Landroid/icu/text/UnicodeSet$GeneralCategoryMaskFilter;-><init>(I)V
-Landroid/icu/text/UnicodeSet$GeneralCategoryMaskFilter;->contains(I)Z
-Landroid/icu/text/UnicodeSet$GeneralCategoryMaskFilter;->mask:I
-Landroid/icu/text/UnicodeSet$IntPropertyFilter;-><init>(II)V
-Landroid/icu/text/UnicodeSet$IntPropertyFilter;->contains(I)Z
-Landroid/icu/text/UnicodeSet$IntPropertyFilter;->prop:I
-Landroid/icu/text/UnicodeSet$IntPropertyFilter;->value:I
-Landroid/icu/text/UnicodeSet$NumericValueFilter;-><init>(D)V
-Landroid/icu/text/UnicodeSet$NumericValueFilter;->contains(I)Z
-Landroid/icu/text/UnicodeSet$NumericValueFilter;->value:D
-Landroid/icu/text/UnicodeSet$ScriptExtensionsFilter;-><init>(I)V
-Landroid/icu/text/UnicodeSet$ScriptExtensionsFilter;->contains(I)Z
-Landroid/icu/text/UnicodeSet$ScriptExtensionsFilter;->script:I
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;-><init>(Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->buffer:[C
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->current:I
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->item:I
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->len:I
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->limit:I
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->sourceList:[I
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->sourceStrings:Ljava/util/TreeSet;
-Landroid/icu/text/UnicodeSet$UnicodeSetIterator2;->stringIterator:Ljava/util/Iterator;
-Landroid/icu/text/UnicodeSet$VersionFilter;-><init>(Landroid/icu/util/VersionInfo;)V
-Landroid/icu/text/UnicodeSet$VersionFilter;->contains(I)Z
-Landroid/icu/text/UnicodeSet$VersionFilter;->version:Landroid/icu/util/VersionInfo;
-Landroid/icu/text/UnicodeSet$XSymbolTable;-><init>()V
-Landroid/icu/text/UnicodeSet$XSymbolTable;->applyPropertyAlias(Ljava/lang/String;Ljava/lang/String;Landroid/icu/text/UnicodeSet;)Z
-Landroid/icu/text/UnicodeSet;->add([III)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->addAllTo(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection;
-Landroid/icu/text/UnicodeSet;->addAllTo(Ljava/lang/Iterable;[Ljava/lang/Object;)[Ljava/lang/Object;
-Landroid/icu/text/UnicodeSet;->addAllTo([Ljava/lang/String;)[Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->addBridges(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->addCaseMapping(Landroid/icu/text/UnicodeSet;ILjava/lang/StringBuilder;)V
-Landroid/icu/text/UnicodeSet;->add_unchecked(I)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->add_unchecked(II)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->ANY_ID:Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->append(Ljava/lang/Appendable;Ljava/lang/CharSequence;)V
-Landroid/icu/text/UnicodeSet;->appendCodePoint(Ljava/lang/Appendable;I)V
-Landroid/icu/text/UnicodeSet;->appendNewPattern(Ljava/lang/Appendable;ZZ)Ljava/lang/Appendable;
-Landroid/icu/text/UnicodeSet;->applyFilter(Landroid/icu/text/UnicodeSet$Filter;I)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->applyPattern(Landroid/icu/impl/RuleCharacterIterator;Landroid/icu/text/SymbolTable;Ljava/lang/Appendable;I)V
-Landroid/icu/text/UnicodeSet;->applyPattern(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;I)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->applyPropertyPattern(Landroid/icu/impl/RuleCharacterIterator;Ljava/lang/Appendable;Landroid/icu/text/SymbolTable;)V
-Landroid/icu/text/UnicodeSet;->applyPropertyPattern(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->ASCII_ID:Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->ASSIGNED:Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->bmpSet:Landroid/icu/impl/BMPSet;
-Landroid/icu/text/UnicodeSet;->buffer:[I
-Landroid/icu/text/UnicodeSet;->checkFrozen()V
-Landroid/icu/text/UnicodeSet;->compare(ILjava/lang/CharSequence;)I
-Landroid/icu/text/UnicodeSet;->compare(Ljava/lang/CharSequence;I)I
-Landroid/icu/text/UnicodeSet;->compare(Ljava/lang/Iterable;Ljava/lang/Iterable;)I
-Landroid/icu/text/UnicodeSet;->compare(Ljava/util/Collection;Ljava/util/Collection;Landroid/icu/text/UnicodeSet$ComparisonStyle;)I
-Landroid/icu/text/UnicodeSet;->compare(Ljava/util/Iterator;Ljava/util/Iterator;)I
-Landroid/icu/text/UnicodeSet;->containsAll(Ljava/lang/String;I)Z
-Landroid/icu/text/UnicodeSet;->ensureBufferCapacity(I)V
-Landroid/icu/text/UnicodeSet;->ensureCapacity(I)V
-Landroid/icu/text/UnicodeSet;->findCodePoint(I)I
-Landroid/icu/text/UnicodeSet;->findIn(Ljava/lang/CharSequence;IZ)I
-Landroid/icu/text/UnicodeSet;->findLastIn(Ljava/lang/CharSequence;IZ)I
-Landroid/icu/text/UnicodeSet;->getDefaultXSymbolTable()Landroid/icu/text/UnicodeSet$XSymbolTable;
-Landroid/icu/text/UnicodeSet;->getInclusions(I)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->getRegexEquivalent()Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->getSingleCodePoint(Ljava/lang/CharSequence;)I
-Landroid/icu/text/UnicodeSet;->getSingleCP(Ljava/lang/CharSequence;)I
-Landroid/icu/text/UnicodeSet;->GROW_EXTRA:I
-Landroid/icu/text/UnicodeSet;->HIGH:I
-Landroid/icu/text/UnicodeSet;->INCLUSIONS:[Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->LAST0_START:I
-Landroid/icu/text/UnicodeSet;->LAST1_RANGE:I
-Landroid/icu/text/UnicodeSet;->LAST2_SET:I
-Landroid/icu/text/UnicodeSet;->len:I
-Landroid/icu/text/UnicodeSet;->list:[I
-Landroid/icu/text/UnicodeSet;->LOW:I
-Landroid/icu/text/UnicodeSet;->matchesAt(Ljava/lang/CharSequence;I)I
-Landroid/icu/text/UnicodeSet;->matchesAt(Ljava/lang/CharSequence;ILjava/lang/CharSequence;)I
-Landroid/icu/text/UnicodeSet;->matchRest(Landroid/icu/text/Replaceable;IILjava/lang/String;)I
-Landroid/icu/text/UnicodeSet;->max(II)I
-Landroid/icu/text/UnicodeSet;->MODE0_NONE:I
-Landroid/icu/text/UnicodeSet;->MODE1_INBRACKET:I
-Landroid/icu/text/UnicodeSet;->MODE2_OUTBRACKET:I
-Landroid/icu/text/UnicodeSet;->mungeCharName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->NO_VERSION:Landroid/icu/util/VersionInfo;
-Landroid/icu/text/UnicodeSet;->pat:Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->range(II)[I
-Landroid/icu/text/UnicodeSet;->rangeList:[I
-Landroid/icu/text/UnicodeSet;->resemblesPattern(Ljava/lang/String;I)Z
-Landroid/icu/text/UnicodeSet;->resemblesPropertyPattern(Landroid/icu/impl/RuleCharacterIterator;I)Z
-Landroid/icu/text/UnicodeSet;->resemblesPropertyPattern(Ljava/lang/String;I)Z
-Landroid/icu/text/UnicodeSet;->retain([III)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->setDefaultXSymbolTable(Landroid/icu/text/UnicodeSet$XSymbolTable;)V
-Landroid/icu/text/UnicodeSet;->SETMODE0_NONE:I
-Landroid/icu/text/UnicodeSet;->SETMODE1_UNICODESET:I
-Landroid/icu/text/UnicodeSet;->SETMODE2_PROPERTYPAT:I
-Landroid/icu/text/UnicodeSet;->SETMODE3_PREPARSED:I
-Landroid/icu/text/UnicodeSet;->spanAndCount(Ljava/lang/CharSequence;ILandroid/icu/text/UnicodeSet$SpanCondition;Landroid/icu/util/OutputInt;)I
-Landroid/icu/text/UnicodeSet;->spanCodePointsAndCount(Ljava/lang/CharSequence;ILandroid/icu/text/UnicodeSet$SpanCondition;Landroid/icu/util/OutputInt;)I
-Landroid/icu/text/UnicodeSet;->START_EXTRA:I
-Landroid/icu/text/UnicodeSet;->strings:Ljava/util/TreeSet;
-Landroid/icu/text/UnicodeSet;->stringSpan:Landroid/icu/impl/UnicodeSetStringSpan;
-Landroid/icu/text/UnicodeSet;->stripFrom(Ljava/lang/CharSequence;Z)Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->syntaxError(Landroid/icu/impl/RuleCharacterIterator;Ljava/lang/String;)V
-Landroid/icu/text/UnicodeSet;->toArray(Landroid/icu/text/UnicodeSet;)[Ljava/lang/String;
-Landroid/icu/text/UnicodeSet;->xor([III)Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSet;->XSYMBOL_TABLE:Landroid/icu/text/UnicodeSet$XSymbolTable;
-Landroid/icu/text/UnicodeSet;->_appendToPat(Ljava/lang/Appendable;IZ)Ljava/lang/Appendable;
-Landroid/icu/text/UnicodeSet;->_appendToPat(Ljava/lang/Appendable;Ljava/lang/String;Z)Ljava/lang/Appendable;
-Landroid/icu/text/UnicodeSet;->_toPattern(Ljava/lang/Appendable;Z)Ljava/lang/Appendable;
-Landroid/icu/text/UnicodeSetIterator;->endElement:I
-Landroid/icu/text/UnicodeSetIterator;->endRange:I
-Landroid/icu/text/UnicodeSetIterator;->getSet()Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSetIterator;->loadRange(I)V
-Landroid/icu/text/UnicodeSetIterator;->nextElement:I
-Landroid/icu/text/UnicodeSetIterator;->range:I
-Landroid/icu/text/UnicodeSetIterator;->set:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UnicodeSetIterator;->stringIterator:Ljava/util/Iterator;
-Landroid/icu/text/UnicodeSetSpanner;->unicodeSet:Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UTF16$StringComparator;-><init>()V
-Landroid/icu/text/UTF16$StringComparator;-><init>(ZZI)V
-Landroid/icu/text/UTF16$StringComparator;->CODE_POINT_COMPARE_SURROGATE_OFFSET_:I
-Landroid/icu/text/UTF16$StringComparator;->compare(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/UTF16$StringComparator;->compareCaseInsensitive(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/UTF16$StringComparator;->compareCaseSensitive(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/UTF16$StringComparator;->FOLD_CASE_DEFAULT:I
-Landroid/icu/text/UTF16$StringComparator;->FOLD_CASE_EXCLUDE_SPECIAL_I:I
-Landroid/icu/text/UTF16$StringComparator;->getCodePointCompare()Z
-Landroid/icu/text/UTF16$StringComparator;->getIgnoreCase()Z
-Landroid/icu/text/UTF16$StringComparator;->getIgnoreCaseOption()I
-Landroid/icu/text/UTF16$StringComparator;->m_codePointCompare_:I
-Landroid/icu/text/UTF16$StringComparator;->m_foldCase_:I
-Landroid/icu/text/UTF16$StringComparator;->m_ignoreCase_:Z
-Landroid/icu/text/UTF16$StringComparator;->setCodePointCompare(Z)V
-Landroid/icu/text/UTF16$StringComparator;->setIgnoreCase(ZI)V
-Landroid/icu/text/UTF16;-><init>()V
-Landroid/icu/text/UTF16;->append(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/UTF16;->append([CII)I
-Landroid/icu/text/UTF16;->appendCodePoint(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/UTF16;->bounds(Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->bounds(Ljava/lang/StringBuffer;I)I
-Landroid/icu/text/UTF16;->bounds([CIII)I
-Landroid/icu/text/UTF16;->charAt(Landroid/icu/text/Replaceable;I)I
-Landroid/icu/text/UTF16;->charAt(Ljava/lang/CharSequence;I)I
-Landroid/icu/text/UTF16;->charAt(Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->charAt(Ljava/lang/StringBuffer;I)I
-Landroid/icu/text/UTF16;->charAt([CIII)I
-Landroid/icu/text/UTF16;->CODEPOINT_MAX_VALUE:I
-Landroid/icu/text/UTF16;->CODEPOINT_MIN_VALUE:I
-Landroid/icu/text/UTF16;->compareCodePoint(ILjava/lang/CharSequence;)I
-Landroid/icu/text/UTF16;->countCodePoint(Ljava/lang/String;)I
-Landroid/icu/text/UTF16;->countCodePoint(Ljava/lang/StringBuffer;)I
-Landroid/icu/text/UTF16;->countCodePoint([CII)I
-Landroid/icu/text/UTF16;->delete(Ljava/lang/StringBuffer;I)Ljava/lang/StringBuffer;
-Landroid/icu/text/UTF16;->delete([CII)I
-Landroid/icu/text/UTF16;->findCodePointOffset(Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->findCodePointOffset(Ljava/lang/StringBuffer;I)I
-Landroid/icu/text/UTF16;->findCodePointOffset([CIII)I
-Landroid/icu/text/UTF16;->findOffsetFromCodePoint(Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->findOffsetFromCodePoint(Ljava/lang/StringBuffer;I)I
-Landroid/icu/text/UTF16;->findOffsetFromCodePoint([CIII)I
-Landroid/icu/text/UTF16;->getCharCount(I)I
-Landroid/icu/text/UTF16;->getLeadSurrogate(I)C
-Landroid/icu/text/UTF16;->getSingleCodePoint(Ljava/lang/CharSequence;)I
-Landroid/icu/text/UTF16;->getTrailSurrogate(I)C
-Landroid/icu/text/UTF16;->hasMoreCodePointsThan(Ljava/lang/String;I)Z
-Landroid/icu/text/UTF16;->hasMoreCodePointsThan(Ljava/lang/StringBuffer;I)Z
-Landroid/icu/text/UTF16;->hasMoreCodePointsThan([CIII)Z
-Landroid/icu/text/UTF16;->indexOf(Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->indexOf(Ljava/lang/String;II)I
-Landroid/icu/text/UTF16;->indexOf(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/UTF16;->indexOf(Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->insert(Ljava/lang/StringBuffer;II)Ljava/lang/StringBuffer;
-Landroid/icu/text/UTF16;->insert([CIII)I
-Landroid/icu/text/UTF16;->isLeadSurrogate(C)Z
-Landroid/icu/text/UTF16;->isSurrogate(C)Z
-Landroid/icu/text/UTF16;->isTrailSurrogate(C)Z
-Landroid/icu/text/UTF16;->lastIndexOf(Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->lastIndexOf(Ljava/lang/String;II)I
-Landroid/icu/text/UTF16;->lastIndexOf(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/icu/text/UTF16;->lastIndexOf(Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/icu/text/UTF16;->LEAD_SURROGATE_BITMASK:I
-Landroid/icu/text/UTF16;->LEAD_SURROGATE_BITS:I
-Landroid/icu/text/UTF16;->LEAD_SURROGATE_BOUNDARY:I
-Landroid/icu/text/UTF16;->LEAD_SURROGATE_MAX_VALUE:I
-Landroid/icu/text/UTF16;->LEAD_SURROGATE_MIN_VALUE:I
-Landroid/icu/text/UTF16;->LEAD_SURROGATE_OFFSET_:I
-Landroid/icu/text/UTF16;->LEAD_SURROGATE_SHIFT_:I
-Landroid/icu/text/UTF16;->moveCodePointOffset(Ljava/lang/String;II)I
-Landroid/icu/text/UTF16;->moveCodePointOffset(Ljava/lang/StringBuffer;II)I
-Landroid/icu/text/UTF16;->moveCodePointOffset([CIIII)I
-Landroid/icu/text/UTF16;->newString([III)Ljava/lang/String;
-Landroid/icu/text/UTF16;->replace(Ljava/lang/String;II)Ljava/lang/String;
-Landroid/icu/text/UTF16;->replace(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/text/UTF16;->reverse(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;
-Landroid/icu/text/UTF16;->setCharAt(Ljava/lang/StringBuffer;II)V
-Landroid/icu/text/UTF16;->setCharAt([CIII)I
-Landroid/icu/text/UTF16;->SINGLE_CHAR_BOUNDARY:I
-Landroid/icu/text/UTF16;->SUPPLEMENTARY_MIN_VALUE:I
-Landroid/icu/text/UTF16;->SURROGATE_BITMASK:I
-Landroid/icu/text/UTF16;->SURROGATE_BITS:I
-Landroid/icu/text/UTF16;->SURROGATE_MAX_VALUE:I
-Landroid/icu/text/UTF16;->SURROGATE_MIN_VALUE:I
-Landroid/icu/text/UTF16;->toString(I)Ljava/lang/String;
-Landroid/icu/text/UTF16;->TRAIL_SURROGATE_BITMASK:I
-Landroid/icu/text/UTF16;->TRAIL_SURROGATE_BITS:I
-Landroid/icu/text/UTF16;->TRAIL_SURROGATE_BOUNDARY:I
-Landroid/icu/text/UTF16;->TRAIL_SURROGATE_MASK_:I
-Landroid/icu/text/UTF16;->TRAIL_SURROGATE_MAX_VALUE:I
-Landroid/icu/text/UTF16;->TRAIL_SURROGATE_MIN_VALUE:I
-Landroid/icu/text/UTF16;->valueOf(I)Ljava/lang/String;
-Landroid/icu/text/UTF16;->valueOf(Ljava/lang/String;I)Ljava/lang/String;
-Landroid/icu/text/UTF16;->valueOf(Ljava/lang/StringBuffer;I)Ljava/lang/String;
-Landroid/icu/text/UTF16;->valueOf([CIII)Ljava/lang/String;
-Landroid/icu/text/UTF16;->_charAt(Ljava/lang/CharSequence;IC)I
-Landroid/icu/text/UTF16;->_charAt(Ljava/lang/String;IC)I
-Landroid/icu/util/AnnualTimeZoneRule;-><init>(Ljava/lang/String;IILandroid/icu/util/DateTimeRule;II)V
-Landroid/icu/util/AnnualTimeZoneRule;->dateTimeRule:Landroid/icu/util/DateTimeRule;
-Landroid/icu/util/AnnualTimeZoneRule;->endYear:I
-Landroid/icu/util/AnnualTimeZoneRule;->getEndYear()I
-Landroid/icu/util/AnnualTimeZoneRule;->getFinalStart(II)Ljava/util/Date;
-Landroid/icu/util/AnnualTimeZoneRule;->getFirstStart(II)Ljava/util/Date;
-Landroid/icu/util/AnnualTimeZoneRule;->getNextStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/AnnualTimeZoneRule;->getPreviousStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/AnnualTimeZoneRule;->getRule()Landroid/icu/util/DateTimeRule;
-Landroid/icu/util/AnnualTimeZoneRule;->getStartInYear(III)Ljava/util/Date;
-Landroid/icu/util/AnnualTimeZoneRule;->getStartYear()I
-Landroid/icu/util/AnnualTimeZoneRule;->isEquivalentTo(Landroid/icu/util/TimeZoneRule;)Z
-Landroid/icu/util/AnnualTimeZoneRule;->isTransitionRule()Z
-Landroid/icu/util/AnnualTimeZoneRule;->MAX_YEAR:I
-Landroid/icu/util/AnnualTimeZoneRule;->startYear:I
-Landroid/icu/util/BasicTimeZone;-><init>()V
-Landroid/icu/util/BasicTimeZone;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/BasicTimeZone;->FORMER_LATTER_MASK:I
-Landroid/icu/util/BasicTimeZone;->getNextTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/BasicTimeZone;->getOffsetFromLocal(JII[I)V
-Landroid/icu/util/BasicTimeZone;->getPreviousTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/BasicTimeZone;->getSimpleTimeZoneRulesNear(J)[Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/BasicTimeZone;->getTimeZoneRules()[Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/BasicTimeZone;->getTimeZoneRules(J)[Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/BasicTimeZone;->hasEquivalentTransitions(Landroid/icu/util/TimeZone;JJ)Z
-Landroid/icu/util/BasicTimeZone;->hasEquivalentTransitions(Landroid/icu/util/TimeZone;JJZ)Z
-Landroid/icu/util/BasicTimeZone;->LOCAL_DST:I
-Landroid/icu/util/BasicTimeZone;->LOCAL_FORMER:I
-Landroid/icu/util/BasicTimeZone;->LOCAL_LATTER:I
-Landroid/icu/util/BasicTimeZone;->LOCAL_STD:I
-Landroid/icu/util/BasicTimeZone;->MILLIS_PER_YEAR:J
-Landroid/icu/util/BasicTimeZone;->STD_DST_MASK:I
-Landroid/icu/util/BuddhistCalendar;->BUDDHIST_ERA_START:I
-Landroid/icu/util/BuddhistCalendar;->GREGORIAN_EPOCH:I
-Landroid/icu/util/ByteArrayWrapper;-><init>()V
-Landroid/icu/util/ByteArrayWrapper;-><init>(Ljava/nio/ByteBuffer;)V
-Landroid/icu/util/ByteArrayWrapper;-><init>([BI)V
-Landroid/icu/util/ByteArrayWrapper;->append([BII)Landroid/icu/util/ByteArrayWrapper;
-Landroid/icu/util/ByteArrayWrapper;->bytes:[B
-Landroid/icu/util/ByteArrayWrapper;->compareTo(Landroid/icu/util/ByteArrayWrapper;)I
-Landroid/icu/util/ByteArrayWrapper;->copyBytes([BI[BII)V
-Landroid/icu/util/ByteArrayWrapper;->ensureCapacity(I)Landroid/icu/util/ByteArrayWrapper;
-Landroid/icu/util/ByteArrayWrapper;->releaseBytes()[B
-Landroid/icu/util/ByteArrayWrapper;->set([BII)Landroid/icu/util/ByteArrayWrapper;
-Landroid/icu/util/ByteArrayWrapper;->size:I
-Landroid/icu/util/BytesTrie$Entry;-><init>(I)V
-Landroid/icu/util/BytesTrie$Entry;->append(B)V
-Landroid/icu/util/BytesTrie$Entry;->append([BII)V
-Landroid/icu/util/BytesTrie$Entry;->byteAt(I)B
-Landroid/icu/util/BytesTrie$Entry;->bytes:[B
-Landroid/icu/util/BytesTrie$Entry;->bytesAsByteBuffer()Ljava/nio/ByteBuffer;
-Landroid/icu/util/BytesTrie$Entry;->bytesLength()I
-Landroid/icu/util/BytesTrie$Entry;->copyBytesTo([BI)V
-Landroid/icu/util/BytesTrie$Entry;->ensureCapacity(I)V
-Landroid/icu/util/BytesTrie$Entry;->length:I
-Landroid/icu/util/BytesTrie$Entry;->truncateString(I)V
-Landroid/icu/util/BytesTrie$Entry;->value:I
-Landroid/icu/util/BytesTrie$Iterator;-><init>([BIII)V
-Landroid/icu/util/BytesTrie$Iterator;->branchNext(II)I
-Landroid/icu/util/BytesTrie$Iterator;->bytes_:[B
-Landroid/icu/util/BytesTrie$Iterator;->entry_:Landroid/icu/util/BytesTrie$Entry;
-Landroid/icu/util/BytesTrie$Iterator;->initialPos_:I
-Landroid/icu/util/BytesTrie$Iterator;->initialRemainingMatchLength_:I
-Landroid/icu/util/BytesTrie$Iterator;->maxLength_:I
-Landroid/icu/util/BytesTrie$Iterator;->pos_:I
-Landroid/icu/util/BytesTrie$Iterator;->remainingMatchLength_:I
-Landroid/icu/util/BytesTrie$Iterator;->reset()Landroid/icu/util/BytesTrie$Iterator;
-Landroid/icu/util/BytesTrie$Iterator;->stack_:Ljava/util/ArrayList;
-Landroid/icu/util/BytesTrie$Iterator;->truncateAndStop()Landroid/icu/util/BytesTrie$Entry;
-Landroid/icu/util/BytesTrie$Result;->FINAL_VALUE:Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie$Result;->hasNext()Z
-Landroid/icu/util/BytesTrie$Result;->hasValue()Z
-Landroid/icu/util/BytesTrie$Result;->INTERMEDIATE_VALUE:Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie$Result;->matches()Z
-Landroid/icu/util/BytesTrie$Result;->NO_MATCH:Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie$Result;->NO_VALUE:Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie$Result;->valueOf(Ljava/lang/String;)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie$Result;->values()[Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie$State;-><init>()V
-Landroid/icu/util/BytesTrie$State;->bytes:[B
-Landroid/icu/util/BytesTrie$State;->pos:I
-Landroid/icu/util/BytesTrie$State;->remainingMatchLength:I
-Landroid/icu/util/BytesTrie$State;->root:I
-Landroid/icu/util/BytesTrie;-><init>([BI)V
-Landroid/icu/util/BytesTrie;->append(Ljava/lang/Appendable;I)V
-Landroid/icu/util/BytesTrie;->branchNext(III)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie;->bytes_:[B
-Landroid/icu/util/BytesTrie;->current()Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie;->findUniqueValue([BIJ)J
-Landroid/icu/util/BytesTrie;->findUniqueValueFromBranch([BIIJ)J
-Landroid/icu/util/BytesTrie;->first(I)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie;->getNextBranchBytes([BIILjava/lang/Appendable;)V
-Landroid/icu/util/BytesTrie;->getNextBytes(Ljava/lang/Appendable;)I
-Landroid/icu/util/BytesTrie;->getUniqueValue()J
-Landroid/icu/util/BytesTrie;->getValue()I
-Landroid/icu/util/BytesTrie;->iterator(I)Landroid/icu/util/BytesTrie$Iterator;
-Landroid/icu/util/BytesTrie;->iterator([BII)Landroid/icu/util/BytesTrie$Iterator;
-Landroid/icu/util/BytesTrie;->jumpByDelta([BI)I
-Landroid/icu/util/BytesTrie;->kFiveByteDeltaLead:I
-Landroid/icu/util/BytesTrie;->kFiveByteValueLead:I
-Landroid/icu/util/BytesTrie;->kFourByteDeltaLead:I
-Landroid/icu/util/BytesTrie;->kFourByteValueLead:I
-Landroid/icu/util/BytesTrie;->kMaxBranchLinearSubNodeLength:I
-Landroid/icu/util/BytesTrie;->kMaxLinearMatchLength:I
-Landroid/icu/util/BytesTrie;->kMaxOneByteDelta:I
-Landroid/icu/util/BytesTrie;->kMaxOneByteValue:I
-Landroid/icu/util/BytesTrie;->kMaxThreeByteDelta:I
-Landroid/icu/util/BytesTrie;->kMaxThreeByteValue:I
-Landroid/icu/util/BytesTrie;->kMaxTwoByteDelta:I
-Landroid/icu/util/BytesTrie;->kMaxTwoByteValue:I
-Landroid/icu/util/BytesTrie;->kMinLinearMatch:I
-Landroid/icu/util/BytesTrie;->kMinOneByteValueLead:I
-Landroid/icu/util/BytesTrie;->kMinThreeByteDeltaLead:I
-Landroid/icu/util/BytesTrie;->kMinThreeByteValueLead:I
-Landroid/icu/util/BytesTrie;->kMinTwoByteDeltaLead:I
-Landroid/icu/util/BytesTrie;->kMinTwoByteValueLead:I
-Landroid/icu/util/BytesTrie;->kMinValueLead:I
-Landroid/icu/util/BytesTrie;->kValueIsFinal:I
-Landroid/icu/util/BytesTrie;->next(I)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie;->next([BII)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie;->nextImpl(II)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrie;->pos_:I
-Landroid/icu/util/BytesTrie;->readValue([BII)I
-Landroid/icu/util/BytesTrie;->remainingMatchLength_:I
-Landroid/icu/util/BytesTrie;->reset()Landroid/icu/util/BytesTrie;
-Landroid/icu/util/BytesTrie;->resetToState(Landroid/icu/util/BytesTrie$State;)Landroid/icu/util/BytesTrie;
-Landroid/icu/util/BytesTrie;->root_:I
-Landroid/icu/util/BytesTrie;->saveState(Landroid/icu/util/BytesTrie$State;)Landroid/icu/util/BytesTrie;
-Landroid/icu/util/BytesTrie;->skipDelta([BI)I
-Landroid/icu/util/BytesTrie;->skipValue(II)I
-Landroid/icu/util/BytesTrie;->skipValue([BI)I
-Landroid/icu/util/BytesTrie;->stop()V
-Landroid/icu/util/BytesTrie;->valueResults_:[Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/BytesTrieBuilder$BytesAsCharSequence;-><init>([BI)V
-Landroid/icu/util/BytesTrieBuilder$BytesAsCharSequence;->len:I
-Landroid/icu/util/BytesTrieBuilder$BytesAsCharSequence;->s:[B
-Landroid/icu/util/BytesTrieBuilder;-><init>()V
-Landroid/icu/util/BytesTrieBuilder;->add([BII)Landroid/icu/util/BytesTrieBuilder;
-Landroid/icu/util/BytesTrieBuilder;->build(Landroid/icu/util/StringTrieBuilder$Option;)Landroid/icu/util/BytesTrie;
-Landroid/icu/util/BytesTrieBuilder;->buildByteBuffer(Landroid/icu/util/StringTrieBuilder$Option;)Ljava/nio/ByteBuffer;
-Landroid/icu/util/BytesTrieBuilder;->buildBytes(Landroid/icu/util/StringTrieBuilder$Option;)V
-Landroid/icu/util/BytesTrieBuilder;->bytes:[B
-Landroid/icu/util/BytesTrieBuilder;->bytesLength:I
-Landroid/icu/util/BytesTrieBuilder;->clear()Landroid/icu/util/BytesTrieBuilder;
-Landroid/icu/util/BytesTrieBuilder;->ensureCapacity(I)V
-Landroid/icu/util/BytesTrieBuilder;->getMaxBranchLinearSubNodeLength()I
-Landroid/icu/util/BytesTrieBuilder;->getMaxLinearMatchLength()I
-Landroid/icu/util/BytesTrieBuilder;->getMinLinearMatch()I
-Landroid/icu/util/BytesTrieBuilder;->intBytes:[B
-Landroid/icu/util/BytesTrieBuilder;->matchNodesCanHaveValues()Z
-Landroid/icu/util/BytesTrieBuilder;->write(I)I
-Landroid/icu/util/BytesTrieBuilder;->write(II)I
-Landroid/icu/util/BytesTrieBuilder;->write([BI)I
-Landroid/icu/util/BytesTrieBuilder;->writeDeltaTo(I)I
-Landroid/icu/util/BytesTrieBuilder;->writeValueAndFinal(IZ)I
-Landroid/icu/util/BytesTrieBuilder;->writeValueAndType(ZII)I
-Landroid/icu/util/Calendar$CalType;->BUDDHIST:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->CHINESE:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->COPTIC:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->DANGI:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ETHIOPIC:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ETHIOPIC_AMETE_ALEM:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->GREGORIAN:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->HEBREW:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->id:Ljava/lang/String;
-Landroid/icu/util/Calendar$CalType;->INDIAN:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ISLAMIC:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ISLAMIC_CIVIL:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ISLAMIC_RGSA:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ISLAMIC_TBLA:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ISLAMIC_UMALQURA:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ISO8601:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->JAPANESE:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->PERSIAN:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->ROC:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->UNKNOWN:Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->valueOf(Ljava/lang/String;)Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$CalType;->values()[Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar$FormatConfiguration;-><init>()V
-Landroid/icu/util/Calendar$FormatConfiguration;->cal:Landroid/icu/util/Calendar;
-Landroid/icu/util/Calendar$FormatConfiguration;->formatData:Landroid/icu/text/DateFormatSymbols;
-Landroid/icu/util/Calendar$FormatConfiguration;->getCalendar()Landroid/icu/util/Calendar;
-Landroid/icu/util/Calendar$FormatConfiguration;->getDateFormatSymbols()Landroid/icu/text/DateFormatSymbols;
-Landroid/icu/util/Calendar$FormatConfiguration;->getLocale()Landroid/icu/util/ULocale;
-Landroid/icu/util/Calendar$FormatConfiguration;->getOverrideString()Ljava/lang/String;
-Landroid/icu/util/Calendar$FormatConfiguration;->getPatternString()Ljava/lang/String;
-Landroid/icu/util/Calendar$FormatConfiguration;->loc:Landroid/icu/util/ULocale;
-Landroid/icu/util/Calendar$FormatConfiguration;->override:Ljava/lang/String;
-Landroid/icu/util/Calendar$FormatConfiguration;->pattern:Ljava/lang/String;
-Landroid/icu/util/Calendar$PatternData;-><init>([Ljava/lang/String;[Ljava/lang/String;)V
-Landroid/icu/util/Calendar$PatternData;->getDateTimePattern(I)Ljava/lang/String;
-Landroid/icu/util/Calendar$PatternData;->make(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar$PatternData;
-Landroid/icu/util/Calendar$PatternData;->make(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/util/Calendar$PatternData;
-Landroid/icu/util/Calendar$PatternData;->overrides:[Ljava/lang/String;
-Landroid/icu/util/Calendar$PatternData;->patterns:[Ljava/lang/String;
-Landroid/icu/util/Calendar$WeekDataCache;-><init>()V
-Landroid/icu/util/Calendar$WeekDataCache;->createInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/Calendar$WeekData;
-Landroid/icu/util/Calendar;->actualLocale:Landroid/icu/util/ULocale;
-Landroid/icu/util/Calendar;->areAllFieldsSet:Z
-Landroid/icu/util/Calendar;->areFieldsSet:Z
-Landroid/icu/util/Calendar;->areFieldsVirtuallySet:Z
-Landroid/icu/util/Calendar;->compare(Ljava/lang/Object;)J
-Landroid/icu/util/Calendar;->computeGregorianAndDOWFields(I)V
-Landroid/icu/util/Calendar;->computeMillisInDayLong()J
-Landroid/icu/util/Calendar;->computeWeekFields()V
-Landroid/icu/util/Calendar;->computeZoneOffset(JJ)I
-Landroid/icu/util/Calendar;->createInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;
-Landroid/icu/util/Calendar;->DATE_PRECEDENCE:[[[I
-Landroid/icu/util/Calendar;->DEFAULT_PATTERNS:[Ljava/lang/String;
-Landroid/icu/util/Calendar;->DOW_PRECEDENCE:[[[I
-Landroid/icu/util/Calendar;->expandOverride(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/Calendar;->fields:[I
-Landroid/icu/util/Calendar;->FIELD_DIFF_MAX_INT:I
-Landroid/icu/util/Calendar;->FIELD_NAME:[Ljava/lang/String;
-Landroid/icu/util/Calendar;->findPreviousZoneTransitionTime(Landroid/icu/util/TimeZone;IJJ)Ljava/lang/Long;
-Landroid/icu/util/Calendar;->FIND_ZONE_TRANSITION_TIME_UNITS:[I
-Landroid/icu/util/Calendar;->firstDayOfWeek:I
-Landroid/icu/util/Calendar;->firstIslamicStartYearFromGrego(I)I
-Landroid/icu/util/Calendar;->formatHelper(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;II)Landroid/icu/text/DateFormat;
-Landroid/icu/util/Calendar;->getActualHelper(III)I
-Landroid/icu/util/Calendar;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/util/Calendar;->getCalendarTypeForLocale(Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar$CalType;
-Landroid/icu/util/Calendar;->getDateTimeFormatString(Landroid/icu/util/ULocale;Ljava/lang/String;II)Ljava/lang/String;
-Landroid/icu/util/Calendar;->getDateTimePattern(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;I)Ljava/lang/String;
-Landroid/icu/util/Calendar;->getDayOfWeekType(I)I
-Landroid/icu/util/Calendar;->getDefaultDayInMonth(II)I
-Landroid/icu/util/Calendar;->getDefaultMonthInYear(I)I
-Landroid/icu/util/Calendar;->getImmediatePreviousZoneTransition(J)Ljava/lang/Long;
-Landroid/icu/util/Calendar;->getInstanceInternal(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;
-Landroid/icu/util/Calendar;->getPatternData(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/util/Calendar$PatternData;
-Landroid/icu/util/Calendar;->getPreviousZoneTransitionTime(Landroid/icu/util/TimeZone;JJ)Ljava/lang/Long;
-Landroid/icu/util/Calendar;->getRegionForCalendar(Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/Calendar;->getRelatedYear()I
-Landroid/icu/util/Calendar;->getWeekDataForRegionInternal(Ljava/lang/String;)Landroid/icu/util/Calendar$WeekData;
-Landroid/icu/util/Calendar;->getWeekendTransition(I)I
-Landroid/icu/util/Calendar;->gregorianDayOfMonth:I
-Landroid/icu/util/Calendar;->gregorianDayOfYear:I
-Landroid/icu/util/Calendar;->gregorianMonth:I
-Landroid/icu/util/Calendar;->gregorianYear:I
-Landroid/icu/util/Calendar;->GREGORIAN_MONTH_COUNT:[[I
-Landroid/icu/util/Calendar;->gregoYearFromIslamicStart(I)I
-Landroid/icu/util/Calendar;->handleGetDateFormat(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
-Landroid/icu/util/Calendar;->haveDefaultCentury()Z
-Landroid/icu/util/Calendar;->initInternal()V
-Landroid/icu/util/Calendar;->internalSetMask:I
-Landroid/icu/util/Calendar;->isTimeSet:Z
-Landroid/icu/util/Calendar;->lenient:Z
-Landroid/icu/util/Calendar;->LIMITS:[[I
-Landroid/icu/util/Calendar;->MAX_HOURS:I
-Landroid/icu/util/Calendar;->mergeOverrideStrings(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/Calendar;->minimalDaysInFirstWeek:I
-Landroid/icu/util/Calendar;->nextStamp:I
-Landroid/icu/util/Calendar;->PATTERN_CACHE:Landroid/icu/impl/ICUCache;
-Landroid/icu/util/Calendar;->QUOTE:C
-Landroid/icu/util/Calendar;->recalculateStamp()V
-Landroid/icu/util/Calendar;->repeatedWallTime:I
-Landroid/icu/util/Calendar;->setCalendarLocale(Landroid/icu/util/ULocale;)V
-Landroid/icu/util/Calendar;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V
-Landroid/icu/util/Calendar;->setRelatedYear(I)V
-Landroid/icu/util/Calendar;->setWeekData(Ljava/lang/String;)V
-Landroid/icu/util/Calendar;->skippedWallTime:I
-Landroid/icu/util/Calendar;->stamp:[I
-Landroid/icu/util/Calendar;->STAMP_MAX:I
-Landroid/icu/util/Calendar;->time:J
-Landroid/icu/util/Calendar;->updateTime()V
-Landroid/icu/util/Calendar;->validLocale:Landroid/icu/util/ULocale;
-Landroid/icu/util/Calendar;->WEEKDAY:I
-Landroid/icu/util/Calendar;->WEEKEND:I
-Landroid/icu/util/Calendar;->weekendCease:I
-Landroid/icu/util/Calendar;->weekendCeaseMillis:I
-Landroid/icu/util/Calendar;->weekendOnset:I
-Landroid/icu/util/Calendar;->weekendOnsetMillis:I
-Landroid/icu/util/Calendar;->WEEKEND_CEASE:I
-Landroid/icu/util/Calendar;->WEEKEND_ONSET:I
-Landroid/icu/util/Calendar;->WEEK_DATA_CACHE:Landroid/icu/util/Calendar$WeekDataCache;
-Landroid/icu/util/Calendar;->zone:Landroid/icu/util/TimeZone;
-Landroid/icu/util/CaseInsensitiveString;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/CaseInsensitiveString;->foldCase(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/CaseInsensitiveString;->folded:Ljava/lang/String;
-Landroid/icu/util/CaseInsensitiveString;->getFolded()V
-Landroid/icu/util/CaseInsensitiveString;->getString()Ljava/lang/String;
-Landroid/icu/util/CaseInsensitiveString;->hash:I
-Landroid/icu/util/CaseInsensitiveString;->string:Ljava/lang/String;
-Landroid/icu/util/CECalendar;-><init>()V
-Landroid/icu/util/CECalendar;-><init>(III)V
-Landroid/icu/util/CECalendar;-><init>(IIIIII)V
-Landroid/icu/util/CECalendar;-><init>(Landroid/icu/util/TimeZone;)V
-Landroid/icu/util/CECalendar;-><init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V
-Landroid/icu/util/CECalendar;-><init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V
-Landroid/icu/util/CECalendar;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/util/CECalendar;-><init>(Ljava/util/Date;)V
-Landroid/icu/util/CECalendar;-><init>(Ljava/util/Locale;)V
-Landroid/icu/util/CECalendar;->ceToJD(JIII)I
-Landroid/icu/util/CECalendar;->getJDEpochOffset()I
-Landroid/icu/util/CECalendar;->jdToCE(II[I)V
-Landroid/icu/util/CECalendar;->LIMITS:[[I
-Landroid/icu/util/CharsTrie$Entry;-><init>()V
-Landroid/icu/util/CharsTrie$Entry;->chars:Ljava/lang/CharSequence;
-Landroid/icu/util/CharsTrie$Entry;->value:I
-Landroid/icu/util/CharsTrie$Iterator;-><init>(Ljava/lang/CharSequence;III)V
-Landroid/icu/util/CharsTrie$Iterator;->branchNext(II)I
-Landroid/icu/util/CharsTrie$Iterator;->chars_:Ljava/lang/CharSequence;
-Landroid/icu/util/CharsTrie$Iterator;->entry_:Landroid/icu/util/CharsTrie$Entry;
-Landroid/icu/util/CharsTrie$Iterator;->initialPos_:I
-Landroid/icu/util/CharsTrie$Iterator;->initialRemainingMatchLength_:I
-Landroid/icu/util/CharsTrie$Iterator;->maxLength_:I
-Landroid/icu/util/CharsTrie$Iterator;->pos_:I
-Landroid/icu/util/CharsTrie$Iterator;->remainingMatchLength_:I
-Landroid/icu/util/CharsTrie$Iterator;->reset()Landroid/icu/util/CharsTrie$Iterator;
-Landroid/icu/util/CharsTrie$Iterator;->skipValue_:Z
-Landroid/icu/util/CharsTrie$Iterator;->stack_:Ljava/util/ArrayList;
-Landroid/icu/util/CharsTrie$Iterator;->str_:Ljava/lang/StringBuilder;
-Landroid/icu/util/CharsTrie$Iterator;->truncateAndStop()Landroid/icu/util/CharsTrie$Entry;
-Landroid/icu/util/CharsTrie$State;-><init>()V
-Landroid/icu/util/CharsTrie$State;->chars:Ljava/lang/CharSequence;
-Landroid/icu/util/CharsTrie$State;->pos:I
-Landroid/icu/util/CharsTrie$State;->remainingMatchLength:I
-Landroid/icu/util/CharsTrie$State;->root:I
-Landroid/icu/util/CharsTrie;-><init>(Ljava/lang/CharSequence;I)V
-Landroid/icu/util/CharsTrie;->append(Ljava/lang/Appendable;I)V
-Landroid/icu/util/CharsTrie;->branchNext(III)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->chars_:Ljava/lang/CharSequence;
-Landroid/icu/util/CharsTrie;->current()Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->findUniqueValue(Ljava/lang/CharSequence;IJ)J
-Landroid/icu/util/CharsTrie;->findUniqueValueFromBranch(Ljava/lang/CharSequence;IIJ)J
-Landroid/icu/util/CharsTrie;->first(I)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->firstForCodePoint(I)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->getNextBranchChars(Ljava/lang/CharSequence;IILjava/lang/Appendable;)V
-Landroid/icu/util/CharsTrie;->getNextChars(Ljava/lang/Appendable;)I
-Landroid/icu/util/CharsTrie;->getUniqueValue()J
-Landroid/icu/util/CharsTrie;->getValue()I
-Landroid/icu/util/CharsTrie;->iterator(I)Landroid/icu/util/CharsTrie$Iterator;
-Landroid/icu/util/CharsTrie;->iterator(Ljava/lang/CharSequence;II)Landroid/icu/util/CharsTrie$Iterator;
-Landroid/icu/util/CharsTrie;->jumpByDelta(Ljava/lang/CharSequence;I)I
-Landroid/icu/util/CharsTrie;->kMaxBranchLinearSubNodeLength:I
-Landroid/icu/util/CharsTrie;->kMaxLinearMatchLength:I
-Landroid/icu/util/CharsTrie;->kMaxOneUnitDelta:I
-Landroid/icu/util/CharsTrie;->kMaxOneUnitNodeValue:I
-Landroid/icu/util/CharsTrie;->kMaxOneUnitValue:I
-Landroid/icu/util/CharsTrie;->kMaxTwoUnitDelta:I
-Landroid/icu/util/CharsTrie;->kMaxTwoUnitNodeValue:I
-Landroid/icu/util/CharsTrie;->kMaxTwoUnitValue:I
-Landroid/icu/util/CharsTrie;->kMinLinearMatch:I
-Landroid/icu/util/CharsTrie;->kMinTwoUnitDeltaLead:I
-Landroid/icu/util/CharsTrie;->kMinTwoUnitNodeValueLead:I
-Landroid/icu/util/CharsTrie;->kMinTwoUnitValueLead:I
-Landroid/icu/util/CharsTrie;->kMinValueLead:I
-Landroid/icu/util/CharsTrie;->kNodeTypeMask:I
-Landroid/icu/util/CharsTrie;->kThreeUnitDeltaLead:I
-Landroid/icu/util/CharsTrie;->kThreeUnitNodeValueLead:I
-Landroid/icu/util/CharsTrie;->kThreeUnitValueLead:I
-Landroid/icu/util/CharsTrie;->kValueIsFinal:I
-Landroid/icu/util/CharsTrie;->next(I)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->next(Ljava/lang/CharSequence;II)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->nextForCodePoint(I)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->nextImpl(II)Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrie;->pos_:I
-Landroid/icu/util/CharsTrie;->readNodeValue(Ljava/lang/CharSequence;II)I
-Landroid/icu/util/CharsTrie;->readValue(Ljava/lang/CharSequence;II)I
-Landroid/icu/util/CharsTrie;->remainingMatchLength_:I
-Landroid/icu/util/CharsTrie;->reset()Landroid/icu/util/CharsTrie;
-Landroid/icu/util/CharsTrie;->resetToState(Landroid/icu/util/CharsTrie$State;)Landroid/icu/util/CharsTrie;
-Landroid/icu/util/CharsTrie;->root_:I
-Landroid/icu/util/CharsTrie;->saveState(Landroid/icu/util/CharsTrie$State;)Landroid/icu/util/CharsTrie;
-Landroid/icu/util/CharsTrie;->skipDelta(Ljava/lang/CharSequence;I)I
-Landroid/icu/util/CharsTrie;->skipNodeValue(II)I
-Landroid/icu/util/CharsTrie;->skipValue(II)I
-Landroid/icu/util/CharsTrie;->skipValue(Ljava/lang/CharSequence;I)I
-Landroid/icu/util/CharsTrie;->stop()V
-Landroid/icu/util/CharsTrie;->valueResults_:[Landroid/icu/util/BytesTrie$Result;
-Landroid/icu/util/CharsTrieBuilder;-><init>()V
-Landroid/icu/util/CharsTrieBuilder;->add(Ljava/lang/CharSequence;I)Landroid/icu/util/CharsTrieBuilder;
-Landroid/icu/util/CharsTrieBuilder;->build(Landroid/icu/util/StringTrieBuilder$Option;)Landroid/icu/util/CharsTrie;
-Landroid/icu/util/CharsTrieBuilder;->buildChars(Landroid/icu/util/StringTrieBuilder$Option;)V
-Landroid/icu/util/CharsTrieBuilder;->buildCharSequence(Landroid/icu/util/StringTrieBuilder$Option;)Ljava/lang/CharSequence;
-Landroid/icu/util/CharsTrieBuilder;->chars:[C
-Landroid/icu/util/CharsTrieBuilder;->charsLength:I
-Landroid/icu/util/CharsTrieBuilder;->clear()Landroid/icu/util/CharsTrieBuilder;
-Landroid/icu/util/CharsTrieBuilder;->ensureCapacity(I)V
-Landroid/icu/util/CharsTrieBuilder;->getMaxBranchLinearSubNodeLength()I
-Landroid/icu/util/CharsTrieBuilder;->getMaxLinearMatchLength()I
-Landroid/icu/util/CharsTrieBuilder;->getMinLinearMatch()I
-Landroid/icu/util/CharsTrieBuilder;->intUnits:[C
-Landroid/icu/util/CharsTrieBuilder;->matchNodesCanHaveValues()Z
-Landroid/icu/util/CharsTrieBuilder;->write(I)I
-Landroid/icu/util/CharsTrieBuilder;->write(II)I
-Landroid/icu/util/CharsTrieBuilder;->write([CI)I
-Landroid/icu/util/CharsTrieBuilder;->writeDeltaTo(I)I
-Landroid/icu/util/CharsTrieBuilder;->writeValueAndFinal(IZ)I
-Landroid/icu/util/CharsTrieBuilder;->writeValueAndType(ZII)I
-Landroid/icu/util/ChineseCalendar;-><init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;ILandroid/icu/util/TimeZone;)V
-Landroid/icu/util/ChineseCalendar;->astro:Landroid/icu/impl/CalendarAstronomer;
-Landroid/icu/util/ChineseCalendar;->CHINA_ZONE:Landroid/icu/util/TimeZone;
-Landroid/icu/util/ChineseCalendar;->CHINESE_DATE_PRECEDENCE:[[[I
-Landroid/icu/util/ChineseCalendar;->CHINESE_EPOCH_YEAR:I
-Landroid/icu/util/ChineseCalendar;->computeChineseFields(IIIZ)V
-Landroid/icu/util/ChineseCalendar;->daysToMillis(I)J
-Landroid/icu/util/ChineseCalendar;->epochYear:I
-Landroid/icu/util/ChineseCalendar;->hasNoMajorSolarTerm(I)Z
-Landroid/icu/util/ChineseCalendar;->haveDefaultCentury()Z
-Landroid/icu/util/ChineseCalendar;->isLeapMonthBetween(II)Z
-Landroid/icu/util/ChineseCalendar;->isLeapYear:Z
-Landroid/icu/util/ChineseCalendar;->LIMITS:[[I
-Landroid/icu/util/ChineseCalendar;->majorSolarTerm(I)I
-Landroid/icu/util/ChineseCalendar;->millisToDays(J)I
-Landroid/icu/util/ChineseCalendar;->newMoonNear(IZ)I
-Landroid/icu/util/ChineseCalendar;->newYear(I)I
-Landroid/icu/util/ChineseCalendar;->newYearCache:Landroid/icu/impl/CalendarCache;
-Landroid/icu/util/ChineseCalendar;->offsetMonth(III)V
-Landroid/icu/util/ChineseCalendar;->synodicMonthsBetween(II)I
-Landroid/icu/util/ChineseCalendar;->SYNODIC_GAP:I
-Landroid/icu/util/ChineseCalendar;->winterSolstice(I)I
-Landroid/icu/util/ChineseCalendar;->winterSolsticeCache:Landroid/icu/impl/CalendarCache;
-Landroid/icu/util/ChineseCalendar;->zoneAstro:Landroid/icu/util/TimeZone;
-Landroid/icu/util/CompactByteArray;-><init>()V
-Landroid/icu/util/CompactByteArray;-><init>(B)V
-Landroid/icu/util/CompactByteArray;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/util/CompactByteArray;-><init>([C[B)V
-Landroid/icu/util/CompactByteArray;->arrayRegionMatches([BI[BII)Z
-Landroid/icu/util/CompactByteArray;->BLOCKCOUNT:I
-Landroid/icu/util/CompactByteArray;->BLOCKMASK:I
-Landroid/icu/util/CompactByteArray;->BLOCKSHIFT:I
-Landroid/icu/util/CompactByteArray;->blockTouched(I)Z
-Landroid/icu/util/CompactByteArray;->compact()V
-Landroid/icu/util/CompactByteArray;->compact(Z)V
-Landroid/icu/util/CompactByteArray;->defaultValue:B
-Landroid/icu/util/CompactByteArray;->elementAt(C)B
-Landroid/icu/util/CompactByteArray;->expand()V
-Landroid/icu/util/CompactByteArray;->getIndexArray()[C
-Landroid/icu/util/CompactByteArray;->getValueArray()[B
-Landroid/icu/util/CompactByteArray;->hashes:[I
-Landroid/icu/util/CompactByteArray;->INDEXCOUNT:I
-Landroid/icu/util/CompactByteArray;->INDEXSHIFT:I
-Landroid/icu/util/CompactByteArray;->indices:[C
-Landroid/icu/util/CompactByteArray;->isCompact:Z
-Landroid/icu/util/CompactByteArray;->setElementAt(CB)V
-Landroid/icu/util/CompactByteArray;->setElementAt(CCB)V
-Landroid/icu/util/CompactByteArray;->touchBlock(II)V
-Landroid/icu/util/CompactByteArray;->UNICODECOUNT:I
-Landroid/icu/util/CompactByteArray;->values:[B
-Landroid/icu/util/CompactCharArray;-><init>()V
-Landroid/icu/util/CompactCharArray;-><init>(C)V
-Landroid/icu/util/CompactCharArray;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/util/CompactCharArray;-><init>([C[C)V
-Landroid/icu/util/CompactCharArray;->arrayRegionMatches([CI[CII)Z
-Landroid/icu/util/CompactCharArray;->BLOCKCOUNT:I
-Landroid/icu/util/CompactCharArray;->BLOCKMASK:I
-Landroid/icu/util/CompactCharArray;->BLOCKSHIFT:I
-Landroid/icu/util/CompactCharArray;->blockTouched(I)Z
-Landroid/icu/util/CompactCharArray;->compact()V
-Landroid/icu/util/CompactCharArray;->compact(Z)V
-Landroid/icu/util/CompactCharArray;->defaultValue:C
-Landroid/icu/util/CompactCharArray;->elementAt(C)C
-Landroid/icu/util/CompactCharArray;->expand()V
-Landroid/icu/util/CompactCharArray;->FindOverlappingPosition(I[CI)I
-Landroid/icu/util/CompactCharArray;->getIndexArray()[C
-Landroid/icu/util/CompactCharArray;->getValueArray()[C
-Landroid/icu/util/CompactCharArray;->hashes:[I
-Landroid/icu/util/CompactCharArray;->INDEXCOUNT:I
-Landroid/icu/util/CompactCharArray;->INDEXSHIFT:I
-Landroid/icu/util/CompactCharArray;->indices:[C
-Landroid/icu/util/CompactCharArray;->isCompact:Z
-Landroid/icu/util/CompactCharArray;->setElementAt(CC)V
-Landroid/icu/util/CompactCharArray;->setElementAt(CCC)V
-Landroid/icu/util/CompactCharArray;->touchBlock(II)V
-Landroid/icu/util/CompactCharArray;->UNICODECOUNT:I
-Landroid/icu/util/CompactCharArray;->values:[C
-Landroid/icu/util/CopticCalendar;->BCE:I
-Landroid/icu/util/CopticCalendar;->CE:I
-Landroid/icu/util/CopticCalendar;->copticToJD(JII)I
-Landroid/icu/util/CopticCalendar;->getJDEpochOffset()I
-Landroid/icu/util/CopticCalendar;->JD_EPOCH_OFFSET:I
-Landroid/icu/util/Currency$CurrencyNameResultHandler;-><init>()V
-Landroid/icu/util/Currency$CurrencyNameResultHandler;->bestCurrencyISOCode:Ljava/lang/String;
-Landroid/icu/util/Currency$CurrencyNameResultHandler;->bestMatchLength:I
-Landroid/icu/util/Currency$CurrencyNameResultHandler;->getBestCurrencyISOCode()Ljava/lang/String;
-Landroid/icu/util/Currency$CurrencyNameResultHandler;->getBestMatchLength()I
-Landroid/icu/util/Currency$CurrencyNameResultHandler;->handlePrefixMatch(ILjava/util/Iterator;)Z
-Landroid/icu/util/Currency$CurrencyStringInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/util/Currency$CurrencyStringInfo;->currencyString:Ljava/lang/String;
-Landroid/icu/util/Currency$CurrencyStringInfo;->getCurrencyString()Ljava/lang/String;
-Landroid/icu/util/Currency$CurrencyStringInfo;->getISOCode()Ljava/lang/String;
-Landroid/icu/util/Currency$CurrencyStringInfo;->isoCode:Ljava/lang/String;
-Landroid/icu/util/Currency$EquivalenceRelation;-><init>()V
-Landroid/icu/util/Currency$EquivalenceRelation;->data:Ljava/util/Map;
-Landroid/icu/util/Currency$EquivalenceRelation;->get(Ljava/lang/Object;)Ljava/util/Set;
-Landroid/icu/util/Currency$ServiceShim;-><init>()V
-Landroid/icu/util/Currency$ServiceShim;->createInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;
-Landroid/icu/util/Currency$ServiceShim;->getAvailableLocales()[Ljava/util/Locale;
-Landroid/icu/util/Currency$ServiceShim;->getAvailableULocales()[Landroid/icu/util/ULocale;
-Landroid/icu/util/Currency$ServiceShim;->registerInstance(Landroid/icu/util/Currency;Landroid/icu/util/ULocale;)Ljava/lang/Object;
-Landroid/icu/util/Currency$ServiceShim;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/util/Currency;->ALL_CODES_AS_SET:Ljava/lang/ref/SoftReference;
-Landroid/icu/util/Currency;->ALL_TENDER_CODES:Ljava/lang/ref/SoftReference;
-Landroid/icu/util/Currency;->createCurrency(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;
-Landroid/icu/util/Currency;->CURRENCY_NAME_CACHE:Landroid/icu/impl/ICUCache;
-Landroid/icu/util/Currency;->DEBUG:Z
-Landroid/icu/util/Currency;->EMPTY_STRING_ARRAY:[Ljava/lang/String;
-Landroid/icu/util/Currency;->EQUIVALENT_CURRENCY_SYMBOLS:Landroid/icu/util/Currency$EquivalenceRelation;
-Landroid/icu/util/Currency;->EUR_STR:Ljava/lang/String;
-Landroid/icu/util/Currency;->fromJavaCurrency(Ljava/util/Currency;)Landroid/icu/util/Currency;
-Landroid/icu/util/Currency;->getAllCurrenciesAsSet()Ljava/util/Set;
-Landroid/icu/util/Currency;->getAllTenderCurrencies()Ljava/util/List;
-Landroid/icu/util/Currency;->getCurrencyTrieVec(Landroid/icu/util/ULocale;)Ljava/util/List;
-Landroid/icu/util/Currency;->getShim()Landroid/icu/util/Currency$ServiceShim;
-Landroid/icu/util/Currency;->getTenderCurrencies(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List;
-Landroid/icu/util/Currency;->isAlpha3Code(Ljava/lang/String;)Z
-Landroid/icu/util/Currency;->isoCode:Ljava/lang/String;
-Landroid/icu/util/Currency;->loadCurrency(Ljava/lang/String;)Landroid/icu/util/Currency;
-Landroid/icu/util/Currency;->NARROW_SYMBOL_NAME:I
-Landroid/icu/util/Currency;->openParseState(Landroid/icu/util/ULocale;II)Landroid/icu/impl/TextTrieMap$ParseState;
-Landroid/icu/util/Currency;->parse(Landroid/icu/util/ULocale;Ljava/lang/String;ILjava/text/ParsePosition;)Ljava/lang/String;
-Landroid/icu/util/Currency;->POW10:[I
-Landroid/icu/util/Currency;->regionCurrencyCache:Landroid/icu/impl/CacheBase;
-Landroid/icu/util/Currency;->registerInstance(Landroid/icu/util/Currency;Landroid/icu/util/ULocale;)Ljava/lang/Object;
-Landroid/icu/util/Currency;->setupCurrencyTrieVec(Landroid/icu/util/ULocale;Ljava/util/List;)V
-Landroid/icu/util/Currency;->shim:Landroid/icu/util/Currency$ServiceShim;
-Landroid/icu/util/Currency;->toJavaCurrency()Ljava/util/Currency;
-Landroid/icu/util/Currency;->UND:Landroid/icu/util/ULocale;
-Landroid/icu/util/Currency;->unregister(Ljava/lang/Object;)Z
-Landroid/icu/util/CurrencyAmount;-><init>(DLjava/util/Currency;)V
-Landroid/icu/util/CurrencyAmount;-><init>(Ljava/lang/Number;Ljava/util/Currency;)V
-Landroid/icu/util/DangiCalendar;-><init>()V
-Landroid/icu/util/DangiCalendar;-><init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V
-Landroid/icu/util/DangiCalendar;-><init>(Ljava/util/Date;)V
-Landroid/icu/util/DangiCalendar;->DANGI_EPOCH_YEAR:I
-Landroid/icu/util/DangiCalendar;->KOREA_ZONE:Landroid/icu/util/TimeZone;
-Landroid/icu/util/DateInterval;->fromDate:J
-Landroid/icu/util/DateInterval;->toDate:J
-Landroid/icu/util/DateRule;->firstAfter(Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/DateRule;->firstBetween(Ljava/util/Date;Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/DateRule;->isBetween(Ljava/util/Date;Ljava/util/Date;)Z
-Landroid/icu/util/DateRule;->isOn(Ljava/util/Date;)Z
-Landroid/icu/util/DateTimeRule;-><init>(IIII)V
-Landroid/icu/util/DateTimeRule;-><init>(IIIII)V
-Landroid/icu/util/DateTimeRule;-><init>(IIIZII)V
-Landroid/icu/util/DateTimeRule;->dateRuleType:I
-Landroid/icu/util/DateTimeRule;->dayOfMonth:I
-Landroid/icu/util/DateTimeRule;->dayOfWeek:I
-Landroid/icu/util/DateTimeRule;->DOM:I
-Landroid/icu/util/DateTimeRule;->DOW:I
-Landroid/icu/util/DateTimeRule;->DOWSTR:[Ljava/lang/String;
-Landroid/icu/util/DateTimeRule;->DOW_GEQ_DOM:I
-Landroid/icu/util/DateTimeRule;->DOW_LEQ_DOM:I
-Landroid/icu/util/DateTimeRule;->getDateRuleType()I
-Landroid/icu/util/DateTimeRule;->getRuleDayOfMonth()I
-Landroid/icu/util/DateTimeRule;->getRuleDayOfWeek()I
-Landroid/icu/util/DateTimeRule;->getRuleMillisInDay()I
-Landroid/icu/util/DateTimeRule;->getRuleMonth()I
-Landroid/icu/util/DateTimeRule;->getRuleWeekInMonth()I
-Landroid/icu/util/DateTimeRule;->getTimeRuleType()I
-Landroid/icu/util/DateTimeRule;->millisInDay:I
-Landroid/icu/util/DateTimeRule;->MONSTR:[Ljava/lang/String;
-Landroid/icu/util/DateTimeRule;->month:I
-Landroid/icu/util/DateTimeRule;->STANDARD_TIME:I
-Landroid/icu/util/DateTimeRule;->timeRuleType:I
-Landroid/icu/util/DateTimeRule;->UTC_TIME:I
-Landroid/icu/util/DateTimeRule;->WALL_TIME:I
-Landroid/icu/util/DateTimeRule;->weekInMonth:I
-Landroid/icu/util/EasterHoliday;-><init>(ILjava/lang/String;)V
-Landroid/icu/util/EasterHoliday;-><init>(IZLjava/lang/String;)V
-Landroid/icu/util/EasterHoliday;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/EasterHoliday;->ASCENSION:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->ASH_WEDNESDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->CORPUS_CHRISTI:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->EASTER_MONDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->EASTER_SUNDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->GOOD_FRIDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->MAUNDY_THURSDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->PALM_SUNDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->PENTECOST:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->SHROVE_TUESDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->WHIT_MONDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EasterHoliday;->WHIT_SUNDAY:Landroid/icu/util/EasterHoliday;
-Landroid/icu/util/EthiopicCalendar;->AMETE_ALEM:I
-Landroid/icu/util/EthiopicCalendar;->AMETE_ALEM_ERA:I
-Landroid/icu/util/EthiopicCalendar;->AMETE_MIHRET:I
-Landroid/icu/util/EthiopicCalendar;->AMETE_MIHRET_DELTA:I
-Landroid/icu/util/EthiopicCalendar;->AMETE_MIHRET_ERA:I
-Landroid/icu/util/EthiopicCalendar;->eraType:I
-Landroid/icu/util/EthiopicCalendar;->EthiopicToJD(JII)I
-Landroid/icu/util/EthiopicCalendar;->getJDEpochOffset()I
-Landroid/icu/util/EthiopicCalendar;->JD_EPOCH_OFFSET_AMETE_MIHRET:I
-Landroid/icu/util/EthiopicCalendar;->setCalcTypeForLocale(Landroid/icu/util/ULocale;)V
-Landroid/icu/util/GenderInfo$Cache;-><init>()V
-Landroid/icu/util/GenderInfo$Cache;->cache:Landroid/icu/impl/ICUCache;
-Landroid/icu/util/GenderInfo$Cache;->get(Landroid/icu/util/ULocale;)Landroid/icu/util/GenderInfo;
-Landroid/icu/util/GenderInfo$Cache;->load(Landroid/icu/util/ULocale;)Landroid/icu/util/GenderInfo;
-Landroid/icu/util/GenderInfo$Gender;->FEMALE:Landroid/icu/util/GenderInfo$Gender;
-Landroid/icu/util/GenderInfo$Gender;->MALE:Landroid/icu/util/GenderInfo$Gender;
-Landroid/icu/util/GenderInfo$Gender;->OTHER:Landroid/icu/util/GenderInfo$Gender;
-Landroid/icu/util/GenderInfo$Gender;->valueOf(Ljava/lang/String;)Landroid/icu/util/GenderInfo$Gender;
-Landroid/icu/util/GenderInfo$Gender;->values()[Landroid/icu/util/GenderInfo$Gender;
-Landroid/icu/util/GenderInfo$ListGenderStyle;->fromName(Ljava/lang/String;)Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GenderInfo$ListGenderStyle;->fromNameMap:Ljava/util/Map;
-Landroid/icu/util/GenderInfo$ListGenderStyle;->MALE_TAINTS:Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GenderInfo$ListGenderStyle;->MIXED_NEUTRAL:Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GenderInfo$ListGenderStyle;->NEUTRAL:Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GenderInfo$ListGenderStyle;->valueOf(Ljava/lang/String;)Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GenderInfo$ListGenderStyle;->values()[Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GenderInfo;-><init>(Landroid/icu/util/GenderInfo$ListGenderStyle;)V
-Landroid/icu/util/GenderInfo;->genderInfoCache:Landroid/icu/util/GenderInfo$Cache;
-Landroid/icu/util/GenderInfo;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/GenderInfo;
-Landroid/icu/util/GenderInfo;->getInstance(Ljava/util/Locale;)Landroid/icu/util/GenderInfo;
-Landroid/icu/util/GenderInfo;->getListGender(Ljava/util/List;)Landroid/icu/util/GenderInfo$Gender;
-Landroid/icu/util/GenderInfo;->neutral:Landroid/icu/util/GenderInfo;
-Landroid/icu/util/GenderInfo;->style:Landroid/icu/util/GenderInfo$ListGenderStyle;
-Landroid/icu/util/GlobalizationPreferences;-><init>()V
-Landroid/icu/util/GlobalizationPreferences;->available_locales:Ljava/util/HashMap;
-Landroid/icu/util/GlobalizationPreferences;->BI_CHARACTER:I
-Landroid/icu/util/GlobalizationPreferences;->BI_LIMIT:I
-Landroid/icu/util/GlobalizationPreferences;->BI_LINE:I
-Landroid/icu/util/GlobalizationPreferences;->BI_SENTENCE:I
-Landroid/icu/util/GlobalizationPreferences;->BI_TITLE:I
-Landroid/icu/util/GlobalizationPreferences;->BI_WORD:I
-Landroid/icu/util/GlobalizationPreferences;->breakIterators:[Landroid/icu/text/BreakIterator;
-Landroid/icu/util/GlobalizationPreferences;->calendar:Landroid/icu/util/Calendar;
-Landroid/icu/util/GlobalizationPreferences;->collator:Landroid/icu/text/Collator;
-Landroid/icu/util/GlobalizationPreferences;->currency:Landroid/icu/util/Currency;
-Landroid/icu/util/GlobalizationPreferences;->dateFormats:[[Landroid/icu/text/DateFormat;
-Landroid/icu/util/GlobalizationPreferences;->DF_FULL:I
-Landroid/icu/util/GlobalizationPreferences;->DF_LIMIT:I
-Landroid/icu/util/GlobalizationPreferences;->DF_LONG:I
-Landroid/icu/util/GlobalizationPreferences;->DF_MEDIUM:I
-Landroid/icu/util/GlobalizationPreferences;->DF_NONE:I
-Landroid/icu/util/GlobalizationPreferences;->DF_SHORT:I
-Landroid/icu/util/GlobalizationPreferences;->frozen:Z
-Landroid/icu/util/GlobalizationPreferences;->getAvailableLocale(I)Landroid/icu/util/ULocale;
-Landroid/icu/util/GlobalizationPreferences;->getBreakIterator(I)Landroid/icu/text/BreakIterator;
-Landroid/icu/util/GlobalizationPreferences;->getCalendar()Landroid/icu/util/Calendar;
-Landroid/icu/util/GlobalizationPreferences;->getCollator()Landroid/icu/text/Collator;
-Landroid/icu/util/GlobalizationPreferences;->getCurrency()Landroid/icu/util/Currency;
-Landroid/icu/util/GlobalizationPreferences;->getDateFormat(II)Landroid/icu/text/DateFormat;
-Landroid/icu/util/GlobalizationPreferences;->getDisplayName(Ljava/lang/String;I)Ljava/lang/String;
-Landroid/icu/util/GlobalizationPreferences;->getLocale(I)Landroid/icu/util/ULocale;
-Landroid/icu/util/GlobalizationPreferences;->getLocales()Ljava/util/List;
-Landroid/icu/util/GlobalizationPreferences;->getNumberFormat(I)Landroid/icu/text/NumberFormat;
-Landroid/icu/util/GlobalizationPreferences;->getResourceBundle(Ljava/lang/String;)Ljava/util/ResourceBundle;
-Landroid/icu/util/GlobalizationPreferences;->getResourceBundle(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/ResourceBundle;
-Landroid/icu/util/GlobalizationPreferences;->getTerritory()Ljava/lang/String;
-Landroid/icu/util/GlobalizationPreferences;->getTimeZone()Landroid/icu/util/TimeZone;
-Landroid/icu/util/GlobalizationPreferences;->guessBreakIterator(I)Landroid/icu/text/BreakIterator;
-Landroid/icu/util/GlobalizationPreferences;->guessCalendar()Landroid/icu/util/Calendar;
-Landroid/icu/util/GlobalizationPreferences;->guessCollator()Landroid/icu/text/Collator;
-Landroid/icu/util/GlobalizationPreferences;->guessCurrency()Landroid/icu/util/Currency;
-Landroid/icu/util/GlobalizationPreferences;->guessDateFormat(II)Landroid/icu/text/DateFormat;
-Landroid/icu/util/GlobalizationPreferences;->guessLocales()Ljava/util/List;
-Landroid/icu/util/GlobalizationPreferences;->guessNumberFormat(I)Landroid/icu/text/NumberFormat;
-Landroid/icu/util/GlobalizationPreferences;->guessTerritory()Ljava/lang/String;
-Landroid/icu/util/GlobalizationPreferences;->guessTimeZone()Landroid/icu/util/TimeZone;
-Landroid/icu/util/GlobalizationPreferences;->ID_CURRENCY:I
-Landroid/icu/util/GlobalizationPreferences;->ID_CURRENCY_SYMBOL:I
-Landroid/icu/util/GlobalizationPreferences;->ID_KEYWORD:I
-Landroid/icu/util/GlobalizationPreferences;->ID_KEYWORD_VALUE:I
-Landroid/icu/util/GlobalizationPreferences;->ID_LANGUAGE:I
-Landroid/icu/util/GlobalizationPreferences;->ID_LOCALE:I
-Landroid/icu/util/GlobalizationPreferences;->ID_SCRIPT:I
-Landroid/icu/util/GlobalizationPreferences;->ID_TERRITORY:I
-Landroid/icu/util/GlobalizationPreferences;->ID_TIMEZONE:I
-Landroid/icu/util/GlobalizationPreferences;->ID_VARIANT:I
-Landroid/icu/util/GlobalizationPreferences;->implicitLocales:Ljava/util/List;
-Landroid/icu/util/GlobalizationPreferences;->isAvailableLocale(Landroid/icu/util/ULocale;I)Z
-Landroid/icu/util/GlobalizationPreferences;->language_territory_hack:[[Ljava/lang/String;
-Landroid/icu/util/GlobalizationPreferences;->language_territory_hack_map:Ljava/util/Map;
-Landroid/icu/util/GlobalizationPreferences;->locales:Ljava/util/List;
-Landroid/icu/util/GlobalizationPreferences;->NF_CURRENCY:I
-Landroid/icu/util/GlobalizationPreferences;->NF_INTEGER:I
-Landroid/icu/util/GlobalizationPreferences;->NF_LIMIT:I
-Landroid/icu/util/GlobalizationPreferences;->NF_NUMBER:I
-Landroid/icu/util/GlobalizationPreferences;->NF_PERCENT:I
-Landroid/icu/util/GlobalizationPreferences;->NF_SCIENTIFIC:I
-Landroid/icu/util/GlobalizationPreferences;->numberFormats:[Landroid/icu/text/NumberFormat;
-Landroid/icu/util/GlobalizationPreferences;->processLocales(Ljava/util/List;)Ljava/util/List;
-Landroid/icu/util/GlobalizationPreferences;->reset()Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setBreakIterator(ILandroid/icu/text/BreakIterator;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setCalendar(Landroid/icu/util/Calendar;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setCollator(Landroid/icu/text/Collator;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setCurrency(Landroid/icu/util/Currency;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setDateFormat(IILandroid/icu/text/DateFormat;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setLocale(Landroid/icu/util/ULocale;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setLocales(Ljava/lang/String;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setLocales(Ljava/util/List;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setLocales([Landroid/icu/util/ULocale;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setNumberFormat(ILandroid/icu/text/NumberFormat;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setTerritory(Ljava/lang/String;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->setTimeZone(Landroid/icu/util/TimeZone;)Landroid/icu/util/GlobalizationPreferences;
-Landroid/icu/util/GlobalizationPreferences;->territory:Ljava/lang/String;
-Landroid/icu/util/GlobalizationPreferences;->territory_tzid_hack:[[Ljava/lang/String;
-Landroid/icu/util/GlobalizationPreferences;->territory_tzid_hack_map:Ljava/util/Map;
-Landroid/icu/util/GlobalizationPreferences;->timezone:Landroid/icu/util/TimeZone;
-Landroid/icu/util/GlobalizationPreferences;->TYPE_BREAKITERATOR:I
-Landroid/icu/util/GlobalizationPreferences;->TYPE_CALENDAR:I
-Landroid/icu/util/GlobalizationPreferences;->TYPE_COLLATOR:I
-Landroid/icu/util/GlobalizationPreferences;->TYPE_DATEFORMAT:I
-Landroid/icu/util/GlobalizationPreferences;->TYPE_GENERIC:I
-Landroid/icu/util/GlobalizationPreferences;->TYPE_LIMIT:I
-Landroid/icu/util/GlobalizationPreferences;->TYPE_NUMBERFORMAT:I
-Landroid/icu/util/GregorianCalendar;->cutoverJulianDay:I
-Landroid/icu/util/GregorianCalendar;->EPOCH_YEAR:I
-Landroid/icu/util/GregorianCalendar;->gregorianCutover:J
-Landroid/icu/util/GregorianCalendar;->gregorianCutoverYear:I
-Landroid/icu/util/GregorianCalendar;->inDaylightTime()Z
-Landroid/icu/util/GregorianCalendar;->LIMITS:[[I
-Landroid/icu/util/GregorianCalendar;->MONTH_COUNT:[[I
-Landroid/icu/util/HebrewCalendar;->BAHARAD:J
-Landroid/icu/util/HebrewCalendar;->cache:Landroid/icu/impl/CalendarCache;
-Landroid/icu/util/HebrewCalendar;->DAY_PARTS:J
-Landroid/icu/util/HebrewCalendar;->HOUR_PARTS:J
-Landroid/icu/util/HebrewCalendar;->isLeapYear(I)Z
-Landroid/icu/util/HebrewCalendar;->LEAP_MONTH_START:[[I
-Landroid/icu/util/HebrewCalendar;->LIMITS:[[I
-Landroid/icu/util/HebrewCalendar;->monthsInYear(I)I
-Landroid/icu/util/HebrewCalendar;->MONTH_DAYS:I
-Landroid/icu/util/HebrewCalendar;->MONTH_FRACT:J
-Landroid/icu/util/HebrewCalendar;->MONTH_LENGTH:[[I
-Landroid/icu/util/HebrewCalendar;->MONTH_PARTS:J
-Landroid/icu/util/HebrewCalendar;->MONTH_START:[[I
-Landroid/icu/util/HebrewCalendar;->startOfYear(I)J
-Landroid/icu/util/HebrewCalendar;->yearType(I)I
-Landroid/icu/util/HebrewHoliday;-><init>(IIILjava/lang/String;)V
-Landroid/icu/util/HebrewHoliday;-><init>(IILjava/lang/String;)V
-Landroid/icu/util/HebrewHoliday;->ESTHER:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->gCalendar:Landroid/icu/util/HebrewCalendar;
-Landroid/icu/util/HebrewHoliday;->GEDALIAH:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->HANUKKAH:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->HOSHANAH_RABBAH:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->LAG_BOMER:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->PASSOVER:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->PESACH_SHEINI:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->PURIM:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->ROSH_HASHANAH:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->SELIHOT:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->SHAVUOT:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->SHEMINI_ATZERET:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->SHUSHAN_PURIM:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->SIMCHAT_TORAH:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->SUKKOT:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->TAMMUZ_17:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->TEVET_10:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->TISHA_BAV:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->TU_BSHEVAT:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->YOM_HAATZMAUT:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->YOM_HASHOAH:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->YOM_HAZIKARON:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->YOM_KIPPUR:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/HebrewHoliday;->YOM_YERUSHALAYIM:Landroid/icu/util/HebrewHoliday;
-Landroid/icu/util/Holiday;-><init>(Ljava/lang/String;Landroid/icu/util/DateRule;)V
-Landroid/icu/util/Holiday;->firstAfter(Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/Holiday;->firstBetween(Ljava/util/Date;Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/Holiday;->getDisplayName()Ljava/lang/String;
-Landroid/icu/util/Holiday;->getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/Holiday;->getDisplayName(Ljava/util/Locale;)Ljava/lang/String;
-Landroid/icu/util/Holiday;->getHolidays()[Landroid/icu/util/Holiday;
-Landroid/icu/util/Holiday;->getHolidays(Landroid/icu/util/ULocale;)[Landroid/icu/util/Holiday;
-Landroid/icu/util/Holiday;->getHolidays(Ljava/util/Locale;)[Landroid/icu/util/Holiday;
-Landroid/icu/util/Holiday;->getRule()Landroid/icu/util/DateRule;
-Landroid/icu/util/Holiday;->isBetween(Ljava/util/Date;Ljava/util/Date;)Z
-Landroid/icu/util/Holiday;->isOn(Ljava/util/Date;)Z
-Landroid/icu/util/Holiday;->name:Ljava/lang/String;
-Landroid/icu/util/Holiday;->noHolidays:[Landroid/icu/util/Holiday;
-Landroid/icu/util/Holiday;->rule:Landroid/icu/util/DateRule;
-Landroid/icu/util/Holiday;->setRule(Landroid/icu/util/DateRule;)V
-Landroid/icu/util/ICUCloneNotSupportedException;-><init>()V
-Landroid/icu/util/ICUCloneNotSupportedException;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/ICUCloneNotSupportedException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Landroid/icu/util/ICUCloneNotSupportedException;-><init>(Ljava/lang/Throwable;)V
-Landroid/icu/util/ICUException;-><init>()V
-Landroid/icu/util/ICUException;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/ICUException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Landroid/icu/util/ICUException;-><init>(Ljava/lang/Throwable;)V
-Landroid/icu/util/IllformedLocaleException;->_errIdx:I
-Landroid/icu/util/IndianCalendar;->gregorianToJD(III)D
-Landroid/icu/util/IndianCalendar;->IndianToJD(III)D
-Landroid/icu/util/IndianCalendar;->INDIAN_ERA_START:I
-Landroid/icu/util/IndianCalendar;->INDIAN_YEAR_START:I
-Landroid/icu/util/IndianCalendar;->isGregorianLeap(I)Z
-Landroid/icu/util/IndianCalendar;->jdToGregorian(D)[I
-Landroid/icu/util/IndianCalendar;->LIMITS:[[I
-Landroid/icu/util/InitialTimeZoneRule;-><init>(Ljava/lang/String;II)V
-Landroid/icu/util/InitialTimeZoneRule;->getFinalStart(II)Ljava/util/Date;
-Landroid/icu/util/InitialTimeZoneRule;->getFirstStart(II)Ljava/util/Date;
-Landroid/icu/util/InitialTimeZoneRule;->getNextStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/InitialTimeZoneRule;->getPreviousStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/InitialTimeZoneRule;->isEquivalentTo(Landroid/icu/util/TimeZoneRule;)Z
-Landroid/icu/util/InitialTimeZoneRule;->isTransitionRule()Z
-Landroid/icu/util/IslamicCalendar$CalculationType;->bcpType()Ljava/lang/String;
-Landroid/icu/util/IslamicCalendar$CalculationType;->bcpType:Ljava/lang/String;
-Landroid/icu/util/IslamicCalendar;->astro:Landroid/icu/impl/CalendarAstronomer;
-Landroid/icu/util/IslamicCalendar;->ASTRONOMICAL_EPOC:J
-Landroid/icu/util/IslamicCalendar;->cache:Landroid/icu/impl/CalendarCache;
-Landroid/icu/util/IslamicCalendar;->civil:Z
-Landroid/icu/util/IslamicCalendar;->civilLeapYear(I)Z
-Landroid/icu/util/IslamicCalendar;->CIVIL_EPOC:J
-Landroid/icu/util/IslamicCalendar;->cType:Landroid/icu/util/IslamicCalendar$CalculationType;
-Landroid/icu/util/IslamicCalendar;->HIJRA_MILLIS:J
-Landroid/icu/util/IslamicCalendar;->isCivil()Z
-Landroid/icu/util/IslamicCalendar;->LIMITS:[[I
-Landroid/icu/util/IslamicCalendar;->monthStart(II)J
-Landroid/icu/util/IslamicCalendar;->moonAge(J)D
-Landroid/icu/util/IslamicCalendar;->setCalcTypeForLocale(Landroid/icu/util/ULocale;)V
-Landroid/icu/util/IslamicCalendar;->setCivil(Z)V
-Landroid/icu/util/IslamicCalendar;->trueMonthStart(J)J
-Landroid/icu/util/IslamicCalendar;->UMALQURA_MONTHLENGTH:[I
-Landroid/icu/util/IslamicCalendar;->UMALQURA_YEAR_END:I
-Landroid/icu/util/IslamicCalendar;->UMALQURA_YEAR_START:I
-Landroid/icu/util/IslamicCalendar;->UMALQURA_YEAR_START_ESTIMATE_FIX:[B
-Landroid/icu/util/IslamicCalendar;->yearStart(I)J
-Landroid/icu/util/JapaneseCalendar;->ERAS:[I
-Landroid/icu/util/JapaneseCalendar;->getDefaultDayInMonth(II)I
-Landroid/icu/util/JapaneseCalendar;->getDefaultMonthInYear(I)I
-Landroid/icu/util/JapaneseCalendar;->GREGORIAN_EPOCH:I
-Landroid/icu/util/JapaneseCalendar;->haveDefaultCentury()Z
-Landroid/icu/util/LocaleData$MeasurementSystem;-><init>()V
-Landroid/icu/util/LocaleData$PaperSize;-><init>(II)V
-Landroid/icu/util/LocaleData$PaperSize;->height:I
-Landroid/icu/util/LocaleData$PaperSize;->width:I
-Landroid/icu/util/LocaleData;-><init>()V
-Landroid/icu/util/LocaleData;->bundle:Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/util/LocaleData;->DELIMITER_COUNT:I
-Landroid/icu/util/LocaleData;->DELIMITER_TYPES:[Ljava/lang/String;
-Landroid/icu/util/LocaleData;->ES_AUXILIARY:I
-Landroid/icu/util/LocaleData;->ES_COUNT:I
-Landroid/icu/util/LocaleData;->ES_CURRENCY:I
-Landroid/icu/util/LocaleData;->ES_INDEX:I
-Landroid/icu/util/LocaleData;->ES_PUNCTUATION:I
-Landroid/icu/util/LocaleData;->ES_STANDARD:I
-Landroid/icu/util/LocaleData;->gCLDRVersion:Landroid/icu/util/VersionInfo;
-Landroid/icu/util/LocaleData;->getExemplarSet(II)Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/LocaleData;->getExemplarSet(Landroid/icu/util/ULocale;I)Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/LocaleData;->getExemplarSet(Landroid/icu/util/ULocale;II)Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/LocaleData;->getLocaleDisplayPattern()Ljava/lang/String;
-Landroid/icu/util/LocaleData;->getLocaleSeparator()Ljava/lang/String;
-Landroid/icu/util/LocaleData;->langBundle:Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/util/LocaleData;->LOCALE_DISPLAY_PATTERN:Ljava/lang/String;
-Landroid/icu/util/LocaleData;->measurementTypeBundleForLocale(Landroid/icu/util/ULocale;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/LocaleData;->MEASUREMENT_SYSTEM:Ljava/lang/String;
-Landroid/icu/util/LocaleData;->noSubstitute:Z
-Landroid/icu/util/LocaleData;->PAPER_SIZE:Ljava/lang/String;
-Landroid/icu/util/LocaleData;->PATTERN:Ljava/lang/String;
-Landroid/icu/util/LocaleData;->SEPARATOR:Ljava/lang/String;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;-><init>()V
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->addDistance(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/icu/util/LocaleMatcher$LanguageMatcherData;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->addDistance(Ljava/lang/String;Ljava/lang/String;IZ)Landroid/icu/util/LocaleMatcher$LanguageMatcherData;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->addDistance(Ljava/lang/String;Ljava/lang/String;IZLjava/lang/String;)Landroid/icu/util/LocaleMatcher$LanguageMatcherData;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->frozen:Z
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->languageScores:Landroid/icu/util/LocaleMatcher$ScoreData;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->match(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)D
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->matchingLanguages()Landroid/icu/impl/Relation;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->matchingLanguages:Landroid/icu/impl/Relation;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->regionScores:Landroid/icu/util/LocaleMatcher$ScoreData;
-Landroid/icu/util/LocaleMatcher$LanguageMatcherData;->scriptScores:Landroid/icu/util/LocaleMatcher$ScoreData;
-Landroid/icu/util/LocaleMatcher$Level;->language:Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$Level;->region:Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$Level;->script:Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$Level;->valueOf(Ljava/lang/String;)Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$Level;->values()[Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$Level;->worst:D
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->getLanguage()Ljava/lang/String;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->getLevel()Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->getRegion()Ljava/lang/String;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->getScript()Ljava/lang/String;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->lang:Ljava/lang/String;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->level:Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->matches(Landroid/icu/util/ULocale;)Z
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->pattern:Ljava/util/regex/Pattern;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->region:Ljava/lang/String;
-Landroid/icu/util/LocaleMatcher$LocalePatternMatcher;->script:Ljava/lang/String;
-Landroid/icu/util/LocaleMatcher$OutputDouble;-><init>()V
-Landroid/icu/util/LocaleMatcher$OutputDouble;->value:D
-Landroid/icu/util/LocaleMatcher$ScoreData;-><init>(Landroid/icu/util/LocaleMatcher$Level;)V
-Landroid/icu/util/LocaleMatcher$ScoreData;->addDataToScores(Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/Row$R3;)V
-Landroid/icu/util/LocaleMatcher$ScoreData;->frozen:Z
-Landroid/icu/util/LocaleMatcher$ScoreData;->getMatchingLanguages()Landroid/icu/impl/Relation;
-Landroid/icu/util/LocaleMatcher$ScoreData;->getRawScore(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)D
-Landroid/icu/util/LocaleMatcher$ScoreData;->getScore(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)D
-Landroid/icu/util/LocaleMatcher$ScoreData;->level:Landroid/icu/util/LocaleMatcher$Level;
-Landroid/icu/util/LocaleMatcher$ScoreData;->maxUnequal_changeD_sameS:D
-Landroid/icu/util/LocaleMatcher$ScoreData;->maxUnequal_changeEqual:D
-Landroid/icu/util/LocaleMatcher$ScoreData;->scores:Ljava/util/LinkedHashSet;
-Landroid/icu/util/LocaleMatcher;-><init>(Landroid/icu/util/LocalePriorityList;)V
-Landroid/icu/util/LocaleMatcher;-><init>(Landroid/icu/util/LocalePriorityList;Landroid/icu/util/LocaleMatcher$LanguageMatcherData;)V
-Landroid/icu/util/LocaleMatcher;-><init>(Landroid/icu/util/LocalePriorityList;Landroid/icu/util/LocaleMatcher$LanguageMatcherData;D)V
-Landroid/icu/util/LocaleMatcher;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/LocaleMatcher;->add(Landroid/icu/util/ULocale;Ljava/lang/Double;)V
-Landroid/icu/util/LocaleMatcher;->addFiltered(Ljava/lang/String;Landroid/icu/impl/Row$R3;)V
-Landroid/icu/util/LocaleMatcher;->addLikelySubtags(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->canonicalize(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->canonicalMap:Ljava/util/HashMap;
-Landroid/icu/util/LocaleMatcher;->DEBUG:Z
-Landroid/icu/util/LocaleMatcher;->defaultLanguage:Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->defaultWritten:Landroid/icu/util/LocaleMatcher$LanguageMatcherData;
-Landroid/icu/util/LocaleMatcher;->DEFAULT_THRESHOLD:D
-Landroid/icu/util/LocaleMatcher;->desiredLanguageToPossibleLocalesToMaxLocaleToData:Ljava/util/Map;
-Landroid/icu/util/LocaleMatcher;->distance(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)I
-Landroid/icu/util/LocaleMatcher;->getBestMatch(Landroid/icu/util/LocalePriorityList;)Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->getBestMatch(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->getBestMatch(Ljava/lang/String;)Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->getBestMatch(Ljava/util/LinkedHashSet;Landroid/icu/util/Output;)Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->getBestMatchInternal(Landroid/icu/util/ULocale;Landroid/icu/util/LocaleMatcher$OutputDouble;)Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->getICUSupplementalData()Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/util/LocaleMatcher;->getLocaleMatcher()Landroid/icu/impl/locale/XLocaleMatcher;
-Landroid/icu/util/LocaleMatcher;->languagePriorityList:Landroid/icu/util/LocalePriorityList;
-Landroid/icu/util/LocaleMatcher;->localeToMaxLocaleAndWeight:Ljava/util/Set;
-Landroid/icu/util/LocaleMatcher;->match(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)D
-Landroid/icu/util/LocaleMatcher;->match(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)D
-Landroid/icu/util/LocaleMatcher;->matcherData:Landroid/icu/util/LocaleMatcher$LanguageMatcherData;
-Landroid/icu/util/LocaleMatcher;->processMapping()V
-Landroid/icu/util/LocaleMatcher;->setDefaultLanguage(Landroid/icu/util/ULocale;)Landroid/icu/util/LocaleMatcher;
-Landroid/icu/util/LocaleMatcher;->setFavorScript(Z)Landroid/icu/util/LocaleMatcher;
-Landroid/icu/util/LocaleMatcher;->threshold:D
-Landroid/icu/util/LocaleMatcher;->UNKNOWN_LOCALE:Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->xDefaultLanguage:Landroid/icu/util/ULocale;
-Landroid/icu/util/LocaleMatcher;->xFavorScript:Z
-Landroid/icu/util/LocaleMatcher;->xLocaleMatcher:Landroid/icu/impl/locale/XLocaleMatcher;
-Landroid/icu/util/LocalePriorityList$Builder;-><init>()V
-Landroid/icu/util/LocalePriorityList$Builder;->add(Landroid/icu/util/LocalePriorityList;)Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList$Builder;->add(Landroid/icu/util/ULocale;)Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList$Builder;->add(Landroid/icu/util/ULocale;D)Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList$Builder;->add(Ljava/lang/String;)Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList$Builder;->build()Landroid/icu/util/LocalePriorityList;
-Landroid/icu/util/LocalePriorityList$Builder;->build(Z)Landroid/icu/util/LocalePriorityList;
-Landroid/icu/util/LocalePriorityList$Builder;->languageToWeight:Ljava/util/Map;
-Landroid/icu/util/LocalePriorityList;-><init>(Ljava/util/Map;)V
-Landroid/icu/util/LocalePriorityList;->add(Landroid/icu/util/LocalePriorityList;)Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList;->add(Landroid/icu/util/ULocale;D)Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList;->add(Ljava/lang/String;)Landroid/icu/util/LocalePriorityList$Builder;
-Landroid/icu/util/LocalePriorityList;->D0:D
-Landroid/icu/util/LocalePriorityList;->D1:Ljava/lang/Double;
-Landroid/icu/util/LocalePriorityList;->getWeight(Landroid/icu/util/ULocale;)Ljava/lang/Double;
-Landroid/icu/util/LocalePriorityList;->languagesAndWeights:Ljava/util/Map;
-Landroid/icu/util/LocalePriorityList;->languageSplitter:Ljava/util/regex/Pattern;
-Landroid/icu/util/LocalePriorityList;->myDescendingDouble:Ljava/util/Comparator;
-Landroid/icu/util/LocalePriorityList;->weightSplitter:Ljava/util/regex/Pattern;
-Landroid/icu/util/Measure;->number:Ljava/lang/Number;
-Landroid/icu/util/Measure;->numbersEqual(Ljava/lang/Number;Ljava/lang/Number;)Z
-Landroid/icu/util/Measure;->unit:Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MeasureUnit$CurrencyNumericCodeSink;-><init>()V
-Landroid/icu/util/MeasureUnit$Factory;->create(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MeasureUnit$MeasureUnitProxy;-><init>()V
-Landroid/icu/util/MeasureUnit$MeasureUnitProxy;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/util/MeasureUnit$MeasureUnitProxy;->subType:Ljava/lang/String;
-Landroid/icu/util/MeasureUnit$MeasureUnitProxy;->type:Ljava/lang/String;
-Landroid/icu/util/MeasureUnit$MeasureUnitSink;-><init>()V
-Landroid/icu/util/MeasureUnit;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/util/MeasureUnit;->addUnit(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/MeasureUnit$Factory;)Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MeasureUnit;->ASCII:Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/MeasureUnit;->ASCII_HYPHEN_DIGITS:Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/MeasureUnit;->cache:Ljava/util/Map;
-Landroid/icu/util/MeasureUnit;->cacheIsPopulated:Z
-Landroid/icu/util/MeasureUnit;->CURRENCY_FACTORY:Landroid/icu/util/MeasureUnit$Factory;
-Landroid/icu/util/MeasureUnit;->internalGetInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MeasureUnit;->NOUNIT_FACTORY:Landroid/icu/util/MeasureUnit$Factory;
-Landroid/icu/util/MeasureUnit;->POINT:Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MeasureUnit;->populateCache()V
-Landroid/icu/util/MeasureUnit;->resolveUnitPerUnit(Landroid/icu/util/MeasureUnit;Landroid/icu/util/MeasureUnit;)Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MeasureUnit;->subType:Ljava/lang/String;
-Landroid/icu/util/MeasureUnit;->TIMEUNIT_FACTORY:Landroid/icu/util/MeasureUnit$Factory;
-Landroid/icu/util/MeasureUnit;->type:Ljava/lang/String;
-Landroid/icu/util/MeasureUnit;->unitPerUnitToSingleUnit:Ljava/util/HashMap;
-Landroid/icu/util/MeasureUnit;->UNIT_FACTORY:Landroid/icu/util/MeasureUnit$Factory;
-Landroid/icu/util/NoUnit;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/NoUnit;->BASE:Landroid/icu/util/NoUnit;
-Landroid/icu/util/NoUnit;->PERCENT:Landroid/icu/util/NoUnit;
-Landroid/icu/util/NoUnit;->PERMILLE:Landroid/icu/util/NoUnit;
-Landroid/icu/util/OutputInt;-><init>()V
-Landroid/icu/util/OutputInt;-><init>(I)V
-Landroid/icu/util/OutputInt;->value:I
-Landroid/icu/util/PersianCalendar;-><init>()V
-Landroid/icu/util/PersianCalendar;-><init>(III)V
-Landroid/icu/util/PersianCalendar;-><init>(IIIIII)V
-Landroid/icu/util/PersianCalendar;-><init>(Landroid/icu/util/TimeZone;)V
-Landroid/icu/util/PersianCalendar;-><init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V
-Landroid/icu/util/PersianCalendar;-><init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V
-Landroid/icu/util/PersianCalendar;-><init>(Landroid/icu/util/ULocale;)V
-Landroid/icu/util/PersianCalendar;-><init>(Ljava/util/Date;)V
-Landroid/icu/util/PersianCalendar;->isLeapYear(I)Z
-Landroid/icu/util/PersianCalendar;->LIMITS:[[I
-Landroid/icu/util/PersianCalendar;->MONTH_COUNT:[[I
-Landroid/icu/util/PersianCalendar;->PERSIAN_EPOCH:I
-Landroid/icu/util/Range;-><init>(Ljava/util/Date;Landroid/icu/util/DateRule;)V
-Landroid/icu/util/Range;->rule:Landroid/icu/util/DateRule;
-Landroid/icu/util/Range;->start:Ljava/util/Date;
-Landroid/icu/util/RangeDateRule;-><init>()V
-Landroid/icu/util/RangeDateRule;->add(Landroid/icu/util/DateRule;)V
-Landroid/icu/util/RangeDateRule;->add(Ljava/util/Date;Landroid/icu/util/DateRule;)V
-Landroid/icu/util/RangeDateRule;->firstAfter(Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/RangeDateRule;->firstBetween(Ljava/util/Date;Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/RangeDateRule;->isBetween(Ljava/util/Date;Ljava/util/Date;)Z
-Landroid/icu/util/RangeDateRule;->isOn(Ljava/util/Date;)Z
-Landroid/icu/util/RangeDateRule;->rangeAt(I)Landroid/icu/util/Range;
-Landroid/icu/util/RangeDateRule;->ranges:Ljava/util/List;
-Landroid/icu/util/RangeDateRule;->startIndex(Ljava/util/Date;)I
-Landroid/icu/util/Region$RegionType;->CONTINENT:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->DEPRECATED:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->GROUPING:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->SUBCONTINENT:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->TERRITORY:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->UNKNOWN:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->valueOf(Ljava/lang/String;)Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->values()[Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region$RegionType;->WORLD:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region;-><init>()V
-Landroid/icu/util/Region;->availableRegions:Ljava/util/ArrayList;
-Landroid/icu/util/Region;->code:I
-Landroid/icu/util/Region;->compareTo(Landroid/icu/util/Region;)I
-Landroid/icu/util/Region;->containedRegions:Ljava/util/Set;
-Landroid/icu/util/Region;->containingRegion:Landroid/icu/util/Region;
-Landroid/icu/util/Region;->contains(Landroid/icu/util/Region;)Z
-Landroid/icu/util/Region;->getAvailable(Landroid/icu/util/Region$RegionType;)Ljava/util/Set;
-Landroid/icu/util/Region;->getContainedRegions()Ljava/util/Set;
-Landroid/icu/util/Region;->getContainedRegions(Landroid/icu/util/Region$RegionType;)Ljava/util/Set;
-Landroid/icu/util/Region;->getContainingRegion()Landroid/icu/util/Region;
-Landroid/icu/util/Region;->getContainingRegion(Landroid/icu/util/Region$RegionType;)Landroid/icu/util/Region;
-Landroid/icu/util/Region;->getInstance(I)Landroid/icu/util/Region;
-Landroid/icu/util/Region;->getInstance(Ljava/lang/String;)Landroid/icu/util/Region;
-Landroid/icu/util/Region;->getNumericCode()I
-Landroid/icu/util/Region;->getPreferredValues()Ljava/util/List;
-Landroid/icu/util/Region;->getType()Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region;->id:Ljava/lang/String;
-Landroid/icu/util/Region;->loadRegionData()V
-Landroid/icu/util/Region;->numericCodeMap:Ljava/util/Map;
-Landroid/icu/util/Region;->OUTLYING_OCEANIA_REGION_ID:Ljava/lang/String;
-Landroid/icu/util/Region;->preferredValues:Ljava/util/List;
-Landroid/icu/util/Region;->regionAliases:Ljava/util/Map;
-Landroid/icu/util/Region;->regionDataIsLoaded:Z
-Landroid/icu/util/Region;->regionIDMap:Ljava/util/Map;
-Landroid/icu/util/Region;->regions:Ljava/util/ArrayList;
-Landroid/icu/util/Region;->type:Landroid/icu/util/Region$RegionType;
-Landroid/icu/util/Region;->UNKNOWN_REGION_ID:Ljava/lang/String;
-Landroid/icu/util/Region;->WORLD_ID:Ljava/lang/String;
-Landroid/icu/util/RuleBasedTimeZone;-><init>(Ljava/lang/String;Landroid/icu/util/InitialTimeZoneRule;)V
-Landroid/icu/util/RuleBasedTimeZone;->addTransitionRule(Landroid/icu/util/TimeZoneRule;)V
-Landroid/icu/util/RuleBasedTimeZone;->complete()V
-Landroid/icu/util/RuleBasedTimeZone;->finalRules:[Landroid/icu/util/AnnualTimeZoneRule;
-Landroid/icu/util/RuleBasedTimeZone;->findRuleInFinal(JZII)Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/RuleBasedTimeZone;->getLocalDelta(IIIIII)I
-Landroid/icu/util/RuleBasedTimeZone;->getNextTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/RuleBasedTimeZone;->getOffset(JZII[I)V
-Landroid/icu/util/RuleBasedTimeZone;->getOffsetFromLocal(JII[I)V
-Landroid/icu/util/RuleBasedTimeZone;->getPreviousTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/RuleBasedTimeZone;->getTimeZoneRules()[Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/RuleBasedTimeZone;->getTransitionTime(Landroid/icu/util/TimeZoneTransition;ZII)J
-Landroid/icu/util/RuleBasedTimeZone;->historicRules:Ljava/util/List;
-Landroid/icu/util/RuleBasedTimeZone;->historicTransitions:Ljava/util/List;
-Landroid/icu/util/RuleBasedTimeZone;->initialRule:Landroid/icu/util/InitialTimeZoneRule;
-Landroid/icu/util/RuleBasedTimeZone;->isFrozen:Z
-Landroid/icu/util/RuleBasedTimeZone;->upToDate:Z
-Landroid/icu/util/SimpleDateRule;-><init>(II)V
-Landroid/icu/util/SimpleDateRule;-><init>(IIIZ)V
-Landroid/icu/util/SimpleDateRule;-><init>(IILandroid/icu/util/Calendar;)V
-Landroid/icu/util/SimpleDateRule;->calendar:Landroid/icu/util/Calendar;
-Landroid/icu/util/SimpleDateRule;->computeInYear(ILandroid/icu/util/Calendar;)Ljava/util/Date;
-Landroid/icu/util/SimpleDateRule;->dayOfMonth:I
-Landroid/icu/util/SimpleDateRule;->dayOfWeek:I
-Landroid/icu/util/SimpleDateRule;->doFirstBetween(Ljava/util/Date;Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/SimpleDateRule;->firstAfter(Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/SimpleDateRule;->firstBetween(Ljava/util/Date;Ljava/util/Date;)Ljava/util/Date;
-Landroid/icu/util/SimpleDateRule;->isBetween(Ljava/util/Date;Ljava/util/Date;)Z
-Landroid/icu/util/SimpleDateRule;->isOn(Ljava/util/Date;)Z
-Landroid/icu/util/SimpleDateRule;->month:I
-Landroid/icu/util/SimpleHoliday;-><init>(IIILjava/lang/String;)V
-Landroid/icu/util/SimpleHoliday;-><init>(IIILjava/lang/String;I)V
-Landroid/icu/util/SimpleHoliday;-><init>(IIILjava/lang/String;II)V
-Landroid/icu/util/SimpleHoliday;-><init>(IILjava/lang/String;)V
-Landroid/icu/util/SimpleHoliday;-><init>(IILjava/lang/String;I)V
-Landroid/icu/util/SimpleHoliday;-><init>(IILjava/lang/String;II)V
-Landroid/icu/util/SimpleHoliday;->ALL_SAINTS_DAY:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->ALL_SOULS_DAY:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->ASSUMPTION:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->BOXING_DAY:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->CHRISTMAS:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->CHRISTMAS_EVE:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->EPIPHANY:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->IMMACULATE_CONCEPTION:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->MAY_DAY:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->NEW_YEARS_DAY:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->NEW_YEARS_EVE:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleHoliday;->rangeRule(IILandroid/icu/util/DateRule;)Landroid/icu/util/DateRule;
-Landroid/icu/util/SimpleHoliday;->ST_STEPHENS_DAY:Landroid/icu/util/SimpleHoliday;
-Landroid/icu/util/SimpleTimeZone;-><init>(ILjava/lang/String;)V
-Landroid/icu/util/SimpleTimeZone;-><init>(ILjava/lang/String;IIIIIIII)V
-Landroid/icu/util/SimpleTimeZone;-><init>(ILjava/lang/String;IIIIIIIII)V
-Landroid/icu/util/SimpleTimeZone;-><init>(ILjava/lang/String;IIIIIIIIIII)V
-Landroid/icu/util/SimpleTimeZone;->compareToRule(IIIIIIIIIIII)I
-Landroid/icu/util/SimpleTimeZone;->construct(IIIIIIIIIIII)V
-Landroid/icu/util/SimpleTimeZone;->decodeEndRule()V
-Landroid/icu/util/SimpleTimeZone;->decodeRules()V
-Landroid/icu/util/SimpleTimeZone;->decodeStartRule()V
-Landroid/icu/util/SimpleTimeZone;->DOM_MODE:I
-Landroid/icu/util/SimpleTimeZone;->DOW_GE_DOM_MODE:I
-Landroid/icu/util/SimpleTimeZone;->DOW_IN_MONTH_MODE:I
-Landroid/icu/util/SimpleTimeZone;->DOW_LE_DOM_MODE:I
-Landroid/icu/util/SimpleTimeZone;->dst:I
-Landroid/icu/util/SimpleTimeZone;->dstRule:Landroid/icu/util/AnnualTimeZoneRule;
-Landroid/icu/util/SimpleTimeZone;->endDay:I
-Landroid/icu/util/SimpleTimeZone;->endDayOfWeek:I
-Landroid/icu/util/SimpleTimeZone;->endMode:I
-Landroid/icu/util/SimpleTimeZone;->endMonth:I
-Landroid/icu/util/SimpleTimeZone;->endTime:I
-Landroid/icu/util/SimpleTimeZone;->endTimeMode:I
-Landroid/icu/util/SimpleTimeZone;->firstTransition:Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/SimpleTimeZone;->getNextTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/SimpleTimeZone;->getOffset(IIIIIII)I
-Landroid/icu/util/SimpleTimeZone;->getOffset(IIIIIIII)I
-Landroid/icu/util/SimpleTimeZone;->getOffsetFromLocal(JII[I)V
-Landroid/icu/util/SimpleTimeZone;->getPreviousTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/SimpleTimeZone;->getSTZInfo()Landroid/icu/util/STZInfo;
-Landroid/icu/util/SimpleTimeZone;->getTimeZoneRules()[Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/SimpleTimeZone;->idEquals(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/icu/util/SimpleTimeZone;->initialRule:Landroid/icu/util/InitialTimeZoneRule;
-Landroid/icu/util/SimpleTimeZone;->initTransitionRules()V
-Landroid/icu/util/SimpleTimeZone;->isFrozen:Z
-Landroid/icu/util/SimpleTimeZone;->raw:I
-Landroid/icu/util/SimpleTimeZone;->setDSTSavings(I)V
-Landroid/icu/util/SimpleTimeZone;->setEndRule(III)V
-Landroid/icu/util/SimpleTimeZone;->setEndRule(IIII)V
-Landroid/icu/util/SimpleTimeZone;->setEndRule(IIIII)V
-Landroid/icu/util/SimpleTimeZone;->setEndRule(IIIIIZ)V
-Landroid/icu/util/SimpleTimeZone;->setEndRule(IIIIZ)V
-Landroid/icu/util/SimpleTimeZone;->setStartRule(III)V
-Landroid/icu/util/SimpleTimeZone;->setStartRule(IIII)V
-Landroid/icu/util/SimpleTimeZone;->setStartRule(IIIII)V
-Landroid/icu/util/SimpleTimeZone;->setStartRule(IIIIZ)V
-Landroid/icu/util/SimpleTimeZone;->setStartYear(I)V
-Landroid/icu/util/SimpleTimeZone;->STANDARD_TIME:I
-Landroid/icu/util/SimpleTimeZone;->startDay:I
-Landroid/icu/util/SimpleTimeZone;->startDayOfWeek:I
-Landroid/icu/util/SimpleTimeZone;->startMode:I
-Landroid/icu/util/SimpleTimeZone;->startMonth:I
-Landroid/icu/util/SimpleTimeZone;->startTime:I
-Landroid/icu/util/SimpleTimeZone;->startTimeMode:I
-Landroid/icu/util/SimpleTimeZone;->startYear:I
-Landroid/icu/util/SimpleTimeZone;->staticMonthLength:[B
-Landroid/icu/util/SimpleTimeZone;->stdRule:Landroid/icu/util/AnnualTimeZoneRule;
-Landroid/icu/util/SimpleTimeZone;->transitionRulesInitialized:Z
-Landroid/icu/util/SimpleTimeZone;->useDaylight:Z
-Landroid/icu/util/SimpleTimeZone;->UTC_TIME:I
-Landroid/icu/util/SimpleTimeZone;->WALL_TIME:I
-Landroid/icu/util/SimpleTimeZone;->xinfo:Landroid/icu/util/STZInfo;
-Landroid/icu/util/StringTokenizer;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/StringTokenizer;-><init>(Ljava/lang/String;Landroid/icu/text/UnicodeSet;)V
-Landroid/icu/util/StringTokenizer;-><init>(Ljava/lang/String;Landroid/icu/text/UnicodeSet;Z)V
-Landroid/icu/util/StringTokenizer;-><init>(Ljava/lang/String;Landroid/icu/text/UnicodeSet;ZZ)V
-Landroid/icu/util/StringTokenizer;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/util/StringTokenizer;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-Landroid/icu/util/StringTokenizer;-><init>(Ljava/lang/String;Ljava/lang/String;ZZ)V
-Landroid/icu/util/StringTokenizer;->checkDelimiters()V
-Landroid/icu/util/StringTokenizer;->countTokens()I
-Landroid/icu/util/StringTokenizer;->DEFAULT_DELIMITERS_:Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/StringTokenizer;->delims:[Z
-Landroid/icu/util/StringTokenizer;->EMPTY_DELIMITER_:Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/StringTokenizer;->getNextDelimiter(I)I
-Landroid/icu/util/StringTokenizer;->getNextNonDelimiter(I)I
-Landroid/icu/util/StringTokenizer;->hasMoreTokens()Z
-Landroid/icu/util/StringTokenizer;->m_coalesceDelimiters_:Z
-Landroid/icu/util/StringTokenizer;->m_delimiters_:Landroid/icu/text/UnicodeSet;
-Landroid/icu/util/StringTokenizer;->m_length_:I
-Landroid/icu/util/StringTokenizer;->m_nextOffset_:I
-Landroid/icu/util/StringTokenizer;->m_returnDelimiters_:Z
-Landroid/icu/util/StringTokenizer;->m_source_:Ljava/lang/String;
-Landroid/icu/util/StringTokenizer;->m_tokenLimit_:[I
-Landroid/icu/util/StringTokenizer;->m_tokenOffset_:I
-Landroid/icu/util/StringTokenizer;->m_tokenSize_:I
-Landroid/icu/util/StringTokenizer;->m_tokenStart_:[I
-Landroid/icu/util/StringTokenizer;->nextToken()Ljava/lang/String;
-Landroid/icu/util/StringTokenizer;->nextToken(Landroid/icu/text/UnicodeSet;)Ljava/lang/String;
-Landroid/icu/util/StringTokenizer;->nextToken(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/StringTokenizer;->TOKEN_SIZE_:I
-Landroid/icu/util/StringTrieBuilder$BranchHeadNode;-><init>(ILandroid/icu/util/StringTrieBuilder$Node;)V
-Landroid/icu/util/StringTrieBuilder$BranchHeadNode;->length:I
-Landroid/icu/util/StringTrieBuilder$BranchHeadNode;->markRightEdgesFirst(I)I
-Landroid/icu/util/StringTrieBuilder$BranchHeadNode;->next:Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$BranchHeadNode;->write(Landroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder$BranchNode;-><init>()V
-Landroid/icu/util/StringTrieBuilder$BranchNode;->firstEdgeNumber:I
-Landroid/icu/util/StringTrieBuilder$BranchNode;->hash:I
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;-><init>()V
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;->add(CLandroid/icu/util/StringTrieBuilder$Node;)V
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;->add(Landroid/icu/util/StringTrieBuilder;Ljava/lang/CharSequence;II)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;->chars:Ljava/lang/StringBuilder;
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;->equal:Ljava/util/ArrayList;
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;->find(C)I
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;->register(Landroid/icu/util/StringTrieBuilder;)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$DynamicBranchNode;->register(Landroid/icu/util/StringTrieBuilder;II)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$IntermediateValueNode;-><init>(ILandroid/icu/util/StringTrieBuilder$Node;)V
-Landroid/icu/util/StringTrieBuilder$IntermediateValueNode;->markRightEdgesFirst(I)I
-Landroid/icu/util/StringTrieBuilder$IntermediateValueNode;->next:Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$IntermediateValueNode;->write(Landroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;-><init>(Ljava/lang/CharSequence;IILandroid/icu/util/StringTrieBuilder$Node;)V
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->add(Landroid/icu/util/StringTrieBuilder;Ljava/lang/CharSequence;II)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->hash:I
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->length:I
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->markRightEdgesFirst(I)I
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->next:Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->register(Landroid/icu/util/StringTrieBuilder;)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->setHashCode()V
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->stringOffset:I
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->strings:Ljava/lang/CharSequence;
-Landroid/icu/util/StringTrieBuilder$LinearMatchNode;->write(Landroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;-><init>(I)V
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->add(II)V
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->add(ILandroid/icu/util/StringTrieBuilder$Node;)V
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->equal:[Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->length:I
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->markRightEdgesFirst(I)I
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->units:[C
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->values:[I
-Landroid/icu/util/StringTrieBuilder$ListBranchNode;->write(Landroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder$Node;-><init>()V
-Landroid/icu/util/StringTrieBuilder$Node;->add(Landroid/icu/util/StringTrieBuilder;Ljava/lang/CharSequence;II)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$Node;->getOffset()I
-Landroid/icu/util/StringTrieBuilder$Node;->markRightEdgesFirst(I)I
-Landroid/icu/util/StringTrieBuilder$Node;->offset:I
-Landroid/icu/util/StringTrieBuilder$Node;->register(Landroid/icu/util/StringTrieBuilder;)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$Node;->write(Landroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder$Node;->writeUnlessInsideRightEdge(IILandroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder$Option;->FAST:Landroid/icu/util/StringTrieBuilder$Option;
-Landroid/icu/util/StringTrieBuilder$Option;->SMALL:Landroid/icu/util/StringTrieBuilder$Option;
-Landroid/icu/util/StringTrieBuilder$Option;->valueOf(Ljava/lang/String;)Landroid/icu/util/StringTrieBuilder$Option;
-Landroid/icu/util/StringTrieBuilder$Option;->values()[Landroid/icu/util/StringTrieBuilder$Option;
-Landroid/icu/util/StringTrieBuilder$SplitBranchNode;-><init>(CLandroid/icu/util/StringTrieBuilder$Node;Landroid/icu/util/StringTrieBuilder$Node;)V
-Landroid/icu/util/StringTrieBuilder$SplitBranchNode;->greaterOrEqual:Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$SplitBranchNode;->lessThan:Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$SplitBranchNode;->markRightEdgesFirst(I)I
-Landroid/icu/util/StringTrieBuilder$SplitBranchNode;->unit:C
-Landroid/icu/util/StringTrieBuilder$SplitBranchNode;->write(Landroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder$State;->ADDING:Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder$State;->BUILDING_FAST:Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder$State;->BUILDING_SMALL:Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder$State;->BUILT:Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder$State;->valueOf(Ljava/lang/String;)Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder$State;->values()[Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder$ValueNode;-><init>()V
-Landroid/icu/util/StringTrieBuilder$ValueNode;-><init>(I)V
-Landroid/icu/util/StringTrieBuilder$ValueNode;->add(Landroid/icu/util/StringTrieBuilder;Ljava/lang/CharSequence;II)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder$ValueNode;->hasValue:Z
-Landroid/icu/util/StringTrieBuilder$ValueNode;->setFinalValue(I)V
-Landroid/icu/util/StringTrieBuilder$ValueNode;->setValue(I)V
-Landroid/icu/util/StringTrieBuilder$ValueNode;->value:I
-Landroid/icu/util/StringTrieBuilder$ValueNode;->write(Landroid/icu/util/StringTrieBuilder;)V
-Landroid/icu/util/StringTrieBuilder;-><init>()V
-Landroid/icu/util/StringTrieBuilder;->addImpl(Ljava/lang/CharSequence;I)V
-Landroid/icu/util/StringTrieBuilder;->buildImpl(Landroid/icu/util/StringTrieBuilder$Option;)V
-Landroid/icu/util/StringTrieBuilder;->clearImpl()V
-Landroid/icu/util/StringTrieBuilder;->createSuffixNode(Ljava/lang/CharSequence;II)Landroid/icu/util/StringTrieBuilder$ValueNode;
-Landroid/icu/util/StringTrieBuilder;->getMaxBranchLinearSubNodeLength()I
-Landroid/icu/util/StringTrieBuilder;->getMaxLinearMatchLength()I
-Landroid/icu/util/StringTrieBuilder;->getMinLinearMatch()I
-Landroid/icu/util/StringTrieBuilder;->lookupFinalValueNode:Landroid/icu/util/StringTrieBuilder$ValueNode;
-Landroid/icu/util/StringTrieBuilder;->matchNodesCanHaveValues()Z
-Landroid/icu/util/StringTrieBuilder;->nodes:Ljava/util/HashMap;
-Landroid/icu/util/StringTrieBuilder;->registerFinalValue(I)Landroid/icu/util/StringTrieBuilder$ValueNode;
-Landroid/icu/util/StringTrieBuilder;->registerNode(Landroid/icu/util/StringTrieBuilder$Node;)Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder;->root:Landroid/icu/util/StringTrieBuilder$Node;
-Landroid/icu/util/StringTrieBuilder;->state:Landroid/icu/util/StringTrieBuilder$State;
-Landroid/icu/util/StringTrieBuilder;->strings:Ljava/lang/StringBuilder;
-Landroid/icu/util/StringTrieBuilder;->write(I)I
-Landroid/icu/util/StringTrieBuilder;->write(II)I
-Landroid/icu/util/StringTrieBuilder;->writeDeltaTo(I)I
-Landroid/icu/util/StringTrieBuilder;->writeValueAndFinal(IZ)I
-Landroid/icu/util/StringTrieBuilder;->writeValueAndType(ZII)I
-Landroid/icu/util/STZInfo;-><init>()V
-Landroid/icu/util/STZInfo;->applyTo(Landroid/icu/util/SimpleTimeZone;)V
-Landroid/icu/util/STZInfo;->ea:Z
-Landroid/icu/util/STZInfo;->edm:I
-Landroid/icu/util/STZInfo;->edw:I
-Landroid/icu/util/STZInfo;->edwm:I
-Landroid/icu/util/STZInfo;->em:I
-Landroid/icu/util/STZInfo;->et:I
-Landroid/icu/util/STZInfo;->sa:Z
-Landroid/icu/util/STZInfo;->sdm:I
-Landroid/icu/util/STZInfo;->sdw:I
-Landroid/icu/util/STZInfo;->sdwm:I
-Landroid/icu/util/STZInfo;->setEnd(IIIIIZ)V
-Landroid/icu/util/STZInfo;->setStart(IIIIIZ)V
-Landroid/icu/util/STZInfo;->sm:I
-Landroid/icu/util/STZInfo;->st:I
-Landroid/icu/util/STZInfo;->sy:I
-Landroid/icu/util/TaiwanCalendar;->GREGORIAN_EPOCH:I
-Landroid/icu/util/TaiwanCalendar;->Taiwan_ERA_START:I
-Landroid/icu/util/TimeArrayTimeZoneRule;-><init>(Ljava/lang/String;II[JI)V
-Landroid/icu/util/TimeArrayTimeZoneRule;->getFinalStart(II)Ljava/util/Date;
-Landroid/icu/util/TimeArrayTimeZoneRule;->getFirstStart(II)Ljava/util/Date;
-Landroid/icu/util/TimeArrayTimeZoneRule;->getNextStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/TimeArrayTimeZoneRule;->getPreviousStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/TimeArrayTimeZoneRule;->getStartTimes()[J
-Landroid/icu/util/TimeArrayTimeZoneRule;->getTimeType()I
-Landroid/icu/util/TimeArrayTimeZoneRule;->getUTC(JII)J
-Landroid/icu/util/TimeArrayTimeZoneRule;->isEquivalentTo(Landroid/icu/util/TimeZoneRule;)Z
-Landroid/icu/util/TimeArrayTimeZoneRule;->isTransitionRule()Z
-Landroid/icu/util/TimeArrayTimeZoneRule;->startTimes:[J
-Landroid/icu/util/TimeArrayTimeZoneRule;->timeType:I
-Landroid/icu/util/TimeUnit;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/icu/util/TimeUnit;->index:I
-Landroid/icu/util/TimeUnitAmount;-><init>(DLandroid/icu/util/TimeUnit;)V
-Landroid/icu/util/TimeUnitAmount;-><init>(Ljava/lang/Number;Landroid/icu/util/TimeUnit;)V
-Landroid/icu/util/TimeUnitAmount;->getTimeUnit()Landroid/icu/util/TimeUnit;
-Landroid/icu/util/TimeZone$ConstantZone;-><init>(ILjava/lang/String;)V
-Landroid/icu/util/TimeZone$ConstantZone;->isFrozen:Z
-Landroid/icu/util/TimeZone$ConstantZone;->rawOffset:I
-Landroid/icu/util/TimeZone;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/TimeZone;->defaultZone:Landroid/icu/util/TimeZone;
-Landroid/icu/util/TimeZone;->getDefaultTimeZoneType()I
-Landroid/icu/util/TimeZone;->getFrozenICUTimeZone(Ljava/lang/String;Z)Landroid/icu/util/BasicTimeZone;
-Landroid/icu/util/TimeZone;->getTimeZone(Ljava/lang/String;IZ)Landroid/icu/util/TimeZone;
-Landroid/icu/util/TimeZone;->GMT_ZONE_ID:Ljava/lang/String;
-Landroid/icu/util/TimeZone;->ID:Ljava/lang/String;
-Landroid/icu/util/TimeZone;->LOGGER:Ljava/util/logging/Logger;
-Landroid/icu/util/TimeZone;->setDefault(Landroid/icu/util/TimeZone;)V
-Landroid/icu/util/TimeZone;->setDefaultTimeZoneType(I)V
-Landroid/icu/util/TimeZone;->setICUDefault(Landroid/icu/util/TimeZone;)V
-Landroid/icu/util/TimeZone;->TZIMPL_CONFIG_ICU:Ljava/lang/String;
-Landroid/icu/util/TimeZone;->TZIMPL_CONFIG_JDK:Ljava/lang/String;
-Landroid/icu/util/TimeZone;->TZIMPL_CONFIG_KEY:Ljava/lang/String;
-Landroid/icu/util/TimeZone;->TZ_IMPL:I
-Landroid/icu/util/TimeZone;->_getDisplayName(IZLandroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/TimeZoneRule;-><init>(Ljava/lang/String;II)V
-Landroid/icu/util/TimeZoneRule;->dstSavings:I
-Landroid/icu/util/TimeZoneRule;->getDSTSavings()I
-Landroid/icu/util/TimeZoneRule;->getFinalStart(II)Ljava/util/Date;
-Landroid/icu/util/TimeZoneRule;->getFirstStart(II)Ljava/util/Date;
-Landroid/icu/util/TimeZoneRule;->getName()Ljava/lang/String;
-Landroid/icu/util/TimeZoneRule;->getNextStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/TimeZoneRule;->getPreviousStart(JIIZ)Ljava/util/Date;
-Landroid/icu/util/TimeZoneRule;->getRawOffset()I
-Landroid/icu/util/TimeZoneRule;->isEquivalentTo(Landroid/icu/util/TimeZoneRule;)Z
-Landroid/icu/util/TimeZoneRule;->isTransitionRule()Z
-Landroid/icu/util/TimeZoneRule;->name:Ljava/lang/String;
-Landroid/icu/util/TimeZoneRule;->rawOffset:I
-Landroid/icu/util/TimeZoneTransition;-><init>(JLandroid/icu/util/TimeZoneRule;Landroid/icu/util/TimeZoneRule;)V
-Landroid/icu/util/TimeZoneTransition;->from:Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/TimeZoneTransition;->getFrom()Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/TimeZoneTransition;->getTime()J
-Landroid/icu/util/TimeZoneTransition;->getTo()Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/TimeZoneTransition;->time:J
-Landroid/icu/util/TimeZoneTransition;->to:Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/ULocale$Builder;->_locbld:Landroid/icu/impl/locale/InternalLocaleBuilder;
-Landroid/icu/util/ULocale$JDKLocaleHelper;-><init>()V
-Landroid/icu/util/ULocale$JDKLocaleHelper;->eDISPLAY:Ljava/lang/Object;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->eFORMAT:Ljava/lang/Object;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->getDefault(Landroid/icu/util/ULocale$Category;)Ljava/util/Locale;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->getSystemProperty(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->hasLocaleCategories()Z
-Landroid/icu/util/ULocale$JDKLocaleHelper;->hasLocaleCategories:Z
-Landroid/icu/util/ULocale$JDKLocaleHelper;->hasScriptsAndUnicodeExtensions:Z
-Landroid/icu/util/ULocale$JDKLocaleHelper;->isOriginalDefaultLocale(Ljava/util/Locale;)Z
-Landroid/icu/util/ULocale$JDKLocaleHelper;->JAVA6_MAPDATA:[[Ljava/lang/String;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mForLanguageTag:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mGetDefault:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mGetExtension:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mGetExtensionKeys:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mGetScript:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mGetUnicodeLocaleAttributes:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mGetUnicodeLocaleKeys:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mGetUnicodeLocaleType:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->mSetDefault:Ljava/lang/reflect/Method;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->setDefault(Landroid/icu/util/ULocale$Category;Ljava/util/Locale;)V
-Landroid/icu/util/ULocale$JDKLocaleHelper;->toLocale(Landroid/icu/util/ULocale;)Ljava/util/Locale;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->toLocale6(Landroid/icu/util/ULocale;)Ljava/util/Locale;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->toLocale7(Landroid/icu/util/ULocale;)Ljava/util/Locale;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->toULocale(Ljava/util/Locale;)Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->toULocale6(Ljava/util/Locale;)Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale$JDKLocaleHelper;->toULocale7(Ljava/util/Locale;)Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale$Minimize;->FAVOR_REGION:Landroid/icu/util/ULocale$Minimize;
-Landroid/icu/util/ULocale$Minimize;->FAVOR_SCRIPT:Landroid/icu/util/ULocale$Minimize;
-Landroid/icu/util/ULocale$Minimize;->valueOf(Ljava/lang/String;)Landroid/icu/util/ULocale$Minimize;
-Landroid/icu/util/ULocale$Minimize;->values()[Landroid/icu/util/ULocale$Minimize;
-Landroid/icu/util/ULocale$Type;-><init>()V
-Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;Ljava/util/Locale;)V
-Landroid/icu/util/ULocale;-><init>(Ljava/util/Locale;)V
-Landroid/icu/util/ULocale;->ACTUAL_LOCALE:Landroid/icu/util/ULocale$Type;
-Landroid/icu/util/ULocale;->appendTag(Ljava/lang/String;Ljava/lang/StringBuilder;)V
-Landroid/icu/util/ULocale;->base()Landroid/icu/impl/locale/BaseLocale;
-Landroid/icu/util/ULocale;->baseLocale:Landroid/icu/impl/locale/BaseLocale;
-Landroid/icu/util/ULocale;->CACHE:Landroid/icu/impl/SoftCache;
-Landroid/icu/util/ULocale;->CANONICALIZE_MAP:[[Ljava/lang/String;
-Landroid/icu/util/ULocale;->createLikelySubtagsString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->createTagString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->createTagString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->defaultCategoryLocales:[Ljava/util/Locale;
-Landroid/icu/util/ULocale;->defaultCategoryULocales:[Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale;->defaultLocale:Ljava/util/Locale;
-Landroid/icu/util/ULocale;->defaultULocale:Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale;->EMPTY_LOCALE:Ljava/util/Locale;
-Landroid/icu/util/ULocale;->EMPTY_STRING:Ljava/lang/String;
-Landroid/icu/util/ULocale;->extensions()Landroid/icu/impl/locale/LocaleExtensions;
-Landroid/icu/util/ULocale;->extensions:Landroid/icu/impl/locale/LocaleExtensions;
-Landroid/icu/util/ULocale;->getDisplayCountryInternal(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayKeywordInternal(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayKeywordValueInternal(Landroid/icu/util/ULocale;Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayLanguageInternal(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;Z)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayNameInternal(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayNameWithDialectInternal(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayScriptInContext()Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayScriptInContext(Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayScriptInContext(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayScriptInContext(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayScriptInContextInternal(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayScriptInternal(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getDisplayVariantInternal(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getFallbackString(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getInstance(Landroid/icu/impl/locale/BaseLocale;Landroid/icu/impl/locale/LocaleExtensions;)Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale;->getRegionForSupplementalData(Landroid/icu/util/ULocale;Z)Ljava/lang/String;
-Landroid/icu/util/ULocale;->getShortestSubtagLength(Ljava/lang/String;)I
-Landroid/icu/util/ULocale;->isEmptyString(Ljava/lang/String;)Z
-Landroid/icu/util/ULocale;->LANG_DIR_STRING:Ljava/lang/String;
-Landroid/icu/util/ULocale;->locale:Ljava/util/Locale;
-Landroid/icu/util/ULocale;->localeID:Ljava/lang/String;
-Landroid/icu/util/ULocale;->LOCALE_ATTRIBUTE_KEY:Ljava/lang/String;
-Landroid/icu/util/ULocale;->lookupLikelySubtags(Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->lscvToID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/icu/util/ULocale;->minimizeSubtags(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale$Minimize;)Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale;->nameCache:Landroid/icu/impl/CacheBase;
-Landroid/icu/util/ULocale;->parseAcceptLanguage(Ljava/lang/String;Z)[Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale;->parseTagString(Ljava/lang/String;[Ljava/lang/String;)I
-Landroid/icu/util/ULocale;->setDefault(Landroid/icu/util/ULocale$Category;Landroid/icu/util/ULocale;)V
-Landroid/icu/util/ULocale;->setDefault(Landroid/icu/util/ULocale;)V
-Landroid/icu/util/ULocale;->UNDEFINED_LANGUAGE:Ljava/lang/String;
-Landroid/icu/util/ULocale;->UNDEFINED_REGION:Ljava/lang/String;
-Landroid/icu/util/ULocale;->UNDEFINED_SCRIPT:Ljava/lang/String;
-Landroid/icu/util/ULocale;->UNDERSCORE:C
-Landroid/icu/util/ULocale;->VALID_LOCALE:Landroid/icu/util/ULocale$Type;
-Landroid/icu/util/ULocale;->variantsToKeywords:[[Ljava/lang/String;
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;-><init>(JJJJJJ)V
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->epochOffset:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->epochOffsetM1:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->epochOffsetP1:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->fromMax:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->fromMin:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->maxRound:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->minRound:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->toMax:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->toMin:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->units:J
-Landroid/icu/util/UniversalTimeScale$TimeScaleData;->unitsRound:J
-Landroid/icu/util/UniversalTimeScale;-><init>()V
-Landroid/icu/util/UniversalTimeScale;->days:J
-Landroid/icu/util/UniversalTimeScale;->EPOCH_OFFSET_MINUS_1_VALUE:I
-Landroid/icu/util/UniversalTimeScale;->fromRangeCheck(JI)Landroid/icu/util/UniversalTimeScale$TimeScaleData;
-Landroid/icu/util/UniversalTimeScale;->getTimeScaleData(I)Landroid/icu/util/UniversalTimeScale$TimeScaleData;
-Landroid/icu/util/UniversalTimeScale;->hours:J
-Landroid/icu/util/UniversalTimeScale;->MAX_ROUND_VALUE:I
-Landroid/icu/util/UniversalTimeScale;->MAX_SCALE_VALUE:I
-Landroid/icu/util/UniversalTimeScale;->microseconds:J
-Landroid/icu/util/UniversalTimeScale;->milliseconds:J
-Landroid/icu/util/UniversalTimeScale;->minutes:J
-Landroid/icu/util/UniversalTimeScale;->MIN_ROUND_VALUE:I
-Landroid/icu/util/UniversalTimeScale;->seconds:J
-Landroid/icu/util/UniversalTimeScale;->ticks:J
-Landroid/icu/util/UniversalTimeScale;->timeScaleTable:[Landroid/icu/util/UniversalTimeScale$TimeScaleData;
-Landroid/icu/util/UniversalTimeScale;->toBigDecimalTrunc(Landroid/icu/math/BigDecimal;I)Landroid/icu/math/BigDecimal;
-Landroid/icu/util/UniversalTimeScale;->toRangeCheck(JI)Landroid/icu/util/UniversalTimeScale$TimeScaleData;
-Landroid/icu/util/UniversalTimeScale;->UNITS_ROUND_VALUE:I
-Landroid/icu/util/UResourceBundle$RootType;->ICU:Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceBundle$RootType;->JAVA:Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceBundle$RootType;->MISSING:Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceBundle$RootType;->valueOf(Ljava/lang/String;)Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceBundle$RootType;->values()[Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceBundle;-><init>()V
-Landroid/icu/util/UResourceBundle;->ARRAY:I
-Landroid/icu/util/UResourceBundle;->BINARY:I
-Landroid/icu/util/UResourceBundle;->findTopLevel(I)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->findTopLevel(Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->get(I)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->get(Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBaseName()Ljava/lang/String;
-Landroid/icu/util/UResourceBundle;->getBinary()Ljava/nio/ByteBuffer;
-Landroid/icu/util/UResourceBundle;->getBinary([B)[B
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Landroid/icu/util/ULocale;Ljava/lang/ClassLoader;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getBundleInstance(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getInt()I
-Landroid/icu/util/UResourceBundle;->getIntVector()[I
-Landroid/icu/util/UResourceBundle;->getIterator()Landroid/icu/util/UResourceBundleIterator;
-Landroid/icu/util/UResourceBundle;->getLocaleID()Ljava/lang/String;
-Landroid/icu/util/UResourceBundle;->getParent()Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->getRootType(Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceBundle;->getSize()I
-Landroid/icu/util/UResourceBundle;->getString(I)Ljava/lang/String;
-Landroid/icu/util/UResourceBundle;->getStringArray()[Ljava/lang/String;
-Landroid/icu/util/UResourceBundle;->getUInt()I
-Landroid/icu/util/UResourceBundle;->getULocale()Landroid/icu/util/ULocale;
-Landroid/icu/util/UResourceBundle;->getVersion()Landroid/icu/util/VersionInfo;
-Landroid/icu/util/UResourceBundle;->handleGet(ILjava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->handleGet(Ljava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->handleGetKeys()Ljava/util/Enumeration;
-Landroid/icu/util/UResourceBundle;->handleGetObjectImpl(Ljava/lang/String;Landroid/icu/util/UResourceBundle;)Ljava/lang/Object;
-Landroid/icu/util/UResourceBundle;->handleGetStringArray()[Ljava/lang/String;
-Landroid/icu/util/UResourceBundle;->instantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle;->INT:I
-Landroid/icu/util/UResourceBundle;->INT_VECTOR:I
-Landroid/icu/util/UResourceBundle;->isTopLevelResource()Z
-Landroid/icu/util/UResourceBundle;->NONE:I
-Landroid/icu/util/UResourceBundle;->resolveObject(Ljava/lang/String;Landroid/icu/util/UResourceBundle;)Ljava/lang/Object;
-Landroid/icu/util/UResourceBundle;->ROOT_CACHE:Ljava/util/Map;
-Landroid/icu/util/UResourceBundle;->setRootType(Ljava/lang/String;Landroid/icu/util/UResourceBundle$RootType;)V
-Landroid/icu/util/UResourceBundle;->STRING:I
-Landroid/icu/util/UResourceBundle;->TABLE:I
-Landroid/icu/util/UResourceBundleIterator;-><init>(Landroid/icu/util/UResourceBundle;)V
-Landroid/icu/util/UResourceBundleIterator;->bundle:Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundleIterator;->index:I
-Landroid/icu/util/UResourceBundleIterator;->nextString()Ljava/lang/String;
-Landroid/icu/util/UResourceBundleIterator;->reset()V
-Landroid/icu/util/UResourceBundleIterator;->size:I
-Landroid/icu/util/UResourceTypeMismatchException;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/VersionInfo;-><init>(I)V
-Landroid/icu/util/VersionInfo;->getInt(IIII)I
-Landroid/icu/util/VersionInfo;->getTZDataVersion()Ljava/lang/String;
-Landroid/icu/util/VersionInfo;->getVersionString(II)Ljava/lang/String;
-Landroid/icu/util/VersionInfo;->ICU_DATA_VERSION:Landroid/icu/util/VersionInfo;
-Landroid/icu/util/VersionInfo;->ICU_DATA_VERSION_PATH:Ljava/lang/String;
-Landroid/icu/util/VersionInfo;->INVALID_VERSION_NUMBER_:Ljava/lang/String;
-Landroid/icu/util/VersionInfo;->javaVersion()Landroid/icu/util/VersionInfo;
-Landroid/icu/util/VersionInfo;->javaVersion:Landroid/icu/util/VersionInfo;
-Landroid/icu/util/VersionInfo;->LAST_BYTE_MASK_:I
-Landroid/icu/util/VersionInfo;->main([Ljava/lang/String;)V
-Landroid/icu/util/VersionInfo;->MAP_:Ljava/util/concurrent/ConcurrentHashMap;
-Landroid/icu/util/VersionInfo;->m_version_:I
-Landroid/icu/util/VersionInfo;->TZDATA_VERSION:Ljava/lang/String;
-Landroid/icu/util/VersionInfo;->UCOL_TAILORINGS_VERSION:Landroid/icu/util/VersionInfo;
-Landroid/icu/util/VersionInfo;->UNICODE_VERSION:Landroid/icu/util/VersionInfo;
-Landroid/icu/util/VTimeZone;-><init>()V
-Landroid/icu/util/VTimeZone;-><init>(Ljava/lang/String;)V
-Landroid/icu/util/VTimeZone;->appendUNTIL(Ljava/io/Writer;Ljava/lang/String;)V
-Landroid/icu/util/VTimeZone;->beginRRULE(Ljava/io/Writer;I)V
-Landroid/icu/util/VTimeZone;->beginZoneProps(Ljava/io/Writer;ZLjava/lang/String;IIJ)V
-Landroid/icu/util/VTimeZone;->COLON:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->COMMA:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->create(Ljava/io/Reader;)Landroid/icu/util/VTimeZone;
-Landroid/icu/util/VTimeZone;->create(Ljava/lang/String;)Landroid/icu/util/VTimeZone;
-Landroid/icu/util/VTimeZone;->createRuleByRDATE(Ljava/lang/String;IIJLjava/util/List;I)Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/VTimeZone;->createRuleByRRULE(Ljava/lang/String;IIJLjava/util/List;I)Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/VTimeZone;->DEF_DSTSAVINGS:I
-Landroid/icu/util/VTimeZone;->DEF_TZSTARTTIME:J
-Landroid/icu/util/VTimeZone;->endZoneProps(Ljava/io/Writer;Z)V
-Landroid/icu/util/VTimeZone;->EQUALS_SIGN:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ERR:I
-Landroid/icu/util/VTimeZone;->getDateTimeString(J)Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->getDefaultTZName(Ljava/lang/String;Z)Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->getLastModified()Ljava/util/Date;
-Landroid/icu/util/VTimeZone;->getNextTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/VTimeZone;->getOffsetFromLocal(JII[I)V
-Landroid/icu/util/VTimeZone;->getPreviousTransition(JZ)Landroid/icu/util/TimeZoneTransition;
-Landroid/icu/util/VTimeZone;->getTimeZoneRules()[Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/VTimeZone;->getTimeZoneRules(J)[Landroid/icu/util/TimeZoneRule;
-Landroid/icu/util/VTimeZone;->getTZURL()Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->getUTCDateTimeString(J)Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->hasEquivalentTransitions(Landroid/icu/util/TimeZone;JJ)Z
-Landroid/icu/util/VTimeZone;->ICAL_BEGIN:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_BEGIN_VTIMEZONE:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_BYDAY:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_BYMONTH:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_BYMONTHDAY:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_DAYLIGHT:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_DOW_NAMES:[Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_DTSTART:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_END:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_END_VTIMEZONE:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_FREQ:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_LASTMOD:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_RDATE:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_RRULE:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_STANDARD:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_TZID:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_TZNAME:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_TZOFFSETFROM:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_TZOFFSETTO:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_TZURL:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_UNTIL:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_VTIMEZONE:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICAL_YEARLY:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICU_TZINFO_PROP:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->ICU_TZVERSION:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->INI:I
-Landroid/icu/util/VTimeZone;->isEquivalentDateRule(IIILandroid/icu/util/DateTimeRule;)Z
-Landroid/icu/util/VTimeZone;->isFrozen:Z
-Landroid/icu/util/VTimeZone;->lastmod:Ljava/util/Date;
-Landroid/icu/util/VTimeZone;->load(Ljava/io/Reader;)Z
-Landroid/icu/util/VTimeZone;->MAX_TIME:J
-Landroid/icu/util/VTimeZone;->millisToOffset(I)Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->MIN_TIME:J
-Landroid/icu/util/VTimeZone;->MONTHLENGTH:[I
-Landroid/icu/util/VTimeZone;->NEWLINE:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->numToString(II)Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->offsetStrToMillis(Ljava/lang/String;)I
-Landroid/icu/util/VTimeZone;->olsonzid:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->parse()Z
-Landroid/icu/util/VTimeZone;->parseDateTimeString(Ljava/lang/String;I)J
-Landroid/icu/util/VTimeZone;->parseRRULE(Ljava/lang/String;[J)[I
-Landroid/icu/util/VTimeZone;->SEMICOLON:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->setLastModified(Ljava/util/Date;)V
-Landroid/icu/util/VTimeZone;->setTZURL(Ljava/lang/String;)V
-Landroid/icu/util/VTimeZone;->toWallTimeRule(Landroid/icu/util/DateTimeRule;II)Landroid/icu/util/DateTimeRule;
-Landroid/icu/util/VTimeZone;->tz:Landroid/icu/util/BasicTimeZone;
-Landroid/icu/util/VTimeZone;->TZI:I
-Landroid/icu/util/VTimeZone;->tzurl:Ljava/lang/String;
-Landroid/icu/util/VTimeZone;->VTZ:I
-Landroid/icu/util/VTimeZone;->vtzlines:Ljava/util/List;
-Landroid/icu/util/VTimeZone;->write(Ljava/io/Writer;)V
-Landroid/icu/util/VTimeZone;->write(Ljava/io/Writer;J)V
-Landroid/icu/util/VTimeZone;->writeFinalRule(Ljava/io/Writer;ZLandroid/icu/util/AnnualTimeZoneRule;IIJ)V
-Landroid/icu/util/VTimeZone;->writeFooter(Ljava/io/Writer;)V
-Landroid/icu/util/VTimeZone;->writeHeader(Ljava/io/Writer;)V
-Landroid/icu/util/VTimeZone;->writeSimple(Ljava/io/Writer;J)V
-Landroid/icu/util/VTimeZone;->writeZone(Ljava/io/Writer;Landroid/icu/util/BasicTimeZone;[Ljava/lang/String;)V
-Landroid/icu/util/VTimeZone;->writeZonePropsByDOM(Ljava/io/Writer;ZLjava/lang/String;IIIIJJ)V
-Landroid/icu/util/VTimeZone;->writeZonePropsByDOW(Ljava/io/Writer;ZLjava/lang/String;IIIIIJJ)V
-Landroid/icu/util/VTimeZone;->writeZonePropsByDOW_GEQ_DOM(Ljava/io/Writer;ZLjava/lang/String;IIIIIJJ)V
-Landroid/icu/util/VTimeZone;->writeZonePropsByDOW_GEQ_DOM_sub(Ljava/io/Writer;IIIIJI)V
-Landroid/icu/util/VTimeZone;->writeZonePropsByDOW_LEQ_DOM(Ljava/io/Writer;ZLjava/lang/String;IIIIIJJ)V
-Landroid/icu/util/VTimeZone;->writeZonePropsByTime(Ljava/io/Writer;ZLjava/lang/String;IIJZ)V
 Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl;->mEnabled:Z
 Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl;->mRevoked:Z
 Landroid/inputmethodservice/AbstractInputMethodService;->exposeContent(Landroid/view/inputmethod/InputContentInfo;Landroid/view/inputmethod/InputConnection;)V
@@ -65381,117 +58139,6 @@
 Landroid/speech/tts/Voice;->mName:Ljava/lang/String;
 Landroid/speech/tts/Voice;->mQuality:I
 Landroid/speech/tts/Voice;->mRequiresNetworkConnection:Z
-Landroid/system/ErrnoException;->functionName:Ljava/lang/String;
-Landroid/system/ErrnoException;->rethrowAsIOException()Ljava/io/IOException;
-Landroid/system/ErrnoException;->rethrowAsSocketException()Ljava/net/SocketException;
-Landroid/system/GaiException;-><init>(Ljava/lang/String;I)V
-Landroid/system/GaiException;-><init>(Ljava/lang/String;ILjava/lang/Throwable;)V
-Landroid/system/GaiException;->error:I
-Landroid/system/GaiException;->functionName:Ljava/lang/String;
-Landroid/system/GaiException;->rethrowAsUnknownHostException()Ljava/net/UnknownHostException;
-Landroid/system/GaiException;->rethrowAsUnknownHostException(Ljava/lang/String;)Ljava/net/UnknownHostException;
-Landroid/system/Int32Ref;-><init>(I)V
-Landroid/system/NetlinkSocketAddress;-><init>()V
-Landroid/system/NetlinkSocketAddress;-><init>(I)V
-Landroid/system/NetlinkSocketAddress;->getGroupsMask()I
-Landroid/system/NetlinkSocketAddress;->getPortId()I
-Landroid/system/NetlinkSocketAddress;->nlGroupsMask:I
-Landroid/system/NetlinkSocketAddress;->nlPortId:I
-Landroid/system/Os;-><init>()V
-Landroid/system/Os;->accept(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)Ljava/io/FileDescriptor;
-Landroid/system/Os;->android_getaddrinfo(Ljava/lang/String;Landroid/system/StructAddrinfo;I)[Ljava/net/InetAddress;
-Landroid/system/Os;->capget(Landroid/system/StructCapUserHeader;)[Landroid/system/StructCapUserData;
-Landroid/system/Os;->capset(Landroid/system/StructCapUserHeader;[Landroid/system/StructCapUserData;)V
-Landroid/system/Os;->fcntlFlock(Ljava/io/FileDescriptor;ILandroid/system/StructFlock;)I
-Landroid/system/Os;->fcntlInt(Ljava/io/FileDescriptor;II)I
-Landroid/system/Os;->fcntlVoid(Ljava/io/FileDescriptor;I)I
-Landroid/system/Os;->getifaddrs()[Landroid/system/StructIfaddrs;
-Landroid/system/Os;->getnameinfo(Ljava/net/InetAddress;I)Ljava/lang/String;
-Landroid/system/Os;->getpgid(I)I
-Landroid/system/Os;->getpwnam(Ljava/lang/String;)Landroid/system/StructPasswd;
-Landroid/system/Os;->getpwuid(I)Landroid/system/StructPasswd;
-Landroid/system/Os;->getrlimit(I)Landroid/system/StructRlimit;
-Landroid/system/Os;->getsockoptByte(Ljava/io/FileDescriptor;II)I
-Landroid/system/Os;->getsockoptInAddr(Ljava/io/FileDescriptor;II)Ljava/net/InetAddress;
-Landroid/system/Os;->getsockoptInt(Ljava/io/FileDescriptor;II)I
-Landroid/system/Os;->getsockoptLinger(Ljava/io/FileDescriptor;II)Landroid/system/StructLinger;
-Landroid/system/Os;->getsockoptTimeval(Ljava/io/FileDescriptor;II)Landroid/system/StructTimeval;
-Landroid/system/Os;->getsockoptUcred(Ljava/io/FileDescriptor;II)Landroid/system/StructUcred;
-Landroid/system/Os;->ioctlInetAddress(Ljava/io/FileDescriptor;ILjava/lang/String;)Ljava/net/InetAddress;
-Landroid/system/Os;->ioctlInt(Ljava/io/FileDescriptor;ILandroid/system/Int32Ref;)I
-Landroid/system/Os;->pipe2(I)[Ljava/io/FileDescriptor;
-Landroid/system/Os;->realpath(Ljava/lang/String;)Ljava/lang/String;
-Landroid/system/Os;->setpgid(II)V
-Landroid/system/Os;->setregid(II)V
-Landroid/system/Os;->setreuid(II)V
-Landroid/system/Os;->setsockoptByte(Ljava/io/FileDescriptor;III)V
-Landroid/system/Os;->setsockoptGroupReq(Ljava/io/FileDescriptor;IILandroid/system/StructGroupReq;)V
-Landroid/system/Os;->setsockoptIpMreqn(Ljava/io/FileDescriptor;III)V
-Landroid/system/Os;->setsockoptLinger(Ljava/io/FileDescriptor;IILandroid/system/StructLinger;)V
-Landroid/system/Os;->splice(Ljava/io/FileDescriptor;Landroid/system/Int64Ref;Ljava/io/FileDescriptor;Landroid/system/Int64Ref;JI)J
-Landroid/system/Os;->unlink(Ljava/lang/String;)V
-Landroid/system/Os;->waitpid(ILandroid/system/Int32Ref;I)I
-Landroid/system/PacketSocketAddress;-><init>(SISB[B)V
-Landroid/system/PacketSocketAddress;->sll_addr:[B
-Landroid/system/PacketSocketAddress;->sll_hatype:S
-Landroid/system/PacketSocketAddress;->sll_ifindex:I
-Landroid/system/PacketSocketAddress;->sll_pkttype:B
-Landroid/system/PacketSocketAddress;->sll_protocol:S
-Landroid/system/StructAddrinfo;-><init>()V
-Landroid/system/StructAddrinfo;->ai_addr:Ljava/net/InetAddress;
-Landroid/system/StructAddrinfo;->ai_family:I
-Landroid/system/StructAddrinfo;->ai_flags:I
-Landroid/system/StructAddrinfo;->ai_next:Landroid/system/StructAddrinfo;
-Landroid/system/StructAddrinfo;->ai_protocol:I
-Landroid/system/StructAddrinfo;->ai_socktype:I
-Landroid/system/StructCapUserData;-><init>(III)V
-Landroid/system/StructCapUserData;->effective:I
-Landroid/system/StructCapUserData;->inheritable:I
-Landroid/system/StructCapUserData;->permitted:I
-Landroid/system/StructCapUserHeader;-><init>(II)V
-Landroid/system/StructCapUserHeader;->pid:I
-Landroid/system/StructCapUserHeader;->version:I
-Landroid/system/StructFlock;-><init>()V
-Landroid/system/StructFlock;->l_len:J
-Landroid/system/StructFlock;->l_pid:I
-Landroid/system/StructFlock;->l_start:J
-Landroid/system/StructFlock;->l_type:S
-Landroid/system/StructFlock;->l_whence:S
-Landroid/system/StructGroupReq;-><init>(ILjava/net/InetAddress;)V
-Landroid/system/StructGroupReq;->gr_group:Ljava/net/InetAddress;
-Landroid/system/StructGroupReq;->gr_interface:I
-Landroid/system/StructIcmpHdr;-><init>()V
-Landroid/system/StructIcmpHdr;->getBytes()[B
-Landroid/system/StructIcmpHdr;->IcmpEchoHdr(ZI)Landroid/system/StructIcmpHdr;
-Landroid/system/StructIcmpHdr;->packet:[B
-Landroid/system/StructIfaddrs;-><init>(Ljava/lang/String;ILjava/net/InetAddress;Ljava/net/InetAddress;Ljava/net/InetAddress;[B)V
-Landroid/system/StructIfaddrs;->hwaddr:[B
-Landroid/system/StructIfaddrs;->ifa_addr:Ljava/net/InetAddress;
-Landroid/system/StructIfaddrs;->ifa_broadaddr:Ljava/net/InetAddress;
-Landroid/system/StructIfaddrs;->ifa_flags:I
-Landroid/system/StructIfaddrs;->ifa_name:Ljava/lang/String;
-Landroid/system/StructIfaddrs;->ifa_netmask:Ljava/net/InetAddress;
-Landroid/system/StructLinger;-><init>(II)V
-Landroid/system/StructLinger;->isOn()Z
-Landroid/system/StructLinger;->l_linger:I
-Landroid/system/StructLinger;->l_onoff:I
-Landroid/system/StructPasswd;-><init>(Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;)V
-Landroid/system/StructPasswd;->pw_dir:Ljava/lang/String;
-Landroid/system/StructPasswd;->pw_gid:I
-Landroid/system/StructPasswd;->pw_name:Ljava/lang/String;
-Landroid/system/StructPasswd;->pw_shell:Ljava/lang/String;
-Landroid/system/StructPasswd;->pw_uid:I
-Landroid/system/StructRlimit;-><init>(JJ)V
-Landroid/system/StructRlimit;->rlim_cur:J
-Landroid/system/StructRlimit;->rlim_max:J
-Landroid/system/StructTimeval;-><init>(JJ)V
-Landroid/system/StructTimeval;->toMillis()J
-Landroid/system/StructTimeval;->tv_sec:J
-Landroid/system/StructTimeval;->tv_usec:J
-Landroid/system/StructUcred;-><init>(III)V
-Landroid/system/StructUcred;->gid:I
-Landroid/system/StructUcred;->pid:I
-Landroid/system/StructUcred;->uid:I
 Landroid/telecom/AudioState;->listAppend(Ljava/lang/StringBuffer;Ljava/lang/String;)V
 Landroid/telecom/AudioState;->ROUTE_ALL:I
 Landroid/telecom/AuthenticatorService;-><init>()V
@@ -101216,1154 +93863,6 @@
 Lcom/android/internal/widget/VerifyCredentialResponse;->setTimeout(I)V
 Lcom/android/internal/widget/VerifyCredentialResponse;->stripPayload()Lcom/android/internal/widget/VerifyCredentialResponse;
 Lcom/android/internal/widget/VerifyCredentialResponse;->TAG:Ljava/lang/String;
-Lcom/android/okhttp/Address;-><init>(Ljava/lang/String;ILcom/android/okhttp/Dns;Ljavax/net/SocketFactory;Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/HostnameVerifier;Lcom/android/okhttp/CertificatePinner;Lcom/android/okhttp/Authenticator;Ljava/net/Proxy;Ljava/util/List;Ljava/util/List;Ljava/net/ProxySelector;)V
-Lcom/android/okhttp/Address;->authenticator:Lcom/android/okhttp/Authenticator;
-Lcom/android/okhttp/Address;->certificatePinner:Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/Address;->connectionSpecs:Ljava/util/List;
-Lcom/android/okhttp/Address;->dns:Lcom/android/okhttp/Dns;
-Lcom/android/okhttp/Address;->getAuthenticator()Lcom/android/okhttp/Authenticator;
-Lcom/android/okhttp/Address;->getCertificatePinner()Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/Address;->getConnectionSpecs()Ljava/util/List;
-Lcom/android/okhttp/Address;->getDns()Lcom/android/okhttp/Dns;
-Lcom/android/okhttp/Address;->getHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;
-Lcom/android/okhttp/Address;->getProtocols()Ljava/util/List;
-Lcom/android/okhttp/Address;->getProxy()Ljava/net/Proxy;
-Lcom/android/okhttp/Address;->getProxySelector()Ljava/net/ProxySelector;
-Lcom/android/okhttp/Address;->getSocketFactory()Ljavax/net/SocketFactory;
-Lcom/android/okhttp/Address;->getSslSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
-Lcom/android/okhttp/Address;->getUriHost()Ljava/lang/String;
-Lcom/android/okhttp/Address;->getUriPort()I
-Lcom/android/okhttp/Address;->hostnameVerifier:Ljavax/net/ssl/HostnameVerifier;
-Lcom/android/okhttp/Address;->protocols:Ljava/util/List;
-Lcom/android/okhttp/Address;->proxy:Ljava/net/Proxy;
-Lcom/android/okhttp/Address;->proxySelector:Ljava/net/ProxySelector;
-Lcom/android/okhttp/Address;->socketFactory:Ljavax/net/SocketFactory;
-Lcom/android/okhttp/Address;->sslSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
-Lcom/android/okhttp/Address;->url()Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/Address;->url:Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/AndroidShimResponseCache;-><init>(Lcom/android/okhttp/Cache;)V
-Lcom/android/okhttp/AndroidShimResponseCache;->close()V
-Lcom/android/okhttp/AndroidShimResponseCache;->create(Ljava/io/File;J)Lcom/android/okhttp/AndroidShimResponseCache;
-Lcom/android/okhttp/AndroidShimResponseCache;->delegate:Lcom/android/okhttp/Cache;
-Lcom/android/okhttp/AndroidShimResponseCache;->delete()V
-Lcom/android/okhttp/AndroidShimResponseCache;->flush()V
-Lcom/android/okhttp/AndroidShimResponseCache;->getCache()Lcom/android/okhttp/Cache;
-Lcom/android/okhttp/AndroidShimResponseCache;->getHitCount()I
-Lcom/android/okhttp/AndroidShimResponseCache;->getNetworkCount()I
-Lcom/android/okhttp/AndroidShimResponseCache;->getRequestCount()I
-Lcom/android/okhttp/AndroidShimResponseCache;->isEquivalent(Ljava/io/File;J)Z
-Lcom/android/okhttp/AndroidShimResponseCache;->maxSize()J
-Lcom/android/okhttp/AndroidShimResponseCache;->size()J
-Lcom/android/okhttp/Authenticator;->authenticate(Ljava/net/Proxy;Lcom/android/okhttp/Response;)Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Authenticator;->authenticateProxy(Ljava/net/Proxy;Lcom/android/okhttp/Response;)Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Cache$CacheRequestImpl;->abort()V
-Lcom/android/okhttp/Cache$CacheRequestImpl;->body()Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/Cache$CacheRequestImpl;->body:Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/Cache$CacheRequestImpl;->cacheOut:Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/Cache$CacheRequestImpl;->done:Z
-Lcom/android/okhttp/Cache$CacheRequestImpl;->editor:Lcom/android/okhttp/internal/DiskLruCache$Editor;
-Lcom/android/okhttp/Cache$CacheResponseBody;-><init>(Lcom/android/okhttp/internal/DiskLruCache$Snapshot;Ljava/lang/String;Ljava/lang/String;)V
-Lcom/android/okhttp/Cache$CacheResponseBody;->bodySource:Lcom/android/okhttp/okio/BufferedSource;
-Lcom/android/okhttp/Cache$CacheResponseBody;->contentLength()J
-Lcom/android/okhttp/Cache$CacheResponseBody;->contentLength:Ljava/lang/String;
-Lcom/android/okhttp/Cache$CacheResponseBody;->contentType()Lcom/android/okhttp/MediaType;
-Lcom/android/okhttp/Cache$CacheResponseBody;->contentType:Ljava/lang/String;
-Lcom/android/okhttp/Cache$CacheResponseBody;->snapshot:Lcom/android/okhttp/internal/DiskLruCache$Snapshot;
-Lcom/android/okhttp/Cache$CacheResponseBody;->source()Lcom/android/okhttp/okio/BufferedSource;
-Lcom/android/okhttp/Cache$Entry;-><init>(Lcom/android/okhttp/okio/Source;)V
-Lcom/android/okhttp/Cache$Entry;-><init>(Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/Cache$Entry;->code:I
-Lcom/android/okhttp/Cache$Entry;->handshake:Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Cache$Entry;->isHttps()Z
-Lcom/android/okhttp/Cache$Entry;->matches(Lcom/android/okhttp/Request;Lcom/android/okhttp/Response;)Z
-Lcom/android/okhttp/Cache$Entry;->message:Ljava/lang/String;
-Lcom/android/okhttp/Cache$Entry;->protocol:Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Cache$Entry;->readCertificateList(Lcom/android/okhttp/okio/BufferedSource;)Ljava/util/List;
-Lcom/android/okhttp/Cache$Entry;->requestMethod:Ljava/lang/String;
-Lcom/android/okhttp/Cache$Entry;->response(Lcom/android/okhttp/Request;Lcom/android/okhttp/internal/DiskLruCache$Snapshot;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Cache$Entry;->responseHeaders:Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/Cache$Entry;->url:Ljava/lang/String;
-Lcom/android/okhttp/Cache$Entry;->varyHeaders:Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/Cache$Entry;->writeCertList(Lcom/android/okhttp/okio/BufferedSink;Ljava/util/List;)V
-Lcom/android/okhttp/Cache$Entry;->writeTo(Lcom/android/okhttp/internal/DiskLruCache$Editor;)V
-Lcom/android/okhttp/Cache;-><init>(Ljava/io/File;J)V
-Lcom/android/okhttp/Cache;-><init>(Ljava/io/File;JLcom/android/okhttp/internal/io/FileSystem;)V
-Lcom/android/okhttp/Cache;->abortQuietly(Lcom/android/okhttp/internal/DiskLruCache$Editor;)V
-Lcom/android/okhttp/Cache;->cache:Lcom/android/okhttp/internal/DiskLruCache;
-Lcom/android/okhttp/Cache;->close()V
-Lcom/android/okhttp/Cache;->delete()V
-Lcom/android/okhttp/Cache;->ENTRY_BODY:I
-Lcom/android/okhttp/Cache;->ENTRY_COUNT:I
-Lcom/android/okhttp/Cache;->ENTRY_METADATA:I
-Lcom/android/okhttp/Cache;->evictAll()V
-Lcom/android/okhttp/Cache;->flush()V
-Lcom/android/okhttp/Cache;->get(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Cache;->getDirectory()Ljava/io/File;
-Lcom/android/okhttp/Cache;->getHitCount()I
-Lcom/android/okhttp/Cache;->getMaxSize()J
-Lcom/android/okhttp/Cache;->getNetworkCount()I
-Lcom/android/okhttp/Cache;->getRequestCount()I
-Lcom/android/okhttp/Cache;->getSize()J
-Lcom/android/okhttp/Cache;->getWriteAbortCount()I
-Lcom/android/okhttp/Cache;->getWriteSuccessCount()I
-Lcom/android/okhttp/Cache;->hitCount:I
-Lcom/android/okhttp/Cache;->initialize()V
-Lcom/android/okhttp/Cache;->internalCache:Lcom/android/okhttp/internal/InternalCache;
-Lcom/android/okhttp/Cache;->isClosed()Z
-Lcom/android/okhttp/Cache;->networkCount:I
-Lcom/android/okhttp/Cache;->put(Lcom/android/okhttp/Response;)Lcom/android/okhttp/internal/http/CacheRequest;
-Lcom/android/okhttp/Cache;->readInt(Lcom/android/okhttp/okio/BufferedSource;)I
-Lcom/android/okhttp/Cache;->remove(Lcom/android/okhttp/Request;)V
-Lcom/android/okhttp/Cache;->requestCount:I
-Lcom/android/okhttp/Cache;->trackConditionalCacheHit()V
-Lcom/android/okhttp/Cache;->trackResponse(Lcom/android/okhttp/internal/http/CacheStrategy;)V
-Lcom/android/okhttp/Cache;->update(Lcom/android/okhttp/Response;Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/Cache;->urls()Ljava/util/Iterator;
-Lcom/android/okhttp/Cache;->urlToKey(Lcom/android/okhttp/Request;)Ljava/lang/String;
-Lcom/android/okhttp/Cache;->VERSION:I
-Lcom/android/okhttp/Cache;->writeAbortCount:I
-Lcom/android/okhttp/Cache;->writeSuccessCount:I
-Lcom/android/okhttp/CacheControl$Builder;-><init>()V
-Lcom/android/okhttp/CacheControl$Builder;->build()Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/CacheControl$Builder;->maxAge(ILjava/util/concurrent/TimeUnit;)Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl$Builder;->maxAgeSeconds:I
-Lcom/android/okhttp/CacheControl$Builder;->maxStale(ILjava/util/concurrent/TimeUnit;)Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl$Builder;->maxStaleSeconds:I
-Lcom/android/okhttp/CacheControl$Builder;->minFresh(ILjava/util/concurrent/TimeUnit;)Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl$Builder;->minFreshSeconds:I
-Lcom/android/okhttp/CacheControl$Builder;->noCache()Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl$Builder;->noCache:Z
-Lcom/android/okhttp/CacheControl$Builder;->noStore()Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl$Builder;->noStore:Z
-Lcom/android/okhttp/CacheControl$Builder;->noTransform()Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl$Builder;->noTransform:Z
-Lcom/android/okhttp/CacheControl$Builder;->onlyIfCached()Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CacheControl$Builder;->onlyIfCached:Z
-Lcom/android/okhttp/CacheControl;-><init>(Lcom/android/okhttp/CacheControl$Builder;)V
-Lcom/android/okhttp/CacheControl;-><init>(ZZIIZZZIIZZLjava/lang/String;)V
-Lcom/android/okhttp/CacheControl;->FORCE_CACHE:Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/CacheControl;->FORCE_NETWORK:Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/CacheControl;->headerValue()Ljava/lang/String;
-Lcom/android/okhttp/CacheControl;->headerValue:Ljava/lang/String;
-Lcom/android/okhttp/CacheControl;->isPrivate()Z
-Lcom/android/okhttp/CacheControl;->isPrivate:Z
-Lcom/android/okhttp/CacheControl;->isPublic()Z
-Lcom/android/okhttp/CacheControl;->isPublic:Z
-Lcom/android/okhttp/CacheControl;->maxAgeSeconds()I
-Lcom/android/okhttp/CacheControl;->maxAgeSeconds:I
-Lcom/android/okhttp/CacheControl;->maxStaleSeconds()I
-Lcom/android/okhttp/CacheControl;->maxStaleSeconds:I
-Lcom/android/okhttp/CacheControl;->minFreshSeconds()I
-Lcom/android/okhttp/CacheControl;->minFreshSeconds:I
-Lcom/android/okhttp/CacheControl;->mustRevalidate()Z
-Lcom/android/okhttp/CacheControl;->mustRevalidate:Z
-Lcom/android/okhttp/CacheControl;->noCache()Z
-Lcom/android/okhttp/CacheControl;->noCache:Z
-Lcom/android/okhttp/CacheControl;->noStore()Z
-Lcom/android/okhttp/CacheControl;->noStore:Z
-Lcom/android/okhttp/CacheControl;->noTransform()Z
-Lcom/android/okhttp/CacheControl;->noTransform:Z
-Lcom/android/okhttp/CacheControl;->onlyIfCached()Z
-Lcom/android/okhttp/CacheControl;->onlyIfCached:Z
-Lcom/android/okhttp/CacheControl;->parse(Lcom/android/okhttp/Headers;)Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/CacheControl;->sMaxAgeSeconds()I
-Lcom/android/okhttp/CacheControl;->sMaxAgeSeconds:I
-Lcom/android/okhttp/Call$ApplicationInterceptorChain;->connection()Lcom/android/okhttp/Connection;
-Lcom/android/okhttp/Call$ApplicationInterceptorChain;->forWebSocket:Z
-Lcom/android/okhttp/Call$ApplicationInterceptorChain;->index:I
-Lcom/android/okhttp/Call$ApplicationInterceptorChain;->proceed(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Call$ApplicationInterceptorChain;->request()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Call$ApplicationInterceptorChain;->request:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Call$AsyncCall;->cancel()V
-Lcom/android/okhttp/Call$AsyncCall;->execute()V
-Lcom/android/okhttp/Call$AsyncCall;->forWebSocket:Z
-Lcom/android/okhttp/Call$AsyncCall;->get()Lcom/android/okhttp/Call;
-Lcom/android/okhttp/Call$AsyncCall;->host()Ljava/lang/String;
-Lcom/android/okhttp/Call$AsyncCall;->request()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Call$AsyncCall;->responseCallback:Lcom/android/okhttp/Callback;
-Lcom/android/okhttp/Call$AsyncCall;->tag()Ljava/lang/Object;
-Lcom/android/okhttp/Call;-><init>(Lcom/android/okhttp/OkHttpClient;Lcom/android/okhttp/Request;)V
-Lcom/android/okhttp/Call;->cancel()V
-Lcom/android/okhttp/Call;->canceled:Z
-Lcom/android/okhttp/Call;->client:Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/Call;->engine:Lcom/android/okhttp/internal/http/HttpEngine;
-Lcom/android/okhttp/Call;->enqueue(Lcom/android/okhttp/Callback;)V
-Lcom/android/okhttp/Call;->enqueue(Lcom/android/okhttp/Callback;Z)V
-Lcom/android/okhttp/Call;->execute()Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Call;->executed:Z
-Lcom/android/okhttp/Call;->getResponse(Lcom/android/okhttp/Request;Z)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Call;->getResponseWithInterceptorChain(Z)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Call;->isCanceled()Z
-Lcom/android/okhttp/Call;->isExecuted()Z
-Lcom/android/okhttp/Call;->originalRequest:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Call;->tag()Ljava/lang/Object;
-Lcom/android/okhttp/Call;->toLoggableString()Ljava/lang/String;
-Lcom/android/okhttp/Callback;->onFailure(Lcom/android/okhttp/Request;Ljava/io/IOException;)V
-Lcom/android/okhttp/Callback;->onResponse(Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/CertificatePinner$Builder;-><init>()V
-Lcom/android/okhttp/CertificatePinner$Builder;->build()Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/CertificatePinner$Builder;->hostnameToPins:Ljava/util/Map;
-Lcom/android/okhttp/CertificatePinner;-><init>(Lcom/android/okhttp/CertificatePinner$Builder;)V
-Lcom/android/okhttp/CertificatePinner;->check(Ljava/lang/String;Ljava/util/List;)V
-Lcom/android/okhttp/CertificatePinner;->DEFAULT:Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/CertificatePinner;->findMatchingPins(Ljava/lang/String;)Ljava/util/Set;
-Lcom/android/okhttp/CertificatePinner;->hostnameToPins:Ljava/util/Map;
-Lcom/android/okhttp/CertificatePinner;->pin(Ljava/security/cert/Certificate;)Ljava/lang/String;
-Lcom/android/okhttp/CertificatePinner;->sha1(Ljava/security/cert/X509Certificate;)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/Challenge;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Lcom/android/okhttp/Challenge;->getRealm()Ljava/lang/String;
-Lcom/android/okhttp/Challenge;->getScheme()Ljava/lang/String;
-Lcom/android/okhttp/Challenge;->realm:Ljava/lang/String;
-Lcom/android/okhttp/Challenge;->scheme:Ljava/lang/String;
-Lcom/android/okhttp/CipherSuite;->forJavaName(Ljava/lang/String;)Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->javaName:Ljava/lang/String;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_DSS_WITH_DES_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DHE_RSA_WITH_DES_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_EXPORT_WITH_RC4_40_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_AES_256_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_DES_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_DH_anon_WITH_RC4_128_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_NULL_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_NULL_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDHE_RSA_WITH_RC4_128_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_anon_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_anon_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_anon_WITH_NULL_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_anon_WITH_RC4_128_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_NULL_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_ECDSA_WITH_RC4_128_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_NULL_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_ECDH_RSA_WITH_RC4_128_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_EMPTY_RENEGOTIATION_INFO_SCSV:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_EXPORT_WITH_RC4_40_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_EXPORT_WITH_RC4_40_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_WITH_3DES_EDE_CBC_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_WITH_DES_CBC_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_WITH_DES_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_WITH_RC4_128_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_KRB5_WITH_RC4_128_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_EXPORT_WITH_DES40_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_EXPORT_WITH_RC4_40_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_3DES_EDE_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_AES_128_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_AES_128_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_AES_128_GCM_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_AES_256_CBC_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_AES_256_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_AES_256_GCM_SHA384:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_DES_CBC_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_NULL_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_NULL_SHA256:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_NULL_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_RC4_128_MD5:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->TLS_RSA_WITH_RC4_128_SHA:Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->valueOf(Ljava/lang/String;)Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/CipherSuite;->values()[Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/Connection;->getHandshake()Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Connection;->getProtocol()Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Connection;->getRoute()Lcom/android/okhttp/Route;
-Lcom/android/okhttp/ConnectionPool;-><init>(IJ)V
-Lcom/android/okhttp/ConnectionPool;-><init>(IJLjava/util/concurrent/TimeUnit;)V
-Lcom/android/okhttp/ConnectionPool;->cleanup(J)J
-Lcom/android/okhttp/ConnectionPool;->cleanupRunnable:Ljava/lang/Runnable;
-Lcom/android/okhttp/ConnectionPool;->connectionBecameIdle(Lcom/android/okhttp/internal/io/RealConnection;)Z
-Lcom/android/okhttp/ConnectionPool;->DEFAULT_KEEP_ALIVE_DURATION_MS:J
-Lcom/android/okhttp/ConnectionPool;->evictAll()V
-Lcom/android/okhttp/ConnectionPool;->executor:Ljava/util/concurrent/Executor;
-Lcom/android/okhttp/ConnectionPool;->get(Lcom/android/okhttp/Address;Lcom/android/okhttp/internal/http/StreamAllocation;)Lcom/android/okhttp/internal/io/RealConnection;
-Lcom/android/okhttp/ConnectionPool;->getConnectionCount()I
-Lcom/android/okhttp/ConnectionPool;->getDefault()Lcom/android/okhttp/ConnectionPool;
-Lcom/android/okhttp/ConnectionPool;->getHttpConnectionCount()I
-Lcom/android/okhttp/ConnectionPool;->getIdleConnectionCount()I
-Lcom/android/okhttp/ConnectionPool;->getMultiplexedConnectionCount()I
-Lcom/android/okhttp/ConnectionPool;->getSpdyConnectionCount()I
-Lcom/android/okhttp/ConnectionPool;->pruneAndGetAllocationCount(Lcom/android/okhttp/internal/io/RealConnection;J)I
-Lcom/android/okhttp/ConnectionPool;->put(Lcom/android/okhttp/internal/io/RealConnection;)V
-Lcom/android/okhttp/ConnectionPool;->routeDatabase:Lcom/android/okhttp/internal/RouteDatabase;
-Lcom/android/okhttp/ConnectionPool;->setCleanupRunnableForTest(Ljava/lang/Runnable;)V
-Lcom/android/okhttp/ConnectionSpec$Builder;-><init>(Lcom/android/okhttp/ConnectionSpec;)V
-Lcom/android/okhttp/ConnectionSpec$Builder;-><init>(Z)V
-Lcom/android/okhttp/ConnectionSpec$Builder;->allEnabledCipherSuites()Lcom/android/okhttp/ConnectionSpec$Builder;
-Lcom/android/okhttp/ConnectionSpec$Builder;->allEnabledTlsVersions()Lcom/android/okhttp/ConnectionSpec$Builder;
-Lcom/android/okhttp/ConnectionSpec$Builder;->build()Lcom/android/okhttp/ConnectionSpec;
-Lcom/android/okhttp/ConnectionSpec$Builder;->cipherSuites:[Ljava/lang/String;
-Lcom/android/okhttp/ConnectionSpec$Builder;->supportsTlsExtensions(Z)Lcom/android/okhttp/ConnectionSpec$Builder;
-Lcom/android/okhttp/ConnectionSpec$Builder;->supportsTlsExtensions:Z
-Lcom/android/okhttp/ConnectionSpec$Builder;->tls:Z
-Lcom/android/okhttp/ConnectionSpec$Builder;->tlsVersions:[Ljava/lang/String;
-Lcom/android/okhttp/ConnectionSpec;-><init>(Lcom/android/okhttp/ConnectionSpec$Builder;)V
-Lcom/android/okhttp/ConnectionSpec;->apply(Ljavax/net/ssl/SSLSocket;Z)V
-Lcom/android/okhttp/ConnectionSpec;->APPROVED_CIPHER_SUITES:[Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/ConnectionSpec;->cipherSuites()Ljava/util/List;
-Lcom/android/okhttp/ConnectionSpec;->cipherSuites:[Ljava/lang/String;
-Lcom/android/okhttp/ConnectionSpec;->CLEARTEXT:Lcom/android/okhttp/ConnectionSpec;
-Lcom/android/okhttp/ConnectionSpec;->COMPATIBLE_TLS:Lcom/android/okhttp/ConnectionSpec;
-Lcom/android/okhttp/ConnectionSpec;->isCompatible(Ljavax/net/ssl/SSLSocket;)Z
-Lcom/android/okhttp/ConnectionSpec;->isTls()Z
-Lcom/android/okhttp/ConnectionSpec;->MODERN_TLS:Lcom/android/okhttp/ConnectionSpec;
-Lcom/android/okhttp/ConnectionSpec;->nonEmptyIntersection([Ljava/lang/String;[Ljava/lang/String;)Z
-Lcom/android/okhttp/ConnectionSpec;->supportedSpec(Ljavax/net/ssl/SSLSocket;Z)Lcom/android/okhttp/ConnectionSpec;
-Lcom/android/okhttp/ConnectionSpec;->supportsTlsExtensions()Z
-Lcom/android/okhttp/ConnectionSpec;->supportsTlsExtensions:Z
-Lcom/android/okhttp/ConnectionSpec;->tls:Z
-Lcom/android/okhttp/ConnectionSpec;->tlsVersions()Ljava/util/List;
-Lcom/android/okhttp/ConnectionSpec;->tlsVersions:[Ljava/lang/String;
-Lcom/android/okhttp/Dispatcher;-><init>()V
-Lcom/android/okhttp/Dispatcher;-><init>(Ljava/util/concurrent/ExecutorService;)V
-Lcom/android/okhttp/Dispatcher;->cancel(Ljava/lang/Object;)V
-Lcom/android/okhttp/Dispatcher;->enqueue(Lcom/android/okhttp/Call$AsyncCall;)V
-Lcom/android/okhttp/Dispatcher;->executed(Lcom/android/okhttp/Call;)V
-Lcom/android/okhttp/Dispatcher;->executedCalls:Ljava/util/Deque;
-Lcom/android/okhttp/Dispatcher;->executorService:Ljava/util/concurrent/ExecutorService;
-Lcom/android/okhttp/Dispatcher;->finished(Lcom/android/okhttp/Call$AsyncCall;)V
-Lcom/android/okhttp/Dispatcher;->finished(Lcom/android/okhttp/Call;)V
-Lcom/android/okhttp/Dispatcher;->getExecutorService()Ljava/util/concurrent/ExecutorService;
-Lcom/android/okhttp/Dispatcher;->getMaxRequests()I
-Lcom/android/okhttp/Dispatcher;->getMaxRequestsPerHost()I
-Lcom/android/okhttp/Dispatcher;->getQueuedCallCount()I
-Lcom/android/okhttp/Dispatcher;->getRunningCallCount()I
-Lcom/android/okhttp/Dispatcher;->maxRequests:I
-Lcom/android/okhttp/Dispatcher;->maxRequestsPerHost:I
-Lcom/android/okhttp/Dispatcher;->promoteCalls()V
-Lcom/android/okhttp/Dispatcher;->readyCalls:Ljava/util/Deque;
-Lcom/android/okhttp/Dispatcher;->runningCalls:Ljava/util/Deque;
-Lcom/android/okhttp/Dispatcher;->runningCallsForHost(Lcom/android/okhttp/Call$AsyncCall;)I
-Lcom/android/okhttp/Dispatcher;->setMaxRequests(I)V
-Lcom/android/okhttp/Dispatcher;->setMaxRequestsPerHost(I)V
-Lcom/android/okhttp/Dns;->lookup(Ljava/lang/String;)Ljava/util/List;
-Lcom/android/okhttp/Dns;->SYSTEM:Lcom/android/okhttp/Dns;
-Lcom/android/okhttp/Handshake;-><init>(Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
-Lcom/android/okhttp/Handshake;->cipherSuite()Ljava/lang/String;
-Lcom/android/okhttp/Handshake;->cipherSuite:Ljava/lang/String;
-Lcom/android/okhttp/Handshake;->get(Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Handshake;->get(Ljavax/net/ssl/SSLSession;)Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Handshake;->localCertificates()Ljava/util/List;
-Lcom/android/okhttp/Handshake;->localCertificates:Ljava/util/List;
-Lcom/android/okhttp/Handshake;->localPrincipal()Ljava/security/Principal;
-Lcom/android/okhttp/Handshake;->peerCertificates()Ljava/util/List;
-Lcom/android/okhttp/Handshake;->peerCertificates:Ljava/util/List;
-Lcom/android/okhttp/Handshake;->peerPrincipal()Ljava/security/Principal;
-Lcom/android/okhttp/Headers$Builder;-><init>()V
-Lcom/android/okhttp/Headers$Builder;->add(Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers$Builder;->add(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers$Builder;->addLenient(Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers$Builder;->addLenient(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers$Builder;->build()Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/Headers$Builder;->checkNameAndValue(Ljava/lang/String;Ljava/lang/String;)V
-Lcom/android/okhttp/Headers$Builder;->get(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/Headers$Builder;->namesAndValues:Ljava/util/List;
-Lcom/android/okhttp/Headers$Builder;->removeAll(Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers$Builder;->set(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers;-><init>(Lcom/android/okhttp/Headers$Builder;)V
-Lcom/android/okhttp/Headers;-><init>([Ljava/lang/String;)V
-Lcom/android/okhttp/Headers;->get(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/Headers;->get([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/Headers;->getDate(Ljava/lang/String;)Ljava/util/Date;
-Lcom/android/okhttp/Headers;->name(I)Ljava/lang/String;
-Lcom/android/okhttp/Headers;->names()Ljava/util/Set;
-Lcom/android/okhttp/Headers;->namesAndValues:[Ljava/lang/String;
-Lcom/android/okhttp/Headers;->newBuilder()Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Headers;->of(Ljava/util/Map;)Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/Headers;->size()I
-Lcom/android/okhttp/Headers;->toMultimap()Ljava/util/Map;
-Lcom/android/okhttp/Headers;->value(I)Ljava/lang/String;
-Lcom/android/okhttp/Headers;->values(Ljava/lang/String;)Ljava/util/List;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;->INVALID_HOST:Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;->INVALID_PORT:Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;->MISSING_SCHEME:Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;->SUCCESS:Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;->UNSUPPORTED_SCHEME:Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;->valueOf(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;->values()[Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder;-><init>()V
-Lcom/android/okhttp/HttpUrl$Builder;->addEncodedPathSegment(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->addEncodedQueryParameter(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->addPathSegment(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->addQueryParameter(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->canonicalizeHost(Ljava/lang/String;II)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->containsInvalidHostnameAsciiCodes(Ljava/lang/String;)Z
-Lcom/android/okhttp/HttpUrl$Builder;->decodeIpv4Suffix(Ljava/lang/String;II[BI)Z
-Lcom/android/okhttp/HttpUrl$Builder;->decodeIpv6(Ljava/lang/String;II)Ljava/net/InetAddress;
-Lcom/android/okhttp/HttpUrl$Builder;->domainToAscii(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->effectivePort()I
-Lcom/android/okhttp/HttpUrl$Builder;->encodedFragment(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedFragment:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedPassword(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedPassword:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedPath(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedPathSegments:Ljava/util/List;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedQuery(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedQueryNamesAndValues:Ljava/util/List;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedUsername(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->encodedUsername:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->fragment(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->host(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->host:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->inet6AddressToAscii([B)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->isDot(Ljava/lang/String;)Z
-Lcom/android/okhttp/HttpUrl$Builder;->isDotDot(Ljava/lang/String;)Z
-Lcom/android/okhttp/HttpUrl$Builder;->parse(Lcom/android/okhttp/HttpUrl;Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/HttpUrl$Builder;->parsePort(Ljava/lang/String;II)I
-Lcom/android/okhttp/HttpUrl$Builder;->password(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->pop()V
-Lcom/android/okhttp/HttpUrl$Builder;->port(I)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->port:I
-Lcom/android/okhttp/HttpUrl$Builder;->portColonOffset(Ljava/lang/String;II)I
-Lcom/android/okhttp/HttpUrl$Builder;->push(Ljava/lang/String;IIZZ)V
-Lcom/android/okhttp/HttpUrl$Builder;->query(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->reencodeForUri()Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->removeAllCanonicalQueryParameters(Ljava/lang/String;)V
-Lcom/android/okhttp/HttpUrl$Builder;->removeAllEncodedQueryParameters(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->removeAllQueryParameters(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->removePathSegment(I)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->resolvePath(Ljava/lang/String;II)V
-Lcom/android/okhttp/HttpUrl$Builder;->scheme(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->scheme:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl$Builder;->schemeDelimiterOffset(Ljava/lang/String;II)I
-Lcom/android/okhttp/HttpUrl$Builder;->setEncodedPathSegment(ILjava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->setEncodedQueryParameter(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->setPathSegment(ILjava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->setQueryParameter(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder;->skipLeadingAsciiWhitespace(Ljava/lang/String;II)I
-Lcom/android/okhttp/HttpUrl$Builder;->skipTrailingAsciiWhitespace(Ljava/lang/String;II)I
-Lcom/android/okhttp/HttpUrl$Builder;->slashCount(Ljava/lang/String;II)I
-Lcom/android/okhttp/HttpUrl$Builder;->username(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl;-><init>(Lcom/android/okhttp/HttpUrl$Builder;)V
-Lcom/android/okhttp/HttpUrl;->canonicalize(Lcom/android/okhttp/okio/Buffer;Ljava/lang/String;IILjava/lang/String;ZZZZ)V
-Lcom/android/okhttp/HttpUrl;->canonicalize(Ljava/lang/String;IILjava/lang/String;ZZZZ)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->canonicalize(Ljava/lang/String;Ljava/lang/String;ZZZZ)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->decodeHexDigit(C)I
-Lcom/android/okhttp/HttpUrl;->defaultPort(Ljava/lang/String;)I
-Lcom/android/okhttp/HttpUrl;->delimiterOffset(Ljava/lang/String;IILjava/lang/String;)I
-Lcom/android/okhttp/HttpUrl;->encodedFragment()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->encodedPassword()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->encodedPathSegments()Ljava/util/List;
-Lcom/android/okhttp/HttpUrl;->encodedQuery()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->encodedUsername()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->FORM_ENCODE_SET:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->fragment()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->fragment:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->FRAGMENT_ENCODE_SET:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->FRAGMENT_ENCODE_SET_URI:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->get(Ljava/net/URI;)Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/HttpUrl;->get(Ljava/net/URL;)Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/HttpUrl;->getChecked(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/HttpUrl;->HEX_DIGITS:[C
-Lcom/android/okhttp/HttpUrl;->host()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->host:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->isHttps()Z
-Lcom/android/okhttp/HttpUrl;->namesAndValuesToQueryString(Ljava/lang/StringBuilder;Ljava/util/List;)V
-Lcom/android/okhttp/HttpUrl;->password()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->password:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->PASSWORD_ENCODE_SET:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->pathSegments()Ljava/util/List;
-Lcom/android/okhttp/HttpUrl;->pathSegments:Ljava/util/List;
-Lcom/android/okhttp/HttpUrl;->pathSegmentsToString(Ljava/lang/StringBuilder;Ljava/util/List;)V
-Lcom/android/okhttp/HttpUrl;->pathSize()I
-Lcom/android/okhttp/HttpUrl;->PATH_SEGMENT_ENCODE_SET:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->PATH_SEGMENT_ENCODE_SET_URI:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->percentDecode(Lcom/android/okhttp/okio/Buffer;Ljava/lang/String;IIZ)V
-Lcom/android/okhttp/HttpUrl;->percentDecode(Ljava/lang/String;IIZ)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->percentDecode(Ljava/lang/String;Z)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->percentDecode(Ljava/util/List;Z)Ljava/util/List;
-Lcom/android/okhttp/HttpUrl;->percentEncoded(Ljava/lang/String;II)Z
-Lcom/android/okhttp/HttpUrl;->port()I
-Lcom/android/okhttp/HttpUrl;->port:I
-Lcom/android/okhttp/HttpUrl;->queryNamesAndValues:Ljava/util/List;
-Lcom/android/okhttp/HttpUrl;->queryParameter(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->queryParameterName(I)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->queryParameterNames()Ljava/util/Set;
-Lcom/android/okhttp/HttpUrl;->queryParameterValue(I)Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->queryParameterValues(Ljava/lang/String;)Ljava/util/List;
-Lcom/android/okhttp/HttpUrl;->querySize()I
-Lcom/android/okhttp/HttpUrl;->queryStringToNamesAndValues(Ljava/lang/String;)Ljava/util/List;
-Lcom/android/okhttp/HttpUrl;->QUERY_COMPONENT_ENCODE_SET:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->QUERY_COMPONENT_ENCODE_SET_URI:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->QUERY_ENCODE_SET:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->resolve(Ljava/lang/String;)Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/HttpUrl;->scheme()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->scheme:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->uri()Ljava/net/URI;
-Lcom/android/okhttp/HttpUrl;->url()Ljava/net/URL;
-Lcom/android/okhttp/HttpUrl;->url:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->username()Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->username:Ljava/lang/String;
-Lcom/android/okhttp/HttpUrl;->USERNAME_ENCODE_SET:Ljava/lang/String;
-Lcom/android/okhttp/Interceptor$Chain;->connection()Lcom/android/okhttp/Connection;
-Lcom/android/okhttp/Interceptor$Chain;->proceed(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Interceptor$Chain;->request()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Interceptor;->intercept(Lcom/android/okhttp/Interceptor$Chain;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/CacheRequest;->abort()V
-Lcom/android/okhttp/internal/http/CacheRequest;->body()Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;-><init>(JLcom/android/okhttp/Request;Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->ageSeconds:I
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->cacheResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->cacheResponseAge()J
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->computeFreshnessLifetime()J
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->etag:Ljava/lang/String;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->expires:Ljava/util/Date;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->get()Lcom/android/okhttp/internal/http/CacheStrategy;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->getCandidate()Lcom/android/okhttp/internal/http/CacheStrategy;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->hasConditions(Lcom/android/okhttp/Request;)Z
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->isFreshnessLifetimeHeuristic()Z
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->lastModified:Ljava/util/Date;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->lastModifiedString:Ljava/lang/String;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->nowMillis:J
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->receivedResponseMillis:J
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->request:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->sentRequestMillis:J
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->servedDate:Ljava/util/Date;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;->servedDateString:Ljava/lang/String;
-Lcom/android/okhttp/internal/http/CacheStrategy;-><init>(Lcom/android/okhttp/Request;Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/internal/http/CacheStrategy;->cacheResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/CacheStrategy;->isCacheable(Lcom/android/okhttp/Response;Lcom/android/okhttp/Request;)Z
-Lcom/android/okhttp/internal/http/CacheStrategy;->networkRequest:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/internal/http/HttpEngine$NetworkInterceptorChain;->calls:I
-Lcom/android/okhttp/internal/http/HttpEngine$NetworkInterceptorChain;->connection()Lcom/android/okhttp/Connection;
-Lcom/android/okhttp/internal/http/HttpEngine$NetworkInterceptorChain;->index:I
-Lcom/android/okhttp/internal/http/HttpEngine$NetworkInterceptorChain;->proceed(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/HttpEngine$NetworkInterceptorChain;->request()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/internal/http/HttpEngine$NetworkInterceptorChain;->request:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/internal/http/HttpEngine;-><init>(Lcom/android/okhttp/OkHttpClient;Lcom/android/okhttp/Request;ZZZLcom/android/okhttp/internal/http/StreamAllocation;Lcom/android/okhttp/internal/http/RetryableSink;Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/internal/http/HttpEngine;->bufferedRequestBody:Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/internal/http/HttpEngine;->bufferRequestBody:Z
-Lcom/android/okhttp/internal/http/HttpEngine;->cacheResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/HttpEngine;->cacheStrategy:Lcom/android/okhttp/internal/http/CacheStrategy;
-Lcom/android/okhttp/internal/http/HttpEngine;->cacheWritingResponse(Lcom/android/okhttp/internal/http/CacheRequest;Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/HttpEngine;->callerWritesRequestBody:Z
-Lcom/android/okhttp/internal/http/HttpEngine;->cancel()V
-Lcom/android/okhttp/internal/http/HttpEngine;->client:Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/internal/http/HttpEngine;->close()Lcom/android/okhttp/internal/http/StreamAllocation;
-Lcom/android/okhttp/internal/http/HttpEngine;->combine(Lcom/android/okhttp/Headers;Lcom/android/okhttp/Headers;)Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/internal/http/HttpEngine;->connect()Lcom/android/okhttp/internal/http/HttpStream;
-Lcom/android/okhttp/internal/http/HttpEngine;->createAddress(Lcom/android/okhttp/OkHttpClient;Lcom/android/okhttp/Request;)Lcom/android/okhttp/Address;
-Lcom/android/okhttp/internal/http/HttpEngine;->EMPTY_BODY:Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/internal/http/HttpEngine;->followUpRequest()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/internal/http/HttpEngine;->forWebSocket:Z
-Lcom/android/okhttp/internal/http/HttpEngine;->getBufferedRequestBody()Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/internal/http/HttpEngine;->getRequest()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/internal/http/HttpEngine;->getRequestBody()Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/internal/http/HttpEngine;->getResponse()Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/HttpEngine;->hasBody(Lcom/android/okhttp/Response;)Z
-Lcom/android/okhttp/internal/http/HttpEngine;->MAX_FOLLOW_UPS:I
-Lcom/android/okhttp/internal/http/HttpEngine;->maybeCache()V
-Lcom/android/okhttp/internal/http/HttpEngine;->permitsRequestBody(Lcom/android/okhttp/Request;)Z
-Lcom/android/okhttp/internal/http/HttpEngine;->readNetworkResponse()Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/HttpEngine;->receiveHeaders(Lcom/android/okhttp/Headers;)V
-Lcom/android/okhttp/internal/http/HttpEngine;->recover(Lcom/android/okhttp/internal/http/RouteException;)Lcom/android/okhttp/internal/http/HttpEngine;
-Lcom/android/okhttp/internal/http/HttpEngine;->recover(Ljava/io/IOException;)Lcom/android/okhttp/internal/http/HttpEngine;
-Lcom/android/okhttp/internal/http/HttpEngine;->recover(Ljava/io/IOException;Lcom/android/okhttp/okio/Sink;)Lcom/android/okhttp/internal/http/HttpEngine;
-Lcom/android/okhttp/internal/http/HttpEngine;->releaseStreamAllocation()V
-Lcom/android/okhttp/internal/http/HttpEngine;->requestBodyOut:Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/internal/http/HttpEngine;->sameConnection(Lcom/android/okhttp/HttpUrl;)Z
-Lcom/android/okhttp/internal/http/HttpEngine;->storeRequest:Lcom/android/okhttp/internal/http/CacheRequest;
-Lcom/android/okhttp/internal/http/HttpEngine;->streamAllocation:Lcom/android/okhttp/internal/http/StreamAllocation;
-Lcom/android/okhttp/internal/http/HttpEngine;->stripBody(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/HttpEngine;->transparentGzip:Z
-Lcom/android/okhttp/internal/http/HttpEngine;->unzip(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response;
-Lcom/android/okhttp/internal/http/HttpEngine;->userRequest:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/internal/http/HttpEngine;->validate(Lcom/android/okhttp/Response;Lcom/android/okhttp/Response;)Z
-Lcom/android/okhttp/internal/http/HttpStream;->cancel()V
-Lcom/android/okhttp/internal/http/HttpStream;->createRequestBody(Lcom/android/okhttp/Request;J)Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/internal/http/HttpStream;->DISCARD_STREAM_TIMEOUT_MILLIS:I
-Lcom/android/okhttp/internal/http/HttpStream;->finishRequest()V
-Lcom/android/okhttp/internal/http/HttpStream;->openResponseBody(Lcom/android/okhttp/Response;)Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/internal/http/HttpStream;->readResponseHeaders()Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/internal/http/HttpStream;->setHttpEngine(Lcom/android/okhttp/internal/http/HttpEngine;)V
-Lcom/android/okhttp/internal/http/HttpStream;->writeRequestBody(Lcom/android/okhttp/internal/http/RetryableSink;)V
-Lcom/android/okhttp/internal/http/HttpStream;->writeRequestHeaders(Lcom/android/okhttp/Request;)V
-Lcom/android/okhttp/internal/http/RequestException;-><init>(Ljava/io/IOException;)V
-Lcom/android/okhttp/internal/http/RetryableSink;-><init>()V
-Lcom/android/okhttp/internal/http/RetryableSink;-><init>(I)V
-Lcom/android/okhttp/internal/http/RetryableSink;->closed:Z
-Lcom/android/okhttp/internal/http/RetryableSink;->content:Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/internal/http/RetryableSink;->contentLength()J
-Lcom/android/okhttp/internal/http/RetryableSink;->limit:I
-Lcom/android/okhttp/internal/http/RetryableSink;->timeout()Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/internal/http/RetryableSink;->write(Lcom/android/okhttp/okio/Buffer;J)V
-Lcom/android/okhttp/internal/http/RetryableSink;->writeToSocket(Lcom/android/okhttp/okio/Sink;)V
-Lcom/android/okhttp/internal/http/RouteException;-><init>(Ljava/io/IOException;)V
-Lcom/android/okhttp/internal/http/RouteException;->addConnectException(Ljava/io/IOException;)V
-Lcom/android/okhttp/internal/http/RouteException;->addSuppressedExceptionMethod:Ljava/lang/reflect/Method;
-Lcom/android/okhttp/internal/http/RouteException;->addSuppressedIfPossible(Ljava/io/IOException;Ljava/io/IOException;)V
-Lcom/android/okhttp/internal/http/RouteException;->getLastConnectException()Ljava/io/IOException;
-Lcom/android/okhttp/internal/http/RouteException;->lastException:Ljava/io/IOException;
-Lcom/android/okhttp/internal/http/RouteSelector;-><init>(Lcom/android/okhttp/Address;Lcom/android/okhttp/internal/RouteDatabase;)V
-Lcom/android/okhttp/internal/http/RouteSelector;->address:Lcom/android/okhttp/Address;
-Lcom/android/okhttp/internal/http/RouteSelector;->connectFailed(Lcom/android/okhttp/Route;Ljava/io/IOException;)V
-Lcom/android/okhttp/internal/http/RouteSelector;->getHostString(Ljava/net/InetSocketAddress;)Ljava/lang/String;
-Lcom/android/okhttp/internal/http/RouteSelector;->hasNextInetSocketAddress()Z
-Lcom/android/okhttp/internal/http/RouteSelector;->hasNextPostponed()Z
-Lcom/android/okhttp/internal/http/RouteSelector;->hasNextProxy()Z
-Lcom/android/okhttp/internal/http/RouteSelector;->inetSocketAddresses:Ljava/util/List;
-Lcom/android/okhttp/internal/http/RouteSelector;->lastInetSocketAddress:Ljava/net/InetSocketAddress;
-Lcom/android/okhttp/internal/http/RouteSelector;->lastProxy:Ljava/net/Proxy;
-Lcom/android/okhttp/internal/http/RouteSelector;->next()Lcom/android/okhttp/Route;
-Lcom/android/okhttp/internal/http/RouteSelector;->nextInetSocketAddress()Ljava/net/InetSocketAddress;
-Lcom/android/okhttp/internal/http/RouteSelector;->nextInetSocketAddressIndex:I
-Lcom/android/okhttp/internal/http/RouteSelector;->nextPostponed()Lcom/android/okhttp/Route;
-Lcom/android/okhttp/internal/http/RouteSelector;->nextProxy()Ljava/net/Proxy;
-Lcom/android/okhttp/internal/http/RouteSelector;->nextProxyIndex:I
-Lcom/android/okhttp/internal/http/RouteSelector;->postponedRoutes:Ljava/util/List;
-Lcom/android/okhttp/internal/http/RouteSelector;->proxies:Ljava/util/List;
-Lcom/android/okhttp/internal/http/RouteSelector;->resetNextInetSocketAddress(Ljava/net/Proxy;)V
-Lcom/android/okhttp/internal/http/RouteSelector;->resetNextProxy(Lcom/android/okhttp/HttpUrl;Ljava/net/Proxy;)V
-Lcom/android/okhttp/internal/http/RouteSelector;->routeDatabase:Lcom/android/okhttp/internal/RouteDatabase;
-Lcom/android/okhttp/internal/http/StreamAllocation;-><init>(Lcom/android/okhttp/ConnectionPool;Lcom/android/okhttp/Address;)V
-Lcom/android/okhttp/internal/http/StreamAllocation;->acquire(Lcom/android/okhttp/internal/io/RealConnection;)V
-Lcom/android/okhttp/internal/http/StreamAllocation;->address:Lcom/android/okhttp/Address;
-Lcom/android/okhttp/internal/http/StreamAllocation;->cancel()V
-Lcom/android/okhttp/internal/http/StreamAllocation;->canceled:Z
-Lcom/android/okhttp/internal/http/StreamAllocation;->connection()Lcom/android/okhttp/internal/io/RealConnection;
-Lcom/android/okhttp/internal/http/StreamAllocation;->connection:Lcom/android/okhttp/internal/io/RealConnection;
-Lcom/android/okhttp/internal/http/StreamAllocation;->connectionFailed()V
-Lcom/android/okhttp/internal/http/StreamAllocation;->connectionFailed(Ljava/io/IOException;)V
-Lcom/android/okhttp/internal/http/StreamAllocation;->connectionPool:Lcom/android/okhttp/ConnectionPool;
-Lcom/android/okhttp/internal/http/StreamAllocation;->deallocate(ZZZ)V
-Lcom/android/okhttp/internal/http/StreamAllocation;->findConnection(IIIZ)Lcom/android/okhttp/internal/io/RealConnection;
-Lcom/android/okhttp/internal/http/StreamAllocation;->findHealthyConnection(IIIZZ)Lcom/android/okhttp/internal/io/RealConnection;
-Lcom/android/okhttp/internal/http/StreamAllocation;->isRecoverable(Lcom/android/okhttp/internal/http/RouteException;)Z
-Lcom/android/okhttp/internal/http/StreamAllocation;->isRecoverable(Ljava/io/IOException;)Z
-Lcom/android/okhttp/internal/http/StreamAllocation;->newStream(IIIZZ)Lcom/android/okhttp/internal/http/HttpStream;
-Lcom/android/okhttp/internal/http/StreamAllocation;->noNewStreams()V
-Lcom/android/okhttp/internal/http/StreamAllocation;->recover(Lcom/android/okhttp/internal/http/RouteException;)Z
-Lcom/android/okhttp/internal/http/StreamAllocation;->recover(Ljava/io/IOException;Lcom/android/okhttp/okio/Sink;)Z
-Lcom/android/okhttp/internal/http/StreamAllocation;->release()V
-Lcom/android/okhttp/internal/http/StreamAllocation;->release(Lcom/android/okhttp/internal/io/RealConnection;)V
-Lcom/android/okhttp/internal/http/StreamAllocation;->released:Z
-Lcom/android/okhttp/internal/http/StreamAllocation;->routeDatabase()Lcom/android/okhttp/internal/RouteDatabase;
-Lcom/android/okhttp/internal/http/StreamAllocation;->routeSelector:Lcom/android/okhttp/internal/http/RouteSelector;
-Lcom/android/okhttp/internal/http/StreamAllocation;->stream()Lcom/android/okhttp/internal/http/HttpStream;
-Lcom/android/okhttp/internal/http/StreamAllocation;->stream:Lcom/android/okhttp/internal/http/HttpStream;
-Lcom/android/okhttp/internal/http/StreamAllocation;->streamFinished(Lcom/android/okhttp/internal/http/HttpStream;)V
-Lcom/android/okhttp/MediaType;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Lcom/android/okhttp/MediaType;->charset()Ljava/nio/charset/Charset;
-Lcom/android/okhttp/MediaType;->charset(Ljava/nio/charset/Charset;)Ljava/nio/charset/Charset;
-Lcom/android/okhttp/MediaType;->charset:Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->mediaType:Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->PARAMETER:Ljava/util/regex/Pattern;
-Lcom/android/okhttp/MediaType;->parse(Ljava/lang/String;)Lcom/android/okhttp/MediaType;
-Lcom/android/okhttp/MediaType;->QUOTED:Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->subtype()Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->subtype:Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->TOKEN:Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->type()Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->type:Ljava/lang/String;
-Lcom/android/okhttp/MediaType;->TYPE_SUBTYPE:Ljava/util/regex/Pattern;
-Lcom/android/okhttp/OkCacheContainer;->getCache()Lcom/android/okhttp/Cache;
-Lcom/android/okhttp/OkHttpClient;-><init>(Lcom/android/okhttp/OkHttpClient;)V
-Lcom/android/okhttp/OkHttpClient;->authenticator:Lcom/android/okhttp/Authenticator;
-Lcom/android/okhttp/OkHttpClient;->cache:Lcom/android/okhttp/Cache;
-Lcom/android/okhttp/OkHttpClient;->cancel(Ljava/lang/Object;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->certificatePinner:Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/OkHttpClient;->connectionSpecs:Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->connectTimeout:I
-Lcom/android/okhttp/OkHttpClient;->cookieHandler:Ljava/net/CookieHandler;
-Lcom/android/okhttp/OkHttpClient;->copyWithDefaults()Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->defaultSslSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
-Lcom/android/okhttp/OkHttpClient;->DEFAULT_CONNECTION_SPECS:Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->dispatcher:Lcom/android/okhttp/Dispatcher;
-Lcom/android/okhttp/OkHttpClient;->followRedirects:Z
-Lcom/android/okhttp/OkHttpClient;->followSslRedirects:Z
-Lcom/android/okhttp/OkHttpClient;->getAuthenticator()Lcom/android/okhttp/Authenticator;
-Lcom/android/okhttp/OkHttpClient;->getCache()Lcom/android/okhttp/Cache;
-Lcom/android/okhttp/OkHttpClient;->getCertificatePinner()Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/OkHttpClient;->getConnectionSpecs()Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->getConnectTimeout()I
-Lcom/android/okhttp/OkHttpClient;->getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;
-Lcom/android/okhttp/OkHttpClient;->getDispatcher()Lcom/android/okhttp/Dispatcher;
-Lcom/android/okhttp/OkHttpClient;->getDns()Lcom/android/okhttp/Dns;
-Lcom/android/okhttp/OkHttpClient;->getFollowRedirects()Z
-Lcom/android/okhttp/OkHttpClient;->getFollowSslRedirects()Z
-Lcom/android/okhttp/OkHttpClient;->getProtocols()Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->getReadTimeout()I
-Lcom/android/okhttp/OkHttpClient;->getRetryOnConnectionFailure()Z
-Lcom/android/okhttp/OkHttpClient;->getSocketFactory()Ljavax/net/SocketFactory;
-Lcom/android/okhttp/OkHttpClient;->getWriteTimeout()I
-Lcom/android/okhttp/OkHttpClient;->hostnameVerifier:Ljavax/net/ssl/HostnameVerifier;
-Lcom/android/okhttp/OkHttpClient;->interceptors()Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->interceptors:Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->internalCache()Lcom/android/okhttp/internal/InternalCache;
-Lcom/android/okhttp/OkHttpClient;->internalCache:Lcom/android/okhttp/internal/InternalCache;
-Lcom/android/okhttp/OkHttpClient;->networkInterceptors()Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->networkInterceptors:Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->newCall(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Call;
-Lcom/android/okhttp/OkHttpClient;->protocols:Ljava/util/List;
-Lcom/android/okhttp/OkHttpClient;->proxy:Ljava/net/Proxy;
-Lcom/android/okhttp/OkHttpClient;->proxySelector:Ljava/net/ProxySelector;
-Lcom/android/okhttp/OkHttpClient;->readTimeout:I
-Lcom/android/okhttp/OkHttpClient;->retryOnConnectionFailure:Z
-Lcom/android/okhttp/OkHttpClient;->routeDatabase()Lcom/android/okhttp/internal/RouteDatabase;
-Lcom/android/okhttp/OkHttpClient;->routeDatabase:Lcom/android/okhttp/internal/RouteDatabase;
-Lcom/android/okhttp/OkHttpClient;->setAuthenticator(Lcom/android/okhttp/Authenticator;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setCache(Lcom/android/okhttp/Cache;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setCertificatePinner(Lcom/android/okhttp/CertificatePinner;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setConnectionPool(Lcom/android/okhttp/ConnectionPool;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setConnectionSpecs(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setConnectTimeout(JLjava/util/concurrent/TimeUnit;)V
-Lcom/android/okhttp/OkHttpClient;->setCookieHandler(Ljava/net/CookieHandler;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setDispatcher(Lcom/android/okhttp/Dispatcher;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setDns(Lcom/android/okhttp/Dns;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setFollowRedirects(Z)V
-Lcom/android/okhttp/OkHttpClient;->setFollowSslRedirects(Z)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setInternalCache(Lcom/android/okhttp/internal/InternalCache;)V
-Lcom/android/okhttp/OkHttpClient;->setProxy(Ljava/net/Proxy;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setProxySelector(Ljava/net/ProxySelector;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setReadTimeout(JLjava/util/concurrent/TimeUnit;)V
-Lcom/android/okhttp/OkHttpClient;->setSocketFactory(Ljavax/net/SocketFactory;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setSslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient;->setWriteTimeout(JLjava/util/concurrent/TimeUnit;)V
-Lcom/android/okhttp/OkHttpClient;->socketFactory:Ljavax/net/SocketFactory;
-Lcom/android/okhttp/OkHttpClient;->sslSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
-Lcom/android/okhttp/OkHttpClient;->writeTimeout:I
-Lcom/android/okhttp/okio/AsyncTimeout$Watchdog;-><init>()V
-Lcom/android/okhttp/okio/AsyncTimeout;-><init>()V
-Lcom/android/okhttp/okio/AsyncTimeout;->awaitTimeout()Lcom/android/okhttp/okio/AsyncTimeout;
-Lcom/android/okhttp/okio/AsyncTimeout;->cancelScheduledTimeout(Lcom/android/okhttp/okio/AsyncTimeout;)Z
-Lcom/android/okhttp/okio/AsyncTimeout;->enter()V
-Lcom/android/okhttp/okio/AsyncTimeout;->exit()Z
-Lcom/android/okhttp/okio/AsyncTimeout;->exit(Ljava/io/IOException;)Ljava/io/IOException;
-Lcom/android/okhttp/okio/AsyncTimeout;->exit(Z)V
-Lcom/android/okhttp/okio/AsyncTimeout;->head:Lcom/android/okhttp/okio/AsyncTimeout;
-Lcom/android/okhttp/okio/AsyncTimeout;->inQueue:Z
-Lcom/android/okhttp/okio/AsyncTimeout;->newTimeoutException(Ljava/io/IOException;)Ljava/io/IOException;
-Lcom/android/okhttp/okio/AsyncTimeout;->next:Lcom/android/okhttp/okio/AsyncTimeout;
-Lcom/android/okhttp/okio/AsyncTimeout;->remainingNanos(J)J
-Lcom/android/okhttp/okio/AsyncTimeout;->scheduleTimeout(Lcom/android/okhttp/okio/AsyncTimeout;JZ)V
-Lcom/android/okhttp/okio/AsyncTimeout;->sink(Lcom/android/okhttp/okio/Sink;)Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/okio/AsyncTimeout;->source(Lcom/android/okhttp/okio/Source;)Lcom/android/okhttp/okio/Source;
-Lcom/android/okhttp/okio/AsyncTimeout;->timedOut()V
-Lcom/android/okhttp/okio/AsyncTimeout;->timeoutAt:J
-Lcom/android/okhttp/okio/Buffer;-><init>()V
-Lcom/android/okhttp/okio/Buffer;->buffer()Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->clear()V
-Lcom/android/okhttp/okio/Buffer;->completeSegmentByteCount()J
-Lcom/android/okhttp/okio/Buffer;->copyTo(Lcom/android/okhttp/okio/Buffer;JJ)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->copyTo(Ljava/io/OutputStream;)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->copyTo(Ljava/io/OutputStream;JJ)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->DIGITS:[B
-Lcom/android/okhttp/okio/Buffer;->emit()Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->emitCompleteSegments()Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->emitCompleteSegments()Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->exhausted()Z
-Lcom/android/okhttp/okio/Buffer;->getByte(J)B
-Lcom/android/okhttp/okio/Buffer;->head:Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/Buffer;->indexOf(B)J
-Lcom/android/okhttp/okio/Buffer;->indexOf(BJ)J
-Lcom/android/okhttp/okio/Buffer;->indexOf(Lcom/android/okhttp/okio/ByteString;)J
-Lcom/android/okhttp/okio/Buffer;->indexOf(Lcom/android/okhttp/okio/ByteString;J)J
-Lcom/android/okhttp/okio/Buffer;->indexOfElement(Lcom/android/okhttp/okio/ByteString;)J
-Lcom/android/okhttp/okio/Buffer;->indexOfElement(Lcom/android/okhttp/okio/ByteString;J)J
-Lcom/android/okhttp/okio/Buffer;->inputStream()Ljava/io/InputStream;
-Lcom/android/okhttp/okio/Buffer;->outputStream()Ljava/io/OutputStream;
-Lcom/android/okhttp/okio/Buffer;->rangeEquals(JLcom/android/okhttp/okio/ByteString;)Z
-Lcom/android/okhttp/okio/Buffer;->read(Lcom/android/okhttp/okio/Buffer;J)J
-Lcom/android/okhttp/okio/Buffer;->read([B)I
-Lcom/android/okhttp/okio/Buffer;->read([BII)I
-Lcom/android/okhttp/okio/Buffer;->readAll(Lcom/android/okhttp/okio/Sink;)J
-Lcom/android/okhttp/okio/Buffer;->readByte()B
-Lcom/android/okhttp/okio/Buffer;->readByteArray()[B
-Lcom/android/okhttp/okio/Buffer;->readByteArray(J)[B
-Lcom/android/okhttp/okio/Buffer;->readByteString()Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/Buffer;->readByteString(J)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/Buffer;->readDecimalLong()J
-Lcom/android/okhttp/okio/Buffer;->readFrom(Ljava/io/InputStream;)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->readFrom(Ljava/io/InputStream;J)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->readFrom(Ljava/io/InputStream;JZ)V
-Lcom/android/okhttp/okio/Buffer;->readFully(Lcom/android/okhttp/okio/Buffer;J)V
-Lcom/android/okhttp/okio/Buffer;->readFully([B)V
-Lcom/android/okhttp/okio/Buffer;->readHexadecimalUnsignedLong()J
-Lcom/android/okhttp/okio/Buffer;->readInt()I
-Lcom/android/okhttp/okio/Buffer;->readIntLe()I
-Lcom/android/okhttp/okio/Buffer;->readLong()J
-Lcom/android/okhttp/okio/Buffer;->readLongLe()J
-Lcom/android/okhttp/okio/Buffer;->readShort()S
-Lcom/android/okhttp/okio/Buffer;->readShortLe()S
-Lcom/android/okhttp/okio/Buffer;->readString(JLjava/nio/charset/Charset;)Ljava/lang/String;
-Lcom/android/okhttp/okio/Buffer;->readString(Ljava/nio/charset/Charset;)Ljava/lang/String;
-Lcom/android/okhttp/okio/Buffer;->readUtf8()Ljava/lang/String;
-Lcom/android/okhttp/okio/Buffer;->readUtf8(J)Ljava/lang/String;
-Lcom/android/okhttp/okio/Buffer;->readUtf8CodePoint()I
-Lcom/android/okhttp/okio/Buffer;->readUtf8Line()Ljava/lang/String;
-Lcom/android/okhttp/okio/Buffer;->readUtf8Line(J)Ljava/lang/String;
-Lcom/android/okhttp/okio/Buffer;->readUtf8LineStrict()Ljava/lang/String;
-Lcom/android/okhttp/okio/Buffer;->REPLACEMENT_CHARACTER:I
-Lcom/android/okhttp/okio/Buffer;->request(J)Z
-Lcom/android/okhttp/okio/Buffer;->require(J)V
-Lcom/android/okhttp/okio/Buffer;->segmentSizes()Ljava/util/List;
-Lcom/android/okhttp/okio/Buffer;->size()J
-Lcom/android/okhttp/okio/Buffer;->size:J
-Lcom/android/okhttp/okio/Buffer;->skip(J)V
-Lcom/android/okhttp/okio/Buffer;->snapshot()Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/Buffer;->snapshot(I)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/Buffer;->timeout()Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Buffer;->writableSegment(I)Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/Buffer;->write(Lcom/android/okhttp/okio/Buffer;J)V
-Lcom/android/okhttp/okio/Buffer;->write(Lcom/android/okhttp/okio/ByteString;)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->write(Lcom/android/okhttp/okio/ByteString;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->write(Lcom/android/okhttp/okio/Source;J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->write([B)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->write([B)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->write([BII)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->write([BII)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeAll(Lcom/android/okhttp/okio/Source;)J
-Lcom/android/okhttp/okio/Buffer;->writeByte(I)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeByte(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeDecimalLong(J)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeDecimalLong(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeHexadecimalUnsignedLong(J)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeHexadecimalUnsignedLong(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeInt(I)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeInt(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeIntLe(I)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeIntLe(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeLong(J)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeLong(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeLongLe(J)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeLongLe(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeShort(I)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeShort(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeShortLe(I)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeShortLe(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeString(Ljava/lang/String;IILjava/nio/charset/Charset;)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeString(Ljava/lang/String;IILjava/nio/charset/Charset;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeString(Ljava/lang/String;Ljava/nio/charset/Charset;)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeString(Ljava/lang/String;Ljava/nio/charset/Charset;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeTo(Ljava/io/OutputStream;)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeTo(Ljava/io/OutputStream;J)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;II)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeUtf8(Ljava/lang/String;II)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/Buffer;->writeUtf8CodePoint(I)Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/Buffer;->writeUtf8CodePoint(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->buffer()Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/BufferedSink;->emit()Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->emitCompleteSegments()Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->outputStream()Ljava/io/OutputStream;
-Lcom/android/okhttp/okio/BufferedSink;->write(Lcom/android/okhttp/okio/ByteString;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->write(Lcom/android/okhttp/okio/Source;J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->write([B)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->write([BII)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeAll(Lcom/android/okhttp/okio/Source;)J
-Lcom/android/okhttp/okio/BufferedSink;->writeByte(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeDecimalLong(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeHexadecimalUnsignedLong(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeInt(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeIntLe(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeLong(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeLongLe(J)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeShort(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeShortLe(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeString(Ljava/lang/String;IILjava/nio/charset/Charset;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeString(Ljava/lang/String;Ljava/nio/charset/Charset;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeUtf8(Ljava/lang/String;II)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSink;->writeUtf8CodePoint(I)Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSource;->buffer()Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/BufferedSource;->exhausted()Z
-Lcom/android/okhttp/okio/BufferedSource;->indexOf(B)J
-Lcom/android/okhttp/okio/BufferedSource;->indexOf(BJ)J
-Lcom/android/okhttp/okio/BufferedSource;->indexOf(Lcom/android/okhttp/okio/ByteString;)J
-Lcom/android/okhttp/okio/BufferedSource;->indexOf(Lcom/android/okhttp/okio/ByteString;J)J
-Lcom/android/okhttp/okio/BufferedSource;->indexOfElement(Lcom/android/okhttp/okio/ByteString;)J
-Lcom/android/okhttp/okio/BufferedSource;->indexOfElement(Lcom/android/okhttp/okio/ByteString;J)J
-Lcom/android/okhttp/okio/BufferedSource;->inputStream()Ljava/io/InputStream;
-Lcom/android/okhttp/okio/BufferedSource;->read([B)I
-Lcom/android/okhttp/okio/BufferedSource;->read([BII)I
-Lcom/android/okhttp/okio/BufferedSource;->readAll(Lcom/android/okhttp/okio/Sink;)J
-Lcom/android/okhttp/okio/BufferedSource;->readByte()B
-Lcom/android/okhttp/okio/BufferedSource;->readByteArray()[B
-Lcom/android/okhttp/okio/BufferedSource;->readByteArray(J)[B
-Lcom/android/okhttp/okio/BufferedSource;->readByteString()Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/BufferedSource;->readByteString(J)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/BufferedSource;->readDecimalLong()J
-Lcom/android/okhttp/okio/BufferedSource;->readFully(Lcom/android/okhttp/okio/Buffer;J)V
-Lcom/android/okhttp/okio/BufferedSource;->readFully([B)V
-Lcom/android/okhttp/okio/BufferedSource;->readHexadecimalUnsignedLong()J
-Lcom/android/okhttp/okio/BufferedSource;->readInt()I
-Lcom/android/okhttp/okio/BufferedSource;->readIntLe()I
-Lcom/android/okhttp/okio/BufferedSource;->readLong()J
-Lcom/android/okhttp/okio/BufferedSource;->readLongLe()J
-Lcom/android/okhttp/okio/BufferedSource;->readShort()S
-Lcom/android/okhttp/okio/BufferedSource;->readShortLe()S
-Lcom/android/okhttp/okio/BufferedSource;->readString(JLjava/nio/charset/Charset;)Ljava/lang/String;
-Lcom/android/okhttp/okio/BufferedSource;->readString(Ljava/nio/charset/Charset;)Ljava/lang/String;
-Lcom/android/okhttp/okio/BufferedSource;->readUtf8()Ljava/lang/String;
-Lcom/android/okhttp/okio/BufferedSource;->readUtf8(J)Ljava/lang/String;
-Lcom/android/okhttp/okio/BufferedSource;->readUtf8CodePoint()I
-Lcom/android/okhttp/okio/BufferedSource;->readUtf8Line()Ljava/lang/String;
-Lcom/android/okhttp/okio/BufferedSource;->readUtf8LineStrict()Ljava/lang/String;
-Lcom/android/okhttp/okio/BufferedSource;->request(J)Z
-Lcom/android/okhttp/okio/BufferedSource;->require(J)V
-Lcom/android/okhttp/okio/BufferedSource;->skip(J)V
-Lcom/android/okhttp/okio/ByteString;-><init>([B)V
-Lcom/android/okhttp/okio/ByteString;->base64()Ljava/lang/String;
-Lcom/android/okhttp/okio/ByteString;->base64Url()Ljava/lang/String;
-Lcom/android/okhttp/okio/ByteString;->compareTo(Lcom/android/okhttp/okio/ByteString;)I
-Lcom/android/okhttp/okio/ByteString;->compareTo(Ljava/lang/Object;)I
-Lcom/android/okhttp/okio/ByteString;->data:[B
-Lcom/android/okhttp/okio/ByteString;->decodeBase64(Ljava/lang/String;)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->decodeHex(Ljava/lang/String;)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->decodeHexDigit(C)I
-Lcom/android/okhttp/okio/ByteString;->digest(Ljava/lang/String;)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->EMPTY:Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->encodeUtf8(Ljava/lang/String;)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->getByte(I)B
-Lcom/android/okhttp/okio/ByteString;->hashCode:I
-Lcom/android/okhttp/okio/ByteString;->hex()Ljava/lang/String;
-Lcom/android/okhttp/okio/ByteString;->HEX_DIGITS:[C
-Lcom/android/okhttp/okio/ByteString;->md5()Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->of([BII)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->rangeEquals(ILcom/android/okhttp/okio/ByteString;II)Z
-Lcom/android/okhttp/okio/ByteString;->rangeEquals(I[BII)Z
-Lcom/android/okhttp/okio/ByteString;->read(Ljava/io/InputStream;I)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->sha256()Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->size()I
-Lcom/android/okhttp/okio/ByteString;->substring(I)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->substring(II)Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->toAsciiLowercase()Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->toAsciiUppercase()Lcom/android/okhttp/okio/ByteString;
-Lcom/android/okhttp/okio/ByteString;->toByteArray()[B
-Lcom/android/okhttp/okio/ByteString;->utf8()Ljava/lang/String;
-Lcom/android/okhttp/okio/ByteString;->utf8:Ljava/lang/String;
-Lcom/android/okhttp/okio/ByteString;->write(Lcom/android/okhttp/okio/Buffer;)V
-Lcom/android/okhttp/okio/ByteString;->write(Ljava/io/OutputStream;)V
-Lcom/android/okhttp/okio/Segment;-><init>()V
-Lcom/android/okhttp/okio/Segment;-><init>(Lcom/android/okhttp/okio/Segment;)V
-Lcom/android/okhttp/okio/Segment;-><init>([BII)V
-Lcom/android/okhttp/okio/Segment;->compact()V
-Lcom/android/okhttp/okio/Segment;->data:[B
-Lcom/android/okhttp/okio/Segment;->limit:I
-Lcom/android/okhttp/okio/Segment;->next:Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/Segment;->owner:Z
-Lcom/android/okhttp/okio/Segment;->pop()Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/Segment;->pos:I
-Lcom/android/okhttp/okio/Segment;->prev:Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/Segment;->push(Lcom/android/okhttp/okio/Segment;)Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/Segment;->shared:Z
-Lcom/android/okhttp/okio/Segment;->SIZE:I
-Lcom/android/okhttp/okio/Segment;->split(I)Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/Segment;->writeTo(Lcom/android/okhttp/okio/Segment;I)V
-Lcom/android/okhttp/okio/Sink;->timeout()Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Sink;->write(Lcom/android/okhttp/okio/Buffer;J)V
-Lcom/android/okhttp/okio/Source;->read(Lcom/android/okhttp/okio/Buffer;J)J
-Lcom/android/okhttp/okio/Source;->timeout()Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout;-><init>()V
-Lcom/android/okhttp/okio/Timeout;->clearDeadline()Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout;->clearTimeout()Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout;->deadline(JLjava/util/concurrent/TimeUnit;)Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout;->deadlineNanoTime()J
-Lcom/android/okhttp/okio/Timeout;->deadlineNanoTime(J)Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout;->deadlineNanoTime:J
-Lcom/android/okhttp/okio/Timeout;->hasDeadline()Z
-Lcom/android/okhttp/okio/Timeout;->hasDeadline:Z
-Lcom/android/okhttp/okio/Timeout;->NONE:Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout;->throwIfReached()V
-Lcom/android/okhttp/okio/Timeout;->timeout(JLjava/util/concurrent/TimeUnit;)Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout;->timeoutNanos()J
-Lcom/android/okhttp/okio/Timeout;->timeoutNanos:J
-Lcom/android/okhttp/Protocol;->get(Ljava/lang/String;)Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Protocol;->HTTP_1_0:Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Protocol;->HTTP_1_1:Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Protocol;->HTTP_2:Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Protocol;->protocol:Ljava/lang/String;
-Lcom/android/okhttp/Protocol;->SPDY_3:Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Protocol;->valueOf(Ljava/lang/String;)Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Protocol;->values()[Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Request$Builder;-><init>()V
-Lcom/android/okhttp/Request$Builder;-><init>(Lcom/android/okhttp/Request;)V
-Lcom/android/okhttp/Request$Builder;->addHeader(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->body:Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/Request$Builder;->build()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Request$Builder;->cacheControl(Lcom/android/okhttp/CacheControl;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->delete()Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->delete(Lcom/android/okhttp/RequestBody;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->get()Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->head()Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->header(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->headers(Lcom/android/okhttp/Headers;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->headers:Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Request$Builder;->method(Ljava/lang/String;Lcom/android/okhttp/RequestBody;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->method:Ljava/lang/String;
-Lcom/android/okhttp/Request$Builder;->patch(Lcom/android/okhttp/RequestBody;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->post(Lcom/android/okhttp/RequestBody;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->put(Lcom/android/okhttp/RequestBody;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->removeHeader(Ljava/lang/String;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->tag(Ljava/lang/Object;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->tag:Ljava/lang/Object;
-Lcom/android/okhttp/Request$Builder;->url(Lcom/android/okhttp/HttpUrl;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->url(Ljava/lang/String;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->url(Ljava/net/URL;)Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request$Builder;->url:Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/Request;-><init>(Lcom/android/okhttp/Request$Builder;)V
-Lcom/android/okhttp/Request;->body()Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/Request;->body:Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/Request;->cacheControl()Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/Request;->cacheControl:Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/Request;->header(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/Request;->headers()Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/Request;->headers(Ljava/lang/String;)Ljava/util/List;
-Lcom/android/okhttp/Request;->httpUrl()Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/Request;->isHttps()Z
-Lcom/android/okhttp/Request;->javaNetUri:Ljava/net/URI;
-Lcom/android/okhttp/Request;->javaNetUrl:Ljava/net/URL;
-Lcom/android/okhttp/Request;->method()Ljava/lang/String;
-Lcom/android/okhttp/Request;->newBuilder()Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Request;->tag()Ljava/lang/Object;
-Lcom/android/okhttp/Request;->tag:Ljava/lang/Object;
-Lcom/android/okhttp/Request;->uri()Ljava/net/URI;
-Lcom/android/okhttp/Request;->url()Ljava/net/URL;
-Lcom/android/okhttp/Request;->urlString()Ljava/lang/String;
-Lcom/android/okhttp/RequestBody;-><init>()V
-Lcom/android/okhttp/RequestBody;->contentLength()J
-Lcom/android/okhttp/RequestBody;->contentType()Lcom/android/okhttp/MediaType;
-Lcom/android/okhttp/RequestBody;->create(Lcom/android/okhttp/MediaType;Lcom/android/okhttp/okio/ByteString;)Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/RequestBody;->create(Lcom/android/okhttp/MediaType;Ljava/io/File;)Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/RequestBody;->create(Lcom/android/okhttp/MediaType;Ljava/lang/String;)Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/RequestBody;->create(Lcom/android/okhttp/MediaType;[B)Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/RequestBody;->create(Lcom/android/okhttp/MediaType;[BII)Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/RequestBody;->writeTo(Lcom/android/okhttp/okio/BufferedSink;)V
-Lcom/android/okhttp/Response$Builder;-><init>()V
-Lcom/android/okhttp/Response$Builder;-><init>(Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/Response$Builder;->addHeader(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->body(Lcom/android/okhttp/ResponseBody;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->body:Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/Response$Builder;->build()Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response$Builder;->cacheResponse(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->cacheResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response$Builder;->checkPriorResponse(Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/Response$Builder;->checkSupportResponse(Ljava/lang/String;Lcom/android/okhttp/Response;)V
-Lcom/android/okhttp/Response$Builder;->code(I)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->code:I
-Lcom/android/okhttp/Response$Builder;->handshake(Lcom/android/okhttp/Handshake;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->handshake:Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Response$Builder;->header(Ljava/lang/String;Ljava/lang/String;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->headers(Lcom/android/okhttp/Headers;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->headers:Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/Response$Builder;->message(Ljava/lang/String;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->message:Ljava/lang/String;
-Lcom/android/okhttp/Response$Builder;->networkResponse(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->networkResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response$Builder;->priorResponse(Lcom/android/okhttp/Response;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->priorResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response$Builder;->protocol(Lcom/android/okhttp/Protocol;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->protocol:Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Response$Builder;->removeHeader(Ljava/lang/String;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->request(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response$Builder;->request:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Response;-><init>(Lcom/android/okhttp/Response$Builder;)V
-Lcom/android/okhttp/Response;->body()Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/Response;->body:Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/Response;->cacheControl()Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/Response;->cacheControl:Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/Response;->cacheResponse()Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response;->cacheResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response;->challenges()Ljava/util/List;
-Lcom/android/okhttp/Response;->code()I
-Lcom/android/okhttp/Response;->handshake()Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Response;->handshake:Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Response;->header(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/Response;->header(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/okhttp/Response;->headers()Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/Response;->headers(Ljava/lang/String;)Ljava/util/List;
-Lcom/android/okhttp/Response;->isRedirect()Z
-Lcom/android/okhttp/Response;->isSuccessful()Z
-Lcom/android/okhttp/Response;->message()Ljava/lang/String;
-Lcom/android/okhttp/Response;->networkResponse()Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response;->newBuilder()Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Response;->priorResponse()Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response;->priorResponse:Lcom/android/okhttp/Response;
-Lcom/android/okhttp/Response;->protocol()Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Response;->request()Lcom/android/okhttp/Request;
-Lcom/android/okhttp/Response;->request:Lcom/android/okhttp/Request;
-Lcom/android/okhttp/ResponseBody;-><init>()V
-Lcom/android/okhttp/ResponseBody;->bytes()[B
-Lcom/android/okhttp/ResponseBody;->byteStream()Ljava/io/InputStream;
-Lcom/android/okhttp/ResponseBody;->charset()Ljava/nio/charset/Charset;
-Lcom/android/okhttp/ResponseBody;->charStream()Ljava/io/Reader;
-Lcom/android/okhttp/ResponseBody;->contentLength()J
-Lcom/android/okhttp/ResponseBody;->contentType()Lcom/android/okhttp/MediaType;
-Lcom/android/okhttp/ResponseBody;->create(Lcom/android/okhttp/MediaType;JLcom/android/okhttp/okio/BufferedSource;)Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/ResponseBody;->create(Lcom/android/okhttp/MediaType;Ljava/lang/String;)Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/ResponseBody;->create(Lcom/android/okhttp/MediaType;[B)Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/ResponseBody;->reader:Ljava/io/Reader;
-Lcom/android/okhttp/ResponseBody;->source()Lcom/android/okhttp/okio/BufferedSource;
-Lcom/android/okhttp/ResponseBody;->string()Ljava/lang/String;
-Lcom/android/okhttp/Route;-><init>(Lcom/android/okhttp/Address;Ljava/net/Proxy;Ljava/net/InetSocketAddress;)V
-Lcom/android/okhttp/Route;->address:Lcom/android/okhttp/Address;
-Lcom/android/okhttp/Route;->getAddress()Lcom/android/okhttp/Address;
-Lcom/android/okhttp/Route;->getProxy()Ljava/net/Proxy;
-Lcom/android/okhttp/Route;->getSocketAddress()Ljava/net/InetSocketAddress;
-Lcom/android/okhttp/Route;->inetSocketAddress:Ljava/net/InetSocketAddress;
-Lcom/android/okhttp/Route;->proxy:Ljava/net/Proxy;
-Lcom/android/okhttp/Route;->requiresTunnel()Z
-Lcom/android/okhttp/TlsVersion;->forJavaName(Ljava/lang/String;)Lcom/android/okhttp/TlsVersion;
-Lcom/android/okhttp/TlsVersion;->javaName()Ljava/lang/String;
-Lcom/android/okhttp/TlsVersion;->javaName:Ljava/lang/String;
-Lcom/android/okhttp/TlsVersion;->SSL_3_0:Lcom/android/okhttp/TlsVersion;
-Lcom/android/okhttp/TlsVersion;->TLS_1_0:Lcom/android/okhttp/TlsVersion;
-Lcom/android/okhttp/TlsVersion;->TLS_1_1:Lcom/android/okhttp/TlsVersion;
-Lcom/android/okhttp/TlsVersion;->TLS_1_2:Lcom/android/okhttp/TlsVersion;
-Lcom/android/okhttp/TlsVersion;->valueOf(Ljava/lang/String;)Lcom/android/okhttp/TlsVersion;
-Lcom/android/okhttp/TlsVersion;->values()[Lcom/android/okhttp/TlsVersion;
 Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>()V
 Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>(Ljava/lang/String;I)V
 Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>(Ljava/lang/String;ILjava/net/InetAddress;I)V
@@ -102641,9868 +94140,6 @@
 Lcom/android/org/conscrypt/TrustManagerImpl;->TRUST_ANCHOR_COMPARATOR:Lcom/android/org/conscrypt/TrustManagerImpl$TrustAnchorComparator;
 Lcom/android/org/conscrypt/TrustManagerImpl;->validator:Ljava/security/cert/CertPathValidator;
 Lcom/android/org/conscrypt/TrustManagerImpl;->verifyChain(Ljava/util/List;Ljava/util/List;Ljava/lang/String;Z[B[B)Ljava/util/List;
-Ldalvik/bytecode/OpcodeInfo;-><init>()V
-Ldalvik/bytecode/OpcodeInfo;->isInvoke(I)Z
-Ldalvik/system/AllocationLimitError;-><init>()V
-Ldalvik/system/AllocationLimitError;-><init>(Ljava/lang/String;)V
-Ldalvik/system/AnnotatedStackTraceElement;-><init>()V
-Ldalvik/system/AnnotatedStackTraceElement;->blockedOn:Ljava/lang/Object;
-Ldalvik/system/AnnotatedStackTraceElement;->getBlockedOn()Ljava/lang/Object;
-Ldalvik/system/AnnotatedStackTraceElement;->getHeldLocks()[Ljava/lang/Object;
-Ldalvik/system/AnnotatedStackTraceElement;->getStackTraceElement()Ljava/lang/StackTraceElement;
-Ldalvik/system/AnnotatedStackTraceElement;->heldLocks:[Ljava/lang/Object;
-Ldalvik/system/AnnotatedStackTraceElement;->stackTraceElement:Ljava/lang/StackTraceElement;
-Ldalvik/system/BaseDexClassLoader$Reporter;->report(Ljava/util/List;Ljava/util/List;)V
-Ldalvik/system/BaseDexClassLoader;-><init>([Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V
-Ldalvik/system/BaseDexClassLoader;->addNativePath(Ljava/util/Collection;)V
-Ldalvik/system/BaseDexClassLoader;->getReporter()Ldalvik/system/BaseDexClassLoader$Reporter;
-Ldalvik/system/BaseDexClassLoader;->reportClassLoaderChain()V
-Ldalvik/system/BaseDexClassLoader;->reporter:Ldalvik/system/BaseDexClassLoader$Reporter;
-Ldalvik/system/BaseDexClassLoader;->setReporter(Ldalvik/system/BaseDexClassLoader$Reporter;)V
-Ldalvik/system/BlockGuard$BlockGuardPolicyException;-><init>(II)V
-Ldalvik/system/BlockGuard$BlockGuardPolicyException;->getPolicy()I
-Ldalvik/system/BlockGuard$BlockGuardPolicyException;->getPolicyViolation()I
-Ldalvik/system/BlockGuard$Policy;->getPolicyMask()I
-Ldalvik/system/BlockGuard$Policy;->onUnbufferedIO()V
-Ldalvik/system/BlockGuard$Policy;->onWriteToDisk()V
-Ldalvik/system/BlockGuard;-><init>()V
-Ldalvik/system/BlockGuard;->DISALLOW_DISK_READ:I
-Ldalvik/system/BlockGuard;->DISALLOW_DISK_WRITE:I
-Ldalvik/system/BlockGuard;->DISALLOW_NETWORK:I
-Ldalvik/system/BlockGuard;->PASS_RESTRICTIONS_VIA_RPC:I
-Ldalvik/system/BlockGuard;->PENALTY_DEATH:I
-Ldalvik/system/BlockGuard;->PENALTY_DIALOG:I
-Ldalvik/system/BlockGuard;->PENALTY_LOG:I
-Ldalvik/system/ClassExt;-><init>()V
-Ldalvik/system/ClassExt;->obsoleteDexCaches:[Ljava/lang/Object;
-Ldalvik/system/ClassExt;->obsoleteMethods:Ljava/lang/Object;
-Ldalvik/system/ClassExt;->originalDexFile:Ljava/lang/Object;
-Ldalvik/system/ClassExt;->verifyError:Ljava/lang/Object;
-Ldalvik/system/CloseGuard$DefaultReporter;->report(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ldalvik/system/CloseGuard$Tracker;->close(Ljava/lang/Throwable;)V
-Ldalvik/system/CloseGuard$Tracker;->open(Ljava/lang/Throwable;)V
-Ldalvik/system/CloseGuard;->closerNameOrAllocationInfo:Ljava/lang/Object;
-Ldalvik/system/CloseGuard;->currentTracker:Ldalvik/system/CloseGuard$Tracker;
-Ldalvik/system/CloseGuard;->getReporter()Ldalvik/system/CloseGuard$Reporter;
-Ldalvik/system/CloseGuard;->getTracker()Ldalvik/system/CloseGuard$Tracker;
-Ldalvik/system/CloseGuard;->isEnabled()Z
-Ldalvik/system/CloseGuard;->reporter:Ldalvik/system/CloseGuard$Reporter;
-Ldalvik/system/CloseGuard;->setTracker(Ldalvik/system/CloseGuard$Tracker;)V
-Ldalvik/system/CloseGuard;->stackAndTrackingEnabled:Z
-Ldalvik/system/DalvikLogging;-><init>()V
-Ldalvik/system/DalvikLogging;->loggerNameToTag(Ljava/lang/String;)Ljava/lang/String;
-Ldalvik/system/DalvikLogHandler;->publish(Ljava/util/logging/Logger;Ljava/lang/String;Ljava/util/logging/Level;Ljava/lang/String;)V
-Ldalvik/system/DexFile$DFEnum;-><init>(Ldalvik/system/DexFile;)V
-Ldalvik/system/DexFile$DFEnum;->mIndex:I
-Ldalvik/system/DexFile$OptimizationInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Ldalvik/system/DexFile$OptimizationInfo;->getReason()Ljava/lang/String;
-Ldalvik/system/DexFile$OptimizationInfo;->getStatus()Ljava/lang/String;
-Ldalvik/system/DexFile$OptimizationInfo;->reason:Ljava/lang/String;
-Ldalvik/system/DexFile$OptimizationInfo;->status:Ljava/lang/String;
-Ldalvik/system/DexFile;-><init>(Ljava/io/File;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)V
-Ldalvik/system/DexFile;-><init>(Ljava/lang/String;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)V
-Ldalvik/system/DexFile;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)V
-Ldalvik/system/DexFile;-><init>(Ljava/nio/ByteBuffer;)V
-Ldalvik/system/DexFile;->closeDexFile(Ljava/lang/Object;)Z
-Ldalvik/system/DexFile;->createCookieWithArray([BII)Ljava/lang/Object;
-Ldalvik/system/DexFile;->createCookieWithDirectBuffer(Ljava/nio/ByteBuffer;II)Ljava/lang/Object;
-Ldalvik/system/DexFile;->defineClass(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/Object;Ldalvik/system/DexFile;Ljava/util/List;)Ljava/lang/Class;
-Ldalvik/system/DexFile;->defineClassNative(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/Object;Ldalvik/system/DexFile;)Ljava/lang/Class;
-Ldalvik/system/DexFile;->DEX2OAT_FOR_BOOT_IMAGE:I
-Ldalvik/system/DexFile;->DEX2OAT_FOR_FILTER:I
-Ldalvik/system/DexFile;->DEX2OAT_FOR_RELOCATION:I
-Ldalvik/system/DexFile;->DEX2OAT_FROM_SCRATCH:I
-Ldalvik/system/DexFile;->getDexFileOptimizationInfo(Ljava/lang/String;Ljava/lang/String;)Ldalvik/system/DexFile$OptimizationInfo;
-Ldalvik/system/DexFile;->getDexFileOptimizationStatus(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
-Ldalvik/system/DexFile;->getDexFileOutputPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
-Ldalvik/system/DexFile;->getDexFileStatus(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Ldalvik/system/DexFile;->getDexOptNeeded(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)I
-Ldalvik/system/DexFile;->getDexOptNeeded(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)I
-Ldalvik/system/DexFile;->getNonProfileGuidedCompilerFilter(Ljava/lang/String;)Ljava/lang/String;
-Ldalvik/system/DexFile;->getSafeModeCompilerFilter(Ljava/lang/String;)Ljava/lang/String;
-Ldalvik/system/DexFile;->getStaticSizeOfDexFile()J
-Ldalvik/system/DexFile;->getStaticSizeOfDexFile(Ljava/lang/Object;)J
-Ldalvik/system/DexFile;->isBackedByOatFile(Ljava/lang/Object;)Z
-Ldalvik/system/DexFile;->isProfileGuidedCompilerFilter(Ljava/lang/String;)Z
-Ldalvik/system/DexFile;->isValidCompilerFilter(Ljava/lang/String;)Z
-Ldalvik/system/DexFile;->NO_DEXOPT_NEEDED:I
-Ldalvik/system/DexFile;->openInMemoryDexFile(Ljava/nio/ByteBuffer;)Ljava/lang/Object;
-Ldalvik/system/DexFile;->setTrusted()V
-Ldalvik/system/DexFile;->setTrusted(Ljava/lang/Object;)V
-Ldalvik/system/DexPathList$Element;-><init>(Ldalvik/system/DexFile;)V
-Ldalvik/system/DexPathList$Element;-><init>(Ljava/io/File;)V
-Ldalvik/system/DexPathList$Element;->findClass(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/List;)Ljava/lang/Class;
-Ldalvik/system/DexPathList$Element;->findResource(Ljava/lang/String;)Ljava/net/URL;
-Ldalvik/system/DexPathList$Element;->getDexPath()Ljava/lang/String;
-Ldalvik/system/DexPathList$Element;->initialized:Z
-Ldalvik/system/DexPathList$Element;->maybeInit()V
-Ldalvik/system/DexPathList$Element;->urlHandler:Llibcore/io/ClassPathURLStreamHandler;
-Ldalvik/system/DexPathList$NativeLibraryElement;-><init>(Ljava/io/File;Ljava/lang/String;)V
-Ldalvik/system/DexPathList$NativeLibraryElement;->findNativeLibrary(Ljava/lang/String;)Ljava/lang/String;
-Ldalvik/system/DexPathList$NativeLibraryElement;->initialized:Z
-Ldalvik/system/DexPathList$NativeLibraryElement;->maybeInit()V
-Ldalvik/system/DexPathList$NativeLibraryElement;->urlHandler:Llibcore/io/ClassPathURLStreamHandler;
-Ldalvik/system/DexPathList$NativeLibraryElement;->zipDir:Ljava/lang/String;
-Ldalvik/system/DexPathList;-><init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Z)V
-Ldalvik/system/DexPathList;-><init>(Ljava/lang/ClassLoader;[Ljava/nio/ByteBuffer;)V
-Ldalvik/system/DexPathList;->addDexPath(Ljava/lang/String;Ljava/io/File;Z)V
-Ldalvik/system/DexPathList;->DEX_SUFFIX:Ljava/lang/String;
-Ldalvik/system/DexPathList;->findClass(Ljava/lang/String;Ljava/util/List;)Ljava/lang/Class;
-Ldalvik/system/DexPathList;->findLibrary(Ljava/lang/String;)Ljava/lang/String;
-Ldalvik/system/DexPathList;->findResource(Ljava/lang/String;)Ljava/net/URL;
-Ldalvik/system/DexPathList;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;
-Ldalvik/system/DexPathList;->getDexPaths()Ljava/util/List;
-Ldalvik/system/DexPathList;->getNativeLibraryDirectories()Ljava/util/List;
-Ldalvik/system/DexPathList;->makeDexElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;Ljava/lang/ClassLoader;Z)[Ldalvik/system/DexPathList$Element;
-Ldalvik/system/DexPathList;->optimizedPathFor(Ljava/io/File;Ljava/io/File;)Ljava/lang/String;
-Ldalvik/system/DexPathList;->splitDexPath(Ljava/lang/String;)Ljava/util/List;
-Ldalvik/system/DexPathList;->zipSeparator:Ljava/lang/String;
-Ldalvik/system/EmulatedStackFrame$Range;-><init>(IIII)V
-Ldalvik/system/EmulatedStackFrame$Range;->all(Ljava/lang/invoke/MethodType;)Ldalvik/system/EmulatedStackFrame$Range;
-Ldalvik/system/EmulatedStackFrame$Range;->numBytes:I
-Ldalvik/system/EmulatedStackFrame$Range;->numReferences:I
-Ldalvik/system/EmulatedStackFrame$Range;->of(Ljava/lang/invoke/MethodType;II)Ldalvik/system/EmulatedStackFrame$Range;
-Ldalvik/system/EmulatedStackFrame$Range;->referencesStart:I
-Ldalvik/system/EmulatedStackFrame$Range;->stackFrameStart:I
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;-><init>()V
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->argumentIdx:I
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->attach(Ldalvik/system/EmulatedStackFrame;)Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->attach(Ldalvik/system/EmulatedStackFrame;III)Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->checkType(Ljava/lang/Class;)V
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->copyNext(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->frame:Ldalvik/system/EmulatedStackFrame;
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->frameBuf:Ljava/nio/ByteBuffer;
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->makeReturnValueAccessor()V
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->numArgs:I
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->referencesOffset:I
-Ldalvik/system/EmulatedStackFrame$StackFrameAccessor;->RETURN_VALUE_IDX:I
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;-><init>()V
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextBoolean()Z
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextByte()B
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextChar()C
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextDouble()D
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextFloat()F
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextInt()I
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextLong()J
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextReference(Ljava/lang/Class;)Ljava/lang/Object;
-Ldalvik/system/EmulatedStackFrame$StackFrameReader;->nextShort()S
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;-><init>()V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextBoolean(Z)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextByte(B)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextChar(C)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextDouble(D)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextFloat(F)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextInt(I)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextLong(J)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextReference(Ljava/lang/Object;Ljava/lang/Class;)V
-Ldalvik/system/EmulatedStackFrame$StackFrameWriter;->putNextShort(S)V
-Ldalvik/system/EmulatedStackFrame;-><init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;[B)V
-Ldalvik/system/EmulatedStackFrame;->callsiteType:Ljava/lang/invoke/MethodType;
-Ldalvik/system/EmulatedStackFrame;->copyRangeTo(Ldalvik/system/EmulatedStackFrame;Ldalvik/system/EmulatedStackFrame$Range;II)V
-Ldalvik/system/EmulatedStackFrame;->copyReturnValueTo(Ldalvik/system/EmulatedStackFrame;)V
-Ldalvik/system/EmulatedStackFrame;->create(Ljava/lang/invoke/MethodType;)Ldalvik/system/EmulatedStackFrame;
-Ldalvik/system/EmulatedStackFrame;->getCallsiteType()Ljava/lang/invoke/MethodType;
-Ldalvik/system/EmulatedStackFrame;->getMethodType()Ljava/lang/invoke/MethodType;
-Ldalvik/system/EmulatedStackFrame;->getReference(ILjava/lang/Class;)Ljava/lang/Object;
-Ldalvik/system/EmulatedStackFrame;->getSize(Ljava/lang/Class;)I
-Ldalvik/system/EmulatedStackFrame;->is64BitPrimitive(Ljava/lang/Class;)Z
-Ldalvik/system/EmulatedStackFrame;->references:[Ljava/lang/Object;
-Ldalvik/system/EmulatedStackFrame;->setReference(ILjava/lang/Object;)V
-Ldalvik/system/EmulatedStackFrame;->setReturnValueTo(Ljava/lang/Object;)V
-Ldalvik/system/EmulatedStackFrame;->stackFrame:[B
-Ldalvik/system/EmulatedStackFrame;->type:Ljava/lang/invoke/MethodType;
-Ldalvik/system/PotentialDeadlockError;-><init>()V
-Ldalvik/system/PotentialDeadlockError;-><init>(Ljava/lang/String;)V
-Ldalvik/system/SocketTagger;-><init>()V
-Ldalvik/system/SocketTagger;->set(Ldalvik/system/SocketTagger;)V
-Ldalvik/system/SocketTagger;->tag(Ljava/io/FileDescriptor;)V
-Ldalvik/system/SocketTagger;->tag(Ljava/net/DatagramSocket;)V
-Ldalvik/system/SocketTagger;->tagger:Ldalvik/system/SocketTagger;
-Ldalvik/system/SocketTagger;->untag(Ljava/io/FileDescriptor;)V
-Ldalvik/system/SocketTagger;->untag(Ljava/net/DatagramSocket;)V
-Ldalvik/system/TemporaryDirectory;-><init>()V
-Ldalvik/system/TemporaryDirectory;->setUpDirectory(Ljava/io/File;)V
-Ldalvik/system/TemporaryDirectory;->setUpDirectory(Ljava/lang/String;)V
-Ldalvik/system/VMDebug;-><init>()V
-Ldalvik/system/VMDebug;->attachAgent(Ljava/lang/String;)V
-Ldalvik/system/VMDebug;->attachAgent(Ljava/lang/String;Ljava/lang/ClassLoader;)V
-Ldalvik/system/VMDebug;->cacheRegisterMap(Ljava/lang/String;)Z
-Ldalvik/system/VMDebug;->checkBufferSize(I)I
-Ldalvik/system/VMDebug;->countInstancesOfClass(Ljava/lang/Class;Z)J
-Ldalvik/system/VMDebug;->countInstancesOfClasses([Ljava/lang/Class;Z)[J
-Ldalvik/system/VMDebug;->crash()V
-Ldalvik/system/VMDebug;->dumpHprofData(Ljava/lang/String;)V
-Ldalvik/system/VMDebug;->dumpHprofData(Ljava/lang/String;I)V
-Ldalvik/system/VMDebug;->dumpHprofData(Ljava/lang/String;Ljava/io/FileDescriptor;)V
-Ldalvik/system/VMDebug;->dumpHprofDataDdms()V
-Ldalvik/system/VMDebug;->getAllocCount(I)I
-Ldalvik/system/VMDebug;->getHeapSpaceStats([J)V
-Ldalvik/system/VMDebug;->getInstancesOfClasses([Ljava/lang/Class;Z)[[Ljava/lang/Object;
-Ldalvik/system/VMDebug;->getInstructionCount([I)V
-Ldalvik/system/VMDebug;->getLoadedClassCount()I
-Ldalvik/system/VMDebug;->getMethodTracingMode()I
-Ldalvik/system/VMDebug;->getRuntimeStat(Ljava/lang/String;)Ljava/lang/String;
-Ldalvik/system/VMDebug;->getRuntimeStatInternal(I)Ljava/lang/String;
-Ldalvik/system/VMDebug;->getRuntimeStats()Ljava/util/Map;
-Ldalvik/system/VMDebug;->getRuntimeStatsInternal()[Ljava/lang/String;
-Ldalvik/system/VMDebug;->getVmFeatureList()[Ljava/lang/String;
-Ldalvik/system/VMDebug;->infopoint(I)V
-Ldalvik/system/VMDebug;->isDebuggingEnabled()Z
-Ldalvik/system/VMDebug;->KIND_ALLOCATED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_ALLOCATED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_ALL_COUNTS:I
-Ldalvik/system/VMDebug;->KIND_CLASS_INIT_COUNT:I
-Ldalvik/system/VMDebug;->KIND_CLASS_INIT_TIME:I
-Ldalvik/system/VMDebug;->KIND_EXT_ALLOCATED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_EXT_ALLOCATED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_EXT_FREED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_EXT_FREED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_FREED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_FREED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_GC_INVOCATIONS:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_ALLOCATED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_ALLOCATED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_CLASS_INIT_COUNT:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_CLASS_INIT_TIME:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_EXT_ALLOCATED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_EXT_ALLOCATED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_EXT_FREED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_EXT_FREED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_FREED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_FREED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_GLOBAL_GC_INVOCATIONS:I
-Ldalvik/system/VMDebug;->KIND_THREAD_ALLOCATED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_THREAD_ALLOCATED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_THREAD_CLASS_INIT_COUNT:I
-Ldalvik/system/VMDebug;->KIND_THREAD_CLASS_INIT_TIME:I
-Ldalvik/system/VMDebug;->KIND_THREAD_EXT_ALLOCATED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_THREAD_EXT_ALLOCATED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_THREAD_EXT_FREED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_THREAD_EXT_FREED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_THREAD_FREED_BYTES:I
-Ldalvik/system/VMDebug;->KIND_THREAD_FREED_OBJECTS:I
-Ldalvik/system/VMDebug;->KIND_THREAD_GC_INVOCATIONS:I
-Ldalvik/system/VMDebug;->lastDebuggerActivity()J
-Ldalvik/system/VMDebug;->nativeAttachAgent(Ljava/lang/String;Ljava/lang/ClassLoader;)V
-Ldalvik/system/VMDebug;->printLoadedClasses(I)V
-Ldalvik/system/VMDebug;->resetAllocCount(I)V
-Ldalvik/system/VMDebug;->resetInstructionCount()V
-Ldalvik/system/VMDebug;->runtimeStatsMap:Ljava/util/HashMap;
-Ldalvik/system/VMDebug;->setAllocationLimit(I)I
-Ldalvik/system/VMDebug;->setGlobalAllocationLimit(I)I
-Ldalvik/system/VMDebug;->startAllocCounting()V
-Ldalvik/system/VMDebug;->startClassPrep()V
-Ldalvik/system/VMDebug;->startEmulatorTracing()V
-Ldalvik/system/VMDebug;->startGC()V
-Ldalvik/system/VMDebug;->startInstructionCounting()V
-Ldalvik/system/VMDebug;->startMethodTracing()V
-Ldalvik/system/VMDebug;->startMethodTracing(Ljava/lang/String;IIZI)V
-Ldalvik/system/VMDebug;->startMethodTracing(Ljava/lang/String;Ljava/io/FileDescriptor;IIZI)V
-Ldalvik/system/VMDebug;->startMethodTracing(Ljava/lang/String;Ljava/io/FileDescriptor;IIZIZ)V
-Ldalvik/system/VMDebug;->startMethodTracingDdms(IIZI)V
-Ldalvik/system/VMDebug;->startMethodTracingDdmsImpl(IIZI)V
-Ldalvik/system/VMDebug;->startMethodTracingFd(Ljava/lang/String;IIIZIZ)V
-Ldalvik/system/VMDebug;->startMethodTracingFilename(Ljava/lang/String;IIZI)V
-Ldalvik/system/VMDebug;->stopAllocCounting()V
-Ldalvik/system/VMDebug;->stopEmulatorTracing()V
-Ldalvik/system/VMDebug;->stopInstructionCounting()V
-Ldalvik/system/VMDebug;->stopMethodTracing()V
-Ldalvik/system/VMDebug;->threadCpuTimeNanos()J
-Ldalvik/system/VMDebug;->TRACE_COUNT_ALLOCS:I
-Ldalvik/system/VMRuntime;-><init>()V
-Ldalvik/system/VMRuntime;->ABI_TO_INSTRUCTION_SET_MAP:Ljava/util/Map;
-Ldalvik/system/VMRuntime;->bootClassPath()Ljava/lang/String;
-Ldalvik/system/VMRuntime;->clampGrowthLimit()V
-Ldalvik/system/VMRuntime;->classPath()Ljava/lang/String;
-Ldalvik/system/VMRuntime;->concurrentGC()V
-Ldalvik/system/VMRuntime;->didPruneDalvikCache()Z
-Ldalvik/system/VMRuntime;->disableJitCompilation()V
-Ldalvik/system/VMRuntime;->getTargetHeapUtilization()F
-Ldalvik/system/VMRuntime;->getTargetSdkVersion()I
-Ldalvik/system/VMRuntime;->hasUsedHiddenApi()Z
-Ldalvik/system/VMRuntime;->is64BitInstructionSet(Ljava/lang/String;)Z
-Ldalvik/system/VMRuntime;->isBootClassPathOnDisk(Ljava/lang/String;)Z
-Ldalvik/system/VMRuntime;->isCheckJniEnabled()Z
-Ldalvik/system/VMRuntime;->isDebuggerActive()Z
-Ldalvik/system/VMRuntime;->isJavaDebuggable()Z
-Ldalvik/system/VMRuntime;->isNativeDebuggable()Z
-Ldalvik/system/VMRuntime;->nativeSetTargetHeapUtilization(F)V
-Ldalvik/system/VMRuntime;->newUnpaddedArray(Ljava/lang/Class;I)Ljava/lang/Object;
-Ldalvik/system/VMRuntime;->nonSdkApiUsageConsumer:Ljava/util/function/Consumer;
-Ldalvik/system/VMRuntime;->preloadDexCaches()V
-Ldalvik/system/VMRuntime;->properties()[Ljava/lang/String;
-Ldalvik/system/VMRuntime;->registerAppInfo(Ljava/lang/String;[Ljava/lang/String;)V
-Ldalvik/system/VMRuntime;->registerSensitiveThread()V
-Ldalvik/system/VMRuntime;->requestConcurrentGC()V
-Ldalvik/system/VMRuntime;->requestHeapTrim()V
-Ldalvik/system/VMRuntime;->runHeapTasks()V
-Ldalvik/system/VMRuntime;->SDK_VERSION_CUR_DEVELOPMENT:I
-Ldalvik/system/VMRuntime;->setDedupeHiddenApiWarnings(Z)V
-Ldalvik/system/VMRuntime;->setHiddenApiAccessLogSamplingRate(I)V
-Ldalvik/system/VMRuntime;->setNonSdkApiUsageConsumer(Ljava/util/function/Consumer;)V
-Ldalvik/system/VMRuntime;->setProcessPackageName(Ljava/lang/String;)V
-Ldalvik/system/VMRuntime;->setSystemDaemonThreadPriority()V
-Ldalvik/system/VMRuntime;->startHeapTaskProcessor()V
-Ldalvik/system/VMRuntime;->startJitCompilation()V
-Ldalvik/system/VMRuntime;->stopHeapTaskProcessor()V
-Ldalvik/system/VMRuntime;->targetSdkVersion:I
-Ldalvik/system/VMRuntime;->THE_ONE:Ldalvik/system/VMRuntime;
-Ldalvik/system/VMRuntime;->trimHeap()V
-Ldalvik/system/VMRuntime;->updateProcessState(I)V
-Ldalvik/system/VMRuntime;->vmVersion()Ljava/lang/String;
-Ldalvik/system/VMStack;-><init>()V
-Ldalvik/system/VMStack;->getAnnotatedThreadStackTrace(Ljava/lang/Thread;)[Ldalvik/system/AnnotatedStackTraceElement;
-Ldalvik/system/VMStack;->getClosestUserClassLoader()Ljava/lang/ClassLoader;
-Ldalvik/system/VMStack;->getStackClass1()Ljava/lang/Class;
-Ldalvik/system/ZygoteHooks;-><init>()V
-Ldalvik/system/ZygoteHooks;->nativePostForkChild(JIZZLjava/lang/String;)V
-Ldalvik/system/ZygoteHooks;->nativePreFork()J
-Ldalvik/system/ZygoteHooks;->postForkChild(IZZLjava/lang/String;)V
-Ldalvik/system/ZygoteHooks;->postForkCommon()V
-Ldalvik/system/ZygoteHooks;->preFork()V
-Ldalvik/system/ZygoteHooks;->startZygoteNoThreadCreation()V
-Ldalvik/system/ZygoteHooks;->stopZygoteNoThreadCreation()V
-Ldalvik/system/ZygoteHooks;->token:J
-Ldalvik/system/ZygoteHooks;->waitUntilAllThreadsStopped()V
-Ljava/awt/font/NumericShaper$Range;->base:I
-Ljava/awt/font/NumericShaper$Range;->end:I
-Ljava/awt/font/NumericShaper$Range;->getDigitBase()I
-Ljava/awt/font/NumericShaper$Range;->getNumericBase()C
-Ljava/awt/font/NumericShaper$Range;->indexToRange(I)Ljava/awt/font/NumericShaper$Range;
-Ljava/awt/font/NumericShaper$Range;->inRange(I)Z
-Ljava/awt/font/NumericShaper$Range;->maskToRangeSet(I)Ljava/util/Set;
-Ljava/awt/font/NumericShaper$Range;->start:I
-Ljava/awt/font/NumericShaper$Range;->toRangeIndex(Ljava/awt/font/NumericShaper$Range;)I
-Ljava/awt/font/NumericShaper$Range;->toRangeMask(Ljava/util/Set;)I
-Ljava/awt/font/NumericShaper;-><init>(II)V
-Ljava/awt/font/NumericShaper;-><init>(Ljava/awt/font/NumericShaper$Range;Ljava/util/Set;)V
-Ljava/awt/font/NumericShaper;->ARABIC_KEY:I
-Ljava/awt/font/NumericShaper;->bases:[C
-Ljava/awt/font/NumericShaper;->BENGALI_KEY:I
-Ljava/awt/font/NumericShaper;->BSEARCH_THRESHOLD:I
-Ljava/awt/font/NumericShaper;->checkParams([CII)V
-Ljava/awt/font/NumericShaper;->contexts:[C
-Ljava/awt/font/NumericShaper;->CONTEXTUAL_MASK:I
-Ljava/awt/font/NumericShaper;->ctCache:I
-Ljava/awt/font/NumericShaper;->ctCacheLimit:I
-Ljava/awt/font/NumericShaper;->currentRange:Ljava/awt/font/NumericShaper$Range;
-Ljava/awt/font/NumericShaper;->DEVANAGARI_KEY:I
-Ljava/awt/font/NumericShaper;->EASTERN_ARABIC_KEY:I
-Ljava/awt/font/NumericShaper;->ETHIOPIC_KEY:I
-Ljava/awt/font/NumericShaper;->EUROPEAN_KEY:I
-Ljava/awt/font/NumericShaper;->getContextKey(C)I
-Ljava/awt/font/NumericShaper;->getHighBit(I)I
-Ljava/awt/font/NumericShaper;->getKeyFromMask(I)I
-Ljava/awt/font/NumericShaper;->GUJARATI_KEY:I
-Ljava/awt/font/NumericShaper;->GURMUKHI_KEY:I
-Ljava/awt/font/NumericShaper;->isStrongDirectional(C)Z
-Ljava/awt/font/NumericShaper;->KANNADA_KEY:I
-Ljava/awt/font/NumericShaper;->key:I
-Ljava/awt/font/NumericShaper;->KHMER_KEY:I
-Ljava/awt/font/NumericShaper;->LAO_KEY:I
-Ljava/awt/font/NumericShaper;->MALAYALAM_KEY:I
-Ljava/awt/font/NumericShaper;->mask:I
-Ljava/awt/font/NumericShaper;->MONGOLIAN_KEY:I
-Ljava/awt/font/NumericShaper;->MYANMAR_KEY:I
-Ljava/awt/font/NumericShaper;->NUM_KEYS:I
-Ljava/awt/font/NumericShaper;->ORIYA_KEY:I
-Ljava/awt/font/NumericShaper;->rangeArray:[Ljava/awt/font/NumericShaper$Range;
-Ljava/awt/font/NumericShaper;->rangeForCodePoint(I)Ljava/awt/font/NumericShaper$Range;
-Ljava/awt/font/NumericShaper;->rangeSet:Ljava/util/Set;
-Ljava/awt/font/NumericShaper;->search(I[III)I
-Ljava/awt/font/NumericShaper;->shapeContextually([CIII)V
-Ljava/awt/font/NumericShaper;->shapeContextually([CIILjava/awt/font/NumericShaper$Range;)V
-Ljava/awt/font/NumericShaper;->shapeNonContextually([CII)V
-Ljava/awt/font/NumericShaper;->shapingRange:Ljava/awt/font/NumericShaper$Range;
-Ljava/awt/font/NumericShaper;->stCache:I
-Ljava/awt/font/NumericShaper;->strongTable:[I
-Ljava/awt/font/NumericShaper;->TAMIL_KEY:I
-Ljava/awt/font/NumericShaper;->TELUGU_KEY:I
-Ljava/awt/font/NumericShaper;->THAI_KEY:I
-Ljava/awt/font/NumericShaper;->TIBETAN_KEY:I
-Ljava/awt/font/TextAttribute;->instanceMap:Ljava/util/Map;
-Ljava/beans/ChangeListenerMap;-><init>()V
-Ljava/beans/ChangeListenerMap;->add(Ljava/lang/String;Ljava/util/EventListener;)V
-Ljava/beans/ChangeListenerMap;->extract(Ljava/util/EventListener;)Ljava/util/EventListener;
-Ljava/beans/ChangeListenerMap;->get(Ljava/lang/String;)[Ljava/util/EventListener;
-Ljava/beans/ChangeListenerMap;->getEntries()Ljava/util/Set;
-Ljava/beans/ChangeListenerMap;->getListeners()[Ljava/util/EventListener;
-Ljava/beans/ChangeListenerMap;->getListeners(Ljava/lang/String;)[Ljava/util/EventListener;
-Ljava/beans/ChangeListenerMap;->hasListeners(Ljava/lang/String;)Z
-Ljava/beans/ChangeListenerMap;->map:Ljava/util/Map;
-Ljava/beans/ChangeListenerMap;->newArray(I)[Ljava/util/EventListener;
-Ljava/beans/ChangeListenerMap;->newProxy(Ljava/lang/String;Ljava/util/EventListener;)Ljava/util/EventListener;
-Ljava/beans/ChangeListenerMap;->remove(Ljava/lang/String;Ljava/util/EventListener;)V
-Ljava/beans/ChangeListenerMap;->set(Ljava/lang/String;[Ljava/util/EventListener;)V
-Ljava/beans/IndexedPropertyChangeEvent;->appendTo(Ljava/lang/StringBuilder;)V
-Ljava/beans/IndexedPropertyChangeEvent;->index:I
-Ljava/beans/PropertyChangeEvent;->appendTo(Ljava/lang/StringBuilder;)V
-Ljava/beans/PropertyChangeEvent;->newValue:Ljava/lang/Object;
-Ljava/beans/PropertyChangeEvent;->oldValue:Ljava/lang/Object;
-Ljava/beans/PropertyChangeEvent;->propagationId:Ljava/lang/Object;
-Ljava/beans/PropertyChangeEvent;->propertyName:Ljava/lang/String;
-Ljava/beans/PropertyChangeListenerProxy;->propertyName:Ljava/lang/String;
-Ljava/beans/PropertyChangeSupport$PropertyChangeListenerMap;-><init>()V
-Ljava/beans/PropertyChangeSupport$PropertyChangeListenerMap;->EMPTY:[Ljava/beans/PropertyChangeListener;
-Ljava/beans/PropertyChangeSupport$PropertyChangeListenerMap;->extract(Ljava/beans/PropertyChangeListener;)Ljava/beans/PropertyChangeListener;
-Ljava/beans/PropertyChangeSupport$PropertyChangeListenerMap;->newArray(I)[Ljava/beans/PropertyChangeListener;
-Ljava/beans/PropertyChangeSupport$PropertyChangeListenerMap;->newProxy(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)Ljava/beans/PropertyChangeListener;
-Ljava/beans/PropertyChangeSupport;->fire([Ljava/beans/PropertyChangeListener;Ljava/beans/PropertyChangeEvent;)V
-Ljava/beans/PropertyChangeSupport;->map:Ljava/beans/PropertyChangeSupport$PropertyChangeListenerMap;
-Ljava/beans/PropertyChangeSupport;->source:Ljava/lang/Object;
-Ljava/io/BufferedInputStream;->bufUpdater:Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;
-Ljava/io/BufferedInputStream;->DEFAULT_BUFFER_SIZE:I
-Ljava/io/BufferedInputStream;->fill()V
-Ljava/io/BufferedInputStream;->getBufIfOpen()[B
-Ljava/io/BufferedInputStream;->getInIfOpen()Ljava/io/InputStream;
-Ljava/io/BufferedInputStream;->MAX_BUFFER_SIZE:I
-Ljava/io/BufferedInputStream;->read1([BII)I
-Ljava/io/BufferedOutputStream;->flushBuffer()V
-Ljava/io/BufferedReader;->cb:[C
-Ljava/io/BufferedReader;->defaultCharBufferSize:I
-Ljava/io/BufferedReader;->defaultExpectedLineLength:I
-Ljava/io/BufferedReader;->ensureOpen()V
-Ljava/io/BufferedReader;->fill()V
-Ljava/io/BufferedReader;->in:Ljava/io/Reader;
-Ljava/io/BufferedReader;->INVALIDATED:I
-Ljava/io/BufferedReader;->markedChar:I
-Ljava/io/BufferedReader;->markedSkipLF:Z
-Ljava/io/BufferedReader;->nChars:I
-Ljava/io/BufferedReader;->nextChar:I
-Ljava/io/BufferedReader;->read1([CII)I
-Ljava/io/BufferedReader;->readAheadLimit:I
-Ljava/io/BufferedReader;->readLine(Z)Ljava/lang/String;
-Ljava/io/BufferedReader;->skipLF:Z
-Ljava/io/BufferedReader;->UNMARKED:I
-Ljava/io/BufferedWriter;->cb:[C
-Ljava/io/BufferedWriter;->defaultCharBufferSize:I
-Ljava/io/BufferedWriter;->ensureOpen()V
-Ljava/io/BufferedWriter;->flushBuffer()V
-Ljava/io/BufferedWriter;->lineSeparator:Ljava/lang/String;
-Ljava/io/BufferedWriter;->min(II)I
-Ljava/io/BufferedWriter;->nChars:I
-Ljava/io/BufferedWriter;->nextChar:I
-Ljava/io/BufferedWriter;->out:Ljava/io/Writer;
-Ljava/io/ByteArrayOutputStream;->ensureCapacity(I)V
-Ljava/io/ByteArrayOutputStream;->grow(I)V
-Ljava/io/ByteArrayOutputStream;->hugeCapacity(I)I
-Ljava/io/ByteArrayOutputStream;->MAX_ARRAY_SIZE:I
-Ljava/io/CharArrayReader;->ensureOpen()V
-Ljava/io/Console$LineReader;->cb:[C
-Ljava/io/Console$LineReader;->in:Ljava/io/Reader;
-Ljava/io/Console$LineReader;->leftoverLF:Z
-Ljava/io/Console$LineReader;->nChars:I
-Ljava/io/Console$LineReader;->nextChar:I
-Ljava/io/Console;-><init>()V
-Ljava/io/Console;-><init>(Ljava/io/InputStream;Ljava/io/OutputStream;)V
-Ljava/io/Console;->cons:Ljava/io/Console;
-Ljava/io/Console;->console()Ljava/io/Console;
-Ljava/io/Console;->cs:Ljava/nio/charset/Charset;
-Ljava/io/Console;->echo(Z)Z
-Ljava/io/Console;->echoOff:Z
-Ljava/io/Console;->formatter:Ljava/util/Formatter;
-Ljava/io/Console;->grow()[C
-Ljava/io/Console;->istty()Z
-Ljava/io/Console;->out:Ljava/io/Writer;
-Ljava/io/Console;->pw:Ljava/io/PrintWriter;
-Ljava/io/Console;->rcb:[C
-Ljava/io/Console;->reader:Ljava/io/Reader;
-Ljava/io/Console;->readline(Z)[C
-Ljava/io/Console;->readLock:Ljava/lang/Object;
-Ljava/io/Console;->writeLock:Ljava/lang/Object;
-Ljava/io/DataInputStream;->bytearr:[B
-Ljava/io/DataInputStream;->chararr:[C
-Ljava/io/DataInputStream;->lineBuffer:[C
-Ljava/io/DataInputStream;->readBuffer:[B
-Ljava/io/DataOutputStream;->bytearr:[B
-Ljava/io/DataOutputStream;->incCount(I)V
-Ljava/io/DataOutputStream;->writeBuffer:[B
-Ljava/io/DataOutputStream;->writeUTF(Ljava/lang/String;Ljava/io/DataOutput;)I
-Ljava/io/File$PathStatus;->CHECKED:Ljava/io/File$PathStatus;
-Ljava/io/File$PathStatus;->INVALID:Ljava/io/File$PathStatus;
-Ljava/io/File$PathStatus;->valueOf(Ljava/lang/String;)Ljava/io/File$PathStatus;
-Ljava/io/File$PathStatus;->values()[Ljava/io/File$PathStatus;
-Ljava/io/File$TempDirectory;-><init>()V
-Ljava/io/File$TempDirectory;->generateFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;
-Ljava/io/File;-><init>(Ljava/lang/String;I)V
-Ljava/io/File;-><init>(Ljava/lang/String;Ljava/io/File;)V
-Ljava/io/File;->getPrefixLength()I
-Ljava/io/File;->isInvalid()Z
-Ljava/io/File;->PATH_OFFSET:J
-Ljava/io/File;->PREFIX_LENGTH_OFFSET:J
-Ljava/io/File;->slashify(Ljava/lang/String;Z)Ljava/lang/String;
-Ljava/io/File;->UNSAFE:Lsun/misc/Unsafe;
-Ljava/io/FileDescriptor;-><init>(I)V
-Ljava/io/FileDescriptor;->dupFd(I)Ljava/io/FileDescriptor;
-Ljava/io/FileDescriptor;->isSocket(I)Z
-Ljava/io/FileInputStream$UseManualSkipException;-><init>()V
-Ljava/io/FileInputStream;-><init>(Ljava/io/FileDescriptor;Z)V
-Ljava/io/FileInputStream;->available0()I
-Ljava/io/FileInputStream;->channel:Ljava/nio/channels/FileChannel;
-Ljava/io/FileInputStream;->closed:Z
-Ljava/io/FileInputStream;->closeLock:Ljava/lang/Object;
-Ljava/io/FileInputStream;->guard:Ldalvik/system/CloseGuard;
-Ljava/io/FileInputStream;->isFdOwner:Z
-Ljava/io/FileInputStream;->open(Ljava/lang/String;)V
-Ljava/io/FileInputStream;->open0(Ljava/lang/String;)V
-Ljava/io/FileInputStream;->path:Ljava/lang/String;
-Ljava/io/FileInputStream;->skip0(J)J
-Ljava/io/FileInputStream;->tracker:Llibcore/io/IoTracker;
-Ljava/io/FileNotFoundException;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/io/FileOutputStream;-><init>(Ljava/io/FileDescriptor;Z)V
-Ljava/io/FileOutputStream;->append:Z
-Ljava/io/FileOutputStream;->closed:Z
-Ljava/io/FileOutputStream;->closeLock:Ljava/lang/Object;
-Ljava/io/FileOutputStream;->guard:Ldalvik/system/CloseGuard;
-Ljava/io/FileOutputStream;->isFdOwner:Z
-Ljava/io/FileOutputStream;->open(Ljava/lang/String;Z)V
-Ljava/io/FileOutputStream;->open0(Ljava/lang/String;Z)V
-Ljava/io/FileOutputStream;->path:Ljava/lang/String;
-Ljava/io/FileOutputStream;->tracker:Llibcore/io/IoTracker;
-Ljava/io/FileSystem;-><init>()V
-Ljava/io/FileSystem;->ACCESS_EXECUTE:I
-Ljava/io/FileSystem;->ACCESS_OK:I
-Ljava/io/FileSystem;->ACCESS_READ:I
-Ljava/io/FileSystem;->ACCESS_WRITE:I
-Ljava/io/FileSystem;->BA_DIRECTORY:I
-Ljava/io/FileSystem;->BA_EXISTS:I
-Ljava/io/FileSystem;->BA_HIDDEN:I
-Ljava/io/FileSystem;->BA_REGULAR:I
-Ljava/io/FileSystem;->getBooleanProperty(Ljava/lang/String;Z)Z
-Ljava/io/FileSystem;->SPACE_FREE:I
-Ljava/io/FileSystem;->SPACE_TOTAL:I
-Ljava/io/FileSystem;->SPACE_USABLE:I
-Ljava/io/FileSystem;->useCanonCaches:Z
-Ljava/io/FileSystem;->useCanonPrefixCache:Z
-Ljava/io/InputStream;->MAX_SKIP_BUFFER_SIZE:I
-Ljava/io/InputStreamReader;->sd:Lsun/nio/cs/StreamDecoder;
-Ljava/io/InterruptedIOException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/io/InterruptedIOException;-><init>(Ljava/lang/Throwable;)V
-Ljava/io/LineNumberInputStream;->lineNumber:I
-Ljava/io/LineNumberInputStream;->markLineNumber:I
-Ljava/io/LineNumberInputStream;->markPushBack:I
-Ljava/io/LineNumberInputStream;->pushBack:I
-Ljava/io/LineNumberReader;->lineNumber:I
-Ljava/io/LineNumberReader;->markedLineNumber:I
-Ljava/io/LineNumberReader;->markedSkipLF:Z
-Ljava/io/LineNumberReader;->maxSkipBufferSize:I
-Ljava/io/LineNumberReader;->skipBuffer:[C
-Ljava/io/LineNumberReader;->skipLF:Z
-Ljava/io/ObjectInputStream$BlockDataInputStream;->blkmode:Z
-Ljava/io/ObjectInputStream$BlockDataInputStream;->buf:[B
-Ljava/io/ObjectInputStream$BlockDataInputStream;->cbuf:[C
-Ljava/io/ObjectInputStream$BlockDataInputStream;->CHAR_BUF_SIZE:I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->currentBlockRemaining()I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->din:Ljava/io/DataInputStream;
-Ljava/io/ObjectInputStream$BlockDataInputStream;->end:I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->getBlockDataMode()Z
-Ljava/io/ObjectInputStream$BlockDataInputStream;->hbuf:[B
-Ljava/io/ObjectInputStream$BlockDataInputStream;->HEADER_BLOCKED:I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->in:Ljava/io/ObjectInputStream$PeekInputStream;
-Ljava/io/ObjectInputStream$BlockDataInputStream;->MAX_BLOCK_SIZE:I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->MAX_HEADER_SIZE:I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->peek()I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->peekByte()B
-Ljava/io/ObjectInputStream$BlockDataInputStream;->pos:I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->read([BIIZ)I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readBlockHeader(Z)I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readBooleans([ZII)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readChars([CII)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readDoubles([DII)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readFloats([FII)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readFully([BIIZ)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readInts([III)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readLongs([JII)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readLongUTF()Ljava/lang/String;
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readShorts([SII)V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readUTFBody(J)Ljava/lang/String;
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readUTFChar(Ljava/lang/StringBuilder;J)I
-Ljava/io/ObjectInputStream$BlockDataInputStream;->readUTFSpan(Ljava/lang/StringBuilder;J)J
-Ljava/io/ObjectInputStream$BlockDataInputStream;->refill()V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->setBlockDataMode(Z)Z
-Ljava/io/ObjectInputStream$BlockDataInputStream;->skipBlockData()V
-Ljava/io/ObjectInputStream$BlockDataInputStream;->unread:I
-Ljava/io/ObjectInputStream$Caches;-><init>()V
-Ljava/io/ObjectInputStream$Caches;->subclassAudits:Ljava/util/concurrent/ConcurrentMap;
-Ljava/io/ObjectInputStream$Caches;->subclassAuditsQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/io/ObjectInputStream$GetFieldImpl;->desc:Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectInputStream$GetFieldImpl;->getFieldOffset(Ljava/lang/String;Ljava/lang/Class;)I
-Ljava/io/ObjectInputStream$GetFieldImpl;->objHandles:[I
-Ljava/io/ObjectInputStream$GetFieldImpl;->objVals:[Ljava/lang/Object;
-Ljava/io/ObjectInputStream$GetFieldImpl;->primVals:[B
-Ljava/io/ObjectInputStream$GetFieldImpl;->readFields()V
-Ljava/io/ObjectInputStream$HandleTable$HandleList;-><init>()V
-Ljava/io/ObjectInputStream$HandleTable$HandleList;->add(I)V
-Ljava/io/ObjectInputStream$HandleTable$HandleList;->get(I)I
-Ljava/io/ObjectInputStream$HandleTable$HandleList;->list:[I
-Ljava/io/ObjectInputStream$HandleTable$HandleList;->size()I
-Ljava/io/ObjectInputStream$HandleTable$HandleList;->size:I
-Ljava/io/ObjectInputStream$HandleTable;-><init>(I)V
-Ljava/io/ObjectInputStream$HandleTable;->assign(Ljava/lang/Object;)I
-Ljava/io/ObjectInputStream$HandleTable;->clear()V
-Ljava/io/ObjectInputStream$HandleTable;->deps:[Ljava/io/ObjectInputStream$HandleTable$HandleList;
-Ljava/io/ObjectInputStream$HandleTable;->entries:[Ljava/lang/Object;
-Ljava/io/ObjectInputStream$HandleTable;->finish(I)V
-Ljava/io/ObjectInputStream$HandleTable;->grow()V
-Ljava/io/ObjectInputStream$HandleTable;->lookupException(I)Ljava/lang/ClassNotFoundException;
-Ljava/io/ObjectInputStream$HandleTable;->lookupObject(I)Ljava/lang/Object;
-Ljava/io/ObjectInputStream$HandleTable;->lowDep:I
-Ljava/io/ObjectInputStream$HandleTable;->markDependency(II)V
-Ljava/io/ObjectInputStream$HandleTable;->markException(ILjava/lang/ClassNotFoundException;)V
-Ljava/io/ObjectInputStream$HandleTable;->setObject(ILjava/lang/Object;)V
-Ljava/io/ObjectInputStream$HandleTable;->size()I
-Ljava/io/ObjectInputStream$HandleTable;->size:I
-Ljava/io/ObjectInputStream$HandleTable;->status:[B
-Ljava/io/ObjectInputStream$HandleTable;->STATUS_EXCEPTION:B
-Ljava/io/ObjectInputStream$HandleTable;->STATUS_OK:B
-Ljava/io/ObjectInputStream$HandleTable;->STATUS_UNKNOWN:B
-Ljava/io/ObjectInputStream$PeekInputStream;-><init>(Ljava/io/InputStream;)V
-Ljava/io/ObjectInputStream$PeekInputStream;->in:Ljava/io/InputStream;
-Ljava/io/ObjectInputStream$PeekInputStream;->peek()I
-Ljava/io/ObjectInputStream$PeekInputStream;->peekb:I
-Ljava/io/ObjectInputStream$PeekInputStream;->readFully([BII)V
-Ljava/io/ObjectInputStream$ValidationList$Callback;-><init>(Ljava/io/ObjectInputValidation;ILjava/io/ObjectInputStream$ValidationList$Callback;Ljava/security/AccessControlContext;)V
-Ljava/io/ObjectInputStream$ValidationList$Callback;->acc:Ljava/security/AccessControlContext;
-Ljava/io/ObjectInputStream$ValidationList$Callback;->next:Ljava/io/ObjectInputStream$ValidationList$Callback;
-Ljava/io/ObjectInputStream$ValidationList$Callback;->obj:Ljava/io/ObjectInputValidation;
-Ljava/io/ObjectInputStream$ValidationList$Callback;->priority:I
-Ljava/io/ObjectInputStream$ValidationList;-><init>()V
-Ljava/io/ObjectInputStream$ValidationList;->clear()V
-Ljava/io/ObjectInputStream$ValidationList;->doCallbacks()V
-Ljava/io/ObjectInputStream$ValidationList;->list:Ljava/io/ObjectInputStream$ValidationList$Callback;
-Ljava/io/ObjectInputStream$ValidationList;->register(Ljava/io/ObjectInputValidation;I)V
-Ljava/io/ObjectInputStream;->auditSubclass(Ljava/lang/Class;)Z
-Ljava/io/ObjectInputStream;->checkResolve(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->clear()V
-Ljava/io/ObjectInputStream;->cloneArray(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->closed:Z
-Ljava/io/ObjectInputStream;->curContext:Ljava/io/SerialCallbackContext;
-Ljava/io/ObjectInputStream;->defaultDataEnd:Z
-Ljava/io/ObjectInputStream;->defaultReadFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-Ljava/io/ObjectInputStream;->depth:I
-Ljava/io/ObjectInputStream;->enableOverride:Z
-Ljava/io/ObjectInputStream;->enableResolve:Z
-Ljava/io/ObjectInputStream;->handleReset()V
-Ljava/io/ObjectInputStream;->handles:Ljava/io/ObjectInputStream$HandleTable;
-Ljava/io/ObjectInputStream;->isCustomSubclass()Z
-Ljava/io/ObjectInputStream;->latestUserDefinedLoader()Ljava/lang/ClassLoader;
-Ljava/io/ObjectInputStream;->NULL_HANDLE:I
-Ljava/io/ObjectInputStream;->passHandle:I
-Ljava/io/ObjectInputStream;->primClasses:Ljava/util/HashMap;
-Ljava/io/ObjectInputStream;->primVals:[B
-Ljava/io/ObjectInputStream;->readArray(Z)Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->readClass(Z)Ljava/lang/Class;
-Ljava/io/ObjectInputStream;->readClassDesc(Z)Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectInputStream;->readEnum(Z)Ljava/lang/Enum;
-Ljava/io/ObjectInputStream;->readExternalData(Ljava/io/Externalizable;Ljava/io/ObjectStreamClass;)V
-Ljava/io/ObjectInputStream;->readFatalException()Ljava/io/IOException;
-Ljava/io/ObjectInputStream;->readHandle(Z)Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->readNonProxyDesc(Z)Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectInputStream;->readNull()Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->readObject0(Z)Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->readOrdinaryObject(Z)Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->readProxyDesc(Z)Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectInputStream;->readSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-Ljava/io/ObjectInputStream;->readString(Z)Ljava/lang/String;
-Ljava/io/ObjectInputStream;->readTypeString()Ljava/lang/String;
-Ljava/io/ObjectInputStream;->skipCustomData()V
-Ljava/io/ObjectInputStream;->unsharedMarker:Ljava/lang/Object;
-Ljava/io/ObjectInputStream;->verifySubclass()V
-Ljava/io/ObjectInputStream;->vlist:Ljava/io/ObjectInputStream$ValidationList;
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;-><init>(Ljava/io/OutputStream;)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->blkmode:Z
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->buf:[B
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->cbuf:[C
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->CHAR_BUF_SIZE:I
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->dout:Ljava/io/DataOutputStream;
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->drain()V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->getBlockDataMode()Z
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->getUTFLength(Ljava/lang/String;)J
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->hbuf:[B
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->MAX_BLOCK_SIZE:I
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->MAX_HEADER_SIZE:I
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->out:Ljava/io/OutputStream;
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->pos:I
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->setBlockDataMode(Z)Z
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->warnIfClosed()V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->warnOnceWhenWriting:Z
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->write([BIIZ)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeBlockHeader(I)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeBooleans([ZII)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeChars([CII)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeDoubles([DII)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeFloats([FII)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeInts([III)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeLongs([JII)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeLongUTF(Ljava/lang/String;)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeLongUTF(Ljava/lang/String;J)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeShorts([SII)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeUTF(Ljava/lang/String;J)V
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;->writeUTFBody(Ljava/lang/String;)V
-Ljava/io/ObjectOutputStream$Caches;-><init>()V
-Ljava/io/ObjectOutputStream$Caches;->subclassAudits:Ljava/util/concurrent/ConcurrentMap;
-Ljava/io/ObjectOutputStream$Caches;->subclassAuditsQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/io/ObjectOutputStream$DebugTraceInfoStack;-><init>()V
-Ljava/io/ObjectOutputStream$DebugTraceInfoStack;->clear()V
-Ljava/io/ObjectOutputStream$DebugTraceInfoStack;->pop()V
-Ljava/io/ObjectOutputStream$DebugTraceInfoStack;->push(Ljava/lang/String;)V
-Ljava/io/ObjectOutputStream$DebugTraceInfoStack;->stack:Ljava/util/List;
-Ljava/io/ObjectOutputStream$HandleTable;-><init>(IF)V
-Ljava/io/ObjectOutputStream$HandleTable;->assign(Ljava/lang/Object;)I
-Ljava/io/ObjectOutputStream$HandleTable;->clear()V
-Ljava/io/ObjectOutputStream$HandleTable;->growEntries()V
-Ljava/io/ObjectOutputStream$HandleTable;->growSpine()V
-Ljava/io/ObjectOutputStream$HandleTable;->hash(Ljava/lang/Object;)I
-Ljava/io/ObjectOutputStream$HandleTable;->insert(Ljava/lang/Object;I)V
-Ljava/io/ObjectOutputStream$HandleTable;->loadFactor:F
-Ljava/io/ObjectOutputStream$HandleTable;->lookup(Ljava/lang/Object;)I
-Ljava/io/ObjectOutputStream$HandleTable;->next:[I
-Ljava/io/ObjectOutputStream$HandleTable;->objs:[Ljava/lang/Object;
-Ljava/io/ObjectOutputStream$HandleTable;->size()I
-Ljava/io/ObjectOutputStream$HandleTable;->size:I
-Ljava/io/ObjectOutputStream$HandleTable;->spine:[I
-Ljava/io/ObjectOutputStream$HandleTable;->threshold:I
-Ljava/io/ObjectOutputStream$PutFieldImpl;->desc:Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectOutputStream$PutFieldImpl;->getFieldOffset(Ljava/lang/String;Ljava/lang/Class;)I
-Ljava/io/ObjectOutputStream$PutFieldImpl;->objVals:[Ljava/lang/Object;
-Ljava/io/ObjectOutputStream$PutFieldImpl;->primVals:[B
-Ljava/io/ObjectOutputStream$PutFieldImpl;->writeFields()V
-Ljava/io/ObjectOutputStream$ReplaceTable;-><init>(IF)V
-Ljava/io/ObjectOutputStream$ReplaceTable;->assign(Ljava/lang/Object;Ljava/lang/Object;)V
-Ljava/io/ObjectOutputStream$ReplaceTable;->clear()V
-Ljava/io/ObjectOutputStream$ReplaceTable;->grow()V
-Ljava/io/ObjectOutputStream$ReplaceTable;->htab:Ljava/io/ObjectOutputStream$HandleTable;
-Ljava/io/ObjectOutputStream$ReplaceTable;->lookup(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/io/ObjectOutputStream$ReplaceTable;->reps:[Ljava/lang/Object;
-Ljava/io/ObjectOutputStream$ReplaceTable;->size()I
-Ljava/io/ObjectOutputStream;->auditSubclass(Ljava/lang/Class;)Z
-Ljava/io/ObjectOutputStream;->bout:Ljava/io/ObjectOutputStream$BlockDataOutputStream;
-Ljava/io/ObjectOutputStream;->clear()V
-Ljava/io/ObjectOutputStream;->curContext:Ljava/io/SerialCallbackContext;
-Ljava/io/ObjectOutputStream;->curPut:Ljava/io/ObjectOutputStream$PutFieldImpl;
-Ljava/io/ObjectOutputStream;->debugInfoStack:Ljava/io/ObjectOutputStream$DebugTraceInfoStack;
-Ljava/io/ObjectOutputStream;->defaultWriteFields(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-Ljava/io/ObjectOutputStream;->depth:I
-Ljava/io/ObjectOutputStream;->doublesToBytes([DI[BII)V
-Ljava/io/ObjectOutputStream;->enableOverride:Z
-Ljava/io/ObjectOutputStream;->enableReplace:Z
-Ljava/io/ObjectOutputStream;->extendedDebugInfo:Z
-Ljava/io/ObjectOutputStream;->floatsToBytes([FI[BII)V
-Ljava/io/ObjectOutputStream;->getProtocolVersion()I
-Ljava/io/ObjectOutputStream;->handles:Ljava/io/ObjectOutputStream$HandleTable;
-Ljava/io/ObjectOutputStream;->isCustomSubclass()Z
-Ljava/io/ObjectOutputStream;->primVals:[B
-Ljava/io/ObjectOutputStream;->subs:Ljava/io/ObjectOutputStream$ReplaceTable;
-Ljava/io/ObjectOutputStream;->verifySubclass()V
-Ljava/io/ObjectOutputStream;->writeArray(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V
-Ljava/io/ObjectOutputStream;->writeClass(Ljava/lang/Class;Z)V
-Ljava/io/ObjectOutputStream;->writeClassDesc(Ljava/io/ObjectStreamClass;Z)V
-Ljava/io/ObjectOutputStream;->writeEnum(Ljava/lang/Enum;Ljava/io/ObjectStreamClass;Z)V
-Ljava/io/ObjectOutputStream;->writeExternalData(Ljava/io/Externalizable;)V
-Ljava/io/ObjectOutputStream;->writeFatalException(Ljava/io/IOException;)V
-Ljava/io/ObjectOutputStream;->writeHandle(I)V
-Ljava/io/ObjectOutputStream;->writeNonProxyDesc(Ljava/io/ObjectStreamClass;Z)V
-Ljava/io/ObjectOutputStream;->writeNull()V
-Ljava/io/ObjectOutputStream;->writeObject0(Ljava/lang/Object;Z)V
-Ljava/io/ObjectOutputStream;->writeOrdinaryObject(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V
-Ljava/io/ObjectOutputStream;->writeProxyDesc(Ljava/io/ObjectStreamClass;Z)V
-Ljava/io/ObjectOutputStream;->writeSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-Ljava/io/ObjectOutputStream;->writeString(Ljava/lang/String;Z)V
-Ljava/io/ObjectOutputStream;->writeTypeString(Ljava/lang/String;)V
-Ljava/io/ObjectStreamClass$Caches;-><init>()V
-Ljava/io/ObjectStreamClass$Caches;->localDescs:Ljava/util/concurrent/ConcurrentMap;
-Ljava/io/ObjectStreamClass$Caches;->localDescsQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/io/ObjectStreamClass$Caches;->reflectors:Ljava/util/concurrent/ConcurrentMap;
-Ljava/io/ObjectStreamClass$Caches;->reflectorsQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/io/ObjectStreamClass$ClassDataSlot;-><init>(Ljava/io/ObjectStreamClass;Z)V
-Ljava/io/ObjectStreamClass$ClassDataSlot;->desc:Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamClass$ClassDataSlot;->hasData:Z
-Ljava/io/ObjectStreamClass$EntryFuture;-><init>()V
-Ljava/io/ObjectStreamClass$EntryFuture;->entry:Ljava/lang/Object;
-Ljava/io/ObjectStreamClass$EntryFuture;->get()Ljava/lang/Object;
-Ljava/io/ObjectStreamClass$EntryFuture;->getOwner()Ljava/lang/Thread;
-Ljava/io/ObjectStreamClass$EntryFuture;->owner:Ljava/lang/Thread;
-Ljava/io/ObjectStreamClass$EntryFuture;->set(Ljava/lang/Object;)Z
-Ljava/io/ObjectStreamClass$EntryFuture;->unset:Ljava/lang/Object;
-Ljava/io/ObjectStreamClass$ExceptionInfo;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/io/ObjectStreamClass$ExceptionInfo;->className:Ljava/lang/String;
-Ljava/io/ObjectStreamClass$ExceptionInfo;->message:Ljava/lang/String;
-Ljava/io/ObjectStreamClass$ExceptionInfo;->newInvalidClassException()Ljava/io/InvalidClassException;
-Ljava/io/ObjectStreamClass$FieldReflector;-><init>([Ljava/io/ObjectStreamField;)V
-Ljava/io/ObjectStreamClass$FieldReflector;->fields:[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass$FieldReflector;->getFields()[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass$FieldReflector;->getObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-Ljava/io/ObjectStreamClass$FieldReflector;->getPrimFieldValues(Ljava/lang/Object;[B)V
-Ljava/io/ObjectStreamClass$FieldReflector;->numPrimFields:I
-Ljava/io/ObjectStreamClass$FieldReflector;->offsets:[I
-Ljava/io/ObjectStreamClass$FieldReflector;->readKeys:[J
-Ljava/io/ObjectStreamClass$FieldReflector;->setObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-Ljava/io/ObjectStreamClass$FieldReflector;->setPrimFieldValues(Ljava/lang/Object;[B)V
-Ljava/io/ObjectStreamClass$FieldReflector;->typeCodes:[C
-Ljava/io/ObjectStreamClass$FieldReflector;->types:[Ljava/lang/Class;
-Ljava/io/ObjectStreamClass$FieldReflector;->unsafe:Lsun/misc/Unsafe;
-Ljava/io/ObjectStreamClass$FieldReflector;->writeKeys:[J
-Ljava/io/ObjectStreamClass$FieldReflectorKey;-><init>(Ljava/lang/Class;[Ljava/io/ObjectStreamField;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/io/ObjectStreamClass$FieldReflectorKey;->hash:I
-Ljava/io/ObjectStreamClass$FieldReflectorKey;->nullClass:Z
-Ljava/io/ObjectStreamClass$FieldReflectorKey;->sigs:Ljava/lang/String;
-Ljava/io/ObjectStreamClass$MemberSignature;-><init>(Ljava/lang/reflect/Constructor;)V
-Ljava/io/ObjectStreamClass$MemberSignature;-><init>(Ljava/lang/reflect/Field;)V
-Ljava/io/ObjectStreamClass$MemberSignature;-><init>(Ljava/lang/reflect/Method;)V
-Ljava/io/ObjectStreamClass$MemberSignature;->member:Ljava/lang/reflect/Member;
-Ljava/io/ObjectStreamClass$MemberSignature;->name:Ljava/lang/String;
-Ljava/io/ObjectStreamClass$MemberSignature;->signature:Ljava/lang/String;
-Ljava/io/ObjectStreamClass$WeakClassKey;-><init>(Ljava/lang/Class;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/io/ObjectStreamClass$WeakClassKey;->hash:I
-Ljava/io/ObjectStreamClass;-><init>()V
-Ljava/io/ObjectStreamClass;-><init>(Ljava/lang/Class;)V
-Ljava/io/ObjectStreamClass;->checkDefaultSerialize()V
-Ljava/io/ObjectStreamClass;->checkDeserialize()V
-Ljava/io/ObjectStreamClass;->checkSerialize()V
-Ljava/io/ObjectStreamClass;->cl:Ljava/lang/Class;
-Ljava/io/ObjectStreamClass;->classNamesEqual(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/io/ObjectStreamClass;->cons:Ljava/lang/reflect/Constructor;
-Ljava/io/ObjectStreamClass;->dataLayout:[Ljava/io/ObjectStreamClass$ClassDataSlot;
-Ljava/io/ObjectStreamClass;->defaultSerializeEx:Ljava/io/ObjectStreamClass$ExceptionInfo;
-Ljava/io/ObjectStreamClass;->deserializeEx:Ljava/io/ObjectStreamClass$ExceptionInfo;
-Ljava/io/ObjectStreamClass;->externalizable:Z
-Ljava/io/ObjectStreamClass;->fieldRefl:Ljava/io/ObjectStreamClass$FieldReflector;
-Ljava/io/ObjectStreamClass;->getClassDataLayout()[Ljava/io/ObjectStreamClass$ClassDataSlot;
-Ljava/io/ObjectStreamClass;->getClassDataLayout0()[Ljava/io/ObjectStreamClass$ClassDataSlot;
-Ljava/io/ObjectStreamClass;->getClassSignature(Ljava/lang/Class;)Ljava/lang/String;
-Ljava/io/ObjectStreamClass;->getDeclaredSerialFields(Ljava/lang/Class;)[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass;->getDeclaredSUID(Ljava/lang/Class;)Ljava/lang/Long;
-Ljava/io/ObjectStreamClass;->getDefaultSerialFields(Ljava/lang/Class;)[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass;->getExternalizableConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-Ljava/io/ObjectStreamClass;->getField(Ljava/lang/String;Ljava/lang/Class;)Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass;->getFields(Z)[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass;->getInheritableMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-Ljava/io/ObjectStreamClass;->getMethodSignature([Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/String;
-Ljava/io/ObjectStreamClass;->getObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-Ljava/io/ObjectStreamClass;->getPackageName(Ljava/lang/Class;)Ljava/lang/String;
-Ljava/io/ObjectStreamClass;->getPrimFieldValues(Ljava/lang/Object;[B)V
-Ljava/io/ObjectStreamClass;->getPrivateMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Method;
-Ljava/io/ObjectStreamClass;->getReflector([Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamClass;)Ljava/io/ObjectStreamClass$FieldReflector;
-Ljava/io/ObjectStreamClass;->getResolveException()Ljava/lang/ClassNotFoundException;
-Ljava/io/ObjectStreamClass;->getSerialFields(Ljava/lang/Class;)[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass;->getSerializableConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-Ljava/io/ObjectStreamClass;->getSuperDesc()Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamClass;->getVariantFor(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamClass;->hasBlockExternalData()Z
-Ljava/io/ObjectStreamClass;->hasBlockExternalData:Z
-Ljava/io/ObjectStreamClass;->hasReadResolveMethod()Z
-Ljava/io/ObjectStreamClass;->hasStaticInitializer(Ljava/lang/Class;Z)Z
-Ljava/io/ObjectStreamClass;->hasWriteObjectData:Z
-Ljava/io/ObjectStreamClass;->hasWriteObjectMethod()Z
-Ljava/io/ObjectStreamClass;->hasWriteReplaceMethod()Z
-Ljava/io/ObjectStreamClass;->initialized:Z
-Ljava/io/ObjectStreamClass;->initNonProxy(Ljava/io/ObjectStreamClass;Ljava/lang/Class;Ljava/lang/ClassNotFoundException;Ljava/io/ObjectStreamClass;)V
-Ljava/io/ObjectStreamClass;->initProxy(Ljava/lang/Class;Ljava/lang/ClassNotFoundException;Ljava/io/ObjectStreamClass;)V
-Ljava/io/ObjectStreamClass;->invokeReadObject(Ljava/lang/Object;Ljava/io/ObjectInputStream;)V
-Ljava/io/ObjectStreamClass;->invokeReadObjectNoData(Ljava/lang/Object;)V
-Ljava/io/ObjectStreamClass;->invokeReadResolve(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/io/ObjectStreamClass;->invokeWriteObject(Ljava/lang/Object;Ljava/io/ObjectOutputStream;)V
-Ljava/io/ObjectStreamClass;->invokeWriteReplace(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/io/ObjectStreamClass;->isEnum()Z
-Ljava/io/ObjectStreamClass;->isEnum:Z
-Ljava/io/ObjectStreamClass;->isExternalizable()Z
-Ljava/io/ObjectStreamClass;->isInstantiable()Z
-Ljava/io/ObjectStreamClass;->isProxy()Z
-Ljava/io/ObjectStreamClass;->isProxy:Z
-Ljava/io/ObjectStreamClass;->isSerializable()Z
-Ljava/io/ObjectStreamClass;->localDesc:Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamClass;->lookup(Ljava/lang/Class;Z)Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamClass;->matchFields([Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamClass;)[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass;->MAX_SDK_TARGET_FOR_CLINIT_UIDGEN_WORKAROUND:I
-Ljava/io/ObjectStreamClass;->name:Ljava/lang/String;
-Ljava/io/ObjectStreamClass;->numObjFields:I
-Ljava/io/ObjectStreamClass;->packageEquals(Ljava/lang/Class;Ljava/lang/Class;)Z
-Ljava/io/ObjectStreamClass;->primDataSize:I
-Ljava/io/ObjectStreamClass;->processQueue(Ljava/lang/ref/ReferenceQueue;Ljava/util/concurrent/ConcurrentMap;)V
-Ljava/io/ObjectStreamClass;->readNonProxy(Ljava/io/ObjectInputStream;)V
-Ljava/io/ObjectStreamClass;->readObjectMethod:Ljava/lang/reflect/Method;
-Ljava/io/ObjectStreamClass;->readObjectNoDataMethod:Ljava/lang/reflect/Method;
-Ljava/io/ObjectStreamClass;->readResolveMethod:Ljava/lang/reflect/Method;
-Ljava/io/ObjectStreamClass;->requireInitialized()V
-Ljava/io/ObjectStreamClass;->resolveEx:Ljava/lang/ClassNotFoundException;
-Ljava/io/ObjectStreamClass;->serializable:Z
-Ljava/io/ObjectStreamClass;->serializeEx:Ljava/io/ObjectStreamClass$ExceptionInfo;
-Ljava/io/ObjectStreamClass;->setObjFieldValues(Ljava/lang/Object;[Ljava/lang/Object;)V
-Ljava/io/ObjectStreamClass;->setPrimFieldValues(Ljava/lang/Object;[B)V
-Ljava/io/ObjectStreamClass;->suid:Ljava/lang/Long;
-Ljava/io/ObjectStreamClass;->superDesc:Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamClass;->throwMiscException(Ljava/lang/Throwable;)V
-Ljava/io/ObjectStreamClass;->writeNonProxy(Ljava/io/ObjectOutputStream;)V
-Ljava/io/ObjectStreamClass;->writeObjectMethod:Ljava/lang/reflect/Method;
-Ljava/io/ObjectStreamClass;->writeReplaceMethod:Ljava/lang/reflect/Method;
-Ljava/io/ObjectStreamField;-><init>(Ljava/lang/reflect/Field;ZZ)V
-Ljava/io/ObjectStreamField;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-Ljava/io/ObjectStreamField;->field:Ljava/lang/reflect/Field;
-Ljava/io/ObjectStreamField;->getClassSignature(Ljava/lang/Class;)Ljava/lang/String;
-Ljava/io/ObjectStreamField;->getSignature()Ljava/lang/String;
-Ljava/io/ObjectStreamField;->name:Ljava/lang/String;
-Ljava/io/ObjectStreamField;->offset:I
-Ljava/io/ObjectStreamField;->signature:Ljava/lang/String;
-Ljava/io/ObjectStreamField;->type:Ljava/lang/Class;
-Ljava/io/ObjectStreamField;->unshared:Z
-Ljava/io/OptionalDataException;-><init>(I)V
-Ljava/io/OptionalDataException;-><init>(Z)V
-Ljava/io/OutputStreamWriter;->flushBuffer()V
-Ljava/io/OutputStreamWriter;->se:Lsun/nio/cs/StreamEncoder;
-Ljava/io/PipedInputStream;->awaitSpace()V
-Ljava/io/PipedInputStream;->checkStateForReceive()V
-Ljava/io/PipedInputStream;->closedByReader:Z
-Ljava/io/PipedInputStream;->closedByWriter:Z
-Ljava/io/PipedInputStream;->connected:Z
-Ljava/io/PipedInputStream;->DEFAULT_PIPE_SIZE:I
-Ljava/io/PipedInputStream;->initPipe(I)V
-Ljava/io/PipedInputStream;->readSide:Ljava/lang/Thread;
-Ljava/io/PipedInputStream;->receive([BII)V
-Ljava/io/PipedInputStream;->receivedLast()V
-Ljava/io/PipedInputStream;->writeSide:Ljava/lang/Thread;
-Ljava/io/PipedOutputStream;->sink:Ljava/io/PipedInputStream;
-Ljava/io/PipedReader;->buffer:[C
-Ljava/io/PipedReader;->closedByReader:Z
-Ljava/io/PipedReader;->closedByWriter:Z
-Ljava/io/PipedReader;->connected:Z
-Ljava/io/PipedReader;->DEFAULT_PIPE_SIZE:I
-Ljava/io/PipedReader;->in:I
-Ljava/io/PipedReader;->initPipe(I)V
-Ljava/io/PipedReader;->out:I
-Ljava/io/PipedReader;->readSide:Ljava/lang/Thread;
-Ljava/io/PipedReader;->receive(I)V
-Ljava/io/PipedReader;->receive([CII)V
-Ljava/io/PipedReader;->receivedLast()V
-Ljava/io/PipedReader;->writeSide:Ljava/lang/Thread;
-Ljava/io/PipedWriter;->closed:Z
-Ljava/io/PipedWriter;->sink:Ljava/io/PipedReader;
-Ljava/io/PrintStream;-><init>(ZLjava/io/OutputStream;)V
-Ljava/io/PrintStream;-><init>(ZLjava/io/OutputStream;Ljava/nio/charset/Charset;)V
-Ljava/io/PrintStream;-><init>(ZLjava/nio/charset/Charset;Ljava/io/OutputStream;)V
-Ljava/io/PrintStream;->autoFlush:Z
-Ljava/io/PrintStream;->charOut:Ljava/io/OutputStreamWriter;
-Ljava/io/PrintStream;->charset:Ljava/nio/charset/Charset;
-Ljava/io/PrintStream;->closing:Z
-Ljava/io/PrintStream;->ensureOpen()V
-Ljava/io/PrintStream;->formatter:Ljava/util/Formatter;
-Ljava/io/PrintStream;->getTextOut()Ljava/io/BufferedWriter;
-Ljava/io/PrintStream;->newLine()V
-Ljava/io/PrintStream;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
-Ljava/io/PrintStream;->textOut:Ljava/io/BufferedWriter;
-Ljava/io/PrintStream;->toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/io/PrintStream;->trouble:Z
-Ljava/io/PrintStream;->write(Ljava/lang/String;)V
-Ljava/io/PrintStream;->write([C)V
-Ljava/io/PrintWriter;-><init>(Ljava/nio/charset/Charset;Ljava/io/File;)V
-Ljava/io/PrintWriter;->autoFlush:Z
-Ljava/io/PrintWriter;->ensureOpen()V
-Ljava/io/PrintWriter;->formatter:Ljava/util/Formatter;
-Ljava/io/PrintWriter;->lineSeparator:Ljava/lang/String;
-Ljava/io/PrintWriter;->newLine()V
-Ljava/io/PrintWriter;->psOut:Ljava/io/PrintStream;
-Ljava/io/PrintWriter;->toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/io/PrintWriter;->trouble:Z
-Ljava/io/PushbackInputStream;->ensureOpen()V
-Ljava/io/PushbackReader;->buf:[C
-Ljava/io/PushbackReader;->ensureOpen()V
-Ljava/io/PushbackReader;->pos:I
-Ljava/io/RandomAccessFile;->channel:Ljava/nio/channels/FileChannel;
-Ljava/io/RandomAccessFile;->closed:Z
-Ljava/io/RandomAccessFile;->closeLock:Ljava/lang/Object;
-Ljava/io/RandomAccessFile;->flushAfterWrite:I
-Ljava/io/RandomAccessFile;->FLUSH_FDATASYNC:I
-Ljava/io/RandomAccessFile;->FLUSH_FSYNC:I
-Ljava/io/RandomAccessFile;->FLUSH_NONE:I
-Ljava/io/RandomAccessFile;->guard:Ldalvik/system/CloseGuard;
-Ljava/io/RandomAccessFile;->ioTracker:Llibcore/io/IoTracker;
-Ljava/io/RandomAccessFile;->maybeSync()V
-Ljava/io/RandomAccessFile;->mode:I
-Ljava/io/RandomAccessFile;->path:Ljava/lang/String;
-Ljava/io/RandomAccessFile;->readBytes([BII)I
-Ljava/io/RandomAccessFile;->rw:Z
-Ljava/io/RandomAccessFile;->scratch:[B
-Ljava/io/RandomAccessFile;->writeBytes([BII)V
-Ljava/io/Reader;->maxSkipBufferSize:I
-Ljava/io/Reader;->skipBuffer:[C
-Ljava/io/SequenceInputStream;->e:Ljava/util/Enumeration;
-Ljava/io/SequenceInputStream;->in:Ljava/io/InputStream;
-Ljava/io/SequenceInputStream;->nextStream()V
-Ljava/io/SerialCallbackContext;-><init>(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V
-Ljava/io/SerialCallbackContext;->check()V
-Ljava/io/SerialCallbackContext;->checkAndSetUsed()V
-Ljava/io/SerialCallbackContext;->desc:Ljava/io/ObjectStreamClass;
-Ljava/io/SerialCallbackContext;->getDesc()Ljava/io/ObjectStreamClass;
-Ljava/io/SerialCallbackContext;->getObj()Ljava/lang/Object;
-Ljava/io/SerialCallbackContext;->obj:Ljava/lang/Object;
-Ljava/io/SerialCallbackContext;->setUsed()V
-Ljava/io/SerialCallbackContext;->thread:Ljava/lang/Thread;
-Ljava/io/StreamTokenizer;-><init>()V
-Ljava/io/StreamTokenizer;->buf:[C
-Ljava/io/StreamTokenizer;->ctype:[B
-Ljava/io/StreamTokenizer;->CT_ALPHA:B
-Ljava/io/StreamTokenizer;->CT_COMMENT:B
-Ljava/io/StreamTokenizer;->CT_DIGIT:B
-Ljava/io/StreamTokenizer;->CT_QUOTE:B
-Ljava/io/StreamTokenizer;->CT_WHITESPACE:B
-Ljava/io/StreamTokenizer;->eolIsSignificantP:Z
-Ljava/io/StreamTokenizer;->forceLower:Z
-Ljava/io/StreamTokenizer;->input:Ljava/io/InputStream;
-Ljava/io/StreamTokenizer;->LINENO:I
-Ljava/io/StreamTokenizer;->NEED_CHAR:I
-Ljava/io/StreamTokenizer;->peekc:I
-Ljava/io/StreamTokenizer;->pushedBack:Z
-Ljava/io/StreamTokenizer;->read()I
-Ljava/io/StreamTokenizer;->reader:Ljava/io/Reader;
-Ljava/io/StreamTokenizer;->SKIP_LF:I
-Ljava/io/StreamTokenizer;->slashSlashCommentsP:Z
-Ljava/io/StreamTokenizer;->slashStarCommentsP:Z
-Ljava/io/StreamTokenizer;->TT_NOTHING:I
-Ljava/io/StringReader;->ensureOpen()V
-Ljava/io/StringReader;->length:I
-Ljava/io/StringReader;->mark:I
-Ljava/io/StringReader;->next:I
-Ljava/io/StringReader;->str:Ljava/lang/String;
-Ljava/io/StringWriter;->buf:Ljava/lang/StringBuffer;
-Ljava/io/Writer;->writeBuffer:[C
-Ljava/io/Writer;->WRITE_BUFFER_SIZE:I
-Ljava/lang/AbstractStringBuilder;-><init>()V
-Ljava/lang/AbstractStringBuilder;-><init>(I)V
-Ljava/lang/AbstractStringBuilder;->append(D)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(F)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(I)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(J)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(Ljava/lang/Object;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(Ljava/lang/StringBuffer;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append(Z)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append([C)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->append([CII)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->appendCodePoint(I)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->appendNull()Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->capacity()I
-Ljava/lang/AbstractStringBuilder;->codePointAt(I)I
-Ljava/lang/AbstractStringBuilder;->codePointBefore(I)I
-Ljava/lang/AbstractStringBuilder;->codePointCount(II)I
-Ljava/lang/AbstractStringBuilder;->count:I
-Ljava/lang/AbstractStringBuilder;->delete(II)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->deleteCharAt(I)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->ensureCapacity(I)V
-Ljava/lang/AbstractStringBuilder;->ensureCapacityInternal(I)V
-Ljava/lang/AbstractStringBuilder;->getChars(II[CI)V
-Ljava/lang/AbstractStringBuilder;->getValue()[C
-Ljava/lang/AbstractStringBuilder;->hugeCapacity(I)I
-Ljava/lang/AbstractStringBuilder;->indexOf(Ljava/lang/String;)I
-Ljava/lang/AbstractStringBuilder;->indexOf(Ljava/lang/String;I)I
-Ljava/lang/AbstractStringBuilder;->insert(IC)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(ID)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(IF)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(II)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(IJ)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(ILjava/lang/CharSequence;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(ILjava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(ILjava/lang/Object;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(ILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(IZ)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(I[C)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->insert(I[CII)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->lastIndexOf(Ljava/lang/String;)I
-Ljava/lang/AbstractStringBuilder;->lastIndexOf(Ljava/lang/String;I)I
-Ljava/lang/AbstractStringBuilder;->MAX_ARRAY_SIZE:I
-Ljava/lang/AbstractStringBuilder;->newCapacity(I)I
-Ljava/lang/AbstractStringBuilder;->offsetByCodePoints(II)I
-Ljava/lang/AbstractStringBuilder;->replace(IILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->reverse()Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AbstractStringBuilder;->reverseAllValidSurrogatePairs()V
-Ljava/lang/AbstractStringBuilder;->setCharAt(IC)V
-Ljava/lang/AbstractStringBuilder;->setLength(I)V
-Ljava/lang/AbstractStringBuilder;->substring(I)Ljava/lang/String;
-Ljava/lang/AbstractStringBuilder;->substring(II)Ljava/lang/String;
-Ljava/lang/AbstractStringBuilder;->trimToSize()V
-Ljava/lang/AndroidHardcodedSystemProperties;-><init>()V
-Ljava/lang/AndroidHardcodedSystemProperties;->JAVA_VERSION:Ljava/lang/String;
-Ljava/lang/AndroidHardcodedSystemProperties;->STATIC_PROPERTIES:[[Ljava/lang/String;
-Ljava/lang/annotation/AnnotationTypeMismatchException;->element:Ljava/lang/reflect/Method;
-Ljava/lang/annotation/AnnotationTypeMismatchException;->foundType:Ljava/lang/String;
-Ljava/lang/annotation/IncompleteAnnotationException;->annotationType:Ljava/lang/Class;
-Ljava/lang/annotation/IncompleteAnnotationException;->elementName:Ljava/lang/String;
-Ljava/lang/ArrayIndexOutOfBoundsException;-><init>(II)V
-Ljava/lang/ArrayIndexOutOfBoundsException;-><init>(III)V
-Ljava/lang/AssertionError;-><init>(Ljava/lang/String;)V
-Ljava/lang/Byte$ByteCache;-><init>()V
-Ljava/lang/Byte$ByteCache;->cache:[Ljava/lang/Byte;
-Ljava/lang/Byte;->DIGITS:[C
-Ljava/lang/Byte;->UPPER_CASE_DIGITS:[C
-Ljava/lang/Character$CharacterCache;-><init>()V
-Ljava/lang/Character$CharacterCache;->cache:[Ljava/lang/Character;
-Ljava/lang/Character$Subset;->name:Ljava/lang/String;
-Ljava/lang/Character$UnicodeBlock;-><init>(Ljava/lang/String;)V
-Ljava/lang/Character$UnicodeBlock;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/lang/Character$UnicodeBlock;-><init>(Ljava/lang/String;Z)V
-Ljava/lang/Character$UnicodeBlock;->blocks:[Ljava/lang/Character$UnicodeBlock;
-Ljava/lang/Character$UnicodeBlock;->blockStarts:[I
-Ljava/lang/Character$UnicodeBlock;->map:Ljava/util/Map;
-Ljava/lang/Character$UnicodeScript;->aliases:Ljava/util/HashMap;
-Ljava/lang/Character$UnicodeScript;->scripts:[Ljava/lang/Character$UnicodeScript;
-Ljava/lang/Character$UnicodeScript;->scriptStarts:[I
-Ljava/lang/Character;->codePointAtImpl([CII)I
-Ljava/lang/Character;->codePointBeforeImpl([CII)I
-Ljava/lang/Character;->codePointCountImpl([CII)I
-Ljava/lang/Character;->digitImpl(II)I
-Ljava/lang/Character;->DIRECTIONALITY:[B
-Ljava/lang/Character;->ERROR:I
-Ljava/lang/Character;->getDirectionalityImpl(I)B
-Ljava/lang/Character;->getNameImpl(I)Ljava/lang/String;
-Ljava/lang/Character;->getNumericValueImpl(I)I
-Ljava/lang/Character;->getTypeImpl(I)I
-Ljava/lang/Character;->isAlphabeticImpl(I)Z
-Ljava/lang/Character;->isDefinedImpl(I)Z
-Ljava/lang/Character;->isDigitImpl(I)Z
-Ljava/lang/Character;->isIdentifierIgnorableImpl(I)Z
-Ljava/lang/Character;->isIdeographicImpl(I)Z
-Ljava/lang/Character;->isLetterImpl(I)Z
-Ljava/lang/Character;->isLetterOrDigitImpl(I)Z
-Ljava/lang/Character;->isLowerCaseImpl(I)Z
-Ljava/lang/Character;->isMirroredImpl(I)Z
-Ljava/lang/Character;->isSpaceCharImpl(I)Z
-Ljava/lang/Character;->isTitleCaseImpl(I)Z
-Ljava/lang/Character;->isUnicodeIdentifierPartImpl(I)Z
-Ljava/lang/Character;->isUnicodeIdentifierStartImpl(I)Z
-Ljava/lang/Character;->isUpperCaseImpl(I)Z
-Ljava/lang/Character;->isWhitespaceImpl(I)Z
-Ljava/lang/Character;->offsetByCodePointsImpl([CIIII)I
-Ljava/lang/Character;->toLowerCaseImpl(I)I
-Ljava/lang/Character;->toSurrogates(I[CI)V
-Ljava/lang/Character;->toTitleCaseImpl(I)I
-Ljava/lang/Character;->toUpperCaseImpl(I)I
-Ljava/lang/Class$Caches;-><init>()V
-Ljava/lang/Class$Caches;->genericInterfaces:Llibcore/util/BasicLruCache;
-Ljava/lang/Class;->ANNOTATION:I
-Ljava/lang/Class;->cannotCastMsg(Ljava/lang/Object;)Ljava/lang/String;
-Ljava/lang/Class;->classFlags:I
-Ljava/lang/Class;->classForName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
-Ljava/lang/Class;->classNameImpliesTopLevel()Z
-Ljava/lang/Class;->classSize:I
-Ljava/lang/Class;->componentType:Ljava/lang/Class;
-Ljava/lang/Class;->copiedMethodsOffset:S
-Ljava/lang/Class;->dexTypeIndex:I
-Ljava/lang/Class;->ENUM:I
-Ljava/lang/Class;->extData:Ldalvik/system/ClassExt;
-Ljava/lang/Class;->FINALIZABLE:I
-Ljava/lang/Class;->findInterfaceMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-Ljava/lang/Class;->getAccessFlags()I
-Ljava/lang/Class;->getConstructor0([Ljava/lang/Class;I)Ljava/lang/reflect/Constructor;
-Ljava/lang/Class;->getDeclaredConstructorInternal([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-Ljava/lang/Class;->getDeclaredConstructorsInternal(Z)[Ljava/lang/reflect/Constructor;
-Ljava/lang/Class;->getDeclaredFieldsUnchecked(Z)[Ljava/lang/reflect/Field;
-Ljava/lang/Class;->getDeclaredMethodInternal(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-Ljava/lang/Class;->getEnclosingConstructorNative()Ljava/lang/reflect/Constructor;
-Ljava/lang/Class;->getEnclosingMethodNative()Ljava/lang/reflect/Method;
-Ljava/lang/Class;->getEnumConstantsShared()[Ljava/lang/Object;
-Ljava/lang/Class;->getInnerClassFlags(I)I
-Ljava/lang/Class;->getInnerClassName()Ljava/lang/String;
-Ljava/lang/Class;->getInstanceMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-Ljava/lang/Class;->getInterfacesInternal()[Ljava/lang/Class;
-Ljava/lang/Class;->getNameNative()Ljava/lang/String;
-Ljava/lang/Class;->getPackageName$()Ljava/lang/String;
-Ljava/lang/Class;->getPrimitiveClass(Ljava/lang/String;)Ljava/lang/Class;
-Ljava/lang/Class;->getPublicDeclaredFields()[Ljava/lang/reflect/Field;
-Ljava/lang/Class;->getPublicFieldRecursive(Ljava/lang/String;)Ljava/lang/reflect/Field;
-Ljava/lang/Class;->getPublicFieldsRecursive(Ljava/util/List;)V
-Ljava/lang/Class;->getPublicMethodRecursive(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-Ljava/lang/Class;->getPublicMethodsInternal(Ljava/util/List;)V
-Ljava/lang/Class;->getSignatureAnnotation()[Ljava/lang/String;
-Ljava/lang/Class;->getSignatureAttribute()Ljava/lang/String;
-Ljava/lang/Class;->iFields:J
-Ljava/lang/Class;->isDeclaredAnnotationPresent(Ljava/lang/Class;)Z
-Ljava/lang/Class;->isFinalizable()Z
-Ljava/lang/Class;->isLocalOrAnonymousClass()Z
-Ljava/lang/Class;->isProxy()Z
-Ljava/lang/Class;->methods:J
-Ljava/lang/Class;->numReferenceInstanceFields:I
-Ljava/lang/Class;->numReferenceStaticFields:I
-Ljava/lang/Class;->objectSizeAllocFastPath:I
-Ljava/lang/Class;->primitiveType:I
-Ljava/lang/Class;->referenceInstanceOffsets:I
-Ljava/lang/Class;->resolveName(Ljava/lang/String;)Ljava/lang/String;
-Ljava/lang/Class;->sFields:J
-Ljava/lang/Class;->superClass:Ljava/lang/Class;
-Ljava/lang/Class;->SYNTHETIC:I
-Ljava/lang/Class;->virtualMethodsOffset:S
-Ljava/lang/Class;->vtable:Ljava/lang/Object;
-Ljava/lang/ClassLoader$SystemClassLoader;-><init>()V
-Ljava/lang/ClassLoader$SystemClassLoader;->loader:Ljava/lang/ClassLoader;
-Ljava/lang/ClassLoader;-><init>(Ljava/lang/Void;Ljava/lang/ClassLoader;)V
-Ljava/lang/ClassLoader;->allocator:J
-Ljava/lang/ClassLoader;->checkCreateClassLoader()Ljava/lang/Void;
-Ljava/lang/ClassLoader;->classTable:J
-Ljava/lang/ClassLoader;->createSystemClassLoader()Ljava/lang/ClassLoader;
-Ljava/lang/ClassLoader;->findBootstrapClassOrNull(Ljava/lang/String;)Ljava/lang/Class;
-Ljava/lang/ClassLoader;->getBootstrapResource(Ljava/lang/String;)Ljava/net/URL;
-Ljava/lang/ClassLoader;->getBootstrapResources(Ljava/lang/String;)Ljava/util/Enumeration;
-Ljava/lang/ClassLoader;->packages:Ljava/util/HashMap;
-Ljava/lang/ClassLoader;->proxyCache:Ljava/util/Map;
-Ljava/lang/ClassNotFoundException;->ex:Ljava/lang/Throwable;
-Ljava/lang/Compiler;-><init>()V
-Ljava/lang/Daemons$Daemon;-><init>(Ljava/lang/String;)V
-Ljava/lang/Daemons$Daemon;->getStackTrace()[Ljava/lang/StackTraceElement;
-Ljava/lang/Daemons$Daemon;->interrupt()V
-Ljava/lang/Daemons$Daemon;->interrupt(Ljava/lang/Thread;)V
-Ljava/lang/Daemons$Daemon;->name:Ljava/lang/String;
-Ljava/lang/Daemons$Daemon;->postZygoteFork:Z
-Ljava/lang/Daemons$Daemon;->runInternal()V
-Ljava/lang/Daemons$Daemon;->startInternal()V
-Ljava/lang/Daemons$Daemon;->startPostZygoteFork()V
-Ljava/lang/Daemons$FinalizerDaemon;-><init>()V
-Ljava/lang/Daemons$FinalizerDaemon;->doFinalize(Ljava/lang/ref/FinalizerReference;)V
-Ljava/lang/Daemons$FinalizerDaemon;->progressCounter:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/lang/Daemons$FinalizerDaemon;->queue:Ljava/lang/ref/ReferenceQueue;
-Ljava/lang/Daemons$FinalizerDaemon;->runInternal()V
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;-><init>()V
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->finalizerTimedOut(Ljava/lang/Object;)V
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->getNeedToWork()Z
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->goToSleep()V
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->needToWork:Z
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->runInternal()V
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->sleepFor(J)Z
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->sleepUntilNeeded()Z
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->waitForFinalization()Ljava/lang/Object;
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;->wakeUp()V
-Ljava/lang/Daemons$HeapTaskDaemon;-><init>()V
-Ljava/lang/Daemons$HeapTaskDaemon;->INSTANCE:Ljava/lang/Daemons$HeapTaskDaemon;
-Ljava/lang/Daemons$HeapTaskDaemon;->interrupt(Ljava/lang/Thread;)V
-Ljava/lang/Daemons$HeapTaskDaemon;->runInternal()V
-Ljava/lang/Daemons$ReferenceQueueDaemon;-><init>()V
-Ljava/lang/Daemons$ReferenceQueueDaemon;->runInternal()V
-Ljava/lang/Daemons;-><init>()V
-Ljava/lang/Daemons;->NANOS_PER_MILLI:I
-Ljava/lang/Daemons;->NANOS_PER_SECOND:I
-Ljava/lang/Daemons;->requestGC()V
-Ljava/lang/Daemons;->startPostZygoteFork()V
-Ljava/lang/Enum;->sharedConstantsCache:Llibcore/util/BasicLruCache;
-Ljava/lang/EnumConstantNotPresentException;->constantName:Ljava/lang/String;
-Ljava/lang/EnumConstantNotPresentException;->enumType:Ljava/lang/Class;
-Ljava/lang/ExceptionInInitializerError;->exception:Ljava/lang/Throwable;
-Ljava/lang/InheritableThreadLocal;->createMap(Ljava/lang/Thread;Ljava/lang/Object;)V
-Ljava/lang/InheritableThreadLocal;->getMap(Ljava/lang/Thread;)Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/Integer$IntegerCache;-><init>()V
-Ljava/lang/Integer$IntegerCache;->cache:[Ljava/lang/Integer;
-Ljava/lang/Integer$IntegerCache;->high:I
-Ljava/lang/Integer$IntegerCache;->low:I
-Ljava/lang/Integer;->DigitOnes:[C
-Ljava/lang/Integer;->digits:[C
-Ljava/lang/Integer;->DigitTens:[C
-Ljava/lang/Integer;->formatUnsignedInt(II[CII)I
-Ljava/lang/Integer;->getChars(II[C)V
-Ljava/lang/Integer;->sizeTable:[I
-Ljava/lang/Integer;->SMALL_NEG_VALUES:[Ljava/lang/String;
-Ljava/lang/Integer;->SMALL_NONNEG_VALUES:[Ljava/lang/String;
-Ljava/lang/Integer;->stringSize(I)I
-Ljava/lang/Integer;->toUnsignedString0(II)Ljava/lang/String;
-Ljava/lang/invoke/CallSite;-><init>(Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/CallSite;-><init>(Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/CallSite;-><init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/CallSite;->checkTargetChange(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/CallSite;->getTargetVolatile()Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/CallSite;->GET_TARGET:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/CallSite;->initializeGetTarget()V
-Ljava/lang/invoke/CallSite;->makeDynamicInvoker()Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/CallSite;->setTargetNormal(Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/CallSite;->setTargetVolatile(Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/CallSite;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/CallSite;->TARGET_OFFSET:J
-Ljava/lang/invoke/CallSite;->wrongTargetType(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/WrongMethodTypeException;
-Ljava/lang/invoke/ConstantCallSite;->isFrozen:Z
-Ljava/lang/invoke/MethodHandle;-><init>(JILjava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/MethodHandle;->artFieldOrMethod:J
-Ljava/lang/invoke/MethodHandle;->asCollectorChecks(Ljava/lang/Class;I)Z
-Ljava/lang/invoke/MethodHandle;->asSpreaderChecks(Ljava/lang/Class;I)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodHandle;->cachedSpreadInvoker:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandle;->duplicate()Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandle;->getHandleKind()I
-Ljava/lang/invoke/MethodHandle;->handleKind:I
-Ljava/lang/invoke/MethodHandle;->IGET:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_CALLSITE_TRANSFORM:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_DIRECT:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_INTERFACE:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_STATIC:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_SUPER:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_TRANSFORM:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_VAR_HANDLE:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_VAR_HANDLE_EXACT:I
-Ljava/lang/invoke/MethodHandle;->INVOKE_VIRTUAL:I
-Ljava/lang/invoke/MethodHandle;->IPUT:I
-Ljava/lang/invoke/MethodHandle;->nominalType:Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodHandle;->SGET:I
-Ljava/lang/invoke/MethodHandle;->spreadArrayChecks(Ljava/lang/Class;I)V
-Ljava/lang/invoke/MethodHandle;->SPUT:I
-Ljava/lang/invoke/MethodHandle;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/MethodHandle;->transformInternal(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/MethodHandle;->type:Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodHandleImpl$HandleInfo;-><init>(Ljava/lang/reflect/Member;Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/MethodHandleImpl$HandleInfo;->handle:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandleImpl$HandleInfo;->member:Ljava/lang/reflect/Member;
-Ljava/lang/invoke/MethodHandleImpl;-><init>(JILjava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/MethodHandleImpl;->getMemberInternal()Ljava/lang/reflect/Member;
-Ljava/lang/invoke/MethodHandleImpl;->info:Ljava/lang/invoke/MethodHandleImpl$HandleInfo;
-Ljava/lang/invoke/MethodHandleImpl;->reveal()Ljava/lang/invoke/MethodHandleInfo;
-Ljava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodHandles$Lookup;->accessFailedMessage(Ljava/lang/Class;Ljava/lang/Class;I)Ljava/lang/String;
-Ljava/lang/invoke/MethodHandles$Lookup;->allowedModes:I
-Ljava/lang/invoke/MethodHandles$Lookup;->ALL_MODES:I
-Ljava/lang/invoke/MethodHandles$Lookup;->checkAccess(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/String;)V
-Ljava/lang/invoke/MethodHandles$Lookup;->checkReturnType(Ljava/lang/reflect/Method;Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/MethodHandles$Lookup;->checkSpecialCaller(Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodHandles$Lookup;->checkUnprivilegedlookupClass(Ljava/lang/Class;I)V
-Ljava/lang/invoke/MethodHandles$Lookup;->commonFieldChecks(Ljava/lang/reflect/Field;Ljava/lang/Class;Ljava/lang/Class;ZZ)V
-Ljava/lang/invoke/MethodHandles$Lookup;->createMethodHandle(Ljava/lang/reflect/Method;ILjava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->createMethodHandleForConstructor(Ljava/lang/reflect/Constructor;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->findAccessor(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->findAccessor(Ljava/lang/reflect/Field;Ljava/lang/Class;Ljava/lang/Class;IZ)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->findFieldOfType(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/reflect/Field;
-Ljava/lang/invoke/MethodHandles$Lookup;->findSpecial(Ljava/lang/reflect/Method;Ljava/lang/invoke/MethodType;Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->findStaticVarHandle(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/VarHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->findVarHandle(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/VarHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->findVirtualForMH(Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->findVirtualForVH(Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles$Lookup;->fixmods(I)I
-Ljava/lang/invoke/MethodHandles$Lookup;->hasPrivateAccess()Z
-Ljava/lang/invoke/MethodHandles$Lookup;->initMethodType(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodHandles$Lookup;->lookupClass:Ljava/lang/Class;
-Ljava/lang/invoke/MethodHandles$Lookup;->PUBLIC_LOOKUP:Ljava/lang/invoke/MethodHandles$Lookup;
-Ljava/lang/invoke/MethodHandles$Lookup;->throwMakeAccessException(Ljava/lang/String;Ljava/lang/Object;)V
-Ljava/lang/invoke/MethodHandles$Lookup;->unreflectVarHandle(Ljava/lang/reflect/Field;)Ljava/lang/invoke/VarHandle;
-Ljava/lang/invoke/MethodHandles;-><init>()V
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([BI)B
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([CI)C
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([DI)D
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([FI)F
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([II)I
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([JI)J
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([SI)S
-Ljava/lang/invoke/MethodHandles;->arrayElementGetter([ZI)Z
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([BIB)V
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([CIC)V
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([DID)V
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([FIF)V
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([III)V
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([JIJ)V
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([SIS)V
-Ljava/lang/invoke/MethodHandles;->arrayElementSetter([ZIZ)V
-Ljava/lang/invoke/MethodHandles;->arrayElementVarHandle(Ljava/lang/Class;)Ljava/lang/invoke/VarHandle;
-Ljava/lang/invoke/MethodHandles;->byteArrayViewVarHandle(Ljava/lang/Class;Ljava/nio/ByteOrder;)Ljava/lang/invoke/VarHandle;
-Ljava/lang/invoke/MethodHandles;->byteBufferViewVarHandle(Ljava/lang/Class;Ljava/nio/ByteOrder;)Ljava/lang/invoke/VarHandle;
-Ljava/lang/invoke/MethodHandles;->checkClassIsArray(Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodHandles;->checkTypeIsViewable(Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodHandles;->collectArgumentsChecks(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodHandles;->copyTypes(Ljava/util/List;)Ljava/util/List;
-Ljava/lang/invoke/MethodHandles;->dropArgumentChecks(Ljava/lang/invoke/MethodType;ILjava/util/List;)I
-Ljava/lang/invoke/MethodHandles;->explicitCastArgumentsChecks(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/MethodHandles;->filterArgumentChecks(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/MethodHandles;->filterArgumentsCheckArity(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/MethodHandles;->filterReturnValueChecks(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/MethodHandles;->foldArgumentChecks(ILjava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)Ljava/lang/Class;
-Ljava/lang/invoke/MethodHandles;->getMethodHandleImpl(Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandleImpl;
-Ljava/lang/invoke/MethodHandles;->identity(B)B
-Ljava/lang/invoke/MethodHandles;->identity(C)C
-Ljava/lang/invoke/MethodHandles;->identity(D)D
-Ljava/lang/invoke/MethodHandles;->identity(F)F
-Ljava/lang/invoke/MethodHandles;->identity(I)I
-Ljava/lang/invoke/MethodHandles;->identity(J)J
-Ljava/lang/invoke/MethodHandles;->identity(S)S
-Ljava/lang/invoke/MethodHandles;->identity(Z)Z
-Ljava/lang/invoke/MethodHandles;->insertArgumentsChecks(Ljava/lang/invoke/MethodHandle;II)[Ljava/lang/Class;
-Ljava/lang/invoke/MethodHandles;->methodHandleForVarHandleAccessor(Ljava/lang/invoke/VarHandle$AccessMode;Ljava/lang/invoke/MethodType;Z)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles;->misMatchedTypes(Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)Ljava/lang/RuntimeException;
-Ljava/lang/invoke/MethodHandles;->permuteArgumentChecks([ILjava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)Z
-Ljava/lang/invoke/MethodHandles;->varHandleExactInvoker(Ljava/lang/invoke/VarHandle$AccessMode;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandles;->varHandleInvoker(Ljava/lang/invoke/VarHandle$AccessMode;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;-><init>(Ljava/lang/Object;)V
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;->hashcode:I
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;-><init>()V
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;->add(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;->expungeStaleElements()V
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;->get(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;->map:Ljava/util/concurrent/ConcurrentMap;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;->stale:Ljava/lang/ref/ReferenceQueue;
-Ljava/lang/invoke/MethodType;-><init>()V
-Ljava/lang/invoke/MethodType;-><init>(Ljava/lang/Class;[Ljava/lang/Class;Z)V
-Ljava/lang/invoke/MethodType;-><init>([Ljava/lang/Class;Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodType;->asCollectorType(Ljava/lang/Class;I)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->asSpreaderType(Ljava/lang/Class;I)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->basicType()Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->canConvert(Ljava/lang/Class;Ljava/lang/Class;)Z
-Ljava/lang/invoke/MethodType;->canConvertParameters([Ljava/lang/Class;[Ljava/lang/Class;)Z
-Ljava/lang/invoke/MethodType;->checkPtype(Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodType;->checkPtypes([Ljava/lang/Class;)I
-Ljava/lang/invoke/MethodType;->checkRtype(Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodType;->checkSlotCount(I)V
-Ljava/lang/invoke/MethodType;->equals(Ljava/lang/invoke/MethodType;)Z
-Ljava/lang/invoke/MethodType;->explicitCastEquivalentToAsType(Ljava/lang/Class;Ljava/lang/Class;)Z
-Ljava/lang/invoke/MethodType;->explicitCastEquivalentToAsType(Ljava/lang/invoke/MethodType;)Z
-Ljava/lang/invoke/MethodType;->form()Ljava/lang/invoke/MethodTypeForm;
-Ljava/lang/invoke/MethodType;->form:Ljava/lang/invoke/MethodTypeForm;
-Ljava/lang/invoke/MethodType;->internTable:Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;
-Ljava/lang/invoke/MethodType;->invokerType()Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->isConvertibleTo(Ljava/lang/invoke/MethodType;)Z
-Ljava/lang/invoke/MethodType;->isGeneric()Z
-Ljava/lang/invoke/MethodType;->lastParameterType()Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->leadingReferenceParameter()Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->listToArray(Ljava/util/List;)[Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->makeImpl(Ljava/lang/Class;[Ljava/lang/Class;Z)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->MAX_JVM_ARITY:I
-Ljava/lang/invoke/MethodType;->MAX_MH_ARITY:I
-Ljava/lang/invoke/MethodType;->MAX_MH_INVOKER_ARITY:I
-Ljava/lang/invoke/MethodType;->methodDescriptor:Ljava/lang/String;
-Ljava/lang/invoke/MethodType;->MethodType_init(Ljava/lang/Class;[Ljava/lang/Class;)V
-Ljava/lang/invoke/MethodType;->newIndexOutOfBoundsException(Ljava/lang/Object;)Ljava/lang/IndexOutOfBoundsException;
-Ljava/lang/invoke/MethodType;->NO_PTYPES:[Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->objectOnlyTypes:[Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->parameterSlotCount()I
-Ljava/lang/invoke/MethodType;->ptypes()[Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->ptypes:[Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->ptypesOffset:J
-Ljava/lang/invoke/MethodType;->rtype()Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->rtype:Ljava/lang/Class;
-Ljava/lang/invoke/MethodType;->rtypeOffset:J
-Ljava/lang/invoke/MethodType;->toFieldDescriptorString(Ljava/lang/Class;)Ljava/lang/String;
-Ljava/lang/invoke/MethodType;->unwrapWithNoPrims(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->wrapAlt:Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType;->wrapWithPrims(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodTypeForm;-><init>(Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/MethodTypeForm;->argCounts:J
-Ljava/lang/invoke/MethodTypeForm;->argSlotToParameter(I)I
-Ljava/lang/invoke/MethodTypeForm;->argToSlotTable:[I
-Ljava/lang/invoke/MethodTypeForm;->assertIsBasicType()Z
-Ljava/lang/invoke/MethodTypeForm;->basicType()Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodTypeForm;->basicType:Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodTypeForm;->canonicalize(Ljava/lang/Class;I)Ljava/lang/Class;
-Ljava/lang/invoke/MethodTypeForm;->canonicalize(Ljava/lang/invoke/MethodType;II)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodTypeForm;->canonicalizeAll([Ljava/lang/Class;I)[Ljava/lang/Class;
-Ljava/lang/invoke/MethodTypeForm;->ERASE:I
-Ljava/lang/invoke/MethodTypeForm;->erasedType()Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodTypeForm;->erasedType:Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodTypeForm;->findForm(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodTypeForm;
-Ljava/lang/invoke/MethodTypeForm;->hasLongPrimitives()Z
-Ljava/lang/invoke/MethodTypeForm;->hasNonVoidPrimitives()Z
-Ljava/lang/invoke/MethodTypeForm;->hasPrimitives()Z
-Ljava/lang/invoke/MethodTypeForm;->INTS:I
-Ljava/lang/invoke/MethodTypeForm;->longPrimitiveParameterCount()I
-Ljava/lang/invoke/MethodTypeForm;->longPrimitiveReturnCount()I
-Ljava/lang/invoke/MethodTypeForm;->LONGS:I
-Ljava/lang/invoke/MethodTypeForm;->NO_CHANGE:I
-Ljava/lang/invoke/MethodTypeForm;->pack(IIII)J
-Ljava/lang/invoke/MethodTypeForm;->parameterCount()I
-Ljava/lang/invoke/MethodTypeForm;->parameterSlotCount()I
-Ljava/lang/invoke/MethodTypeForm;->parameterToArgSlot(I)I
-Ljava/lang/invoke/MethodTypeForm;->primCounts:J
-Ljava/lang/invoke/MethodTypeForm;->primitiveParameterCount()I
-Ljava/lang/invoke/MethodTypeForm;->primitiveReturnCount()I
-Ljava/lang/invoke/MethodTypeForm;->RAW_RETURN:I
-Ljava/lang/invoke/MethodTypeForm;->returnCount()I
-Ljava/lang/invoke/MethodTypeForm;->returnSlotCount()I
-Ljava/lang/invoke/MethodTypeForm;->slotToArgTable:[I
-Ljava/lang/invoke/MethodTypeForm;->unpack(JI)C
-Ljava/lang/invoke/MethodTypeForm;->UNWRAP:I
-Ljava/lang/invoke/MethodTypeForm;->WRAP:I
-Ljava/lang/invoke/Transformers$AlwaysThrow;-><init>(Ljava/lang/Class;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$AlwaysThrow;->exceptionType:Ljava/lang/Class;
-Ljava/lang/invoke/Transformers$AlwaysThrow;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$BindTo;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/Object;)V
-Ljava/lang/invoke/Transformers$BindTo;->delegate:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$BindTo;->range:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$BindTo;->receiver:Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$BindTo;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$CatchException;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$CatchException;->exType:Ljava/lang/Class;
-Ljava/lang/invoke/Transformers$CatchException;->handler:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$CatchException;->handlerArgsRange:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$CatchException;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$CatchException;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$CollectArguments;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/Transformers$CollectArguments;->collector:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$CollectArguments;->collectorRange:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$CollectArguments;->pos:I
-Ljava/lang/invoke/Transformers$CollectArguments;->range1:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$CollectArguments;->range2:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$CollectArguments;->referencesOffset:I
-Ljava/lang/invoke/Transformers$CollectArguments;->stackFrameOffset:I
-Ljava/lang/invoke/Transformers$CollectArguments;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$CollectArguments;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$Collector;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/Class;I)V
-Ljava/lang/invoke/Transformers$Collector;->arrayOffset:I
-Ljava/lang/invoke/Transformers$Collector;->arrayTypeChar:C
-Ljava/lang/invoke/Transformers$Collector;->copyRange:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$Collector;->numArrayArgs:I
-Ljava/lang/invoke/Transformers$Collector;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$Collector;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$Constant;-><init>(Ljava/lang/Class;Ljava/lang/Object;)V
-Ljava/lang/invoke/Transformers$Constant;->asDouble:D
-Ljava/lang/invoke/Transformers$Constant;->asFloat:F
-Ljava/lang/invoke/Transformers$Constant;->asInt:I
-Ljava/lang/invoke/Transformers$Constant;->asLong:J
-Ljava/lang/invoke/Transformers$Constant;->asReference:Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$Constant;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$Constant;->type:Ljava/lang/Class;
-Ljava/lang/invoke/Transformers$Constant;->typeChar:C
-Ljava/lang/invoke/Transformers$Construct;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/Transformers$Construct;->callerRange:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$Construct;->checkInstantiable(Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$Construct;->constructorHandle:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$Construct;->getConstructorHandle()Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$Construct;->isAbstract(Ljava/lang/Class;)Z
-Ljava/lang/invoke/Transformers$Construct;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$DropArguments;-><init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;II)V
-Ljava/lang/invoke/Transformers$DropArguments;->delegate:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$DropArguments;->range1:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$DropArguments;->range2:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$DropArguments;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->box(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->explicitCast(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->explicitCastArguments(Ldalvik/system/EmulatedStackFrame;Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->explicitCastFromBoolean(ZLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->explicitCastPrimitives(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->explicitCastReturnValue(Ldalvik/system/EmulatedStackFrame;Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->explicitCastToBoolean(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->readPrimitiveAsByte(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;)B
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->readPrimitiveAsChar(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;)C
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->readPrimitiveAsDouble(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;)D
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->readPrimitiveAsFloat(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;)F
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->readPrimitiveAsInt(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;)I
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->readPrimitiveAsLong(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;)J
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->readPrimitiveAsShort(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ljava/lang/Class;)S
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->throwUnexpectedType(Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->toBoolean(B)Z
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->unbox(Ljava/lang/Object;Ljava/lang/Class;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->unboxNonNull(Ljava/lang/Object;Ljava/lang/Class;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ExplicitCastArguments;->unboxNull(Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$FilterArguments;-><init>(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/Transformers$FilterArguments;->deriveType(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/Transformers$FilterArguments;->filters:[Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$FilterArguments;->pos:I
-Ljava/lang/invoke/Transformers$FilterArguments;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$FilterArguments;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$FilterReturnValue;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/Transformers$FilterReturnValue;->allArgs:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$FilterReturnValue;->filter:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$FilterReturnValue;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$FilterReturnValue;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$FoldArguments;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/Transformers$FoldArguments;->combiner:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$FoldArguments;->combinerArgs:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$FoldArguments;->deriveType(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/Transformers$FoldArguments;->referencesOffset:I
-Ljava/lang/invoke/Transformers$FoldArguments;->stackFrameOffset:I
-Ljava/lang/invoke/Transformers$FoldArguments;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$FoldArguments;->targetArgs:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$FoldArguments;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$GuardWithTest;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/Transformers$GuardWithTest;->fallback:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$GuardWithTest;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$GuardWithTest;->test:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$GuardWithTest;->testArgsRange:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$GuardWithTest;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$InsertArguments;-><init>(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/Object;)V
-Ljava/lang/invoke/Transformers$InsertArguments;->pos:I
-Ljava/lang/invoke/Transformers$InsertArguments;->range1:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$InsertArguments;->range2:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$InsertArguments;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$InsertArguments;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$InsertArguments;->values:[Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$Invoker;-><init>(Ljava/lang/invoke/MethodType;Z)V
-Ljava/lang/invoke/Transformers$Invoker;->copyRange:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$Invoker;->isExactInvoker:Z
-Ljava/lang/invoke/Transformers$Invoker;->targetType:Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/Transformers$Invoker;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$PermuteArguments;-><init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;[I)V
-Ljava/lang/invoke/Transformers$PermuteArguments;->reorder:[I
-Ljava/lang/invoke/Transformers$PermuteArguments;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$PermuteArguments;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ReferenceArrayElementGetter;-><init>(Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ReferenceArrayElementGetter;->arrayClass:Ljava/lang/Class;
-Ljava/lang/invoke/Transformers$ReferenceArrayElementGetter;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ReferenceArrayElementSetter;-><init>(Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ReferenceArrayElementSetter;->arrayClass:Ljava/lang/Class;
-Ljava/lang/invoke/Transformers$ReferenceArrayElementSetter;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ReferenceIdentity;-><init>(Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$ReferenceIdentity;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$ReferenceIdentity;->type:Ljava/lang/Class;
-Ljava/lang/invoke/Transformers$Spreader;-><init>(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;I)V
-Ljava/lang/invoke/Transformers$Spreader;->arrayOffset:I
-Ljava/lang/invoke/Transformers$Spreader;->arrayTypeChar:C
-Ljava/lang/invoke/Transformers$Spreader;->copyRange:Ldalvik/system/EmulatedStackFrame$Range;
-Ljava/lang/invoke/Transformers$Spreader;->numArrayArgs:I
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([BLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([CLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([DLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([FLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([ILdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([JLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([Ljava/lang/Object;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([SLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->spreadArray([ZLdalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/invoke/MethodType;II)V
-Ljava/lang/invoke/Transformers$Spreader;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$Spreader;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$Transformer;-><init>(Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/Transformers$Transformer;-><init>(Ljava/lang/invoke/MethodType;I)V
-Ljava/lang/invoke/Transformers$VarargsCollector;-><init>(Ljava/lang/invoke/MethodHandle;)V
-Ljava/lang/invoke/Transformers$VarargsCollector;->arityArgumentsConvertible([Ljava/lang/Class;ILjava/lang/Class;)Z
-Ljava/lang/invoke/Transformers$VarargsCollector;->booleanArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->byteArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->charArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->collectArguments(CLjava/lang/Class;Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->copyParameter(Ldalvik/system/EmulatedStackFrame$StackFrameReader;Ldalvik/system/EmulatedStackFrame$StackFrameWriter;Ljava/lang/Class;)V
-Ljava/lang/invoke/Transformers$VarargsCollector;->doubleArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->floatArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->intArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->lastParameterTypeIsAnArray([Ljava/lang/Class;)Z
-Ljava/lang/invoke/Transformers$VarargsCollector;->longArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->makeArityArray(Ljava/lang/invoke/MethodType;Ldalvik/system/EmulatedStackFrame$StackFrameReader;ILjava/lang/Class;)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->makeTargetFrameType(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/Transformers$VarargsCollector;->prepareFrame(Ldalvik/system/EmulatedStackFrame;Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers$VarargsCollector;->referenceArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->shortArray(Ldalvik/system/EmulatedStackFrame$StackFrameReader;[Ljava/lang/Class;II)Ljava/lang/Object;
-Ljava/lang/invoke/Transformers$VarargsCollector;->target:Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/Transformers$VarargsCollector;->throwWrongMethodTypeException(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)V
-Ljava/lang/invoke/Transformers$VarargsCollector;->transform(Ldalvik/system/EmulatedStackFrame;)V
-Ljava/lang/invoke/Transformers;-><init>()V
-Ljava/lang/invoke/Transformers;->TRANSFORM_INTERNAL:Ljava/lang/reflect/Method;
-Ljava/lang/invoke/VarHandle$AccessMode;->at:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessMode;->COMPARE_AND_EXCHANGE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->COMPARE_AND_EXCHANGE_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->COMPARE_AND_EXCHANGE_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->COMPARE_AND_SET:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_ADD:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_ADD_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_ADD_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_AND:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_AND_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_AND_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_OR:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_OR_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_OR_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_XOR:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_XOR_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_BITWISE_XOR_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_SET:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_SET_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_AND_SET_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_OPAQUE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->GET_VOLATILE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->methodName()Ljava/lang/String;
-Ljava/lang/invoke/VarHandle$AccessMode;->methodName:Ljava/lang/String;
-Ljava/lang/invoke/VarHandle$AccessMode;->methodNameToAccessMode:Ljava/util/Map;
-Ljava/lang/invoke/VarHandle$AccessMode;->SET:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->SET_OPAQUE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->SET_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->SET_VOLATILE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->valueFromMethodName(Ljava/lang/String;)Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->valueOf(Ljava/lang/String;)Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->values()[Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->WEAK_COMPARE_AND_SET:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->WEAK_COMPARE_AND_SET_ACQUIRE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->WEAK_COMPARE_AND_SET_PLAIN:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessMode;->WEAK_COMPARE_AND_SET_RELEASE:Ljava/lang/invoke/VarHandle$AccessMode;
-Ljava/lang/invoke/VarHandle$AccessType;->COMPARE_AND_EXCHANGE:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->COMPARE_AND_SWAP:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->GET:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->GET_AND_UPDATE:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->GET_AND_UPDATE_BITWISE:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->GET_AND_UPDATE_NUMERIC:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->SET:Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->valueOf(Ljava/lang/String;)Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle$AccessType;->values()[Ljava/lang/invoke/VarHandle$AccessType;
-Ljava/lang/invoke/VarHandle;-><init>(Ljava/lang/Class;Ljava/lang/Class;ZLjava/lang/Class;Ljava/lang/Class;)V
-Ljava/lang/invoke/VarHandle;-><init>(Ljava/lang/Class;Z)V
-Ljava/lang/invoke/VarHandle;-><init>(Ljava/lang/Class;ZLjava/lang/Class;)V
-Ljava/lang/invoke/VarHandle;->accessModesBitMask:I
-Ljava/lang/invoke/VarHandle;->accessModeType(Ljava/lang/invoke/VarHandle$AccessMode;)Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/VarHandle;->accessTypesToBitMask(Ljava/util/EnumSet;)I
-Ljava/lang/invoke/VarHandle;->alignedAccessModesBitMask(Ljava/lang/Class;Z)I
-Ljava/lang/invoke/VarHandle;->ALL_MODES_BIT_MASK:I
-Ljava/lang/invoke/VarHandle;->ATOMIC_UPDATE_ACCESS_MODES_BIT_MASK:I
-Ljava/lang/invoke/VarHandle;->BITWISE_ATOMIC_UPDATE_ACCESS_MODES_BIT_MASK:I
-Ljava/lang/invoke/VarHandle;->coordinateType0:Ljava/lang/Class;
-Ljava/lang/invoke/VarHandle;->coordinateType1:Ljava/lang/Class;
-Ljava/lang/invoke/VarHandle;->coordinateTypes()Ljava/util/List;
-Ljava/lang/invoke/VarHandle;->isAccessModeSupported(Ljava/lang/invoke/VarHandle$AccessMode;)Z
-Ljava/lang/invoke/VarHandle;->NUMERIC_ATOMIC_UPDATE_ACCESS_MODES_BIT_MASK:I
-Ljava/lang/invoke/VarHandle;->READ_ACCESS_MODES_BIT_MASK:I
-Ljava/lang/invoke/VarHandle;->toMethodHandle(Ljava/lang/invoke/VarHandle$AccessMode;)Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/VarHandle;->unalignedAccessModesBitMask(Ljava/lang/Class;)I
-Ljava/lang/invoke/VarHandle;->UNSAFE:Lsun/misc/Unsafe;
-Ljava/lang/invoke/VarHandle;->varType()Ljava/lang/Class;
-Ljava/lang/invoke/VarHandle;->varType:Ljava/lang/Class;
-Ljava/lang/invoke/VarHandle;->WRITE_ACCESS_MODES_BIT_MASK:I
-Ljava/lang/invoke/WrongMethodTypeException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/lang/invoke/WrongMethodTypeException;-><init>(Ljava/lang/Throwable;)V
-Ljava/lang/Long$LongCache;-><init>()V
-Ljava/lang/Long$LongCache;->cache:[Ljava/lang/Long;
-Ljava/lang/Long;->formatUnsignedLong(JI[CII)I
-Ljava/lang/Long;->getChars(JI[C)V
-Ljava/lang/Long;->stringSize(J)I
-Ljava/lang/Long;->toUnsignedBigInteger(J)Ljava/math/BigInteger;
-Ljava/lang/Long;->toUnsignedString0(JI)Ljava/lang/String;
-Ljava/lang/Math$RandomNumberGeneratorHolder;-><init>()V
-Ljava/lang/Math$RandomNumberGeneratorHolder;->randomNumberGenerator:Ljava/util/Random;
-Ljava/lang/Math;-><init>()V
-Ljava/lang/Math;->negativeZeroDoubleBits:J
-Ljava/lang/Math;->negativeZeroFloatBits:J
-Ljava/lang/Math;->powerOfTwoD(I)D
-Ljava/lang/Math;->powerOfTwoF(I)F
-Ljava/lang/Math;->randomIntInternal()I
-Ljava/lang/Math;->randomLongInternal()J
-Ljava/lang/Math;->setRandomSeedInternal(J)V
-Ljava/lang/Math;->twoToTheDoubleScaleDown:D
-Ljava/lang/Math;->twoToTheDoubleScaleUp:D
-Ljava/lang/NoClassDefFoundError;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/lang/NumberFormatException;->forInputString(Ljava/lang/String;)Ljava/lang/NumberFormatException;
-Ljava/lang/Object;->identityHashCodeNative(Ljava/lang/Object;)I
-Ljava/lang/Object;->internalClone()Ljava/lang/Object;
-Ljava/lang/Object;->shadow$_klass_:Ljava/lang/Class;
-Ljava/lang/Object;->shadow$_monitor_:I
-Ljava/lang/Package;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;Ljava/lang/ClassLoader;)V
-Ljava/lang/Package;-><init>(Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;Ljava/lang/ClassLoader;)V
-Ljava/lang/Package;->defineSystemPackage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Package;
-Ljava/lang/Package;->getPackage(Ljava/lang/Class;)Ljava/lang/Package;
-Ljava/lang/Package;->getPackageInfo()Ljava/lang/Class;
-Ljava/lang/Package;->getSystemPackage(Ljava/lang/String;)Ljava/lang/Package;
-Ljava/lang/Package;->getSystemPackage0(Ljava/lang/String;)Ljava/lang/String;
-Ljava/lang/Package;->getSystemPackages()[Ljava/lang/Package;
-Ljava/lang/Package;->getSystemPackages0()[Ljava/lang/String;
-Ljava/lang/Package;->implTitle:Ljava/lang/String;
-Ljava/lang/Package;->implVendor:Ljava/lang/String;
-Ljava/lang/Package;->implVersion:Ljava/lang/String;
-Ljava/lang/Package;->loader:Ljava/lang/ClassLoader;
-Ljava/lang/Package;->loadManifest(Ljava/lang/String;)Ljava/util/jar/Manifest;
-Ljava/lang/Package;->mans:Ljava/util/Map;
-Ljava/lang/Package;->packageInfo:Ljava/lang/Class;
-Ljava/lang/Package;->pkgName:Ljava/lang/String;
-Ljava/lang/Package;->pkgs:Ljava/util/Map;
-Ljava/lang/Package;->sealBase:Ljava/net/URL;
-Ljava/lang/Package;->specTitle:Ljava/lang/String;
-Ljava/lang/Package;->specVendor:Ljava/lang/String;
-Ljava/lang/Package;->specVersion:Ljava/lang/String;
-Ljava/lang/Package;->urls:Ljava/util/Map;
-Ljava/lang/ProcessBuilder$NullInputStream;-><init>()V
-Ljava/lang/ProcessBuilder$NullInputStream;->INSTANCE:Ljava/lang/ProcessBuilder$NullInputStream;
-Ljava/lang/ProcessBuilder$NullOutputStream;-><init>()V
-Ljava/lang/ProcessBuilder$NullOutputStream;->INSTANCE:Ljava/lang/ProcessBuilder$NullOutputStream;
-Ljava/lang/ProcessBuilder$Redirect;-><init>()V
-Ljava/lang/ProcessBuilder$Redirect;->append()Z
-Ljava/lang/ProcessBuilder;->command:Ljava/util/List;
-Ljava/lang/ProcessBuilder;->directory:Ljava/io/File;
-Ljava/lang/ProcessBuilder;->environment([Ljava/lang/String;)Ljava/lang/ProcessBuilder;
-Ljava/lang/ProcessBuilder;->environment:Ljava/util/Map;
-Ljava/lang/ProcessBuilder;->redirectErrorStream:Z
-Ljava/lang/ProcessBuilder;->redirects()[Ljava/lang/ProcessBuilder$Redirect;
-Ljava/lang/ProcessBuilder;->redirects:[Ljava/lang/ProcessBuilder$Redirect;
-Ljava/lang/ref/FinalizerReference$Sentinel;-><init>()V
-Ljava/lang/ref/FinalizerReference$Sentinel;->awaitFinalization(J)V
-Ljava/lang/ref/FinalizerReference$Sentinel;->finalized:Z
-Ljava/lang/ref/FinalizerReference;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/lang/ref/FinalizerReference;->enqueueSentinelReference(Ljava/lang/ref/FinalizerReference$Sentinel;)Z
-Ljava/lang/ref/FinalizerReference;->finalizeAllEnqueued(J)V
-Ljava/lang/ref/FinalizerReference;->getReferent()Ljava/lang/Object;
-Ljava/lang/ref/FinalizerReference;->LIST_LOCK:Ljava/lang/Object;
-Ljava/lang/ref/FinalizerReference;->makeCircularListIfUnenqueued()Z
-Ljava/lang/ref/FinalizerReference;->prev:Ljava/lang/ref/FinalizerReference;
-Ljava/lang/ref/FinalizerReference;->zombie:Ljava/lang/Object;
-Ljava/lang/ref/Reference$SinkHolder;-><init>()V
-Ljava/lang/ref/Reference$SinkHolder;->finalize_count:I
-Ljava/lang/ref/Reference$SinkHolder;->sink:Ljava/lang/Object;
-Ljava/lang/ref/Reference$SinkHolder;->sinkUser:Ljava/lang/Object;
-Ljava/lang/ref/Reference;-><init>(Ljava/lang/Object;)V
-Ljava/lang/ref/Reference;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/lang/ref/Reference;->clearReferent()V
-Ljava/lang/ref/Reference;->disableIntrinsic:Z
-Ljava/lang/ref/Reference;->pendingNext:Ljava/lang/ref/Reference;
-Ljava/lang/ref/Reference;->queue:Ljava/lang/ref/ReferenceQueue;
-Ljava/lang/ref/Reference;->queueNext:Ljava/lang/ref/Reference;
-Ljava/lang/ref/Reference;->slowPathEnabled:Z
-Ljava/lang/ref/ReferenceQueue;->enqueue(Ljava/lang/ref/Reference;)Z
-Ljava/lang/ref/ReferenceQueue;->enqueueLocked(Ljava/lang/ref/Reference;)Z
-Ljava/lang/ref/ReferenceQueue;->enqueuePending(Ljava/lang/ref/Reference;)V
-Ljava/lang/ref/ReferenceQueue;->head:Ljava/lang/ref/Reference;
-Ljava/lang/ref/ReferenceQueue;->isEnqueued(Ljava/lang/ref/Reference;)Z
-Ljava/lang/ref/ReferenceQueue;->lock:Ljava/lang/Object;
-Ljava/lang/ref/ReferenceQueue;->reallyPollLocked()Ljava/lang/ref/Reference;
-Ljava/lang/ref/ReferenceQueue;->sQueueNextUnenqueued:Ljava/lang/ref/Reference;
-Ljava/lang/ref/ReferenceQueue;->tail:Ljava/lang/ref/Reference;
-Ljava/lang/ref/ReferenceQueue;->unenqueued:Ljava/lang/ref/Reference;
-Ljava/lang/ref/SoftReference;->clock:J
-Ljava/lang/ref/SoftReference;->timestamp:J
-Ljava/lang/reflect/AccessibleObject;->setAccessible0(Ljava/lang/reflect/AccessibleObject;Z)V
-Ljava/lang/reflect/Array;-><init>()V
-Ljava/lang/reflect/Array;->badArray(Ljava/lang/Object;)Ljava/lang/RuntimeException;
-Ljava/lang/reflect/Array;->createMultiArray(Ljava/lang/Class;[I)Ljava/lang/Object;
-Ljava/lang/reflect/Array;->createObjectArray(Ljava/lang/Class;I)Ljava/lang/Object;
-Ljava/lang/reflect/Array;->incompatibleType(Ljava/lang/Object;)Ljava/lang/IllegalArgumentException;
-Ljava/lang/reflect/Array;->newArray(Ljava/lang/Class;I)Ljava/lang/Object;
-Ljava/lang/reflect/Array;->notAnArray(Ljava/lang/Object;)Ljava/lang/IllegalArgumentException;
-Ljava/lang/reflect/Constructor;-><init>()V
-Ljava/lang/reflect/Constructor;-><init>(Ljava/lang/Class;Ljava/lang/Class;)V
-Ljava/lang/reflect/Constructor;->hasGenericInformation()Z
-Ljava/lang/reflect/Constructor;->newInstanceFromSerialization(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object;
-Ljava/lang/reflect/Constructor;->ORDER_BY_SIGNATURE:Ljava/util/Comparator;
-Ljava/lang/reflect/Constructor;->serializationClass:Ljava/lang/Class;
-Ljava/lang/reflect/Constructor;->serializationCtor:Ljava/lang/Class;
-Ljava/lang/reflect/Constructor;->specificToGenericStringHeader(Ljava/lang/StringBuilder;)V
-Ljava/lang/reflect/Constructor;->specificToStringHeader(Ljava/lang/StringBuilder;)V
-Ljava/lang/reflect/Executable$GenericInfo;-><init>(Llibcore/reflect/ListOfTypes;Llibcore/reflect/ListOfTypes;Ljava/lang/reflect/Type;[Ljava/lang/reflect/TypeVariable;)V
-Ljava/lang/reflect/Executable$GenericInfo;->formalTypeParameters:[Ljava/lang/reflect/TypeVariable;
-Ljava/lang/reflect/Executable$GenericInfo;->genericExceptionTypes:Llibcore/reflect/ListOfTypes;
-Ljava/lang/reflect/Executable$GenericInfo;->genericParameterTypes:Llibcore/reflect/ListOfTypes;
-Ljava/lang/reflect/Executable$GenericInfo;->genericReturnType:Ljava/lang/reflect/Type;
-Ljava/lang/reflect/Executable;-><init>()V
-Ljava/lang/reflect/Executable;->accessFlags:I
-Ljava/lang/reflect/Executable;->compareMethodParametersInternal(Ljava/lang/reflect/Method;)I
-Ljava/lang/reflect/Executable;->declaringClass:Ljava/lang/Class;
-Ljava/lang/reflect/Executable;->declaringClassOfOverriddenMethod:Ljava/lang/Class;
-Ljava/lang/reflect/Executable;->dexMethodIndex:I
-Ljava/lang/reflect/Executable;->equalNameAndParametersInternal(Ljava/lang/reflect/Method;)Z
-Ljava/lang/reflect/Executable;->equalParamTypes([Ljava/lang/Class;[Ljava/lang/Class;)Z
-Ljava/lang/reflect/Executable;->fixMethodFlags(I)I
-Ljava/lang/reflect/Executable;->getAccessFlags()I
-Ljava/lang/reflect/Executable;->getAllGenericParameterTypes()[Ljava/lang/reflect/Type;
-Ljava/lang/reflect/Executable;->getAnnotationNative(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
-Ljava/lang/reflect/Executable;->getArtMethod()J
-Ljava/lang/reflect/Executable;->getDeclaredAnnotationsNative()[Ljava/lang/annotation/Annotation;
-Ljava/lang/reflect/Executable;->getDeclaringClassInternal()Ljava/lang/Class;
-Ljava/lang/reflect/Executable;->getMethodNameInternal()Ljava/lang/String;
-Ljava/lang/reflect/Executable;->getMethodOrConstructorGenericInfoInternal()Ljava/lang/reflect/Executable$GenericInfo;
-Ljava/lang/reflect/Executable;->getMethodReturnTypeInternal()Ljava/lang/Class;
-Ljava/lang/reflect/Executable;->getModifiersInternal()I
-Ljava/lang/reflect/Executable;->getParameterAnnotationsInternal()[[Ljava/lang/annotation/Annotation;
-Ljava/lang/reflect/Executable;->getParameterAnnotationsNative()[[Ljava/lang/annotation/Annotation;
-Ljava/lang/reflect/Executable;->getParameterCountInternal()I
-Ljava/lang/reflect/Executable;->getParameters0()[Ljava/lang/reflect/Parameter;
-Ljava/lang/reflect/Executable;->getParameterTypesInternal()[Ljava/lang/Class;
-Ljava/lang/reflect/Executable;->getSignatureAnnotation()[Ljava/lang/String;
-Ljava/lang/reflect/Executable;->getSignatureAttribute()Ljava/lang/String;
-Ljava/lang/reflect/Executable;->hasGenericInformation()Z
-Ljava/lang/reflect/Executable;->hasGenericInformationInternal()Z
-Ljava/lang/reflect/Executable;->hasRealParameterData()Z
-Ljava/lang/reflect/Executable;->hasRealParameterData:Z
-Ljava/lang/reflect/Executable;->isAnnotationPresentNative(Ljava/lang/Class;)Z
-Ljava/lang/reflect/Executable;->isBridgeMethodInternal()Z
-Ljava/lang/reflect/Executable;->isDefaultMethodInternal()Z
-Ljava/lang/reflect/Executable;->parameters:[Ljava/lang/reflect/Parameter;
-Ljava/lang/reflect/Executable;->printModifiersIfNonzero(Ljava/lang/StringBuilder;IZ)V
-Ljava/lang/reflect/Executable;->privateGetParameters()[Ljava/lang/reflect/Parameter;
-Ljava/lang/reflect/Executable;->separateWithCommas([Ljava/lang/Class;Ljava/lang/StringBuilder;)V
-Ljava/lang/reflect/Executable;->sharedToGenericString(IZ)Ljava/lang/String;
-Ljava/lang/reflect/Executable;->sharedToString(IZ[Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/String;
-Ljava/lang/reflect/Executable;->specificToGenericStringHeader(Ljava/lang/StringBuilder;)V
-Ljava/lang/reflect/Executable;->specificToStringHeader(Ljava/lang/StringBuilder;)V
-Ljava/lang/reflect/Executable;->synthesizeAllParams()[Ljava/lang/reflect/Parameter;
-Ljava/lang/reflect/Executable;->verifyParameters([Ljava/lang/reflect/Parameter;)V
-Ljava/lang/reflect/Field;-><init>()V
-Ljava/lang/reflect/Field;->declaringClass:Ljava/lang/Class;
-Ljava/lang/reflect/Field;->dexFieldIndex:I
-Ljava/lang/reflect/Field;->getAnnotationNative(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
-Ljava/lang/reflect/Field;->getArtField()J
-Ljava/lang/reflect/Field;->getDexFieldIndex()I
-Ljava/lang/reflect/Field;->getNameInternal()Ljava/lang/String;
-Ljava/lang/reflect/Field;->getSignatureAnnotation()[Ljava/lang/String;
-Ljava/lang/reflect/Field;->getSignatureAttribute()Ljava/lang/String;
-Ljava/lang/reflect/Field;->isAnnotationPresentNative(Ljava/lang/Class;)Z
-Ljava/lang/reflect/Field;->offset:I
-Ljava/lang/reflect/Field;->type:Ljava/lang/Class;
-Ljava/lang/reflect/InvocationTargetException;->target:Ljava/lang/Throwable;
-Ljava/lang/reflect/Method;-><init>()V
-Ljava/lang/reflect/Method;->equalNameAndParameters(Ljava/lang/reflect/Method;)Z
-Ljava/lang/reflect/Method;->hasGenericInformation()Z
-Ljava/lang/reflect/Method;->ORDER_BY_SIGNATURE:Ljava/util/Comparator;
-Ljava/lang/reflect/Method;->specificToGenericStringHeader(Ljava/lang/StringBuilder;)V
-Ljava/lang/reflect/Method;->specificToStringHeader(Ljava/lang/StringBuilder;)V
-Ljava/lang/reflect/Modifier;->ACCESS_MODIFIERS:I
-Ljava/lang/reflect/Modifier;->ANNOTATION:I
-Ljava/lang/reflect/Modifier;->BRIDGE:I
-Ljava/lang/reflect/Modifier;->CLASS_MODIFIERS:I
-Ljava/lang/reflect/Modifier;->CONSTRUCTOR:I
-Ljava/lang/reflect/Modifier;->CONSTRUCTOR_MODIFIERS:I
-Ljava/lang/reflect/Modifier;->DEFAULT:I
-Ljava/lang/reflect/Modifier;->ENUM:I
-Ljava/lang/reflect/Modifier;->FIELD_MODIFIERS:I
-Ljava/lang/reflect/Modifier;->INTERFACE_MODIFIERS:I
-Ljava/lang/reflect/Modifier;->isConstructor(I)Z
-Ljava/lang/reflect/Modifier;->isMandated(I)Z
-Ljava/lang/reflect/Modifier;->isSynthetic(I)Z
-Ljava/lang/reflect/Modifier;->MANDATED:I
-Ljava/lang/reflect/Modifier;->METHOD_MODIFIERS:I
-Ljava/lang/reflect/Modifier;->PARAMETER_MODIFIERS:I
-Ljava/lang/reflect/Modifier;->SYNTHETIC:I
-Ljava/lang/reflect/Modifier;->VARARGS:I
-Ljava/lang/reflect/Parameter;->executable:Ljava/lang/reflect/Executable;
-Ljava/lang/reflect/Parameter;->getAnnotationNative(Ljava/lang/reflect/Executable;ILjava/lang/Class;)Ljava/lang/annotation/Annotation;
-Ljava/lang/reflect/Parameter;->getRealName()Ljava/lang/String;
-Ljava/lang/reflect/Parameter;->index:I
-Ljava/lang/reflect/Parameter;->modifiers:I
-Ljava/lang/reflect/Parameter;->name:Ljava/lang/String;
-Ljava/lang/reflect/Parameter;->parameterClassCache:Ljava/lang/Class;
-Ljava/lang/reflect/Parameter;->parameterTypeCache:Ljava/lang/reflect/Type;
-Ljava/lang/reflect/Proxy$Key1;-><init>(Ljava/lang/Class;)V
-Ljava/lang/reflect/Proxy$Key1;->hash:I
-Ljava/lang/reflect/Proxy$Key2;-><init>(Ljava/lang/Class;Ljava/lang/Class;)V
-Ljava/lang/reflect/Proxy$Key2;->hash:I
-Ljava/lang/reflect/Proxy$Key2;->ref2:Ljava/lang/ref/WeakReference;
-Ljava/lang/reflect/Proxy$KeyFactory;-><init>()V
-Ljava/lang/reflect/Proxy$KeyFactory;->apply(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Object;
-Ljava/lang/reflect/Proxy$KeyX;-><init>([Ljava/lang/Class;)V
-Ljava/lang/reflect/Proxy$KeyX;->equals([Ljava/lang/ref/WeakReference;[Ljava/lang/ref/WeakReference;)Z
-Ljava/lang/reflect/Proxy$KeyX;->hash:I
-Ljava/lang/reflect/Proxy$KeyX;->refs:[Ljava/lang/ref/WeakReference;
-Ljava/lang/reflect/Proxy$ProxyClassFactory;-><init>()V
-Ljava/lang/reflect/Proxy$ProxyClassFactory;->apply(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class;
-Ljava/lang/reflect/Proxy$ProxyClassFactory;->nextUniqueNumber:Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/lang/reflect/Proxy$ProxyClassFactory;->proxyClassNamePrefix:Ljava/lang/String;
-Ljava/lang/reflect/Proxy;-><init>()V
-Ljava/lang/reflect/Proxy;->constructorParams:[Ljava/lang/Class;
-Ljava/lang/reflect/Proxy;->deduplicateAndGetExceptions(Ljava/util/List;)Ljava/util/List;
-Ljava/lang/reflect/Proxy;->generateProxy(Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/ClassLoader;[Ljava/lang/reflect/Method;[[Ljava/lang/Class;)Ljava/lang/Class;
-Ljava/lang/reflect/Proxy;->getMethods([Ljava/lang/Class;)Ljava/util/List;
-Ljava/lang/reflect/Proxy;->getMethodsRecursive([Ljava/lang/Class;Ljava/util/List;)V
-Ljava/lang/reflect/Proxy;->intersectExceptions([Ljava/lang/Class;[Ljava/lang/Class;)[Ljava/lang/Class;
-Ljava/lang/reflect/Proxy;->key0:Ljava/lang/Object;
-Ljava/lang/reflect/Proxy;->ORDER_BY_SIGNATURE_AND_SUBTYPE:Ljava/util/Comparator;
-Ljava/lang/reflect/Proxy;->proxyClassCache:Ljava/lang/reflect/WeakCache;
-Ljava/lang/reflect/Proxy;->validateReturnTypes(Ljava/util/List;)V
-Ljava/lang/reflect/UndeclaredThrowableException;->undeclaredThrowable:Ljava/lang/Throwable;
-Ljava/lang/reflect/WeakCache$CacheKey;-><init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/lang/reflect/WeakCache$CacheKey;->expungeFrom(Ljava/util/concurrent/ConcurrentMap;Ljava/util/concurrent/ConcurrentMap;)V
-Ljava/lang/reflect/WeakCache$CacheKey;->hash:I
-Ljava/lang/reflect/WeakCache$CacheKey;->NULL_KEY:Ljava/lang/Object;
-Ljava/lang/reflect/WeakCache$CacheKey;->valueOf(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)Ljava/lang/Object;
-Ljava/lang/reflect/WeakCache$CacheValue;-><init>(Ljava/lang/Object;)V
-Ljava/lang/reflect/WeakCache$CacheValue;->hash:I
-Ljava/lang/reflect/WeakCache$Factory;->key:Ljava/lang/Object;
-Ljava/lang/reflect/WeakCache$Factory;->parameter:Ljava/lang/Object;
-Ljava/lang/reflect/WeakCache$Factory;->subKey:Ljava/lang/Object;
-Ljava/lang/reflect/WeakCache$Factory;->valuesMap:Ljava/util/concurrent/ConcurrentMap;
-Ljava/lang/reflect/WeakCache$LookupValue;-><init>(Ljava/lang/Object;)V
-Ljava/lang/reflect/WeakCache$LookupValue;->value:Ljava/lang/Object;
-Ljava/lang/reflect/WeakCache;-><init>(Ljava/util/function/BiFunction;Ljava/util/function/BiFunction;)V
-Ljava/lang/reflect/WeakCache;->containsValue(Ljava/lang/Object;)Z
-Ljava/lang/reflect/WeakCache;->expungeStaleEntries()V
-Ljava/lang/reflect/WeakCache;->get(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/reflect/WeakCache;->map:Ljava/util/concurrent/ConcurrentMap;
-Ljava/lang/reflect/WeakCache;->refQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/lang/reflect/WeakCache;->reverseMap:Ljava/util/concurrent/ConcurrentMap;
-Ljava/lang/reflect/WeakCache;->size()I
-Ljava/lang/reflect/WeakCache;->subKeyFactory:Ljava/util/function/BiFunction;
-Ljava/lang/reflect/WeakCache;->valueFactory:Ljava/util/function/BiFunction;
-Ljava/lang/Runtime;->checkTargetSdkVersionForLoad(Ljava/lang/String;)V
-Ljava/lang/Runtime;->currentRuntime:Ljava/lang/Runtime;
-Ljava/lang/Runtime;->finalizeOnExit:Z
-Ljava/lang/Runtime;->getLibPaths()[Ljava/lang/String;
-Ljava/lang/Runtime;->initLibPaths()[Ljava/lang/String;
-Ljava/lang/Runtime;->load0(Ljava/lang/Class;Ljava/lang/String;)V
-Ljava/lang/Runtime;->nativeExit(I)V
-Ljava/lang/Runtime;->runFinalization0()V
-Ljava/lang/Runtime;->shutdownHooks:Ljava/util/List;
-Ljava/lang/Runtime;->shuttingDown:Z
-Ljava/lang/Runtime;->tracingMethods:Z
-Ljava/lang/Short$ShortCache;-><init>()V
-Ljava/lang/Short$ShortCache;->cache:[Ljava/lang/Short;
-Ljava/lang/StrictMath$RandomNumberGeneratorHolder;-><init>()V
-Ljava/lang/StrictMath$RandomNumberGeneratorHolder;->randomNumberGenerator:Ljava/util/Random;
-Ljava/lang/StrictMath;-><init>()V
-Ljava/lang/StrictMath;->floorOrCeil(DDDD)D
-Ljava/lang/String$CaseInsensitiveComparator;-><init>()V
-Ljava/lang/String$CaseInsensitiveComparator;->compare(Ljava/lang/String;Ljava/lang/String;)I
-Ljava/lang/String;->doReplace(CC)Ljava/lang/String;
-Ljava/lang/String;->fastSubstring(II)Ljava/lang/String;
-Ljava/lang/String;->getChars([CI)V
-Ljava/lang/String;->indexOf(Ljava/lang/String;Ljava/lang/String;I)I
-Ljava/lang/String;->indexOfSupplementary(II)I
-Ljava/lang/String;->lastIndexOf(Ljava/lang/String;Ljava/lang/String;I)I
-Ljava/lang/String;->lastIndexOfSupplementary(II)I
-Ljava/lang/String;->nonSyncContentEquals(Ljava/lang/AbstractStringBuilder;)Z
-Ljava/lang/StringBuffer;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/StringBuffer;
-Ljava/lang/StringBuffer;->toStringCache:[C
-Ljava/lang/StringIndexOutOfBoundsException;-><init>(II)V
-Ljava/lang/StringIndexOutOfBoundsException;-><init>(III)V
-Ljava/lang/StringIndexOutOfBoundsException;-><init>(Ljava/lang/String;I)V
-Ljava/lang/StringIndexOutOfBoundsException;-><init>(Ljava/lang/String;II)V
-Ljava/lang/System$PropertiesWithNonOverrideableDefaults;-><init>(Ljava/util/Properties;)V
-Ljava/lang/System$PropertiesWithNonOverrideableDefaults;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/System;->addLegacyLocaleSystemProperties()V
-Ljava/lang/System;->arraycopy([DI[DII)V
-Ljava/lang/System;->arraycopyBooleanUnchecked([ZI[ZII)V
-Ljava/lang/System;->arraycopyByteUnchecked([BI[BII)V
-Ljava/lang/System;->arraycopyCharUnchecked([CI[CII)V
-Ljava/lang/System;->arraycopyDoubleUnchecked([DI[DII)V
-Ljava/lang/System;->arraycopyFloatUnchecked([FI[FII)V
-Ljava/lang/System;->arraycopyIntUnchecked([II[III)V
-Ljava/lang/System;->arraycopyLongUnchecked([JI[JII)V
-Ljava/lang/System;->arraycopyShortUnchecked([SI[SII)V
-Ljava/lang/System;->ARRAYCOPY_SHORT_BOOLEAN_ARRAY_THRESHOLD:I
-Ljava/lang/System;->ARRAYCOPY_SHORT_BYTE_ARRAY_THRESHOLD:I
-Ljava/lang/System;->ARRAYCOPY_SHORT_CHAR_ARRAY_THRESHOLD:I
-Ljava/lang/System;->ARRAYCOPY_SHORT_DOUBLE_ARRAY_THRESHOLD:I
-Ljava/lang/System;->ARRAYCOPY_SHORT_FLOAT_ARRAY_THRESHOLD:I
-Ljava/lang/System;->ARRAYCOPY_SHORT_INT_ARRAY_THRESHOLD:I
-Ljava/lang/System;->ARRAYCOPY_SHORT_LONG_ARRAY_THRESHOLD:I
-Ljava/lang/System;->ARRAYCOPY_SHORT_SHORT_ARRAY_THRESHOLD:I
-Ljava/lang/System;->checkKey(Ljava/lang/String;)V
-Ljava/lang/System;->cons:Ljava/io/Console;
-Ljava/lang/System;->initProperties()Ljava/util/Properties;
-Ljava/lang/System;->initUnchangeableSystemProperties()Ljava/util/Properties;
-Ljava/lang/System;->justRanFinalization:Z
-Ljava/lang/System;->lineSeparator:Ljava/lang/String;
-Ljava/lang/System;->LOCK:Ljava/lang/Object;
-Ljava/lang/System;->logI(Ljava/lang/String;)V
-Ljava/lang/System;->logI(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/lang/System;->logW(Ljava/lang/String;)V
-Ljava/lang/System;->newPrintStream(Ljava/io/FileOutputStream;Ljava/lang/String;)Ljava/io/PrintStream;
-Ljava/lang/System;->parsePropertyAssignments(Ljava/util/Properties;[Ljava/lang/String;)V
-Ljava/lang/System;->props:Ljava/util/Properties;
-Ljava/lang/System;->runGC:Z
-Ljava/lang/System;->setDefaultChangeableProperties(Ljava/util/Properties;)Ljava/util/Properties;
-Ljava/lang/System;->setErr0(Ljava/io/PrintStream;)V
-Ljava/lang/System;->setIn0(Ljava/io/InputStream;)V
-Ljava/lang/System;->setOut0(Ljava/io/PrintStream;)V
-Ljava/lang/System;->setUnchangeableSystemProperty(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/lang/System;->specialProperties()[Ljava/lang/String;
-Ljava/lang/System;->unchangeableProps:Ljava/util/Properties;
-Ljava/lang/Thread$Caches;-><init>()V
-Ljava/lang/Thread$Caches;->subclassAudits:Ljava/util/concurrent/ConcurrentMap;
-Ljava/lang/Thread$Caches;->subclassAuditsQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/lang/Thread$ParkState;-><init>()V
-Ljava/lang/Thread$ParkState;->PARKED:I
-Ljava/lang/Thread$ParkState;->PREEMPTIVELY_UNPARKED:I
-Ljava/lang/Thread$ParkState;->UNPARKED:I
-Ljava/lang/Thread$WeakClassKey;-><init>(Ljava/lang/Class;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/lang/Thread$WeakClassKey;->hash:I
-Ljava/lang/Thread;->auditSubclass(Ljava/lang/Class;)Z
-Ljava/lang/Thread;->blockedOn(Lsun/nio/ch/Interruptible;)V
-Ljava/lang/Thread;->blocker:Lsun/nio/ch/Interruptible;
-Ljava/lang/Thread;->blockerLock:Ljava/lang/Object;
-Ljava/lang/Thread;->defaultUncaughtExceptionHandler:Ljava/lang/Thread$UncaughtExceptionHandler;
-Ljava/lang/Thread;->eetop:J
-Ljava/lang/Thread;->EMPTY_STACK_TRACE:[Ljava/lang/StackTraceElement;
-Ljava/lang/Thread;->exit()V
-Ljava/lang/Thread;->init(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;J)V
-Ljava/lang/Thread;->init2(Ljava/lang/Thread;)V
-Ljava/lang/Thread;->isCCLOverridden(Ljava/lang/Class;)Z
-Ljava/lang/Thread;->NANOS_PER_MILLI:I
-Ljava/lang/Thread;->nativeCreate(Ljava/lang/Thread;JZ)V
-Ljava/lang/Thread;->nativeGetStatus(Z)I
-Ljava/lang/Thread;->nativeHoldsLock(Ljava/lang/Object;)Z
-Ljava/lang/Thread;->nativeInterrupt()V
-Ljava/lang/Thread;->nativeParkEventPointer:J
-Ljava/lang/Thread;->nativeSetName(Ljava/lang/String;)V
-Ljava/lang/Thread;->nativeSetPriority(I)V
-Ljava/lang/Thread;->nextThreadID()J
-Ljava/lang/Thread;->nextThreadNum()I
-Ljava/lang/Thread;->parkFor$(J)V
-Ljava/lang/Thread;->parkState:I
-Ljava/lang/Thread;->parkUntil$(J)V
-Ljava/lang/Thread;->processQueue(Ljava/lang/ref/ReferenceQueue;Ljava/util/concurrent/ConcurrentMap;)V
-Ljava/lang/Thread;->setUncaughtExceptionPreHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V
-Ljava/lang/Thread;->single_step:Z
-Ljava/lang/Thread;->sleep(Ljava/lang/Object;JI)V
-Ljava/lang/Thread;->stackSize:J
-Ljava/lang/Thread;->started:Z
-Ljava/lang/Thread;->stillborn:Z
-Ljava/lang/Thread;->SUBCLASS_IMPLEMENTATION_PERMISSION:Ljava/lang/RuntimePermission;
-Ljava/lang/Thread;->threadInitNumber:I
-Ljava/lang/Thread;->threadLocalRandomProbe:I
-Ljava/lang/Thread;->threadLocalRandomSecondarySeed:I
-Ljava/lang/Thread;->threadLocalRandomSeed:J
-Ljava/lang/Thread;->threadQ:Ljava/lang/Thread;
-Ljava/lang/Thread;->threadStatus:I
-Ljava/lang/Thread;->tid:J
-Ljava/lang/Thread;->uncaughtExceptionHandler:Ljava/lang/Thread$UncaughtExceptionHandler;
-Ljava/lang/Thread;->uncaughtExceptionPreHandler:Ljava/lang/Thread$UncaughtExceptionHandler;
-Ljava/lang/Thread;->unpark$()V
-Ljava/lang/ThreadGroup;-><init>()V
-Ljava/lang/ThreadGroup;-><init>(Ljava/lang/Void;Ljava/lang/ThreadGroup;Ljava/lang/String;)V
-Ljava/lang/ThreadGroup;->add(Ljava/lang/ThreadGroup;)V
-Ljava/lang/ThreadGroup;->addUnstarted()V
-Ljava/lang/ThreadGroup;->checkParentAccess(Ljava/lang/ThreadGroup;)Ljava/lang/Void;
-Ljava/lang/ThreadGroup;->daemon:Z
-Ljava/lang/ThreadGroup;->destroyed:Z
-Ljava/lang/ThreadGroup;->enumerate([Ljava/lang/Thread;IZ)I
-Ljava/lang/ThreadGroup;->enumerate([Ljava/lang/ThreadGroup;IZ)I
-Ljava/lang/ThreadGroup;->list(Ljava/io/PrintStream;I)V
-Ljava/lang/ThreadGroup;->maxPriority:I
-Ljava/lang/ThreadGroup;->nthreads:I
-Ljava/lang/ThreadGroup;->nUnstartedThreads:I
-Ljava/lang/ThreadGroup;->remove(Ljava/lang/Thread;)V
-Ljava/lang/ThreadGroup;->remove(Ljava/lang/ThreadGroup;)V
-Ljava/lang/ThreadGroup;->stopOrSuspend(Z)Z
-Ljava/lang/ThreadGroup;->threads:[Ljava/lang/Thread;
-Ljava/lang/ThreadGroup;->threadStartFailed(Ljava/lang/Thread;)V
-Ljava/lang/ThreadGroup;->vmAllowSuspension:Z
-Ljava/lang/ThreadLocal$SuppliedThreadLocal;-><init>(Ljava/util/function/Supplier;)V
-Ljava/lang/ThreadLocal$SuppliedThreadLocal;->supplier:Ljava/util/function/Supplier;
-Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;-><init>(Ljava/lang/ThreadLocal;Ljava/lang/Object;)V
-Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;->value:Ljava/lang/Object;
-Ljava/lang/ThreadLocal$ThreadLocalMap;-><init>(Ljava/lang/ThreadLocal$ThreadLocalMap;)V
-Ljava/lang/ThreadLocal$ThreadLocalMap;-><init>(Ljava/lang/ThreadLocal;Ljava/lang/Object;)V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->cleanSomeSlots(II)Z
-Ljava/lang/ThreadLocal$ThreadLocalMap;->expungeStaleEntries()V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->expungeStaleEntry(I)I
-Ljava/lang/ThreadLocal$ThreadLocalMap;->getEntry(Ljava/lang/ThreadLocal;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-Ljava/lang/ThreadLocal$ThreadLocalMap;->getEntryAfterMiss(Ljava/lang/ThreadLocal;ILjava/lang/ThreadLocal$ThreadLocalMap$Entry;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-Ljava/lang/ThreadLocal$ThreadLocalMap;->INITIAL_CAPACITY:I
-Ljava/lang/ThreadLocal$ThreadLocalMap;->nextIndex(II)I
-Ljava/lang/ThreadLocal$ThreadLocalMap;->prevIndex(II)I
-Ljava/lang/ThreadLocal$ThreadLocalMap;->rehash()V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->remove(Ljava/lang/ThreadLocal;)V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->replaceStaleEntry(Ljava/lang/ThreadLocal;Ljava/lang/Object;I)V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->resize()V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->set(Ljava/lang/ThreadLocal;Ljava/lang/Object;)V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->setThreshold(I)V
-Ljava/lang/ThreadLocal$ThreadLocalMap;->size:I
-Ljava/lang/ThreadLocal$ThreadLocalMap;->table:[Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-Ljava/lang/ThreadLocal$ThreadLocalMap;->threshold:I
-Ljava/lang/ThreadLocal;->childValue(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/ThreadLocal;->createInheritedMap(Ljava/lang/ThreadLocal$ThreadLocalMap;)Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/ThreadLocal;->createMap(Ljava/lang/Thread;Ljava/lang/Object;)V
-Ljava/lang/ThreadLocal;->HASH_INCREMENT:I
-Ljava/lang/ThreadLocal;->nextHashCode()I
-Ljava/lang/ThreadLocal;->nextHashCode:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/lang/ThreadLocal;->setInitialValue()Ljava/lang/Object;
-Ljava/lang/ThreadLocal;->threadLocalHashCode:I
-Ljava/lang/Throwable$PrintStreamOrWriter;-><init>()V
-Ljava/lang/Throwable$PrintStreamOrWriter;->lock()Ljava/lang/Object;
-Ljava/lang/Throwable$PrintStreamOrWriter;->println(Ljava/lang/Object;)V
-Ljava/lang/Throwable$SentinelHolder;-><init>()V
-Ljava/lang/Throwable$SentinelHolder;->STACK_TRACE_ELEMENT_SENTINEL:Ljava/lang/StackTraceElement;
-Ljava/lang/Throwable$SentinelHolder;->STACK_TRACE_SENTINEL:[Ljava/lang/StackTraceElement;
-Ljava/lang/Throwable$WrappedPrintStream;-><init>(Ljava/io/PrintStream;)V
-Ljava/lang/Throwable$WrappedPrintStream;->lock()Ljava/lang/Object;
-Ljava/lang/Throwable$WrappedPrintStream;->println(Ljava/lang/Object;)V
-Ljava/lang/Throwable$WrappedPrintStream;->printStream:Ljava/io/PrintStream;
-Ljava/lang/Throwable$WrappedPrintWriter;-><init>(Ljava/io/PrintWriter;)V
-Ljava/lang/Throwable$WrappedPrintWriter;->lock()Ljava/lang/Object;
-Ljava/lang/Throwable$WrappedPrintWriter;->println(Ljava/lang/Object;)V
-Ljava/lang/Throwable$WrappedPrintWriter;->printWriter:Ljava/io/PrintWriter;
-Ljava/lang/Throwable;->CAUSE_CAPTION:Ljava/lang/String;
-Ljava/lang/Throwable;->EMPTY_THROWABLE_ARRAY:[Ljava/lang/Throwable;
-Ljava/lang/Throwable;->nativeGetStackTrace(Ljava/lang/Object;)[Ljava/lang/StackTraceElement;
-Ljava/lang/Throwable;->NULL_CAUSE_MESSAGE:Ljava/lang/String;
-Ljava/lang/Throwable;->printEnclosedStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;[Ljava/lang/StackTraceElement;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
-Ljava/lang/Throwable;->SELF_SUPPRESSION_MESSAGE:Ljava/lang/String;
-Ljava/lang/Throwable;->SUPPRESSED_CAPTION:Ljava/lang/String;
-Ljava/lang/TypeNotPresentException;->typeName:Ljava/lang/String;
-Ljava/math/BigDecimal;-><init>(II)V
-Ljava/math/BigDecimal;-><init>(JI)V
-Ljava/math/BigDecimal;->addAndMult10(Ljava/math/BigDecimal;Ljava/math/BigDecimal;I)Ljava/math/BigDecimal;
-Ljava/math/BigDecimal;->approxPrecision()I
-Ljava/math/BigDecimal;->bitLength(I)I
-Ljava/math/BigDecimal;->bitLength(J)I
-Ljava/math/BigDecimal;->bitLength:I
-Ljava/math/BigDecimal;->BI_SCALED_BY_ZERO:[Ljava/math/BigDecimal;
-Ljava/math/BigDecimal;->BI_SCALED_BY_ZERO_LENGTH:I
-Ljava/math/BigDecimal;->CH_ZEROS:[C
-Ljava/math/BigDecimal;->compareAbsoluteValues(JJ)I
-Ljava/math/BigDecimal;->compareForRounding(JJ)I
-Ljava/math/BigDecimal;->decimalDigitsInLong(J)I
-Ljava/math/BigDecimal;->divideBigIntegers(Ljava/math/BigInteger;Ljava/math/BigInteger;ILjava/math/RoundingMode;)Ljava/math/BigDecimal;
-Ljava/math/BigDecimal;->dividePrimitiveLongs(JJILjava/math/RoundingMode;)Ljava/math/BigDecimal;
-Ljava/math/BigDecimal;->FIVE_POW:[Ljava/math/BigInteger;
-Ljava/math/BigDecimal;->getUnscaledValue()Ljava/math/BigInteger;
-Ljava/math/BigDecimal;->hashCode:I
-Ljava/math/BigDecimal;->inplaceRound(Ljava/math/MathContext;)V
-Ljava/math/BigDecimal;->intVal:Ljava/math/BigInteger;
-Ljava/math/BigDecimal;->isZero()Z
-Ljava/math/BigDecimal;->LOG10_2:D
-Ljava/math/BigDecimal;->LONG_FIVE_POW:[J
-Ljava/math/BigDecimal;->LONG_FIVE_POW_BIT_LENGTH:[I
-Ljava/math/BigDecimal;->LONG_POWERS_OF_TEN_BIT_LENGTH:[I
-Ljava/math/BigDecimal;->movePoint(J)Ljava/math/BigDecimal;
-Ljava/math/BigDecimal;->precision:I
-Ljava/math/BigDecimal;->roundingBehavior(IILjava/math/RoundingMode;)I
-Ljava/math/BigDecimal;->safeLongToInt(J)I
-Ljava/math/BigDecimal;->scale:I
-Ljava/math/BigDecimal;->setUnscaledValue(Ljava/math/BigInteger;)V
-Ljava/math/BigDecimal;->smallRound(Ljava/math/MathContext;I)V
-Ljava/math/BigDecimal;->smallValue:J
-Ljava/math/BigDecimal;->TEN_POW:[Ljava/math/BigInteger;
-Ljava/math/BigDecimal;->toStringImage:Ljava/lang/String;
-Ljava/math/BigDecimal;->valueExact(I)J
-Ljava/math/BigDecimal;->zeroScaledBy(J)Ljava/math/BigDecimal;
-Ljava/math/BigDecimal;->ZERO_SCALED_BY:[Ljava/math/BigDecimal;
-Ljava/math/BigInt;-><init>()V
-Ljava/math/BigInt;->add(Ljava/math/BigInt;)V
-Ljava/math/BigInt;->addition(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->addPositiveInt(I)V
-Ljava/math/BigInt;->bigEndianMagnitude()[B
-Ljava/math/BigInt;->bigExp(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->bignum:J
-Ljava/math/BigInt;->bitLength()I
-Ljava/math/BigInt;->checkString(Ljava/lang/String;I)Ljava/lang/String;
-Ljava/math/BigInt;->cmp(Ljava/math/BigInt;Ljava/math/BigInt;)I
-Ljava/math/BigInt;->copy()Ljava/math/BigInt;
-Ljava/math/BigInt;->decString()Ljava/lang/String;
-Ljava/math/BigInt;->division(Ljava/math/BigInt;Ljava/math/BigInt;Ljava/math/BigInt;Ljava/math/BigInt;)V
-Ljava/math/BigInt;->exp(Ljava/math/BigInt;I)Ljava/math/BigInt;
-Ljava/math/BigInt;->gcd(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->generatePrimeDefault(I)Ljava/math/BigInt;
-Ljava/math/BigInt;->hasNativeBignum()Z
-Ljava/math/BigInt;->hexString()Ljava/lang/String;
-Ljava/math/BigInt;->invalidBigInteger(Ljava/lang/String;)Ljava/lang/NumberFormatException;
-Ljava/math/BigInt;->isBitSet(I)Z
-Ljava/math/BigInt;->isPrime(I)Z
-Ljava/math/BigInt;->littleEndianIntsMagnitude()[I
-Ljava/math/BigInt;->longInt()J
-Ljava/math/BigInt;->makeValid()V
-Ljava/math/BigInt;->modExp(Ljava/math/BigInt;Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->modInverse(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->modulus(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->multiplyByPositiveInt(I)V
-Ljava/math/BigInt;->newBigInt()Ljava/math/BigInt;
-Ljava/math/BigInt;->product(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->putBigEndian([BZ)V
-Ljava/math/BigInt;->putBigEndianTwosComplement([B)V
-Ljava/math/BigInt;->putCopy(Ljava/math/BigInt;)V
-Ljava/math/BigInt;->putDecString(Ljava/lang/String;)V
-Ljava/math/BigInt;->putHexString(Ljava/lang/String;)V
-Ljava/math/BigInt;->putLittleEndianInts([IZ)V
-Ljava/math/BigInt;->putLongInt(J)V
-Ljava/math/BigInt;->putULongInt(JZ)V
-Ljava/math/BigInt;->registry:Llibcore/util/NativeAllocationRegistry;
-Ljava/math/BigInt;->remainderByPositiveInt(Ljava/math/BigInt;I)I
-Ljava/math/BigInt;->setSign(I)V
-Ljava/math/BigInt;->shift(I)V
-Ljava/math/BigInt;->shift(Ljava/math/BigInt;I)Ljava/math/BigInt;
-Ljava/math/BigInt;->sign()I
-Ljava/math/BigInt;->subtraction(Ljava/math/BigInt;Ljava/math/BigInt;)Ljava/math/BigInt;
-Ljava/math/BigInt;->toAscii(Ljava/lang/String;I)Ljava/lang/String;
-Ljava/math/BigInt;->twosCompFitsIntoBytes(I)Z
-Ljava/math/BigInteger;-><init>(II[I)V
-Ljava/math/BigInteger;-><init>(IJ)V
-Ljava/math/BigInteger;-><init>(Ljava/math/BigInt;)V
-Ljava/math/BigInteger;->bigInt:Ljava/math/BigInt;
-Ljava/math/BigInteger;->copy()Ljava/math/BigInteger;
-Ljava/math/BigInteger;->digits:[I
-Ljava/math/BigInteger;->firstNonzeroDigit:I
-Ljava/math/BigInteger;->getBigInt()Ljava/math/BigInt;
-Ljava/math/BigInteger;->getFirstNonzeroDigit()I
-Ljava/math/BigInteger;->hashCode:I
-Ljava/math/BigInteger;->inplaceAdd([III)I
-Ljava/math/BigInteger;->isSmallPrime(I)Z
-Ljava/math/BigInteger;->javaIsValid:Z
-Ljava/math/BigInteger;->magnitude:[B
-Ljava/math/BigInteger;->MINUS_ONE:Ljava/math/BigInteger;
-Ljava/math/BigInteger;->multiplyByInt([I[III)I
-Ljava/math/BigInteger;->nativeIsValid:Z
-Ljava/math/BigInteger;->numberLength:I
-Ljava/math/BigInteger;->parseFromString(Ljava/math/BigInteger;Ljava/lang/String;I)V
-Ljava/math/BigInteger;->prepareJavaRepresentation()V
-Ljava/math/BigInteger;->setBigInt(Ljava/math/BigInt;)V
-Ljava/math/BigInteger;->setJavaRepresentation(II[I)V
-Ljava/math/BigInteger;->shiftLeftOneBit()Ljava/math/BigInteger;
-Ljava/math/BigInteger;->sign:I
-Ljava/math/BigInteger;->signum:I
-Ljava/math/BigInteger;->SMALL_VALUES:[Ljava/math/BigInteger;
-Ljava/math/BigInteger;->twosComplement()[B
-Ljava/math/MathContext;->checkValid()V
-Ljava/math/MathContext;->invalidMathContext(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/IllegalArgumentException;
-Ljava/math/MathContext;->precision:I
-Ljava/math/MathContext;->roundingMode:Ljava/math/RoundingMode;
-Ljava/math/RoundingMode;->bigDecimalRM:I
-Ljava/net/Authenticator;->requestingAuthType:Ljava/net/Authenticator$RequestorType;
-Ljava/net/Authenticator;->requestingHost:Ljava/lang/String;
-Ljava/net/Authenticator;->requestingPort:I
-Ljava/net/Authenticator;->requestingPrompt:Ljava/lang/String;
-Ljava/net/Authenticator;->requestingProtocol:Ljava/lang/String;
-Ljava/net/Authenticator;->requestingScheme:Ljava/lang/String;
-Ljava/net/Authenticator;->requestingSite:Ljava/net/InetAddress;
-Ljava/net/Authenticator;->requestingURL:Ljava/net/URL;
-Ljava/net/Authenticator;->reset()V
-Ljava/net/BindException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/net/ConnectException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/net/CookieHandler;->cookieHandler:Ljava/net/CookieHandler;
-Ljava/net/CookieManager$CookiePathComparator;-><init>()V
-Ljava/net/CookieManager$CookiePathComparator;->compare(Ljava/net/HttpCookie;Ljava/net/HttpCookie;)I
-Ljava/net/CookieManager;->cookieJar:Ljava/net/CookieStore;
-Ljava/net/CookieManager;->isInPortList(Ljava/lang/String;I)Z
-Ljava/net/CookieManager;->normalizePath(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/CookieManager;->pathMatches(Ljava/net/URI;Ljava/net/HttpCookie;)Z
-Ljava/net/CookieManager;->policyCallback:Ljava/net/CookiePolicy;
-Ljava/net/CookieManager;->shouldAcceptInternal(Ljava/net/URI;Ljava/net/HttpCookie;)Z
-Ljava/net/CookieManager;->sortByPath(Ljava/util/List;)Ljava/util/List;
-Ljava/net/DatagramPacket;->address:Ljava/net/InetAddress;
-Ljava/net/DatagramPacket;->buf:[B
-Ljava/net/DatagramPacket;->bufLength:I
-Ljava/net/DatagramPacket;->length:I
-Ljava/net/DatagramPacket;->offset:I
-Ljava/net/DatagramPacket;->port:I
-Ljava/net/DatagramPacket;->setReceivedLength(I)V
-Ljava/net/DatagramSocket;->bound:Z
-Ljava/net/DatagramSocket;->bytesLeftToFilter:I
-Ljava/net/DatagramSocket;->checkAddress(Ljava/net/InetAddress;Ljava/lang/String;)V
-Ljava/net/DatagramSocket;->checkFiltering(Ljava/net/DatagramPacket;)Z
-Ljava/net/DatagramSocket;->checkOldImpl()V
-Ljava/net/DatagramSocket;->closed:Z
-Ljava/net/DatagramSocket;->closeLock:Ljava/lang/Object;
-Ljava/net/DatagramSocket;->connectedAddress:Ljava/net/InetAddress;
-Ljava/net/DatagramSocket;->connectedPort:I
-Ljava/net/DatagramSocket;->connectInternal(Ljava/net/InetAddress;I)V
-Ljava/net/DatagramSocket;->connectState:I
-Ljava/net/DatagramSocket;->created:Z
-Ljava/net/DatagramSocket;->createImpl()V
-Ljava/net/DatagramSocket;->explicitFilter:Z
-Ljava/net/DatagramSocket;->factory:Ljava/net/DatagramSocketImplFactory;
-Ljava/net/DatagramSocket;->getImpl()Ljava/net/DatagramSocketImpl;
-Ljava/net/DatagramSocket;->implClass:Ljava/lang/Class;
-Ljava/net/DatagramSocket;->oldImpl:Z
-Ljava/net/DatagramSocket;->pendingConnectException:Ljava/net/SocketException;
-Ljava/net/DatagramSocket;->ST_CONNECTED:I
-Ljava/net/DatagramSocket;->ST_CONNECTED_NO_IMPL:I
-Ljava/net/DatagramSocket;->ST_NOT_CONNECTED:I
-Ljava/net/DatagramSocketImpl;->dataAvailable()I
-Ljava/net/DatagramSocketImpl;->getDatagramSocket()Ljava/net/DatagramSocket;
-Ljava/net/DatagramSocketImpl;->getOption(Ljava/net/SocketOption;)Ljava/lang/Object;
-Ljava/net/DatagramSocketImpl;->setDatagramSocket(Ljava/net/DatagramSocket;)V
-Ljava/net/DatagramSocketImpl;->setOption(Ljava/net/SocketOption;Ljava/lang/Object;)V
-Ljava/net/DatagramSocketImpl;->socket:Ljava/net/DatagramSocket;
-Ljava/net/HttpCookie$CookieAttributeAssignor;->assign(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-Ljava/net/HttpCookie;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Ljava/net/HttpCookie;->assignAttribute(Ljava/net/HttpCookie;Ljava/lang/String;Ljava/lang/String;)V
-Ljava/net/HttpCookie;->equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/net/HttpCookie;->GMT:Ljava/util/TimeZone;
-Ljava/net/HttpCookie;->guessCookieVersion(Ljava/lang/String;)I
-Ljava/net/HttpCookie;->header()Ljava/lang/String;
-Ljava/net/HttpCookie;->isFullyQualifiedDomainName(Ljava/lang/String;I)Z
-Ljava/net/HttpCookie;->isToken(Ljava/lang/String;)Z
-Ljava/net/HttpCookie;->MAX_AGE_UNSPECIFIED:J
-Ljava/net/HttpCookie;->parse(Ljava/lang/String;Z)Ljava/util/List;
-Ljava/net/HttpCookie;->parseInternal(Ljava/lang/String;Z)Ljava/net/HttpCookie;
-Ljava/net/HttpCookie;->RESERVED_NAMES:Ljava/util/Set;
-Ljava/net/HttpCookie;->SET_COOKIE2:Ljava/lang/String;
-Ljava/net/HttpCookie;->SET_COOKIE:Ljava/lang/String;
-Ljava/net/HttpCookie;->splitMultiCookies(Ljava/lang/String;)Ljava/util/List;
-Ljava/net/HttpCookie;->startsWithIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/net/HttpCookie;->stripOffSurroundingQuote(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/HttpCookie;->toNetscapeHeaderString()Ljava/lang/String;
-Ljava/net/HttpCookie;->toRFC2965HeaderString()Ljava/lang/String;
-Ljava/net/HttpRetryException;->location:Ljava/lang/String;
-Ljava/net/HttpRetryException;->responseCode:I
-Ljava/net/HttpURLConnection;->DEFAULT_CHUNK_SIZE:I
-Ljava/net/HttpURLConnection;->followRedirects:Z
-Ljava/net/HttpURLConnection;->methods:[Ljava/lang/String;
-Ljava/net/IDN;-><init>()V
-Ljava/net/IDN;->convertFullStop(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;
-Ljava/net/IDN;->isLabelSeperator(C)Z
-Ljava/net/Inet4Address;-><init>(Ljava/lang/String;I)V
-Ljava/net/Inet4Address;-><init>(Ljava/lang/String;[B)V
-Ljava/net/Inet4Address;->INADDRSZ:I
-Ljava/net/Inet4Address;->LOOPBACK:Ljava/net/InetAddress;
-Ljava/net/Inet4Address;->numericToTextFormat([B)Ljava/lang/String;
-Ljava/net/Inet6Address$Inet6AddressHolder;->init([BI)V
-Ljava/net/Inet6Address$Inet6AddressHolder;->init([BLjava/net/NetworkInterface;)V
-Ljava/net/Inet6Address$Inet6AddressHolder;->isAnyLocalAddress()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isIPv4CompatibleAddress()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isLinkLocalAddress()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isLoopbackAddress()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isMCGlobal()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isMCLinkLocal()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isMCNodeLocal()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isMCOrgLocal()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isMCSiteLocal()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isMulticastAddress()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->isSiteLocalAddress()Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->scope_ifname_set:Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->setAddr([B)V
-Ljava/net/Inet6Address;-><init>(Ljava/lang/String;[B)V
-Ljava/net/Inet6Address;-><init>(Ljava/lang/String;[BI)V
-Ljava/net/Inet6Address;-><init>(Ljava/lang/String;[BLjava/lang/String;)V
-Ljava/net/Inet6Address;-><init>(Ljava/lang/String;[BLjava/net/NetworkInterface;)V
-Ljava/net/Inet6Address;->deriveNumericScope(Ljava/lang/String;)I
-Ljava/net/Inet6Address;->deriveNumericScope([BLjava/net/NetworkInterface;)I
-Ljava/net/Inet6Address;->FIELDS_OFFSET:J
-Ljava/net/Inet6Address;->INADDRSZ:I
-Ljava/net/Inet6Address;->initif(Ljava/lang/String;[BLjava/net/NetworkInterface;)V
-Ljava/net/Inet6Address;->initstr(Ljava/lang/String;[BLjava/lang/String;)V
-Ljava/net/Inet6Address;->INT16SZ:I
-Ljava/net/Inet6Address;->isDifferentLocalAddressType([B[B)Z
-Ljava/net/Inet6Address;->isLinkLocalAddress([B)Z
-Ljava/net/Inet6Address;->isSiteLocalAddress([B)Z
-Ljava/net/Inet6Address;->LOOPBACK:Ljava/net/InetAddress;
-Ljava/net/Inet6Address;->numericToTextFormat([B)Ljava/lang/String;
-Ljava/net/Inet6Address;->UNSAFE:Lsun/misc/Unsafe;
-Ljava/net/InetAddress$InetAddressHolder;-><init>()V
-Ljava/net/InetAddress$InetAddressHolder;-><init>(Ljava/lang/String;II)V
-Ljava/net/InetAddress$InetAddressHolder;->getAddress()I
-Ljava/net/InetAddress$InetAddressHolder;->getFamily()I
-Ljava/net/InetAddress$InetAddressHolder;->getHostName()Ljava/lang/String;
-Ljava/net/InetAddress$InetAddressHolder;->getOriginalHostName()Ljava/lang/String;
-Ljava/net/InetAddress$InetAddressHolder;->init(Ljava/lang/String;I)V
-Ljava/net/InetAddress;-><init>()V
-Ljava/net/InetAddress;->anyLocalAddress()Ljava/net/InetAddress;
-Ljava/net/InetAddress;->BOOT_CLASSLOADER:Ljava/lang/ClassLoader;
-Ljava/net/InetAddress;->canonicalHostName:Ljava/lang/String;
-Ljava/net/InetAddress;->disallowDeprecatedFormats(Ljava/lang/String;Ljava/net/InetAddress;)Ljava/net/InetAddress;
-Ljava/net/InetAddress;->getAllByName0(Ljava/lang/String;Z)[Ljava/net/InetAddress;
-Ljava/net/InetAddress;->getByAddress(Ljava/lang/String;[BI)Ljava/net/InetAddress;
-Ljava/net/InetAddress;->getByNameOnNet(Ljava/lang/String;I)Ljava/net/InetAddress;
-Ljava/net/InetAddress;->getHostFromNameService(Ljava/net/InetAddress;)Ljava/lang/String;
-Ljava/net/InetAddress;->getHostName(Z)Ljava/lang/String;
-Ljava/net/InetAddress;->impl:Ljava/net/InetAddressImpl;
-Ljava/net/InetAddress;->isReachableByICMP(I)Z
-Ljava/net/InetAddress;->nameService:Lsun/net/spi/nameservice/NameService;
-Ljava/net/InetAddress;->NETID_UNSET:I
-Ljava/net/InetAddress;->parseNumericAddressNoThrow(Ljava/lang/String;)Ljava/net/InetAddress;
-Ljava/net/InetAddress;->readObjectNoData(Ljava/io/ObjectInputStream;)V
-Ljava/net/InetAddressImpl;->anyLocalAddress()Ljava/net/InetAddress;
-Ljava/net/InetAddressImpl;->clearAddressCache()V
-Ljava/net/InetAddressImpl;->getHostByAddr([B)Ljava/lang/String;
-Ljava/net/InetAddressImpl;->isReachable(Ljava/net/InetAddress;ILjava/net/NetworkInterface;I)Z
-Ljava/net/InetAddressImpl;->lookupAllHostAddr(Ljava/lang/String;I)[Ljava/net/InetAddress;
-Ljava/net/InetAddressImpl;->loopbackAddresses()[Ljava/net/InetAddress;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;-><init>(Ljava/lang/String;Ljava/net/InetAddress;I)V
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->addr:Ljava/net/InetAddress;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->getAddress()Ljava/net/InetAddress;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->getHostName()Ljava/lang/String;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->getHostString()Ljava/lang/String;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->getPort()I
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->hostname:Ljava/lang/String;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->isUnresolved()Z
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;->port:I
-Ljava/net/InetSocketAddress;-><init>()V
-Ljava/net/InetSocketAddress;-><init>(ILjava/lang/String;)V
-Ljava/net/InetSocketAddress;->checkHost(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/InetSocketAddress;->checkPort(I)I
-Ljava/net/InetSocketAddress;->FIELDS_OFFSET:J
-Ljava/net/InetSocketAddress;->UNSAFE:Lsun/misc/Unsafe;
-Ljava/net/InMemoryCookieStore;-><init>()V
-Ljava/net/InMemoryCookieStore;-><init>(I)V
-Ljava/net/InMemoryCookieStore;->addIndex(Ljava/util/Map;Ljava/lang/Object;Ljava/net/HttpCookie;)V
-Ljava/net/InMemoryCookieStore;->applyMCompatibility:Z
-Ljava/net/InMemoryCookieStore;->getEffectiveURI(Ljava/net/URI;)Ljava/net/URI;
-Ljava/net/InMemoryCookieStore;->getInternal1(Ljava/util/List;Ljava/util/Map;Ljava/lang/String;)V
-Ljava/net/InMemoryCookieStore;->getInternal2(Ljava/util/List;Ljava/util/Map;Ljava/lang/Comparable;)V
-Ljava/net/InMemoryCookieStore;->lock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/net/InMemoryCookieStore;->netscapeDomainMatches(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/net/InMemoryCookieStore;->uriIndex:Ljava/util/Map;
-Ljava/net/InterfaceAddress;-><init>(Ljava/net/InetAddress;Ljava/net/Inet4Address;Ljava/net/InetAddress;)V
-Ljava/net/InterfaceAddress;->address:Ljava/net/InetAddress;
-Ljava/net/InterfaceAddress;->broadcast:Ljava/net/Inet4Address;
-Ljava/net/InterfaceAddress;->countPrefixLength(Ljava/net/InetAddress;)S
-Ljava/net/InterfaceAddress;->maskLength:S
-Ljava/net/JarURLConnection;->entryName:Ljava/lang/String;
-Ljava/net/JarURLConnection;->jarFileURL:Ljava/net/URL;
-Ljava/net/JarURLConnection;->parseSpecs(Ljava/net/URL;)V
-Ljava/net/MulticastSocket;->infAddress:Ljava/net/InetAddress;
-Ljava/net/MulticastSocket;->infLock:Ljava/lang/Object;
-Ljava/net/MulticastSocket;->interfaceSet:Z
-Ljava/net/MulticastSocket;->ttlLock:Ljava/lang/Object;
-Ljava/net/NetworkInterface;-><init>()V
-Ljava/net/NetworkInterface;-><init>(Ljava/lang/String;I[Ljava/net/InetAddress;)V
-Ljava/net/NetworkInterface;->addrs:[Ljava/net/InetAddress;
-Ljava/net/NetworkInterface;->bindings:[Ljava/net/InterfaceAddress;
-Ljava/net/NetworkInterface;->childs:Ljava/util/List;
-Ljava/net/NetworkInterface;->defaultIndex:I
-Ljava/net/NetworkInterface;->defaultInterface:Ljava/net/NetworkInterface;
-Ljava/net/NetworkInterface;->displayName:Ljava/lang/String;
-Ljava/net/NetworkInterface;->getAll()[Ljava/net/NetworkInterface;
-Ljava/net/NetworkInterface;->getDefault()Ljava/net/NetworkInterface;
-Ljava/net/NetworkInterface;->getFlags()I
-Ljava/net/NetworkInterface;->hardwareAddr:[B
-Ljava/net/NetworkInterface;->index:I
-Ljava/net/NetworkInterface;->name:Ljava/lang/String;
-Ljava/net/NetworkInterface;->parent:Ljava/net/NetworkInterface;
-Ljava/net/NetworkInterface;->virtual:Z
-Ljava/net/PasswordAuthentication;->password:[C
-Ljava/net/PasswordAuthentication;->userName:Ljava/lang/String;
-Ljava/net/PortUnreachableException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/net/ProtocolException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/net/Proxy;->sa:Ljava/net/SocketAddress;
-Ljava/net/Proxy;->type:Ljava/net/Proxy$Type;
-Ljava/net/ProxySelector;->theProxySelector:Ljava/net/ProxySelector;
-Ljava/net/ResponseCache;->theResponseCache:Ljava/net/ResponseCache;
-Ljava/net/ServerSocket;-><init>(Ljava/net/SocketImpl;)V
-Ljava/net/ServerSocket;->bound:Z
-Ljava/net/ServerSocket;->checkOldImpl()V
-Ljava/net/ServerSocket;->closed:Z
-Ljava/net/ServerSocket;->closeLock:Ljava/lang/Object;
-Ljava/net/ServerSocket;->created:Z
-Ljava/net/ServerSocket;->createImpl()V
-Ljava/net/ServerSocket;->getFileDescriptor$()Ljava/io/FileDescriptor;
-Ljava/net/ServerSocket;->getImpl()Ljava/net/SocketImpl;
-Ljava/net/ServerSocket;->impl:Ljava/net/SocketImpl;
-Ljava/net/ServerSocket;->oldImpl:Z
-Ljava/net/ServerSocket;->setBound()V
-Ljava/net/ServerSocket;->setCreated()V
-Ljava/net/ServerSocket;->setImpl()V
-Ljava/net/Socket;-><init>([Ljava/net/InetAddress;ILjava/net/SocketAddress;Z)V
-Ljava/net/Socket;->bound:Z
-Ljava/net/Socket;->checkAddress(Ljava/net/InetAddress;Ljava/lang/String;)V
-Ljava/net/Socket;->checkOldImpl()V
-Ljava/net/Socket;->closed:Z
-Ljava/net/Socket;->closeLock:Ljava/lang/Object;
-Ljava/net/Socket;->connected:Z
-Ljava/net/Socket;->created:Z
-Ljava/net/Socket;->createImpl(Z)V
-Ljava/net/Socket;->getImpl()Ljava/net/SocketImpl;
-Ljava/net/Socket;->nonNullAddress(Ljava/net/InetAddress;)[Ljava/net/InetAddress;
-Ljava/net/Socket;->oldImpl:Z
-Ljava/net/Socket;->postAccept()V
-Ljava/net/Socket;->setBound()V
-Ljava/net/Socket;->setConnected()V
-Ljava/net/Socket;->setCreated()V
-Ljava/net/Socket;->setImpl()V
-Ljava/net/Socket;->shutIn:Z
-Ljava/net/Socket;->shutOut:Z
-Ljava/net/SocketException;-><init>(Ljava/lang/Throwable;)V
-Ljava/net/SocketImpl;->getFD$()Ljava/io/FileDescriptor;
-Ljava/net/SocketImpl;->getOption(Ljava/net/SocketOption;)Ljava/lang/Object;
-Ljava/net/SocketImpl;->getServerSocket()Ljava/net/ServerSocket;
-Ljava/net/SocketImpl;->getSocket()Ljava/net/Socket;
-Ljava/net/SocketImpl;->reset()V
-Ljava/net/SocketImpl;->setOption(Ljava/net/SocketOption;Ljava/lang/Object;)V
-Ljava/net/SocketImpl;->setServerSocket(Ljava/net/ServerSocket;)V
-Ljava/net/SocketImpl;->setSocket(Ljava/net/Socket;)V
-Ljava/net/SocketTimeoutException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/net/SocketTimeoutException;-><init>(Ljava/lang/Throwable;)V
-Ljava/net/StandardSocketOptions$StdSocketOption;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
-Ljava/net/StandardSocketOptions$StdSocketOption;->name:Ljava/lang/String;
-Ljava/net/StandardSocketOptions$StdSocketOption;->type:Ljava/lang/Class;
-Ljava/net/StandardSocketOptions;-><init>()V
-Ljava/net/URI$Parser;->at(IIC)Z
-Ljava/net/URI$Parser;->at(IILjava/lang/String;)Z
-Ljava/net/URI$Parser;->charAt(I)C
-Ljava/net/URI$Parser;->checkChar(IJJLjava/lang/String;)V
-Ljava/net/URI$Parser;->checkChars(IIJJLjava/lang/String;)V
-Ljava/net/URI$Parser;->fail(Ljava/lang/String;)V
-Ljava/net/URI$Parser;->fail(Ljava/lang/String;I)V
-Ljava/net/URI$Parser;->failExpecting(Ljava/lang/String;I)V
-Ljava/net/URI$Parser;->failExpecting(Ljava/lang/String;Ljava/lang/String;I)V
-Ljava/net/URI$Parser;->input:Ljava/lang/String;
-Ljava/net/URI$Parser;->ipv6byteCount:I
-Ljava/net/URI$Parser;->parse(Z)V
-Ljava/net/URI$Parser;->parseAuthority(II)I
-Ljava/net/URI$Parser;->parseHierarchical(II)I
-Ljava/net/URI$Parser;->parseHostname(II)I
-Ljava/net/URI$Parser;->parseIPv4Address(II)I
-Ljava/net/URI$Parser;->parseIPv6Reference(II)I
-Ljava/net/URI$Parser;->parseServer(II)I
-Ljava/net/URI$Parser;->requireServerAuthority:Z
-Ljava/net/URI$Parser;->scan(IIC)I
-Ljava/net/URI$Parser;->scan(IIJJ)I
-Ljava/net/URI$Parser;->scan(IILjava/lang/String;Ljava/lang/String;)I
-Ljava/net/URI$Parser;->scanByte(II)I
-Ljava/net/URI$Parser;->scanEscape(IIC)I
-Ljava/net/URI$Parser;->scanHexPost(II)I
-Ljava/net/URI$Parser;->scanHexSeq(II)I
-Ljava/net/URI$Parser;->scanIPv4Address(IIZ)I
-Ljava/net/URI$Parser;->substring(II)Ljava/lang/String;
-Ljava/net/URI$Parser;->takeIPv4Address(IILjava/lang/String;)I
-Ljava/net/URI;-><init>()V
-Ljava/net/URI;->appendAuthority(Ljava/lang/StringBuffer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
-Ljava/net/URI;->appendEncoded(Ljava/lang/StringBuffer;C)V
-Ljava/net/URI;->appendEscape(Ljava/lang/StringBuffer;B)V
-Ljava/net/URI;->appendFragment(Ljava/lang/StringBuffer;Ljava/lang/String;)V
-Ljava/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
-Ljava/net/URI;->authority:Ljava/lang/String;
-Ljava/net/URI;->checkPath(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Ljava/net/URI;->compare(Ljava/lang/String;Ljava/lang/String;)I
-Ljava/net/URI;->compareIgnoringCase(Ljava/lang/String;Ljava/lang/String;)I
-Ljava/net/URI;->decode(C)I
-Ljava/net/URI;->decode(CC)B
-Ljava/net/URI;->decode(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/URI;->decodedAuthority:Ljava/lang/String;
-Ljava/net/URI;->decodedFragment:Ljava/lang/String;
-Ljava/net/URI;->decodedPath:Ljava/lang/String;
-Ljava/net/URI;->decodedQuery:Ljava/lang/String;
-Ljava/net/URI;->decodedSchemeSpecificPart:Ljava/lang/String;
-Ljava/net/URI;->decodedUserInfo:Ljava/lang/String;
-Ljava/net/URI;->defineSchemeSpecificPart()V
-Ljava/net/URI;->defineString()V
-Ljava/net/URI;->encode(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/URI;->equal(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/net/URI;->equalIgnoringCase(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/net/URI;->hash(ILjava/lang/String;)I
-Ljava/net/URI;->hash:I
-Ljava/net/URI;->hashIgnoringCase(ILjava/lang/String;)I
-Ljava/net/URI;->hexDigits:[C
-Ljava/net/URI;->highMask(CC)J
-Ljava/net/URI;->highMask(Ljava/lang/String;)J
-Ljava/net/URI;->H_ALPHA:J
-Ljava/net/URI;->H_ALPHANUM:J
-Ljava/net/URI;->H_DASH:J
-Ljava/net/URI;->H_DIGIT:J
-Ljava/net/URI;->H_DOT:J
-Ljava/net/URI;->H_ESCAPED:J
-Ljava/net/URI;->H_HEX:J
-Ljava/net/URI;->H_LEFT_BRACKET:J
-Ljava/net/URI;->H_LOWALPHA:J
-Ljava/net/URI;->H_MARK:J
-Ljava/net/URI;->H_PATH:J
-Ljava/net/URI;->H_PCHAR:J
-Ljava/net/URI;->H_REG_NAME:J
-Ljava/net/URI;->H_RESERVED:J
-Ljava/net/URI;->H_SCHEME:J
-Ljava/net/URI;->H_SERVER:J
-Ljava/net/URI;->H_SERVER_PERCENT:J
-Ljava/net/URI;->H_UNDERSCORE:J
-Ljava/net/URI;->H_UNRESERVED:J
-Ljava/net/URI;->H_UPALPHA:J
-Ljava/net/URI;->H_URIC:J
-Ljava/net/URI;->H_URIC_NO_SLASH:J
-Ljava/net/URI;->H_USERINFO:J
-Ljava/net/URI;->join([C[I)I
-Ljava/net/URI;->lowMask(CC)J
-Ljava/net/URI;->lowMask(Ljava/lang/String;)J
-Ljava/net/URI;->L_ALPHA:J
-Ljava/net/URI;->L_ALPHANUM:J
-Ljava/net/URI;->L_DASH:J
-Ljava/net/URI;->L_DIGIT:J
-Ljava/net/URI;->L_DOT:J
-Ljava/net/URI;->L_ESCAPED:J
-Ljava/net/URI;->L_HEX:J
-Ljava/net/URI;->L_LEFT_BRACKET:J
-Ljava/net/URI;->L_LOWALPHA:J
-Ljava/net/URI;->L_MARK:J
-Ljava/net/URI;->L_PATH:J
-Ljava/net/URI;->L_PCHAR:J
-Ljava/net/URI;->L_REG_NAME:J
-Ljava/net/URI;->L_RESERVED:J
-Ljava/net/URI;->L_SCHEME:J
-Ljava/net/URI;->L_SERVER:J
-Ljava/net/URI;->L_SERVER_PERCENT:J
-Ljava/net/URI;->L_UNDERSCORE:J
-Ljava/net/URI;->L_UNRESERVED:J
-Ljava/net/URI;->L_UPALPHA:J
-Ljava/net/URI;->L_URIC:J
-Ljava/net/URI;->L_URIC_NO_SLASH:J
-Ljava/net/URI;->L_USERINFO:J
-Ljava/net/URI;->match(CJJ)Z
-Ljava/net/URI;->maybeAddLeadingDot([C[I)V
-Ljava/net/URI;->needsNormalization(Ljava/lang/String;)I
-Ljava/net/URI;->normalize(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/URI;->normalize(Ljava/lang/String;Z)Ljava/lang/String;
-Ljava/net/URI;->normalize(Ljava/net/URI;)Ljava/net/URI;
-Ljava/net/URI;->normalizedHash(ILjava/lang/String;)I
-Ljava/net/URI;->path:Ljava/lang/String;
-Ljava/net/URI;->quote(Ljava/lang/String;JJ)Ljava/lang/String;
-Ljava/net/URI;->relativize(Ljava/net/URI;Ljava/net/URI;)Ljava/net/URI;
-Ljava/net/URI;->removeDots([C[IZ)V
-Ljava/net/URI;->resolve(Ljava/net/URI;Ljava/net/URI;)Ljava/net/URI;
-Ljava/net/URI;->resolvePath(Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;
-Ljava/net/URI;->scheme:Ljava/lang/String;
-Ljava/net/URI;->schemeSpecificPart:Ljava/lang/String;
-Ljava/net/URI;->split([C[I)V
-Ljava/net/URI;->toLower(C)I
-Ljava/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;
-Ljava/net/URI;->toUpper(C)I
-Ljava/net/URI;->userInfo:Ljava/lang/String;
-Ljava/net/URISyntaxException;->index:I
-Ljava/net/URISyntaxException;->input:Ljava/lang/String;
-Ljava/net/URL;->authority:Ljava/lang/String;
-Ljava/net/URL;->BUILTIN_HANDLER_CLASS_NAMES:Ljava/util/Set;
-Ljava/net/URL;->checkSpecifyHandler(Ljava/lang/SecurityManager;)V
-Ljava/net/URL;->createBuiltinHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;
-Ljava/net/URL;->createBuiltinHandlerClassNames()Ljava/util/Set;
-Ljava/net/URL;->fabricateNewURL()Ljava/net/URL;
-Ljava/net/URL;->file:Ljava/lang/String;
-Ljava/net/URL;->getURLStreamHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;
-Ljava/net/URL;->hashCode:I
-Ljava/net/URL;->host:Ljava/lang/String;
-Ljava/net/URL;->hostAddress:Ljava/net/InetAddress;
-Ljava/net/URL;->isBuiltinStreamHandler(Ljava/lang/String;)Z
-Ljava/net/URL;->isValidProtocol(Ljava/lang/String;)Z
-Ljava/net/URL;->path:Ljava/lang/String;
-Ljava/net/URL;->port:I
-Ljava/net/URL;->protocolPathProp:Ljava/lang/String;
-Ljava/net/URL;->query:Ljava/lang/String;
-Ljava/net/URL;->ref:Ljava/lang/String;
-Ljava/net/URL;->resetState()V
-Ljava/net/URL;->set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
-Ljava/net/URL;->set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Ljava/net/URL;->setDeserializedFields(Ljava/net/URLStreamHandler;)Ljava/net/URL;
-Ljava/net/URL;->setSerializedHashCode(I)V
-Ljava/net/URL;->streamHandlerLock:Ljava/lang/Object;
-Ljava/net/URL;->tempState:Ljava/net/UrlDeserializedState;
-Ljava/net/URL;->userInfo:Ljava/lang/String;
-Ljava/net/URLClassLoader;-><init>([Ljava/net/URL;Ljava/lang/ClassLoader;Ljava/security/AccessControlContext;)V
-Ljava/net/URLClassLoader;-><init>([Ljava/net/URL;Ljava/security/AccessControlContext;)V
-Ljava/net/URLClassLoader;->closeables:Ljava/util/WeakHashMap;
-Ljava/net/URLClassLoader;->defineClass(Ljava/lang/String;Lsun/misc/Resource;)Ljava/lang/Class;
-Ljava/net/URLClassLoader;->definePackageInternal(Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)V
-Ljava/net/URLClassLoader;->getAndVerifyPackage(Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package;
-Ljava/net/URLClassLoader;->isSealed(Ljava/lang/String;Ljava/util/jar/Manifest;)Z
-Ljava/net/URLConnection;->checkfpx(Ljava/io/InputStream;)Z
-Ljava/net/URLConnection;->connectTimeout:I
-Ljava/net/URLConnection;->contentClassPrefix:Ljava/lang/String;
-Ljava/net/URLConnection;->contentPathProp:Ljava/lang/String;
-Ljava/net/URLConnection;->defaultAllowUserInteraction:Z
-Ljava/net/URLConnection;->defaultUseCaches:Z
-Ljava/net/URLConnection;->factory:Ljava/net/ContentHandlerFactory;
-Ljava/net/URLConnection;->fileNameMap:Ljava/net/FileNameMap;
-Ljava/net/URLConnection;->getContentHandler()Ljava/net/ContentHandler;
-Ljava/net/URLConnection;->getContentHandlerPkgPrefixes()Ljava/lang/String;
-Ljava/net/URLConnection;->handlers:Ljava/util/Hashtable;
-Ljava/net/URLConnection;->lookupContentHandlerClassFor(Ljava/lang/String;)Ljava/net/ContentHandler;
-Ljava/net/URLConnection;->readBytes([IILjava/io/InputStream;)I
-Ljava/net/URLConnection;->readTimeout:I
-Ljava/net/URLConnection;->requests:Lsun/net/www/MessageHeader;
-Ljava/net/URLConnection;->skipForward(Ljava/io/InputStream;J)J
-Ljava/net/URLConnection;->stripOffParameters(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/URLConnection;->typeToPackageName(Ljava/lang/String;)Ljava/lang/String;
-Ljava/net/URLDecoder;->dfltEncName:Ljava/lang/String;
-Ljava/net/URLDecoder;->isValidHexChar(C)Z
-Ljava/net/UrlDeserializedState;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
-Ljava/net/UrlDeserializedState;->authority:Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->file:Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->getAuthority()Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->getFile()Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->getHashCode()I
-Ljava/net/UrlDeserializedState;->getHost()Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->getPort()I
-Ljava/net/UrlDeserializedState;->getProtocol()Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->getRef()Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->hashCode:I
-Ljava/net/UrlDeserializedState;->host:Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->port:I
-Ljava/net/UrlDeserializedState;->protocol:Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->reconstituteUrlString()Ljava/lang/String;
-Ljava/net/UrlDeserializedState;->ref:Ljava/lang/String;
-Ljava/net/URLEncoder;-><init>()V
-Ljava/net/URLEncoder;->caseDiff:I
-Ljava/net/URLEncoder;->dfltEncName:Ljava/lang/String;
-Ljava/net/URLEncoder;->dontNeedEncoding:Ljava/util/BitSet;
-Ljava/nio/Buffer;-><init>(IIIII)V
-Ljava/nio/Buffer;->checkBounds(III)V
-Ljava/nio/Buffer;->checkIndex(I)I
-Ljava/nio/Buffer;->checkIndex(II)I
-Ljava/nio/Buffer;->discardMark()V
-Ljava/nio/Buffer;->getElementSizeShift()I
-Ljava/nio/Buffer;->mark:I
-Ljava/nio/Buffer;->markValue()I
-Ljava/nio/Buffer;->nextGetIndex()I
-Ljava/nio/Buffer;->nextGetIndex(I)I
-Ljava/nio/Buffer;->nextPutIndex()I
-Ljava/nio/Buffer;->nextPutIndex(I)I
-Ljava/nio/Buffer;->SPLITERATOR_CHARACTERISTICS:I
-Ljava/nio/Buffer;->truncate()V
-Ljava/nio/ByteBuffer;-><init>(IIII)V
-Ljava/nio/ByteBuffer;-><init>(IIII[BI)V
-Ljava/nio/ByteBuffer;->bigEndian:Z
-Ljava/nio/ByteBuffer;->compare(BB)I
-Ljava/nio/ByteBuffer;->equals(BB)Z
-Ljava/nio/ByteBuffer;->getCharUnchecked(I)C
-Ljava/nio/ByteBuffer;->getDoubleUnchecked(I)D
-Ljava/nio/ByteBuffer;->getFloatUnchecked(I)F
-Ljava/nio/ByteBuffer;->getIntUnchecked(I)I
-Ljava/nio/ByteBuffer;->getLongUnchecked(I)J
-Ljava/nio/ByteBuffer;->getShortUnchecked(I)S
-Ljava/nio/ByteBuffer;->getUnchecked(I[CII)V
-Ljava/nio/ByteBuffer;->getUnchecked(I[DII)V
-Ljava/nio/ByteBuffer;->getUnchecked(I[FII)V
-Ljava/nio/ByteBuffer;->getUnchecked(I[III)V
-Ljava/nio/ByteBuffer;->getUnchecked(I[JII)V
-Ljava/nio/ByteBuffer;->getUnchecked(I[SII)V
-Ljava/nio/ByteBuffer;->isAccessible()Z
-Ljava/nio/ByteBuffer;->nativeByteOrder:Z
-Ljava/nio/ByteBuffer;->putCharUnchecked(IC)V
-Ljava/nio/ByteBuffer;->putDoubleUnchecked(ID)V
-Ljava/nio/ByteBuffer;->putFloatUnchecked(IF)V
-Ljava/nio/ByteBuffer;->putIntUnchecked(II)V
-Ljava/nio/ByteBuffer;->putLongUnchecked(IJ)V
-Ljava/nio/ByteBuffer;->putShortUnchecked(IS)V
-Ljava/nio/ByteBuffer;->putUnchecked(I[CII)V
-Ljava/nio/ByteBuffer;->putUnchecked(I[DII)V
-Ljava/nio/ByteBuffer;->putUnchecked(I[FII)V
-Ljava/nio/ByteBuffer;->putUnchecked(I[III)V
-Ljava/nio/ByteBuffer;->putUnchecked(I[JII)V
-Ljava/nio/ByteBuffer;->putUnchecked(I[SII)V
-Ljava/nio/ByteBuffer;->setAccessible(Z)V
-Ljava/nio/ByteBuffer;->_get(I)B
-Ljava/nio/ByteBuffer;->_put(IB)V
-Ljava/nio/ByteOrder;-><init>(Ljava/lang/String;)V
-Ljava/nio/ByteOrder;->name:Ljava/lang/String;
-Ljava/nio/channels/AsynchronousChannelGroup;->provider:Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/AsynchronousFileChannel;->NO_ATTRIBUTES:[Ljava/nio/file/attribute/FileAttribute;
-Ljava/nio/channels/AsynchronousServerSocketChannel;->provider:Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/AsynchronousSocketChannel;->provider:Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/Channels$ReadableByteChannelImpl;-><init>(Ljava/io/InputStream;)V
-Ljava/nio/channels/Channels$ReadableByteChannelImpl;->buf:[B
-Ljava/nio/channels/Channels$ReadableByteChannelImpl;->in:Ljava/io/InputStream;
-Ljava/nio/channels/Channels$ReadableByteChannelImpl;->open:Z
-Ljava/nio/channels/Channels$ReadableByteChannelImpl;->readLock:Ljava/lang/Object;
-Ljava/nio/channels/Channels$ReadableByteChannelImpl;->TRANSFER_SIZE:I
-Ljava/nio/channels/Channels$WritableByteChannelImpl;-><init>(Ljava/io/OutputStream;)V
-Ljava/nio/channels/Channels$WritableByteChannelImpl;->buf:[B
-Ljava/nio/channels/Channels$WritableByteChannelImpl;->open:Z
-Ljava/nio/channels/Channels$WritableByteChannelImpl;->out:Ljava/io/OutputStream;
-Ljava/nio/channels/Channels$WritableByteChannelImpl;->TRANSFER_SIZE:I
-Ljava/nio/channels/Channels$WritableByteChannelImpl;->writeLock:Ljava/lang/Object;
-Ljava/nio/channels/Channels;-><init>()V
-Ljava/nio/channels/Channels;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V
-Ljava/nio/channels/Channels;->writeFully(Ljava/nio/channels/WritableByteChannel;Ljava/nio/ByteBuffer;)V
-Ljava/nio/channels/Channels;->writeFullyImpl(Ljava/nio/channels/WritableByteChannel;Ljava/nio/ByteBuffer;)V
-Ljava/nio/channels/FileChannel$MapMode;-><init>(Ljava/lang/String;)V
-Ljava/nio/channels/FileChannel$MapMode;->name:Ljava/lang/String;
-Ljava/nio/channels/FileChannel;->NO_ATTRIBUTES:[Ljava/nio/file/attribute/FileAttribute;
-Ljava/nio/channels/FileLock;->channel:Ljava/nio/channels/Channel;
-Ljava/nio/channels/FileLock;->position:J
-Ljava/nio/channels/FileLock;->shared:Z
-Ljava/nio/channels/FileLock;->size:J
-Ljava/nio/channels/SelectionKey;->attachment:Ljava/lang/Object;
-Ljava/nio/channels/SelectionKey;->attachmentUpdater:Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel;->blockedOn(Lsun/nio/ch/Interruptible;)V
-Ljava/nio/channels/spi/AbstractInterruptibleChannel;->closeLock:Ljava/lang/Object;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel;->interrupted:Ljava/lang/Thread;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel;->interruptor:Lsun/nio/ch/Interruptible;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel;->open:Z
-Ljava/nio/channels/spi/AbstractSelectableChannel;->addKey(Ljava/nio/channels/SelectionKey;)V
-Ljava/nio/channels/spi/AbstractSelectableChannel;->blocking:Z
-Ljava/nio/channels/spi/AbstractSelectableChannel;->findKey(Ljava/nio/channels/Selector;)Ljava/nio/channels/SelectionKey;
-Ljava/nio/channels/spi/AbstractSelectableChannel;->haveValidKeys()Z
-Ljava/nio/channels/spi/AbstractSelectableChannel;->keyCount:I
-Ljava/nio/channels/spi/AbstractSelectableChannel;->keyLock:Ljava/lang/Object;
-Ljava/nio/channels/spi/AbstractSelectableChannel;->keys:[Ljava/nio/channels/SelectionKey;
-Ljava/nio/channels/spi/AbstractSelectableChannel;->provider:Ljava/nio/channels/spi/SelectorProvider;
-Ljava/nio/channels/spi/AbstractSelectableChannel;->regLock:Ljava/lang/Object;
-Ljava/nio/channels/spi/AbstractSelectableChannel;->removeKey(Ljava/nio/channels/SelectionKey;)V
-Ljava/nio/channels/spi/AbstractSelectionKey;->invalidate()V
-Ljava/nio/channels/spi/AbstractSelectionKey;->valid:Z
-Ljava/nio/channels/spi/AbstractSelector;->cancel(Ljava/nio/channels/SelectionKey;)V
-Ljava/nio/channels/spi/AbstractSelector;->cancelledKeys:Ljava/util/Set;
-Ljava/nio/channels/spi/AbstractSelector;->interruptor:Lsun/nio/ch/Interruptible;
-Ljava/nio/channels/spi/AbstractSelector;->provider:Ljava/nio/channels/spi/SelectorProvider;
-Ljava/nio/channels/spi/AbstractSelector;->selectorOpen:Ljava/util/concurrent/atomic/AtomicBoolean;
-Ljava/nio/channels/spi/AsynchronousChannelProvider$ProviderHolder;-><init>()V
-Ljava/nio/channels/spi/AsynchronousChannelProvider$ProviderHolder;->load()Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/spi/AsynchronousChannelProvider$ProviderHolder;->loadProviderAsService()Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/spi/AsynchronousChannelProvider$ProviderHolder;->loadProviderFromProperty()Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/spi/AsynchronousChannelProvider$ProviderHolder;->provider:Ljava/nio/channels/spi/AsynchronousChannelProvider;
-Ljava/nio/channels/spi/AsynchronousChannelProvider;-><init>(Ljava/lang/Void;)V
-Ljava/nio/channels/spi/AsynchronousChannelProvider;->checkPermission()Ljava/lang/Void;
-Ljava/nio/channels/spi/SelectorProvider;->loadProviderAsService()Z
-Ljava/nio/channels/spi/SelectorProvider;->loadProviderFromProperty()Z
-Ljava/nio/channels/spi/SelectorProvider;->lock:Ljava/lang/Object;
-Ljava/nio/channels/spi/SelectorProvider;->provider:Ljava/nio/channels/spi/SelectorProvider;
-Ljava/nio/CharBuffer;-><init>(IIII)V
-Ljava/nio/CharBuffer;-><init>(IIII[CI)V
-Ljava/nio/CharBuffer;->compare(CC)I
-Ljava/nio/CharBuffer;->equals(CC)Z
-Ljava/nio/CharBuffer;->getUnchecked(I)C
-Ljava/nio/CharBuffer;->hb:[C
-Ljava/nio/CharBuffer;->isReadOnly:Z
-Ljava/nio/CharBuffer;->offset:I
-Ljava/nio/charset/Charset;->aliases:[Ljava/lang/String;
-Ljava/nio/charset/Charset;->aliasSet:Ljava/util/Set;
-Ljava/nio/charset/Charset;->atBugLevel(Ljava/lang/String;)Z
-Ljava/nio/charset/Charset;->bugLevel:Ljava/lang/String;
-Ljava/nio/charset/Charset;->cache(Ljava/lang/String;Ljava/nio/charset/Charset;)V
-Ljava/nio/charset/Charset;->cache1:Ljava/util/Map$Entry;
-Ljava/nio/charset/Charset;->cache2:Ljava/util/HashMap;
-Ljava/nio/charset/Charset;->checkName(Ljava/lang/String;)V
-Ljava/nio/charset/Charset;->forNameUEE(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/nio/charset/Charset;->gate:Ljava/lang/ThreadLocal;
-Ljava/nio/charset/Charset;->lookup(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/nio/charset/Charset;->lookup2(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/nio/charset/Charset;->lookupViaProviders(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/nio/charset/Charset;->name:Ljava/lang/String;
-Ljava/nio/charset/Charset;->providers()Ljava/util/Iterator;
-Ljava/nio/charset/Charset;->put(Ljava/util/Iterator;Ljava/util/Map;)V
-Ljava/nio/charset/CharsetDecoder;-><init>(Ljava/nio/charset/Charset;FFLjava/lang/String;)V
-Ljava/nio/charset/CharsetDecoder;->averageCharsPerByte:F
-Ljava/nio/charset/CharsetDecoder;->charset:Ljava/nio/charset/Charset;
-Ljava/nio/charset/CharsetDecoder;->malformedInputAction:Ljava/nio/charset/CodingErrorAction;
-Ljava/nio/charset/CharsetDecoder;->maxCharsPerByte:F
-Ljava/nio/charset/CharsetDecoder;->replacement:Ljava/lang/String;
-Ljava/nio/charset/CharsetDecoder;->state:I
-Ljava/nio/charset/CharsetDecoder;->stateNames:[Ljava/lang/String;
-Ljava/nio/charset/CharsetDecoder;->ST_CODING:I
-Ljava/nio/charset/CharsetDecoder;->ST_END:I
-Ljava/nio/charset/CharsetDecoder;->ST_FLUSHED:I
-Ljava/nio/charset/CharsetDecoder;->ST_RESET:I
-Ljava/nio/charset/CharsetDecoder;->throwIllegalStateException(II)V
-Ljava/nio/charset/CharsetDecoder;->unmappableCharacterAction:Ljava/nio/charset/CodingErrorAction;
-Ljava/nio/charset/CharsetEncoder;-><init>(Ljava/nio/charset/Charset;FF[BZ)V
-Ljava/nio/charset/CharsetEncoder;->averageBytesPerChar:F
-Ljava/nio/charset/CharsetEncoder;->cachedDecoder:Ljava/lang/ref/WeakReference;
-Ljava/nio/charset/CharsetEncoder;->charset:Ljava/nio/charset/Charset;
-Ljava/nio/charset/CharsetEncoder;->malformedInputAction:Ljava/nio/charset/CodingErrorAction;
-Ljava/nio/charset/CharsetEncoder;->maxBytesPerChar:F
-Ljava/nio/charset/CharsetEncoder;->replacement:[B
-Ljava/nio/charset/CharsetEncoder;->state:I
-Ljava/nio/charset/CharsetEncoder;->stateNames:[Ljava/lang/String;
-Ljava/nio/charset/CharsetEncoder;->ST_CODING:I
-Ljava/nio/charset/CharsetEncoder;->ST_END:I
-Ljava/nio/charset/CharsetEncoder;->ST_FLUSHED:I
-Ljava/nio/charset/CharsetEncoder;->ST_RESET:I
-Ljava/nio/charset/CharsetEncoder;->throwIllegalStateException(II)V
-Ljava/nio/charset/CharsetEncoder;->unmappableCharacterAction:Ljava/nio/charset/CodingErrorAction;
-Ljava/nio/charset/CoderResult$Cache;-><init>()V
-Ljava/nio/charset/CoderResult$Cache;->cache:Ljava/util/Map;
-Ljava/nio/charset/CoderResult$Cache;->create(I)Ljava/nio/charset/CoderResult;
-Ljava/nio/charset/CoderResult$Cache;->get(I)Ljava/nio/charset/CoderResult;
-Ljava/nio/charset/CoderResult;-><init>(II)V
-Ljava/nio/charset/CoderResult;->CR_ERROR_MIN:I
-Ljava/nio/charset/CoderResult;->CR_MALFORMED:I
-Ljava/nio/charset/CoderResult;->CR_OVERFLOW:I
-Ljava/nio/charset/CoderResult;->CR_UNDERFLOW:I
-Ljava/nio/charset/CoderResult;->CR_UNMAPPABLE:I
-Ljava/nio/charset/CoderResult;->length:I
-Ljava/nio/charset/CoderResult;->malformedCache:Ljava/nio/charset/CoderResult$Cache;
-Ljava/nio/charset/CoderResult;->names:[Ljava/lang/String;
-Ljava/nio/charset/CoderResult;->type:I
-Ljava/nio/charset/CoderResult;->unmappableCache:Ljava/nio/charset/CoderResult$Cache;
-Ljava/nio/charset/CodingErrorAction;-><init>(Ljava/lang/String;)V
-Ljava/nio/charset/CodingErrorAction;->name:Ljava/lang/String;
-Ljava/nio/charset/IllegalCharsetNameException;->charsetName:Ljava/lang/String;
-Ljava/nio/charset/MalformedInputException;->inputLength:I
-Ljava/nio/charset/ModifiedUtf8;-><init>()V
-Ljava/nio/charset/ModifiedUtf8;->countBytes(Ljava/lang/String;Z)J
-Ljava/nio/charset/ModifiedUtf8;->decode([B[CII)Ljava/lang/String;
-Ljava/nio/charset/ModifiedUtf8;->encode(Ljava/lang/String;)[B
-Ljava/nio/charset/ModifiedUtf8;->encode([BILjava/lang/String;)V
-Ljava/nio/charset/StandardCharsets;-><init>()V
-Ljava/nio/charset/UnmappableCharacterException;->inputLength:I
-Ljava/nio/charset/UnsupportedCharsetException;->charsetName:Ljava/lang/String;
-Ljava/nio/DirectByteBuffer$MemoryRef;-><init>(I)V
-Ljava/nio/DirectByteBuffer$MemoryRef;-><init>(JLjava/lang/Object;)V
-Ljava/nio/DirectByteBuffer$MemoryRef;->allocatedAddress:J
-Ljava/nio/DirectByteBuffer$MemoryRef;->buffer:[B
-Ljava/nio/DirectByteBuffer$MemoryRef;->free()V
-Ljava/nio/DirectByteBuffer$MemoryRef;->isAccessible:Z
-Ljava/nio/DirectByteBuffer$MemoryRef;->isFreed:Z
-Ljava/nio/DirectByteBuffer$MemoryRef;->offset:I
-Ljava/nio/DirectByteBuffer$MemoryRef;->originalBufferObject:Ljava/lang/Object;
-Ljava/nio/DirectByteBuffer;-><init>(IJLjava/io/FileDescriptor;Ljava/lang/Runnable;Z)V
-Ljava/nio/DirectByteBuffer;-><init>(ILjava/nio/DirectByteBuffer$MemoryRef;)V
-Ljava/nio/DirectByteBuffer;-><init>(Ljava/nio/DirectByteBuffer$MemoryRef;IIIII)V
-Ljava/nio/DirectByteBuffer;-><init>(Ljava/nio/DirectByteBuffer$MemoryRef;IIIIIZ)V
-Ljava/nio/DirectByteBuffer;->cleaner:Lsun/misc/Cleaner;
-Ljava/nio/DirectByteBuffer;->get(J)B
-Ljava/nio/DirectByteBuffer;->getCharUnchecked(I)C
-Ljava/nio/DirectByteBuffer;->getDouble(J)D
-Ljava/nio/DirectByteBuffer;->getDoubleUnchecked(I)D
-Ljava/nio/DirectByteBuffer;->getFloat(J)F
-Ljava/nio/DirectByteBuffer;->getFloatUnchecked(I)F
-Ljava/nio/DirectByteBuffer;->getInt(J)I
-Ljava/nio/DirectByteBuffer;->getIntUnchecked(I)I
-Ljava/nio/DirectByteBuffer;->getLong(J)J
-Ljava/nio/DirectByteBuffer;->getLongUnchecked(I)J
-Ljava/nio/DirectByteBuffer;->getShort(J)S
-Ljava/nio/DirectByteBuffer;->getShortUnchecked(I)S
-Ljava/nio/DirectByteBuffer;->getUnchecked(I[CII)V
-Ljava/nio/DirectByteBuffer;->getUnchecked(I[DII)V
-Ljava/nio/DirectByteBuffer;->getUnchecked(I[FII)V
-Ljava/nio/DirectByteBuffer;->getUnchecked(I[III)V
-Ljava/nio/DirectByteBuffer;->getUnchecked(I[JII)V
-Ljava/nio/DirectByteBuffer;->getUnchecked(I[SII)V
-Ljava/nio/DirectByteBuffer;->isAccessible()Z
-Ljava/nio/DirectByteBuffer;->ix(I)J
-Ljava/nio/DirectByteBuffer;->memoryRef:Ljava/nio/DirectByteBuffer$MemoryRef;
-Ljava/nio/DirectByteBuffer;->put(JB)Ljava/nio/ByteBuffer;
-Ljava/nio/DirectByteBuffer;->putChar(JC)Ljava/nio/ByteBuffer;
-Ljava/nio/DirectByteBuffer;->putCharUnchecked(IC)V
-Ljava/nio/DirectByteBuffer;->putDouble(JD)Ljava/nio/ByteBuffer;
-Ljava/nio/DirectByteBuffer;->putDoubleUnchecked(ID)V
-Ljava/nio/DirectByteBuffer;->putFloat(JF)Ljava/nio/ByteBuffer;
-Ljava/nio/DirectByteBuffer;->putFloatUnchecked(IF)V
-Ljava/nio/DirectByteBuffer;->putInt(JI)Ljava/nio/ByteBuffer;
-Ljava/nio/DirectByteBuffer;->putIntUnchecked(II)V
-Ljava/nio/DirectByteBuffer;->putLong(JJ)Ljava/nio/ByteBuffer;
-Ljava/nio/DirectByteBuffer;->putLongUnchecked(IJ)V
-Ljava/nio/DirectByteBuffer;->putShort(JS)Ljava/nio/ByteBuffer;
-Ljava/nio/DirectByteBuffer;->putShortUnchecked(IS)V
-Ljava/nio/DirectByteBuffer;->putUnchecked(I[CII)V
-Ljava/nio/DirectByteBuffer;->putUnchecked(I[DII)V
-Ljava/nio/DirectByteBuffer;->putUnchecked(I[FII)V
-Ljava/nio/DirectByteBuffer;->putUnchecked(I[III)V
-Ljava/nio/DirectByteBuffer;->putUnchecked(I[JII)V
-Ljava/nio/DirectByteBuffer;->putUnchecked(I[SII)V
-Ljava/nio/DirectByteBuffer;->setAccessible(Z)V
-Ljava/nio/DirectByteBuffer;->_get(I)B
-Ljava/nio/DirectByteBuffer;->_put(IB)V
-Ljava/nio/DoubleBuffer;-><init>(IIII)V
-Ljava/nio/DoubleBuffer;-><init>(IIII[DI)V
-Ljava/nio/DoubleBuffer;->compare(DD)I
-Ljava/nio/DoubleBuffer;->equals(DD)Z
-Ljava/nio/DoubleBuffer;->hb:[D
-Ljava/nio/DoubleBuffer;->isReadOnly:Z
-Ljava/nio/DoubleBuffer;->offset:I
-Ljava/nio/file/attribute/AclEntry$Builder;-><init>(Ljava/nio/file/attribute/AclEntryType;Ljava/nio/file/attribute/UserPrincipal;Ljava/util/Set;Ljava/util/Set;)V
-Ljava/nio/file/attribute/AclEntry$Builder;->checkSet(Ljava/util/Set;Ljava/lang/Class;)V
-Ljava/nio/file/attribute/AclEntry$Builder;->flags:Ljava/util/Set;
-Ljava/nio/file/attribute/AclEntry$Builder;->perms:Ljava/util/Set;
-Ljava/nio/file/attribute/AclEntry$Builder;->type:Ljava/nio/file/attribute/AclEntryType;
-Ljava/nio/file/attribute/AclEntry$Builder;->who:Ljava/nio/file/attribute/UserPrincipal;
-Ljava/nio/file/attribute/AclEntry;-><init>(Ljava/nio/file/attribute/AclEntryType;Ljava/nio/file/attribute/UserPrincipal;Ljava/util/Set;Ljava/util/Set;)V
-Ljava/nio/file/attribute/AclEntry;->flags:Ljava/util/Set;
-Ljava/nio/file/attribute/AclEntry;->hash(ILjava/lang/Object;)I
-Ljava/nio/file/attribute/AclEntry;->hash:I
-Ljava/nio/file/attribute/AclEntry;->perms:Ljava/util/Set;
-Ljava/nio/file/attribute/AclEntry;->type:Ljava/nio/file/attribute/AclEntryType;
-Ljava/nio/file/attribute/AclEntry;->who:Ljava/nio/file/attribute/UserPrincipal;
-Ljava/nio/file/attribute/FileTime;-><init>(JLjava/util/concurrent/TimeUnit;Ljava/time/Instant;)V
-Ljava/nio/file/attribute/FileTime;->append(Ljava/lang/StringBuilder;II)Ljava/lang/StringBuilder;
-Ljava/nio/file/attribute/FileTime;->DAYS_PER_10000_YEARS:J
-Ljava/nio/file/attribute/FileTime;->HOURS_PER_DAY:J
-Ljava/nio/file/attribute/FileTime;->instant:Ljava/time/Instant;
-Ljava/nio/file/attribute/FileTime;->MAX_SECOND:J
-Ljava/nio/file/attribute/FileTime;->MICROS_PER_SECOND:J
-Ljava/nio/file/attribute/FileTime;->MILLIS_PER_SECOND:J
-Ljava/nio/file/attribute/FileTime;->MINUTES_PER_HOUR:J
-Ljava/nio/file/attribute/FileTime;->MIN_SECOND:J
-Ljava/nio/file/attribute/FileTime;->NANOS_PER_MICRO:I
-Ljava/nio/file/attribute/FileTime;->NANOS_PER_MILLI:I
-Ljava/nio/file/attribute/FileTime;->NANOS_PER_SECOND:J
-Ljava/nio/file/attribute/FileTime;->scale(JJJ)J
-Ljava/nio/file/attribute/FileTime;->SECONDS_0000_TO_1970:J
-Ljava/nio/file/attribute/FileTime;->SECONDS_PER_10000_YEARS:J
-Ljava/nio/file/attribute/FileTime;->SECONDS_PER_DAY:J
-Ljava/nio/file/attribute/FileTime;->SECONDS_PER_HOUR:J
-Ljava/nio/file/attribute/FileTime;->SECONDS_PER_MINUTE:J
-Ljava/nio/file/attribute/FileTime;->toDays()J
-Ljava/nio/file/attribute/FileTime;->toExcessNanos(J)J
-Ljava/nio/file/attribute/FileTime;->unit:Ljava/util/concurrent/TimeUnit;
-Ljava/nio/file/attribute/FileTime;->value:J
-Ljava/nio/file/attribute/FileTime;->valueAsString:Ljava/lang/String;
-Ljava/nio/file/attribute/PosixFilePermissions;-><init>()V
-Ljava/nio/file/attribute/PosixFilePermissions;->isR(C)Z
-Ljava/nio/file/attribute/PosixFilePermissions;->isSet(CC)Z
-Ljava/nio/file/attribute/PosixFilePermissions;->isW(C)Z
-Ljava/nio/file/attribute/PosixFilePermissions;->isX(C)Z
-Ljava/nio/file/attribute/PosixFilePermissions;->writeBits(Ljava/lang/StringBuilder;ZZZ)V
-Ljava/nio/file/attribute/UserPrincipalNotFoundException;->name:Ljava/lang/String;
-Ljava/nio/file/Files$AcceptAllFilter;-><init>()V
-Ljava/nio/file/Files$AcceptAllFilter;->accept(Ljava/nio/file/Path;)Z
-Ljava/nio/file/Files$AcceptAllFilter;->FILTER:Ljava/nio/file/Files$AcceptAllFilter;
-Ljava/nio/file/Files$FileTypeDetectors;-><init>()V
-Ljava/nio/file/Files$FileTypeDetectors;->createDefaultFileTypeDetector()Ljava/nio/file/spi/FileTypeDetector;
-Ljava/nio/file/Files$FileTypeDetectors;->defaultFileTypeDetector:Ljava/nio/file/spi/FileTypeDetector;
-Ljava/nio/file/Files$FileTypeDetectors;->installeDetectors:Ljava/util/List;
-Ljava/nio/file/Files$FileTypeDetectors;->loadInstalledDetectors()Ljava/util/List;
-Ljava/nio/file/Files;-><init>()V
-Ljava/nio/file/Files;->asUncheckedRunnable(Ljava/io/Closeable;)Ljava/lang/Runnable;
-Ljava/nio/file/Files;->BUFFER_SIZE:I
-Ljava/nio/file/Files;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;)J
-Ljava/nio/file/Files;->MAX_BUFFER_SIZE:I
-Ljava/nio/file/Files;->provider(Ljava/nio/file/Path;)Ljava/nio/file/spi/FileSystemProvider;
-Ljava/nio/file/Files;->read(Ljava/io/InputStream;I)[B
-Ljava/nio/file/FileSystemException;->file:Ljava/lang/String;
-Ljava/nio/file/FileSystemException;->other:Ljava/lang/String;
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder;-><init>()V
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder;->defaultFileSystem()Ljava/nio/file/FileSystem;
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder;->defaultFileSystem:Ljava/nio/file/FileSystem;
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder;->getDefaultProvider()Ljava/nio/file/spi/FileSystemProvider;
-Ljava/nio/file/FileSystems;-><init>()V
-Ljava/nio/file/InvalidPathException;->index:I
-Ljava/nio/file/InvalidPathException;->input:Ljava/lang/String;
-Ljava/nio/file/LinkPermission;->checkName(Ljava/lang/String;)V
-Ljava/nio/file/Paths;-><init>()V
-Ljava/nio/file/spi/FileSystemProvider;-><init>(Ljava/lang/Void;)V
-Ljava/nio/file/spi/FileSystemProvider;->checkPermission()Ljava/lang/Void;
-Ljava/nio/file/spi/FileSystemProvider;->installedProviders:Ljava/util/List;
-Ljava/nio/file/spi/FileSystemProvider;->loadingProviders:Z
-Ljava/nio/file/spi/FileSystemProvider;->loadInstalledProviders()Ljava/util/List;
-Ljava/nio/file/spi/FileSystemProvider;->lock:Ljava/lang/Object;
-Ljava/nio/file/spi/FileTypeDetector;-><init>(Ljava/lang/Void;)V
-Ljava/nio/file/spi/FileTypeDetector;->checkPermission()Ljava/lang/Void;
-Ljava/nio/file/StandardWatchEventKinds$StdWatchEventKind;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
-Ljava/nio/file/StandardWatchEventKinds$StdWatchEventKind;->name:Ljava/lang/String;
-Ljava/nio/file/StandardWatchEventKinds$StdWatchEventKind;->type:Ljava/lang/Class;
-Ljava/nio/file/StandardWatchEventKinds;-><init>()V
-Ljava/nio/FloatBuffer;-><init>(IIII)V
-Ljava/nio/FloatBuffer;-><init>(IIII[FI)V
-Ljava/nio/FloatBuffer;->compare(FF)I
-Ljava/nio/FloatBuffer;->equals(FF)Z
-Ljava/nio/FloatBuffer;->hb:[F
-Ljava/nio/FloatBuffer;->isReadOnly:Z
-Ljava/nio/FloatBuffer;->offset:I
-Ljava/nio/IntBuffer;-><init>(IIII)V
-Ljava/nio/IntBuffer;-><init>(IIII[II)V
-Ljava/nio/IntBuffer;->compare(II)I
-Ljava/nio/IntBuffer;->equals(II)Z
-Ljava/nio/IntBuffer;->hb:[I
-Ljava/nio/IntBuffer;->isReadOnly:Z
-Ljava/nio/IntBuffer;->offset:I
-Ljava/nio/LongBuffer;-><init>(IIII)V
-Ljava/nio/LongBuffer;-><init>(IIII[JI)V
-Ljava/nio/LongBuffer;->compare(JJ)I
-Ljava/nio/LongBuffer;->equals(JJ)Z
-Ljava/nio/LongBuffer;->hb:[J
-Ljava/nio/LongBuffer;->isReadOnly:Z
-Ljava/nio/LongBuffer;->offset:I
-Ljava/nio/MappedByteBuffer;-><init>(IIII)V
-Ljava/nio/MappedByteBuffer;-><init>(IIIILjava/io/FileDescriptor;)V
-Ljava/nio/MappedByteBuffer;-><init>(IIII[BI)V
-Ljava/nio/MappedByteBuffer;->checkMapped()V
-Ljava/nio/MappedByteBuffer;->fd:Ljava/io/FileDescriptor;
-Ljava/nio/MappedByteBuffer;->force0(Ljava/io/FileDescriptor;JJ)V
-Ljava/nio/MappedByteBuffer;->isLoaded0(JJI)Z
-Ljava/nio/MappedByteBuffer;->load0(JJ)V
-Ljava/nio/MappedByteBuffer;->mappingAddress(J)J
-Ljava/nio/MappedByteBuffer;->mappingLength(J)J
-Ljava/nio/MappedByteBuffer;->mappingOffset()J
-Ljava/nio/MappedByteBuffer;->unused:B
-Ljava/nio/NIOAccess;-><init>()V
-Ljava/nio/NioUtils;-><init>()V
-Ljava/nio/NioUtils;->getFD(Ljava/nio/channels/FileChannel;)Ljava/io/FileDescriptor;
-Ljava/nio/NioUtils;->newFileChannel(Ljava/io/Closeable;Ljava/io/FileDescriptor;I)Ljava/nio/channels/FileChannel;
-Ljava/nio/ShortBuffer;-><init>(IIII)V
-Ljava/nio/ShortBuffer;-><init>(IIII[SI)V
-Ljava/nio/ShortBuffer;->compare(SS)I
-Ljava/nio/ShortBuffer;->equals(SS)Z
-Ljava/nio/ShortBuffer;->hb:[S
-Ljava/nio/ShortBuffer;->isReadOnly:Z
-Ljava/nio/ShortBuffer;->offset:I
-Ljava/security/AccessControlException;->perm:Ljava/security/Permission;
-Ljava/security/AccessController;-><init>()V
-Ljava/security/AlgorithmParameterGenerator;->algorithm:Ljava/lang/String;
-Ljava/security/AlgorithmParameterGenerator;->paramGenSpi:Ljava/security/AlgorithmParameterGeneratorSpi;
-Ljava/security/AlgorithmParameterGenerator;->provider:Ljava/security/Provider;
-Ljava/security/AlgorithmParameters;->algorithm:Ljava/lang/String;
-Ljava/security/AlgorithmParameters;->initialized:Z
-Ljava/security/AlgorithmParameters;->paramSpi:Ljava/security/AlgorithmParametersSpi;
-Ljava/security/AlgorithmParameters;->provider:Ljava/security/Provider;
-Ljava/security/cert/Certificate$CertificateRep;->data:[B
-Ljava/security/cert/Certificate$CertificateRep;->type:Ljava/lang/String;
-Ljava/security/cert/Certificate;->hash:I
-Ljava/security/cert/Certificate;->type:Ljava/lang/String;
-Ljava/security/cert/CertificateFactory;->certFacSpi:Ljava/security/cert/CertificateFactorySpi;
-Ljava/security/cert/CertificateFactory;->provider:Ljava/security/Provider;
-Ljava/security/cert/CertificateFactory;->type:Ljava/lang/String;
-Ljava/security/cert/CertificateRevokedException;->authority:Ljavax/security/auth/x500/X500Principal;
-Ljava/security/cert/CertificateRevokedException;->extensions:Ljava/util/Map;
-Ljava/security/cert/CertificateRevokedException;->reason:Ljava/security/cert/CRLReason;
-Ljava/security/cert/CertificateRevokedException;->revocationDate:Ljava/util/Date;
-Ljava/security/cert/CertPath$CertPathRep;->data:[B
-Ljava/security/cert/CertPath$CertPathRep;->type:Ljava/lang/String;
-Ljava/security/cert/CertPath;->type:Ljava/lang/String;
-Ljava/security/cert/CertPathBuilder;->algorithm:Ljava/lang/String;
-Ljava/security/cert/CertPathBuilder;->builderSpi:Ljava/security/cert/CertPathBuilderSpi;
-Ljava/security/cert/CertPathBuilder;->CPB_TYPE:Ljava/lang/String;
-Ljava/security/cert/CertPathBuilder;->provider:Ljava/security/Provider;
-Ljava/security/cert/CertPathValidator;->algorithm:Ljava/lang/String;
-Ljava/security/cert/CertPathValidator;->CPV_TYPE:Ljava/lang/String;
-Ljava/security/cert/CertPathValidator;->provider:Ljava/security/Provider;
-Ljava/security/cert/CertPathValidator;->validatorSpi:Ljava/security/cert/CertPathValidatorSpi;
-Ljava/security/cert/CertPathValidatorException;->certPath:Ljava/security/cert/CertPath;
-Ljava/security/cert/CertPathValidatorException;->index:I
-Ljava/security/cert/CertPathValidatorException;->reason:Ljava/security/cert/CertPathValidatorException$Reason;
-Ljava/security/cert/CertStore;->CERTSTORE_TYPE:Ljava/lang/String;
-Ljava/security/cert/CertStore;->handleException(Ljava/security/NoSuchAlgorithmException;)Ljava/security/cert/CertStore;
-Ljava/security/cert/CertStore;->params:Ljava/security/cert/CertStoreParameters;
-Ljava/security/cert/CertStore;->provider:Ljava/security/Provider;
-Ljava/security/cert/CertStore;->storeSpi:Ljava/security/cert/CertStoreSpi;
-Ljava/security/cert/CertStore;->type:Ljava/lang/String;
-Ljava/security/cert/CollectionCertStoreParameters;->coll:Ljava/util/Collection;
-Ljava/security/cert/CRL;->type:Ljava/lang/String;
-Ljava/security/cert/LDAPCertStoreParameters;->LDAP_DEFAULT_PORT:I
-Ljava/security/cert/LDAPCertStoreParameters;->port:I
-Ljava/security/cert/LDAPCertStoreParameters;->serverName:Ljava/lang/String;
-Ljava/security/cert/PKIXBuilderParameters;->maxPathLength:I
-Ljava/security/cert/PKIXCertPathBuilderResult;->certPath:Ljava/security/cert/CertPath;
-Ljava/security/cert/PKIXCertPathValidatorResult;->policyTree:Ljava/security/cert/PolicyNode;
-Ljava/security/cert/PKIXCertPathValidatorResult;->subjectPublicKey:Ljava/security/PublicKey;
-Ljava/security/cert/PKIXCertPathValidatorResult;->trustAnchor:Ljava/security/cert/TrustAnchor;
-Ljava/security/cert/PKIXParameters;->anyPolicyInhibited:Z
-Ljava/security/cert/PKIXParameters;->certPathCheckers:Ljava/util/List;
-Ljava/security/cert/PKIXParameters;->certSelector:Ljava/security/cert/CertSelector;
-Ljava/security/cert/PKIXParameters;->certStores:Ljava/util/List;
-Ljava/security/cert/PKIXParameters;->date:Ljava/util/Date;
-Ljava/security/cert/PKIXParameters;->explicitPolicyRequired:Z
-Ljava/security/cert/PKIXParameters;->policyMappingInhibited:Z
-Ljava/security/cert/PKIXParameters;->policyQualifiersRejected:Z
-Ljava/security/cert/PKIXParameters;->revocationEnabled:Z
-Ljava/security/cert/PKIXParameters;->sigProvider:Ljava/lang/String;
-Ljava/security/cert/PKIXParameters;->unmodInitialPolicies:Ljava/util/Set;
-Ljava/security/cert/PKIXParameters;->unmodTrustAnchors:Ljava/util/Set;
-Ljava/security/cert/PKIXRevocationChecker;->ocspExtensions:Ljava/util/List;
-Ljava/security/cert/PKIXRevocationChecker;->ocspResponder:Ljava/net/URI;
-Ljava/security/cert/PKIXRevocationChecker;->ocspResponderCert:Ljava/security/cert/X509Certificate;
-Ljava/security/cert/PKIXRevocationChecker;->ocspResponses:Ljava/util/Map;
-Ljava/security/cert/PKIXRevocationChecker;->options:Ljava/util/Set;
-Ljava/security/cert/PolicyQualifierInfo;->mData:[B
-Ljava/security/cert/PolicyQualifierInfo;->mEncoded:[B
-Ljava/security/cert/PolicyQualifierInfo;->mId:Ljava/lang/String;
-Ljava/security/cert/PolicyQualifierInfo;->pqiString:Ljava/lang/String;
-Ljava/security/cert/TrustAnchor;->caName:Ljava/lang/String;
-Ljava/security/cert/TrustAnchor;->caPrincipal:Ljavax/security/auth/x500/X500Principal;
-Ljava/security/cert/TrustAnchor;->nc:Lsun/security/x509/NameConstraintsExtension;
-Ljava/security/cert/TrustAnchor;->ncBytes:[B
-Ljava/security/cert/TrustAnchor;->pubKey:Ljava/security/PublicKey;
-Ljava/security/cert/TrustAnchor;->setNameConstraints([B)V
-Ljava/security/cert/TrustAnchor;->trustedCert:Ljava/security/cert/X509Certificate;
-Ljava/security/cert/X509Certificate;->issuerX500Principal:Ljavax/security/auth/x500/X500Principal;
-Ljava/security/cert/X509Certificate;->subjectX500Principal:Ljavax/security/auth/x500/X500Principal;
-Ljava/security/cert/X509CertSelector;->addPathToNameInternal(ILjava/lang/Object;)V
-Ljava/security/cert/X509CertSelector;->addSubjectAlternativeNameInternal(ILjava/lang/Object;)V
-Ljava/security/cert/X509CertSelector;->ANY_EXTENDED_KEY_USAGE:Lsun/security/util/ObjectIdentifier;
-Ljava/security/cert/X509CertSelector;->authorityKeyID:[B
-Ljava/security/cert/X509CertSelector;->basicConstraints:I
-Ljava/security/cert/X509CertSelector;->certificateValid:Ljava/util/Date;
-Ljava/security/cert/X509CertSelector;->CERT_POLICIES_ID:I
-Ljava/security/cert/X509CertSelector;->cloneAndCheckNames(Ljava/util/Collection;)Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->cloneNames(Ljava/util/Collection;)Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->cloneSet(Ljava/util/Set;)Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->debug:Lsun/security/util/Debug;
-Ljava/security/cert/X509CertSelector;->equalNames(Ljava/util/Collection;Ljava/util/Collection;)Z
-Ljava/security/cert/X509CertSelector;->EXTENDED_KEY_USAGE_ID:I
-Ljava/security/cert/X509CertSelector;->EXTENSION_OIDS:[Ljava/lang/String;
-Ljava/security/cert/X509CertSelector;->FALSE:Ljava/lang/Boolean;
-Ljava/security/cert/X509CertSelector;->getExtensionObject(Ljava/security/cert/X509Certificate;I)Ljava/security/cert/Extension;
-Ljava/security/cert/X509CertSelector;->issuer:Ljavax/security/auth/x500/X500Principal;
-Ljava/security/cert/X509CertSelector;->keyPurposeOIDSet:Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->keyPurposeSet:Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->keyUsage:[Z
-Ljava/security/cert/X509CertSelector;->keyUsageToString([Z)Ljava/lang/String;
-Ljava/security/cert/X509CertSelector;->makeGeneralNameInterface(ILjava/lang/Object;)Lsun/security/x509/GeneralNameInterface;
-Ljava/security/cert/X509CertSelector;->matchAllSubjectAltNames:Z
-Ljava/security/cert/X509CertSelector;->matchAuthorityKeyID(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchBasicConstraints(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchExcluded(Lsun/security/x509/GeneralSubtrees;)Z
-Ljava/security/cert/X509CertSelector;->matchExtendedKeyUsage(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchKeyUsage(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchNameConstraints(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchPathToNames(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchPermitted(Lsun/security/x509/GeneralSubtrees;)Z
-Ljava/security/cert/X509CertSelector;->matchPolicy(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchPrivateKeyValid(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchSubjectAlternativeNames(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchSubjectKeyID(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->matchSubjectPublicKeyAlgID(Ljava/security/cert/X509Certificate;)Z
-Ljava/security/cert/X509CertSelector;->NAME_ANY:I
-Ljava/security/cert/X509CertSelector;->NAME_CONSTRAINTS_ID:I
-Ljava/security/cert/X509CertSelector;->NAME_DIRECTORY:I
-Ljava/security/cert/X509CertSelector;->NAME_DNS:I
-Ljava/security/cert/X509CertSelector;->NAME_EDI:I
-Ljava/security/cert/X509CertSelector;->NAME_IP:I
-Ljava/security/cert/X509CertSelector;->NAME_OID:I
-Ljava/security/cert/X509CertSelector;->NAME_RFC822:I
-Ljava/security/cert/X509CertSelector;->NAME_URI:I
-Ljava/security/cert/X509CertSelector;->NAME_X400:I
-Ljava/security/cert/X509CertSelector;->nc:Lsun/security/x509/NameConstraintsExtension;
-Ljava/security/cert/X509CertSelector;->ncBytes:[B
-Ljava/security/cert/X509CertSelector;->NUM_OF_EXTENSIONS:I
-Ljava/security/cert/X509CertSelector;->parseNames(Ljava/util/Collection;)Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->pathToGeneralNames:Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->pathToNames:Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->policy:Lsun/security/x509/CertificatePolicySet;
-Ljava/security/cert/X509CertSelector;->policySet:Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->privateKeyValid:Ljava/util/Date;
-Ljava/security/cert/X509CertSelector;->PRIVATE_KEY_USAGE_ID:I
-Ljava/security/cert/X509CertSelector;->serialNumber:Ljava/math/BigInteger;
-Ljava/security/cert/X509CertSelector;->setPathToNamesInternal(Ljava/util/Set;)V
-Ljava/security/cert/X509CertSelector;->subject:Ljavax/security/auth/x500/X500Principal;
-Ljava/security/cert/X509CertSelector;->subjectAlternativeGeneralNames:Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->subjectAlternativeNames:Ljava/util/Set;
-Ljava/security/cert/X509CertSelector;->subjectKeyID:[B
-Ljava/security/cert/X509CertSelector;->subjectPublicKey:Ljava/security/PublicKey;
-Ljava/security/cert/X509CertSelector;->subjectPublicKeyAlgID:Lsun/security/util/ObjectIdentifier;
-Ljava/security/cert/X509CertSelector;->subjectPublicKeyBytes:[B
-Ljava/security/cert/X509CertSelector;->SUBJECT_ALT_NAME_ID:I
-Ljava/security/cert/X509CertSelector;->x509Cert:Ljava/security/cert/X509Certificate;
-Ljava/security/cert/X509CRL;->issuerPrincipal:Ljavax/security/auth/x500/X500Principal;
-Ljava/security/cert/X509CRLSelector;->addIssuerNameInternal(Ljava/lang/Object;Ljavax/security/auth/x500/X500Principal;)V
-Ljava/security/cert/X509CRLSelector;->certChecking:Ljava/security/cert/X509Certificate;
-Ljava/security/cert/X509CRLSelector;->cloneAndCheckIssuerNames(Ljava/util/Collection;)Ljava/util/HashSet;
-Ljava/security/cert/X509CRLSelector;->cloneIssuerNames(Ljava/util/Collection;)Ljava/util/HashSet;
-Ljava/security/cert/X509CRLSelector;->dateAndTime:Ljava/util/Date;
-Ljava/security/cert/X509CRLSelector;->debug:Lsun/security/util/Debug;
-Ljava/security/cert/X509CRLSelector;->issuerNames:Ljava/util/HashSet;
-Ljava/security/cert/X509CRLSelector;->issuerX500Principals:Ljava/util/HashSet;
-Ljava/security/cert/X509CRLSelector;->maxCRL:Ljava/math/BigInteger;
-Ljava/security/cert/X509CRLSelector;->minCRL:Ljava/math/BigInteger;
-Ljava/security/cert/X509CRLSelector;->parseIssuerNames(Ljava/util/Collection;)Ljava/util/HashSet;
-Ljava/security/cert/X509CRLSelector;->setDateAndTime(Ljava/util/Date;J)V
-Ljava/security/cert/X509CRLSelector;->skew:J
-Ljava/security/CodeSigner;->myhash:I
-Ljava/security/CodeSigner;->signerCertPath:Ljava/security/cert/CertPath;
-Ljava/security/CodeSigner;->timestamp:Ljava/security/Timestamp;
-Ljava/security/CodeSource;->location:Ljava/net/URL;
-Ljava/security/DigestInputStream;->on:Z
-Ljava/security/DigestOutputStream;->on:Z
-Ljava/security/DomainLoadStoreParameter;->configuration:Ljava/net/URI;
-Ljava/security/DomainLoadStoreParameter;->protectionParams:Ljava/util/Map;
-Ljava/security/GuardedObject;->guard:Ljava/security/Guard;
-Ljava/security/GuardedObject;->object:Ljava/lang/Object;
-Ljava/security/Identity;->certificates:Ljava/util/Vector;
-Ljava/security/Identity;->check(Ljava/lang/String;)V
-Ljava/security/Identity;->fullName()Ljava/lang/String;
-Ljava/security/Identity;->info:Ljava/lang/String;
-Ljava/security/Identity;->keyEquals(Ljava/security/PublicKey;Ljava/security/PublicKey;)Z
-Ljava/security/Identity;->name:Ljava/lang/String;
-Ljava/security/Identity;->printCertificates()Ljava/lang/String;
-Ljava/security/Identity;->printKeys()Ljava/lang/String;
-Ljava/security/Identity;->publicKey:Ljava/security/PublicKey;
-Ljava/security/Identity;->scope:Ljava/security/IdentityScope;
-Ljava/security/IdentityScope;->check(Ljava/lang/String;)V
-Ljava/security/IdentityScope;->initializeSystemScope()V
-Ljava/security/IdentityScope;->scope:Ljava/security/IdentityScope;
-Ljava/security/KeyFactory;-><init>(Ljava/lang/String;)V
-Ljava/security/KeyFactory;->algorithm:Ljava/lang/String;
-Ljava/security/KeyFactory;->debug:Lsun/security/util/Debug;
-Ljava/security/KeyFactory;->lock:Ljava/lang/Object;
-Ljava/security/KeyFactory;->nextSpi(Ljava/security/KeyFactorySpi;)Ljava/security/KeyFactorySpi;
-Ljava/security/KeyFactory;->provider:Ljava/security/Provider;
-Ljava/security/KeyFactory;->serviceIterator:Ljava/util/Iterator;
-Ljava/security/KeyFactory;->spi:Ljava/security/KeyFactorySpi;
-Ljava/security/KeyPair;->privateKey:Ljava/security/PrivateKey;
-Ljava/security/KeyPair;->publicKey:Ljava/security/PublicKey;
-Ljava/security/KeyPairGenerator$Delegate;-><init>(Ljava/security/KeyPairGeneratorSpi;Ljava/lang/String;)V
-Ljava/security/KeyPairGenerator$Delegate;-><init>(Lsun/security/jca/GetInstance$Instance;Ljava/util/Iterator;Ljava/lang/String;)V
-Ljava/security/KeyPairGenerator$Delegate;->disableFailover()V
-Ljava/security/KeyPairGenerator$Delegate;->initKeySize:I
-Ljava/security/KeyPairGenerator$Delegate;->initParams:Ljava/security/spec/AlgorithmParameterSpec;
-Ljava/security/KeyPairGenerator$Delegate;->initRandom:Ljava/security/SecureRandom;
-Ljava/security/KeyPairGenerator$Delegate;->initType:I
-Ljava/security/KeyPairGenerator$Delegate;->I_NONE:I
-Ljava/security/KeyPairGenerator$Delegate;->I_PARAMS:I
-Ljava/security/KeyPairGenerator$Delegate;->I_SIZE:I
-Ljava/security/KeyPairGenerator$Delegate;->lock:Ljava/lang/Object;
-Ljava/security/KeyPairGenerator$Delegate;->nextSpi(Ljava/security/KeyPairGeneratorSpi;Z)Ljava/security/KeyPairGeneratorSpi;
-Ljava/security/KeyPairGenerator$Delegate;->serviceIterator:Ljava/util/Iterator;
-Ljava/security/KeyPairGenerator$Delegate;->spi:Ljava/security/KeyPairGeneratorSpi;
-Ljava/security/KeyPairGenerator;->algorithm:Ljava/lang/String;
-Ljava/security/KeyPairGenerator;->disableFailover()V
-Ljava/security/KeyPairGenerator;->provider:Ljava/security/Provider;
-Ljava/security/KeyRep;->algorithm:Ljava/lang/String;
-Ljava/security/KeyRep;->encoded:[B
-Ljava/security/KeyRep;->format:Ljava/lang/String;
-Ljava/security/KeyRep;->PKCS8:Ljava/lang/String;
-Ljava/security/KeyRep;->RAW:Ljava/lang/String;
-Ljava/security/KeyRep;->type:Ljava/security/KeyRep$Type;
-Ljava/security/KeyRep;->X509:Ljava/lang/String;
-Ljava/security/KeyStore$Builder$FileBuilder;-><init>(Ljava/lang/String;Ljava/security/Provider;Ljava/io/File;Ljava/security/KeyStore$ProtectionParameter;Ljava/security/AccessControlContext;)V
-Ljava/security/KeyStore$Builder$FileBuilder;->context:Ljava/security/AccessControlContext;
-Ljava/security/KeyStore$Builder$FileBuilder;->file:Ljava/io/File;
-Ljava/security/KeyStore$Builder$FileBuilder;->keyProtection:Ljava/security/KeyStore$ProtectionParameter;
-Ljava/security/KeyStore$Builder$FileBuilder;->keyStore:Ljava/security/KeyStore;
-Ljava/security/KeyStore$Builder$FileBuilder;->oldException:Ljava/lang/Throwable;
-Ljava/security/KeyStore$Builder$FileBuilder;->protection:Ljava/security/KeyStore$ProtectionParameter;
-Ljava/security/KeyStore$Builder$FileBuilder;->provider:Ljava/security/Provider;
-Ljava/security/KeyStore$Builder$FileBuilder;->type:Ljava/lang/String;
-Ljava/security/KeyStore$Builder;->MAX_CALLBACK_TRIES:I
-Ljava/security/KeyStore$CallbackHandlerProtection;->handler:Ljavax/security/auth/callback/CallbackHandler;
-Ljava/security/KeyStore$PasswordProtection;->destroyed:Z
-Ljava/security/KeyStore$PasswordProtection;->password:[C
-Ljava/security/KeyStore$PasswordProtection;->protectionAlgorithm:Ljava/lang/String;
-Ljava/security/KeyStore$PasswordProtection;->protectionParameters:Ljava/security/spec/AlgorithmParameterSpec;
-Ljava/security/KeyStore$PrivateKeyEntry;->attributes:Ljava/util/Set;
-Ljava/security/KeyStore$PrivateKeyEntry;->chain:[Ljava/security/cert/Certificate;
-Ljava/security/KeyStore$PrivateKeyEntry;->privKey:Ljava/security/PrivateKey;
-Ljava/security/KeyStore$SecretKeyEntry;->attributes:Ljava/util/Set;
-Ljava/security/KeyStore$SecretKeyEntry;->sKey:Ljavax/crypto/SecretKey;
-Ljava/security/KeyStore$SimpleLoadStoreParameter;-><init>(Ljava/security/KeyStore$ProtectionParameter;)V
-Ljava/security/KeyStore$SimpleLoadStoreParameter;->protection:Ljava/security/KeyStore$ProtectionParameter;
-Ljava/security/KeyStore$TrustedCertificateEntry;->attributes:Ljava/util/Set;
-Ljava/security/KeyStore$TrustedCertificateEntry;->cert:Ljava/security/cert/Certificate;
-Ljava/security/KeyStore;->initialized:Z
-Ljava/security/KeyStore;->KEYSTORE_TYPE:Ljava/lang/String;
-Ljava/security/KeyStore;->provider:Ljava/security/Provider;
-Ljava/security/KeyStore;->type:Ljava/lang/String;
-Ljava/security/MessageDigest$Delegate;-><init>(Ljava/security/MessageDigestSpi;Ljava/lang/String;)V
-Ljava/security/MessageDigest$Delegate;->digestSpi:Ljava/security/MessageDigestSpi;
-Ljava/security/MessageDigest;->algorithm:Ljava/lang/String;
-Ljava/security/MessageDigest;->INITIAL:I
-Ljava/security/MessageDigest;->IN_PROGRESS:I
-Ljava/security/MessageDigest;->provider:Ljava/security/Provider;
-Ljava/security/MessageDigest;->state:I
-Ljava/security/MessageDigestSpi;->tempArray:[B
-Ljava/security/Permission;->name:Ljava/lang/String;
-Ljava/security/PKCS12Attribute;->COLON_SEPARATED_HEX_PAIRS:Ljava/util/regex/Pattern;
-Ljava/security/PKCS12Attribute;->encode(Lsun/security/util/ObjectIdentifier;[Ljava/lang/String;)[B
-Ljava/security/PKCS12Attribute;->encoded:[B
-Ljava/security/PKCS12Attribute;->hashValue:I
-Ljava/security/PKCS12Attribute;->name:Ljava/lang/String;
-Ljava/security/PKCS12Attribute;->parse([B)V
-Ljava/security/PKCS12Attribute;->value:Ljava/lang/String;
-Ljava/security/Policy$UnsupportedEmptyCollection;-><init>()V
-Ljava/security/PrivilegedActionException;->exception:Ljava/lang/Exception;
-Ljava/security/Provider$EngineDescription;-><init>(Ljava/lang/String;ZLjava/lang/String;)V
-Ljava/security/Provider$EngineDescription;->constructorParameterClass:Ljava/lang/Class;
-Ljava/security/Provider$EngineDescription;->constructorParameterClassName:Ljava/lang/String;
-Ljava/security/Provider$EngineDescription;->getConstructorParameterClass()Ljava/lang/Class;
-Ljava/security/Provider$EngineDescription;->name:Ljava/lang/String;
-Ljava/security/Provider$EngineDescription;->supportsParameter:Z
-Ljava/security/Provider$Service;-><init>(Ljava/security/Provider;)V
-Ljava/security/Provider$Service;->addAlias(Ljava/lang/String;)V
-Ljava/security/Provider$Service;->addAttribute(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/security/Provider$Service;->algorithm:Ljava/lang/String;
-Ljava/security/Provider$Service;->aliases:Ljava/util/List;
-Ljava/security/Provider$Service;->attributes:Ljava/util/Map;
-Ljava/security/Provider$Service;->CLASS0:[Ljava/lang/Class;
-Ljava/security/Provider$Service;->className:Ljava/lang/String;
-Ljava/security/Provider$Service;->classRef:Ljava/lang/ref/Reference;
-Ljava/security/Provider$Service;->getAliases()Ljava/util/List;
-Ljava/security/Provider$Service;->getImplClass()Ljava/lang/Class;
-Ljava/security/Provider$Service;->getKeyClass(Ljava/lang/String;)Ljava/lang/Class;
-Ljava/security/Provider$Service;->hasKeyAttributes()Z
-Ljava/security/Provider$Service;->hasKeyAttributes:Ljava/lang/Boolean;
-Ljava/security/Provider$Service;->isValid()Z
-Ljava/security/Provider$Service;->newInstanceGeneric(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/security/Provider$Service;->provider:Ljava/security/Provider;
-Ljava/security/Provider$Service;->registered:Z
-Ljava/security/Provider$Service;->supportedClasses:[Ljava/lang/Class;
-Ljava/security/Provider$Service;->supportedFormats:[Ljava/lang/String;
-Ljava/security/Provider$Service;->supportsKeyClass(Ljava/security/Key;)Z
-Ljava/security/Provider$Service;->supportsKeyFormat(Ljava/security/Key;)Z
-Ljava/security/Provider$Service;->type:Ljava/lang/String;
-Ljava/security/Provider$ServiceKey;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-Ljava/security/Provider$ServiceKey;->algorithm:Ljava/lang/String;
-Ljava/security/Provider$ServiceKey;->matches(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/security/Provider$ServiceKey;->originalAlgorithm:Ljava/lang/String;
-Ljava/security/Provider$ServiceKey;->type:Ljava/lang/String;
-Ljava/security/Provider$UString;-><init>(Ljava/lang/String;)V
-Ljava/security/Provider$UString;->lowerString:Ljava/lang/String;
-Ljava/security/Provider$UString;->string:Ljava/lang/String;
-Ljava/security/Provider;->addEngine(Ljava/lang/String;ZLjava/lang/String;)V
-Ljava/security/Provider;->ALIAS_LENGTH:I
-Ljava/security/Provider;->ALIAS_PREFIX:Ljava/lang/String;
-Ljava/security/Provider;->ALIAS_PREFIX_LOWER:Ljava/lang/String;
-Ljava/security/Provider;->check(Ljava/lang/String;)V
-Ljava/security/Provider;->checkInitialized()V
-Ljava/security/Provider;->checkLegacy(Ljava/lang/Object;)Z
-Ljava/security/Provider;->debug:Lsun/security/util/Debug;
-Ljava/security/Provider;->ensureLegacyParsed()V
-Ljava/security/Provider;->entrySet:Ljava/util/Set;
-Ljava/security/Provider;->entrySetCallCount:I
-Ljava/security/Provider;->getEngineName(Ljava/lang/String;)Ljava/lang/String;
-Ljava/security/Provider;->getTypeAndAlgorithm(Ljava/lang/String;)[Ljava/lang/String;
-Ljava/security/Provider;->implClear()V
-Ljava/security/Provider;->implCompute(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
-Ljava/security/Provider;->implComputeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
-Ljava/security/Provider;->implComputeIfPresent(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
-Ljava/security/Provider;->implMerge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
-Ljava/security/Provider;->implPut(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/security/Provider;->implPutAll(Ljava/util/Map;)V
-Ljava/security/Provider;->implPutIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/security/Provider;->implRemove(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/security/Provider;->implRemove(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/security/Provider;->implRemoveService(Ljava/security/Provider$Service;)V
-Ljava/security/Provider;->implReplace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/security/Provider;->implReplace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/security/Provider;->implReplaceAll(Ljava/util/function/BiFunction;)V
-Ljava/security/Provider;->info:Ljava/lang/String;
-Ljava/security/Provider;->initialized:Z
-Ljava/security/Provider;->isRegistered()Z
-Ljava/security/Provider;->knownEngines:Ljava/util/Map;
-Ljava/security/Provider;->legacyChanged:Z
-Ljava/security/Provider;->legacyMap:Ljava/util/Map;
-Ljava/security/Provider;->legacyStrings:Ljava/util/Map;
-Ljava/security/Provider;->name:Ljava/lang/String;
-Ljava/security/Provider;->parseLegacyPut(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/security/Provider;->previousKey:Ljava/security/Provider$ServiceKey;
-Ljava/security/Provider;->putId()V
-Ljava/security/Provider;->putPropertyStrings(Ljava/security/Provider$Service;)V
-Ljava/security/Provider;->registered:Z
-Ljava/security/Provider;->removeInvalidServices(Ljava/util/Map;)V
-Ljava/security/Provider;->removePropertyStrings(Ljava/security/Provider$Service;)V
-Ljava/security/Provider;->serviceMap:Ljava/util/Map;
-Ljava/security/Provider;->servicesChanged:Z
-Ljava/security/Provider;->serviceSet:Ljava/util/Set;
-Ljava/security/Provider;->setRegistered()V
-Ljava/security/Provider;->setUnregistered()V
-Ljava/security/Provider;->version:D
-Ljava/security/Provider;->warmUpServiceProvision()V
-Ljava/security/SecureClassLoader;->check()V
-Ljava/security/SecureClassLoader;->debug:Lsun/security/util/Debug;
-Ljava/security/SecureClassLoader;->getProtectionDomain(Ljava/security/CodeSource;)Ljava/security/ProtectionDomain;
-Ljava/security/SecureClassLoader;->initialized:Z
-Ljava/security/SecureClassLoader;->pdcache:Ljava/util/HashMap;
-Ljava/security/SecureRandom$StrongPatternHolder;-><init>()V
-Ljava/security/SecureRandom$StrongPatternHolder;->pattern:Ljava/util/regex/Pattern;
-Ljava/security/SecureRandom;-><init>(Ljava/security/SecureRandomSpi;Ljava/security/Provider;Ljava/lang/String;)V
-Ljava/security/SecureRandom;->algorithm:Ljava/lang/String;
-Ljava/security/SecureRandom;->counter:J
-Ljava/security/SecureRandom;->digest:Ljava/security/MessageDigest;
-Ljava/security/SecureRandom;->getDefaultPRNG(Z[B)V
-Ljava/security/SecureRandom;->getPrngAlgorithm()Ljava/lang/String;
-Ljava/security/SecureRandom;->getSecureRandomSpi()Ljava/security/SecureRandomSpi;
-Ljava/security/SecureRandom;->longToByteArray(J)[B
-Ljava/security/SecureRandom;->provider:Ljava/security/Provider;
-Ljava/security/SecureRandom;->randomBytes:[B
-Ljava/security/SecureRandom;->randomBytesUsed:I
-Ljava/security/SecureRandom;->secureRandomSpi:Ljava/security/SecureRandomSpi;
-Ljava/security/SecureRandom;->seedGenerator:Ljava/security/SecureRandom;
-Ljava/security/SecureRandom;->state:[B
-Ljava/security/Security$ProviderProperty;-><init>()V
-Ljava/security/Security$ProviderProperty;->className:Ljava/lang/String;
-Ljava/security/Security$ProviderProperty;->provider:Ljava/security/Provider;
-Ljava/security/Security;-><init>()V
-Ljava/security/Security;->getAllQualifyingCandidates(Ljava/lang/String;Ljava/lang/String;[Ljava/security/Provider;)Ljava/util/LinkedHashSet;
-Ljava/security/Security;->getFilterComponents(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
-Ljava/security/Security;->getImpl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/Object;
-Ljava/security/Security;->getImpl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)[Ljava/lang/Object;
-Ljava/security/Security;->getImpl(Ljava/lang/String;Ljava/lang/String;Ljava/security/Provider;)[Ljava/lang/Object;
-Ljava/security/Security;->getImpl(Ljava/lang/String;Ljava/lang/String;Ljava/security/Provider;Ljava/lang/Object;)[Ljava/lang/Object;
-Ljava/security/Security;->getProviderProperty(Ljava/lang/String;)Ljava/security/Security$ProviderProperty;
-Ljava/security/Security;->getProviderProperty(Ljava/lang/String;Ljava/security/Provider;)Ljava/lang/String;
-Ljava/security/Security;->getProvidersNotUsingCache(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/security/Provider;)Ljava/util/LinkedHashSet;
-Ljava/security/Security;->getSpiClass(Ljava/lang/String;)Ljava/lang/Class;
-Ljava/security/Security;->getVersion()I
-Ljava/security/Security;->increaseVersion()V
-Ljava/security/Security;->initializeStatic()V
-Ljava/security/Security;->invalidateSMCache(Ljava/lang/String;)V
-Ljava/security/Security;->isConstraintSatisfied(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/security/Security;->isCriterionSatisfied(Ljava/security/Provider;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/security/Security;->isStandardAttr(Ljava/lang/String;)Z
-Ljava/security/Security;->props:Ljava/util/Properties;
-Ljava/security/Security;->spiMap:Ljava/util/Map;
-Ljava/security/Security;->version:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/security/Signature$CipherAdapter;-><init>(Ljavax/crypto/Cipher;)V
-Ljava/security/Signature$CipherAdapter;->cipher:Ljavax/crypto/Cipher;
-Ljava/security/Signature$CipherAdapter;->data:Ljava/io/ByteArrayOutputStream;
-Ljava/security/Signature$Delegate;-><init>(Ljava/lang/String;)V
-Ljava/security/Signature$Delegate;-><init>(Ljava/security/SignatureSpi;Ljava/lang/String;)V
-Ljava/security/Signature$Delegate;->chooseFirstProvider()V
-Ljava/security/Signature$Delegate;->chooseProvider(ILjava/security/Key;Ljava/security/SecureRandom;)V
-Ljava/security/Signature$Delegate;->getCurrentSpi()Ljava/security/SignatureSpi;
-Ljava/security/Signature$Delegate;->init(Ljava/security/SignatureSpi;ILjava/security/Key;Ljava/security/SecureRandom;)V
-Ljava/security/Signature$Delegate;->I_PRIV:I
-Ljava/security/Signature$Delegate;->I_PRIV_SR:I
-Ljava/security/Signature$Delegate;->I_PUB:I
-Ljava/security/Signature$Delegate;->lock:Ljava/lang/Object;
-Ljava/security/Signature$Delegate;->newInstance(Ljava/security/Provider$Service;)Ljava/security/SignatureSpi;
-Ljava/security/Signature$Delegate;->sigSpi:Ljava/security/SignatureSpi;
-Ljava/security/Signature$Delegate;->warnCount:I
-Ljava/security/Signature;->algorithm:Ljava/lang/String;
-Ljava/security/Signature;->chooseFirstProvider()V
-Ljava/security/Signature;->getCurrentSpi()Ljava/security/SignatureSpi;
-Ljava/security/Signature;->getInstanceRSA(Ljava/security/Provider;)Ljava/security/Signature;
-Ljava/security/Signature;->isSpi(Ljava/security/Provider$Service;)Z
-Ljava/security/Signature;->provider:Ljava/security/Provider;
-Ljava/security/Signature;->rsaIds:Ljava/util/List;
-Ljava/security/Signature;->RSA_CIPHER:Ljava/lang/String;
-Ljava/security/Signature;->RSA_SIGNATURE:Ljava/lang/String;
-Ljava/security/Signature;->signatureInfo:Ljava/util/Map;
-Ljava/security/SignedObject;->content:[B
-Ljava/security/SignedObject;->sign(Ljava/security/PrivateKey;Ljava/security/Signature;)V
-Ljava/security/SignedObject;->signature:[B
-Ljava/security/SignedObject;->thealgorithm:Ljava/lang/String;
-Ljava/security/Signer;->check(Ljava/lang/String;)V
-Ljava/security/Signer;->printKeys()Ljava/lang/String;
-Ljava/security/Signer;->privateKey:Ljava/security/PrivateKey;
-Ljava/security/spec/DSAParameterSpec;->g:Ljava/math/BigInteger;
-Ljava/security/spec/DSAParameterSpec;->p:Ljava/math/BigInteger;
-Ljava/security/spec/DSAParameterSpec;->q:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPrivateKeySpec;->g:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPrivateKeySpec;->p:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPrivateKeySpec;->q:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPrivateKeySpec;->x:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPublicKeySpec;->g:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPublicKeySpec;->p:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPublicKeySpec;->q:Ljava/math/BigInteger;
-Ljava/security/spec/DSAPublicKeySpec;->y:Ljava/math/BigInteger;
-Ljava/security/spec/ECFieldF2m;->ks:[I
-Ljava/security/spec/ECFieldF2m;->m:I
-Ljava/security/spec/ECFieldF2m;->rp:Ljava/math/BigInteger;
-Ljava/security/spec/ECFieldFp;->p:Ljava/math/BigInteger;
-Ljava/security/spec/ECGenParameterSpec;->name:Ljava/lang/String;
-Ljava/security/spec/ECParameterSpec;->curve:Ljava/security/spec/EllipticCurve;
-Ljava/security/spec/ECParameterSpec;->curveName:Ljava/lang/String;
-Ljava/security/spec/ECParameterSpec;->g:Ljava/security/spec/ECPoint;
-Ljava/security/spec/ECParameterSpec;->h:I
-Ljava/security/spec/ECParameterSpec;->n:Ljava/math/BigInteger;
-Ljava/security/spec/ECPoint;-><init>()V
-Ljava/security/spec/ECPoint;->x:Ljava/math/BigInteger;
-Ljava/security/spec/ECPoint;->y:Ljava/math/BigInteger;
-Ljava/security/spec/ECPrivateKeySpec;->params:Ljava/security/spec/ECParameterSpec;
-Ljava/security/spec/ECPrivateKeySpec;->s:Ljava/math/BigInteger;
-Ljava/security/spec/ECPublicKeySpec;->params:Ljava/security/spec/ECParameterSpec;
-Ljava/security/spec/ECPublicKeySpec;->w:Ljava/security/spec/ECPoint;
-Ljava/security/spec/EllipticCurve;->a:Ljava/math/BigInteger;
-Ljava/security/spec/EllipticCurve;->b:Ljava/math/BigInteger;
-Ljava/security/spec/EllipticCurve;->checkValidity(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/lang/String;)V
-Ljava/security/spec/EllipticCurve;->field:Ljava/security/spec/ECField;
-Ljava/security/spec/EllipticCurve;->seed:[B
-Ljava/security/spec/EncodedKeySpec;->encodedKey:[B
-Ljava/security/spec/MGF1ParameterSpec;->mdName:Ljava/lang/String;
-Ljava/security/spec/PSSParameterSpec;-><init>()V
-Ljava/security/spec/PSSParameterSpec;->mdName:Ljava/lang/String;
-Ljava/security/spec/PSSParameterSpec;->mgfName:Ljava/lang/String;
-Ljava/security/spec/PSSParameterSpec;->mgfSpec:Ljava/security/spec/AlgorithmParameterSpec;
-Ljava/security/spec/PSSParameterSpec;->saltLen:I
-Ljava/security/spec/PSSParameterSpec;->trailerField:I
-Ljava/security/spec/RSAKeyGenParameterSpec;->keysize:I
-Ljava/security/spec/RSAKeyGenParameterSpec;->publicExponent:Ljava/math/BigInteger;
-Ljava/security/spec/RSAMultiPrimePrivateCrtKeySpec;->crtCoefficient:Ljava/math/BigInteger;
-Ljava/security/spec/RSAMultiPrimePrivateCrtKeySpec;->otherPrimeInfo:[Ljava/security/spec/RSAOtherPrimeInfo;
-Ljava/security/spec/RSAMultiPrimePrivateCrtKeySpec;->primeExponentP:Ljava/math/BigInteger;
-Ljava/security/spec/RSAMultiPrimePrivateCrtKeySpec;->primeExponentQ:Ljava/math/BigInteger;
-Ljava/security/spec/RSAMultiPrimePrivateCrtKeySpec;->primeP:Ljava/math/BigInteger;
-Ljava/security/spec/RSAMultiPrimePrivateCrtKeySpec;->primeQ:Ljava/math/BigInteger;
-Ljava/security/spec/RSAMultiPrimePrivateCrtKeySpec;->publicExponent:Ljava/math/BigInteger;
-Ljava/security/spec/RSAOtherPrimeInfo;->crtCoefficient:Ljava/math/BigInteger;
-Ljava/security/spec/RSAOtherPrimeInfo;->prime:Ljava/math/BigInteger;
-Ljava/security/spec/RSAOtherPrimeInfo;->primeExponent:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateCrtKeySpec;->crtCoefficient:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateCrtKeySpec;->primeExponentP:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateCrtKeySpec;->primeExponentQ:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateCrtKeySpec;->primeP:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateCrtKeySpec;->primeQ:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateCrtKeySpec;->publicExponent:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateKeySpec;->modulus:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPrivateKeySpec;->privateExponent:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPublicKeySpec;->modulus:Ljava/math/BigInteger;
-Ljava/security/spec/RSAPublicKeySpec;->publicExponent:Ljava/math/BigInteger;
-Ljava/security/Timestamp;->myhash:I
-Ljava/security/Timestamp;->signerCertPath:Ljava/security/cert/CertPath;
-Ljava/security/Timestamp;->timestamp:Ljava/util/Date;
-Ljava/sql/BatchUpdateException;->updateCounts:[I
-Ljava/sql/DataTruncation;->dataSize:I
-Ljava/sql/DataTruncation;->index:I
-Ljava/sql/DataTruncation;->parameter:Z
-Ljava/sql/DataTruncation;->read:Z
-Ljava/sql/DataTruncation;->transferSize:I
-Ljava/sql/DriverInfo;-><init>(Ljava/sql/Driver;)V
-Ljava/sql/DriverInfo;->driver:Ljava/sql/Driver;
-Ljava/sql/DriverManager;-><init>()V
-Ljava/sql/DriverManager;->getConnection(Ljava/lang/String;Ljava/util/Properties;Ljava/lang/ClassLoader;)Ljava/sql/Connection;
-Ljava/sql/DriverManager;->isDriverAllowed(Ljava/sql/Driver;Ljava/lang/ClassLoader;)Z
-Ljava/sql/DriverManager;->loadInitialDrivers()V
-Ljava/sql/DriverManager;->loginTimeout:I
-Ljava/sql/DriverManager;->logStream:Ljava/io/PrintStream;
-Ljava/sql/DriverManager;->logSync:Ljava/lang/Object;
-Ljava/sql/DriverManager;->logWriter:Ljava/io/PrintWriter;
-Ljava/sql/DriverManager;->registeredDrivers:Ljava/util/concurrent/CopyOnWriteArrayList;
-Ljava/sql/DriverManager;->SET_LOG_PERMISSION:Ljava/sql/SQLPermission;
-Ljava/sql/SQLClientInfoException;->failedProperties:Ljava/util/Map;
-Ljava/sql/SQLException;->next:Ljava/sql/SQLException;
-Ljava/sql/SQLException;->nextUpdater:Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;
-Ljava/sql/SQLException;->SQLState:Ljava/lang/String;
-Ljava/sql/SQLException;->vendorCode:I
-Ljava/sql/Timestamp;->nanos:I
-Ljava/sql/Types;-><init>()V
-Ljava/text/Annotation;->value:Ljava/lang/Object;
-Ljava/text/AttributedCharacterIterator$Attribute;->instanceMap:Ljava/util/Map;
-Ljava/text/AttributedCharacterIterator$Attribute;->name:Ljava/lang/String;
-Ljava/text/AttributedString$AttributedStringIterator;->beginIndex:I
-Ljava/text/AttributedString$AttributedStringIterator;->currentIndex:I
-Ljava/text/AttributedString$AttributedStringIterator;->currentRunIndex:I
-Ljava/text/AttributedString$AttributedStringIterator;->currentRunLimit:I
-Ljava/text/AttributedString$AttributedStringIterator;->currentRunStart:I
-Ljava/text/AttributedString$AttributedStringIterator;->endIndex:I
-Ljava/text/AttributedString$AttributedStringIterator;->getString()Ljava/text/AttributedString;
-Ljava/text/AttributedString$AttributedStringIterator;->internalSetIndex(I)C
-Ljava/text/AttributedString$AttributedStringIterator;->relevantAttributes:[Ljava/text/AttributedCharacterIterator$Attribute;
-Ljava/text/AttributedString$AttributedStringIterator;->updateRunInfo()V
-Ljava/text/AttributedString$AttributeMap;->beginIndex:I
-Ljava/text/AttributedString$AttributeMap;->endIndex:I
-Ljava/text/AttributedString$AttributeMap;->runIndex:I
-Ljava/text/AttributedString;-><init>([Ljava/text/AttributedCharacterIterator;)V
-Ljava/text/AttributedString;->addAttributeImpl(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;II)V
-Ljava/text/AttributedString;->addAttributeRunData(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;II)V
-Ljava/text/AttributedString;->appendContents(Ljava/lang/StringBuffer;Ljava/text/CharacterIterator;)V
-Ljava/text/AttributedString;->ARRAY_SIZE_INCREMENT:I
-Ljava/text/AttributedString;->attributeValuesMatch(Ljava/util/Set;II)Z
-Ljava/text/AttributedString;->charAt(I)C
-Ljava/text/AttributedString;->createRunAttributeDataVectors()V
-Ljava/text/AttributedString;->ensureRunBreak(I)I
-Ljava/text/AttributedString;->ensureRunBreak(IZ)I
-Ljava/text/AttributedString;->getAttribute(Ljava/text/AttributedCharacterIterator$Attribute;I)Ljava/lang/Object;
-Ljava/text/AttributedString;->getAttributeCheckRange(Ljava/text/AttributedCharacterIterator$Attribute;III)Ljava/lang/Object;
-Ljava/text/AttributedString;->length()I
-Ljava/text/AttributedString;->mapsDiffer(Ljava/util/Map;Ljava/util/Map;)Z
-Ljava/text/AttributedString;->runArraySize:I
-Ljava/text/AttributedString;->runAttributes:[Ljava/util/Vector;
-Ljava/text/AttributedString;->runAttributeValues:[Ljava/util/Vector;
-Ljava/text/AttributedString;->runCount:I
-Ljava/text/AttributedString;->runStarts:[I
-Ljava/text/AttributedString;->setAttributes(Ljava/util/Map;I)V
-Ljava/text/AttributedString;->text:Ljava/lang/String;
-Ljava/text/AttributedString;->valuesMatch(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/text/Bidi;-><init>(Landroid/icu/text/Bidi;)V
-Ljava/text/Bidi;->bidiBase:Landroid/icu/text/Bidi;
-Ljava/text/Bidi;->translateConstToIcu(I)I
-Ljava/text/CalendarBuilder;-><init>()V
-Ljava/text/CalendarBuilder;->addYear(I)Ljava/text/CalendarBuilder;
-Ljava/text/CalendarBuilder;->clear(I)Ljava/text/CalendarBuilder;
-Ljava/text/CalendarBuilder;->COMPUTED:I
-Ljava/text/CalendarBuilder;->establish(Ljava/util/Calendar;)Ljava/util/Calendar;
-Ljava/text/CalendarBuilder;->field:[I
-Ljava/text/CalendarBuilder;->ISO_DAY_OF_WEEK:I
-Ljava/text/CalendarBuilder;->isSet(I)Z
-Ljava/text/CalendarBuilder;->isValidDayOfWeek(I)Z
-Ljava/text/CalendarBuilder;->maxFieldIndex:I
-Ljava/text/CalendarBuilder;->MAX_FIELD:I
-Ljava/text/CalendarBuilder;->MINIMUM_USER_STAMP:I
-Ljava/text/CalendarBuilder;->nextStamp:I
-Ljava/text/CalendarBuilder;->set(II)Ljava/text/CalendarBuilder;
-Ljava/text/CalendarBuilder;->toCalendarDayOfWeek(I)I
-Ljava/text/CalendarBuilder;->toISODayOfWeek(I)I
-Ljava/text/CalendarBuilder;->UNSET:I
-Ljava/text/CalendarBuilder;->WEEK_YEAR:I
-Ljava/text/ChoiceFormat;->choiceFormats:[Ljava/lang/String;
-Ljava/text/ChoiceFormat;->choiceLimits:[D
-Ljava/text/ChoiceFormat;->doubleArraySize([D)[D
-Ljava/text/ChoiceFormat;->doubleArraySize([Ljava/lang/String;)[Ljava/lang/String;
-Ljava/text/ChoiceFormat;->EXPONENT:J
-Ljava/text/ChoiceFormat;->POSITIVEINFINITY:J
-Ljava/text/ChoiceFormat;->SIGN:J
-Ljava/text/CollationElementIterator;-><init>(Landroid/icu/text/CollationElementIterator;)V
-Ljava/text/CollationElementIterator;->icuIterator:Landroid/icu/text/CollationElementIterator;
-Ljava/text/CollationKey;->source:Ljava/lang/String;
-Ljava/text/Collator;-><init>(Landroid/icu/text/Collator;)V
-Ljava/text/Collator;->decompositionMode_ICU_Java(I)I
-Ljava/text/Collator;->decompositionMode_Java_ICU(I)I
-Ljava/text/DateFormat$Field;->calendarField:I
-Ljava/text/DateFormat$Field;->calendarToFieldMapping:[Ljava/text/DateFormat$Field;
-Ljava/text/DateFormat$Field;->instanceMap:Ljava/util/Map;
-Ljava/text/DateFormat;->get(IIILjava/util/Locale;)Ljava/text/DateFormat;
-Ljava/text/DateFormat;->set24HourTimePref(Ljava/lang/Boolean;)V
-Ljava/text/DateFormatSymbols;->ampms:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->cachedHashCode:I
-Ljava/text/DateFormatSymbols;->cachedInstances:Ljava/util/concurrent/ConcurrentMap;
-Ljava/text/DateFormatSymbols;->copyMembers(Ljava/text/DateFormatSymbols;Ljava/text/DateFormatSymbols;)V
-Ljava/text/DateFormatSymbols;->currentSerialVersion:I
-Ljava/text/DateFormatSymbols;->eras:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getCachedInstance(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;
-Ljava/text/DateFormatSymbols;->getInstanceRef(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;
-Ljava/text/DateFormatSymbols;->getShortStandAloneMonths()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getShortStandAloneWeekdays()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getStandAloneMonths()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getStandAloneWeekdays()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getTinyMonths()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getTinyStandAloneMonths()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getTinyStandAloneWeekdays()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getTinyWeekdays()[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getZoneIndex(Ljava/lang/String;)I
-Ljava/text/DateFormatSymbols;->getZoneStringsImpl(Z)[[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->getZoneStringsWrapper()[[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->initializeData(Ljava/util/Locale;)V
-Ljava/text/DateFormatSymbols;->initializeSupplementaryData(Llibcore/icu/LocaleData;)V
-Ljava/text/DateFormatSymbols;->internalZoneStrings()[[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->isSubclassObject()Z
-Ljava/text/DateFormatSymbols;->isZoneStringsSet:Z
-Ljava/text/DateFormatSymbols;->lastZoneIndex:I
-Ljava/text/DateFormatSymbols;->locale:Ljava/util/Locale;
-Ljava/text/DateFormatSymbols;->localPatternChars:Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->millisPerHour:I
-Ljava/text/DateFormatSymbols;->months:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->patternChars:Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->PATTERN_AM_PM:I
-Ljava/text/DateFormatSymbols;->PATTERN_DAY_OF_MONTH:I
-Ljava/text/DateFormatSymbols;->PATTERN_DAY_OF_WEEK:I
-Ljava/text/DateFormatSymbols;->PATTERN_DAY_OF_WEEK_IN_MONTH:I
-Ljava/text/DateFormatSymbols;->PATTERN_DAY_OF_YEAR:I
-Ljava/text/DateFormatSymbols;->PATTERN_DAY_PERIOD:I
-Ljava/text/DateFormatSymbols;->PATTERN_ERA:I
-Ljava/text/DateFormatSymbols;->PATTERN_FLEXIBLE_DAY_PERIOD:I
-Ljava/text/DateFormatSymbols;->PATTERN_HOUR0:I
-Ljava/text/DateFormatSymbols;->PATTERN_HOUR1:I
-Ljava/text/DateFormatSymbols;->PATTERN_HOUR_OF_DAY0:I
-Ljava/text/DateFormatSymbols;->PATTERN_HOUR_OF_DAY1:I
-Ljava/text/DateFormatSymbols;->PATTERN_ISO_DAY_OF_WEEK:I
-Ljava/text/DateFormatSymbols;->PATTERN_ISO_ZONE:I
-Ljava/text/DateFormatSymbols;->PATTERN_MILLISECOND:I
-Ljava/text/DateFormatSymbols;->PATTERN_MINUTE:I
-Ljava/text/DateFormatSymbols;->PATTERN_MONTH:I
-Ljava/text/DateFormatSymbols;->PATTERN_MONTH_STANDALONE:I
-Ljava/text/DateFormatSymbols;->PATTERN_SECOND:I
-Ljava/text/DateFormatSymbols;->PATTERN_STANDALONE_DAY_OF_WEEK:I
-Ljava/text/DateFormatSymbols;->PATTERN_WEEK_OF_MONTH:I
-Ljava/text/DateFormatSymbols;->PATTERN_WEEK_OF_YEAR:I
-Ljava/text/DateFormatSymbols;->PATTERN_WEEK_YEAR:I
-Ljava/text/DateFormatSymbols;->PATTERN_YEAR:I
-Ljava/text/DateFormatSymbols;->PATTERN_ZONE_NAME:I
-Ljava/text/DateFormatSymbols;->PATTERN_ZONE_VALUE:I
-Ljava/text/DateFormatSymbols;->serialVersionOnStream:I
-Ljava/text/DateFormatSymbols;->shortMonths:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->shortStandAloneMonths:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->shortStandAloneWeekdays:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->shortWeekdays:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->standAloneMonths:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->standAloneWeekdays:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->tinyMonths:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->tinyStandAloneMonths:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->tinyStandAloneWeekdays:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->tinyWeekdays:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->weekdays:[Ljava/lang/String;
-Ljava/text/DateFormatSymbols;->zoneStrings:[[Ljava/lang/String;
-Ljava/text/DecimalFormat;->adjustForCurrencyDefaultFractionDigits()V
-Ljava/text/DecimalFormat;->compareIcuRoundingIncrement(Landroid/icu/text/DecimalFormat_ICU58_Android;)Z
-Ljava/text/DecimalFormat;->convertRoundingMode(Ljava/math/RoundingMode;)I
-Ljava/text/DecimalFormat;->currentSerialVersion:I
-Ljava/text/DecimalFormat;->DOUBLE_FRACTION_DIGITS:I
-Ljava/text/DecimalFormat;->DOUBLE_INTEGER_DIGITS:I
-Ljava/text/DecimalFormat;->format(Ljava/math/BigDecimal;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-Ljava/text/DecimalFormat;->format(Ljava/math/BigInteger;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;
-Ljava/text/DecimalFormat;->getIcuFieldPosition(Ljava/text/FieldPosition;)Ljava/text/FieldPosition;
-Ljava/text/DecimalFormat;->icuDecimalFormat:Landroid/icu/text/DecimalFormat_ICU58_Android;
-Ljava/text/DecimalFormat;->initPattern(Ljava/lang/String;)V
-Ljava/text/DecimalFormat;->maximumFractionDigits:I
-Ljava/text/DecimalFormat;->maximumIntegerDigits:I
-Ljava/text/DecimalFormat;->MAXIMUM_FRACTION_DIGITS:I
-Ljava/text/DecimalFormat;->MAXIMUM_INTEGER_DIGITS:I
-Ljava/text/DecimalFormat;->minimumFractionDigits:I
-Ljava/text/DecimalFormat;->minimumIntegerDigits:I
-Ljava/text/DecimalFormat;->roundingMode:Ljava/math/RoundingMode;
-Ljava/text/DecimalFormat;->symbols:Ljava/text/DecimalFormatSymbols;
-Ljava/text/DecimalFormat;->toJavaFieldAttribute(Ljava/text/AttributedCharacterIterator$Attribute;)Ljava/text/NumberFormat$Field;
-Ljava/text/DecimalFormat;->updateFieldsFromIcu()V
-Ljava/text/DecimalFormatSymbols;->cachedIcuDFS:Landroid/icu/text/DecimalFormatSymbols;
-Ljava/text/DecimalFormatSymbols;->currency:Ljava/util/Currency;
-Ljava/text/DecimalFormatSymbols;->currencySymbol:Ljava/lang/String;
-Ljava/text/DecimalFormatSymbols;->currentSerialVersion:I
-Ljava/text/DecimalFormatSymbols;->decimalSeparator:C
-Ljava/text/DecimalFormatSymbols;->digit:C
-Ljava/text/DecimalFormatSymbols;->exponential:C
-Ljava/text/DecimalFormatSymbols;->exponentialSeparator:Ljava/lang/String;
-Ljava/text/DecimalFormatSymbols;->fromIcuInstance(Landroid/icu/text/DecimalFormatSymbols;)Ljava/text/DecimalFormatSymbols;
-Ljava/text/DecimalFormatSymbols;->getExponentialSymbol()C
-Ljava/text/DecimalFormatSymbols;->getIcuDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;
-Ljava/text/DecimalFormatSymbols;->getMinusSignString()Ljava/lang/String;
-Ljava/text/DecimalFormatSymbols;->groupingSeparator:C
-Ljava/text/DecimalFormatSymbols;->infinity:Ljava/lang/String;
-Ljava/text/DecimalFormatSymbols;->initialize(Ljava/util/Locale;)V
-Ljava/text/DecimalFormatSymbols;->intlCurrencySymbol:Ljava/lang/String;
-Ljava/text/DecimalFormatSymbols;->locale:Ljava/util/Locale;
-Ljava/text/DecimalFormatSymbols;->maybeStripMarkers(Ljava/lang/String;C)C
-Ljava/text/DecimalFormatSymbols;->minusSign:C
-Ljava/text/DecimalFormatSymbols;->monetarySeparator:C
-Ljava/text/DecimalFormatSymbols;->NaN:Ljava/lang/String;
-Ljava/text/DecimalFormatSymbols;->patternSeparator:C
-Ljava/text/DecimalFormatSymbols;->percent:C
-Ljava/text/DecimalFormatSymbols;->perMill:C
-Ljava/text/DecimalFormatSymbols;->serialVersionOnStream:I
-Ljava/text/DecimalFormatSymbols;->setExponentialSymbol(C)V
-Ljava/text/DecimalFormatSymbols;->zeroDigit:C
-Ljava/text/FieldPosition$Delegate;->encounteredField:Z
-Ljava/text/FieldPosition$Delegate;->formatted(ILjava/text/Format$Field;Ljava/lang/Object;IILjava/lang/StringBuffer;)V
-Ljava/text/FieldPosition$Delegate;->formatted(Ljava/text/Format$Field;Ljava/lang/Object;IILjava/lang/StringBuffer;)V
-Ljava/text/FieldPosition;->attribute:Ljava/text/Format$Field;
-Ljava/text/FieldPosition;->beginIndex:I
-Ljava/text/FieldPosition;->endIndex:I
-Ljava/text/FieldPosition;->field:I
-Ljava/text/FieldPosition;->getFieldDelegate()Ljava/text/Format$FieldDelegate;
-Ljava/text/FieldPosition;->matchesField(Ljava/text/Format$Field;)Z
-Ljava/text/FieldPosition;->matchesField(Ljava/text/Format$Field;I)Z
-Ljava/text/Format$FieldDelegate;->formatted(ILjava/text/Format$Field;Ljava/lang/Object;IILjava/lang/StringBuffer;)V
-Ljava/text/Format$FieldDelegate;->formatted(Ljava/text/Format$Field;Ljava/lang/Object;IILjava/lang/StringBuffer;)V
-Ljava/text/Format;->createAttributedCharacterIterator(Ljava/lang/String;)Ljava/text/AttributedCharacterIterator;
-Ljava/text/Format;->createAttributedCharacterIterator(Ljava/lang/String;Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;)Ljava/text/AttributedCharacterIterator;
-Ljava/text/Format;->createAttributedCharacterIterator(Ljava/text/AttributedCharacterIterator;Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;)Ljava/text/AttributedCharacterIterator;
-Ljava/text/Format;->createAttributedCharacterIterator([Ljava/text/AttributedCharacterIterator;)Ljava/text/AttributedCharacterIterator;
-Ljava/text/MessageFormat;->append(Ljava/lang/StringBuffer;Ljava/text/CharacterIterator;)V
-Ljava/text/MessageFormat;->argumentNumbers:[I
-Ljava/text/MessageFormat;->copyAndFixQuotes(Ljava/lang/String;IILjava/lang/StringBuilder;)V
-Ljava/text/MessageFormat;->DATE_TIME_MODIFIERS:[I
-Ljava/text/MessageFormat;->DATE_TIME_MODIFIER_KEYWORDS:[Ljava/lang/String;
-Ljava/text/MessageFormat;->findKeyword(Ljava/lang/String;[Ljava/lang/String;)I
-Ljava/text/MessageFormat;->formats:[Ljava/text/Format;
-Ljava/text/MessageFormat;->INITIAL_FORMATS:I
-Ljava/text/MessageFormat;->locale:Ljava/util/Locale;
-Ljava/text/MessageFormat;->makeFormat(II[Ljava/lang/StringBuilder;)V
-Ljava/text/MessageFormat;->maxOffset:I
-Ljava/text/MessageFormat;->MODIFIER_CURRENCY:I
-Ljava/text/MessageFormat;->MODIFIER_DEFAULT:I
-Ljava/text/MessageFormat;->MODIFIER_FULL:I
-Ljava/text/MessageFormat;->MODIFIER_INTEGER:I
-Ljava/text/MessageFormat;->MODIFIER_LONG:I
-Ljava/text/MessageFormat;->MODIFIER_MEDIUM:I
-Ljava/text/MessageFormat;->MODIFIER_PERCENT:I
-Ljava/text/MessageFormat;->MODIFIER_SHORT:I
-Ljava/text/MessageFormat;->NUMBER_MODIFIER_KEYWORDS:[Ljava/lang/String;
-Ljava/text/MessageFormat;->offsets:[I
-Ljava/text/MessageFormat;->pattern:Ljava/lang/String;
-Ljava/text/MessageFormat;->SEG_INDEX:I
-Ljava/text/MessageFormat;->SEG_MODIFIER:I
-Ljava/text/MessageFormat;->SEG_RAW:I
-Ljava/text/MessageFormat;->SEG_TYPE:I
-Ljava/text/MessageFormat;->subformat([Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;Ljava/util/List;)Ljava/lang/StringBuffer;
-Ljava/text/MessageFormat;->TYPE_CHOICE:I
-Ljava/text/MessageFormat;->TYPE_DATE:I
-Ljava/text/MessageFormat;->TYPE_KEYWORDS:[Ljava/lang/String;
-Ljava/text/MessageFormat;->TYPE_NULL:I
-Ljava/text/MessageFormat;->TYPE_NUMBER:I
-Ljava/text/MessageFormat;->TYPE_TIME:I
-Ljava/text/Normalizer$Form;->icuMode:Landroid/icu/text/Normalizer$Mode;
-Ljava/text/Normalizer;-><init>()V
-Ljava/text/NumberFormat$Field;->instanceMap:Ljava/util/Map;
-Ljava/text/NumberFormat;->CURRENCYSTYLE:I
-Ljava/text/NumberFormat;->currentSerialVersion:I
-Ljava/text/NumberFormat;->groupingUsed:Z
-Ljava/text/NumberFormat;->INTEGERSTYLE:I
-Ljava/text/NumberFormat;->maxFractionDigits:B
-Ljava/text/NumberFormat;->maximumFractionDigits:I
-Ljava/text/NumberFormat;->maximumIntegerDigits:I
-Ljava/text/NumberFormat;->maxIntegerDigits:B
-Ljava/text/NumberFormat;->minFractionDigits:B
-Ljava/text/NumberFormat;->minimumFractionDigits:I
-Ljava/text/NumberFormat;->minimumIntegerDigits:I
-Ljava/text/NumberFormat;->minIntegerDigits:B
-Ljava/text/NumberFormat;->NUMBERSTYLE:I
-Ljava/text/NumberFormat;->parseIntegerOnly:Z
-Ljava/text/NumberFormat;->PERCENTSTYLE:I
-Ljava/text/NumberFormat;->serialVersionOnStream:I
-Ljava/text/ParseException;->errorOffset:I
-Ljava/text/ParsePosition;->errorIndex:I
-Ljava/text/ParsePosition;->index:I
-Ljava/text/RuleBasedCollator;-><init>(Landroid/icu/text/RuleBasedCollator;)V
-Ljava/text/RuleBasedCollator;->collAsICU()Landroid/icu/text/RuleBasedCollator;
-Ljava/text/SimpleDateFormat;-><init>(IILjava/util/Locale;)V
-Ljava/text/SimpleDateFormat;->cachedNumberFormatData:Ljava/util/concurrent/ConcurrentMap;
-Ljava/text/SimpleDateFormat;->checkNegativeNumberExpression()V
-Ljava/text/SimpleDateFormat;->compile(Ljava/lang/String;)[C
-Ljava/text/SimpleDateFormat;->compiledPattern:[C
-Ljava/text/SimpleDateFormat;->currentSerialVersion:I
-Ljava/text/SimpleDateFormat;->defaultCenturyStart:Ljava/util/Date;
-Ljava/text/SimpleDateFormat;->defaultCenturyStartYear:I
-Ljava/text/SimpleDateFormat;->DST_NAME_TYPES:Ljava/util/Set;
-Ljava/text/SimpleDateFormat;->encode(IILjava/lang/StringBuilder;)V
-Ljava/text/SimpleDateFormat;->format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/Format$FieldDelegate;)Ljava/lang/StringBuffer;
-Ljava/text/SimpleDateFormat;->formatData:Ljava/text/DateFormatSymbols;
-Ljava/text/SimpleDateFormat;->formatMonth(IIILjava/lang/StringBuffer;ZZ)Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->formatWeekday(IIZZ)Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->getCalendarName()Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->getDateTimeFormat(IILjava/util/Locale;)Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->getTimeZoneNames()Landroid/icu/text/TimeZoneNames;
-Ljava/text/SimpleDateFormat;->GMT:Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->hasFollowingMinusSign:Z
-Ljava/text/SimpleDateFormat;->initialize(Ljava/util/Locale;)V
-Ljava/text/SimpleDateFormat;->initializeCalendar(Ljava/util/Locale;)V
-Ljava/text/SimpleDateFormat;->initializeDefaultCentury()V
-Ljava/text/SimpleDateFormat;->isDigit(C)Z
-Ljava/text/SimpleDateFormat;->isGregorianCalendar()Z
-Ljava/text/SimpleDateFormat;->locale:Ljava/util/Locale;
-Ljava/text/SimpleDateFormat;->matchString(Ljava/lang/String;IILjava/util/Map;Ljava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->matchString(Ljava/lang/String;II[Ljava/lang/String;Ljava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->matchZoneString(Ljava/lang/String;I[Ljava/lang/String;)I
-Ljava/text/SimpleDateFormat;->MILLIS_PER_MINUTE:I
-Ljava/text/SimpleDateFormat;->minusSign:C
-Ljava/text/SimpleDateFormat;->NAME_TYPES:Ljava/util/EnumSet;
-Ljava/text/SimpleDateFormat;->originalNumberFormat:Ljava/text/NumberFormat;
-Ljava/text/SimpleDateFormat;->originalNumberPattern:Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->parseAmbiguousDatesAsAfter(Ljava/util/Date;)V
-Ljava/text/SimpleDateFormat;->parseInternal(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;
-Ljava/text/SimpleDateFormat;->parseMonth(Ljava/lang/String;IIIILjava/text/ParsePosition;ZZLjava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->parseWeekday(Ljava/lang/String;IIZZLjava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->pattern:Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->PATTERN_INDEX_TO_CALENDAR_FIELD:[I
-Ljava/text/SimpleDateFormat;->PATTERN_INDEX_TO_DATE_FORMAT_FIELD:[I
-Ljava/text/SimpleDateFormat;->PATTERN_INDEX_TO_DATE_FORMAT_FIELD_ID:[Ljava/text/DateFormat$Field;
-Ljava/text/SimpleDateFormat;->serialVersionOnStream:I
-Ljava/text/SimpleDateFormat;->subFormat(IILjava/text/Format$FieldDelegate;Ljava/lang/StringBuffer;Z)V
-Ljava/text/SimpleDateFormat;->subParse(Ljava/lang/String;IIIZ[ZLjava/text/ParsePosition;ZLjava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->subParseNumericZone(Ljava/lang/String;IIIZLjava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->subParseZoneString(Ljava/lang/String;ILjava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->subParseZoneStringFromICU(Ljava/lang/String;ILjava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->subParseZoneStringFromSymbols(Ljava/lang/String;ILjava/text/CalendarBuilder;)I
-Ljava/text/SimpleDateFormat;->TAG_QUOTE_ASCII_CHAR:I
-Ljava/text/SimpleDateFormat;->TAG_QUOTE_CHARS:I
-Ljava/text/SimpleDateFormat;->timeZoneNames:Landroid/icu/text/TimeZoneNames;
-Ljava/text/SimpleDateFormat;->translatePattern(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Ljava/text/SimpleDateFormat;->useDateFormatSymbols()Z
-Ljava/text/SimpleDateFormat;->useDateFormatSymbols:Z
-Ljava/text/SimpleDateFormat;->zeroDigit:C
-Ljava/text/SimpleDateFormat;->zeroPaddingNumber(IIILjava/lang/StringBuffer;)V
-Ljava/text/StringCharacterIterator;->begin:I
-Ljava/text/StringCharacterIterator;->end:I
-Ljava/text/StringCharacterIterator;->pos:I
-Ljava/text/StringCharacterIterator;->text:Ljava/lang/String;
-Ljava/time/chrono/AbstractChronology;->addFieldValue(Ljava/util/Map;Ljava/time/temporal/ChronoField;J)V
-Ljava/time/chrono/AbstractChronology;->CHRONOS_BY_ID:Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/time/chrono/AbstractChronology;->CHRONOS_BY_TYPE:Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/time/chrono/AbstractChronology;->DATE_ORDER:Ljava/util/Comparator;
-Ljava/time/chrono/AbstractChronology;->DATE_TIME_ORDER:Ljava/util/Comparator;
-Ljava/time/chrono/AbstractChronology;->getAvailableChronologies()Ljava/util/Set;
-Ljava/time/chrono/AbstractChronology;->initCache()Z
-Ljava/time/chrono/AbstractChronology;->INSTANT_ORDER:Ljava/util/Comparator;
-Ljava/time/chrono/AbstractChronology;->of(Ljava/lang/String;)Ljava/time/chrono/Chronology;
-Ljava/time/chrono/AbstractChronology;->of0(Ljava/lang/String;)Ljava/time/chrono/Chronology;
-Ljava/time/chrono/AbstractChronology;->ofLocale(Ljava/util/Locale;)Ljava/time/chrono/Chronology;
-Ljava/time/chrono/AbstractChronology;->readExternal(Ljava/io/DataInput;)Ljava/time/chrono/Chronology;
-Ljava/time/chrono/AbstractChronology;->registerChrono(Ljava/time/chrono/Chronology;)Ljava/time/chrono/Chronology;
-Ljava/time/chrono/AbstractChronology;->registerChrono(Ljava/time/chrono/Chronology;Ljava/lang/String;)Ljava/time/chrono/Chronology;
-Ljava/time/chrono/AbstractChronology;->resolveAligned(Ljava/time/chrono/ChronoLocalDate;JJJ)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->resolveProlepticMonth(Ljava/util/Map;Ljava/time/format/ResolverStyle;)V
-Ljava/time/chrono/AbstractChronology;->resolveYAA(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->resolveYAD(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->resolveYD(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->resolveYearOfEra(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->resolveYMAA(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->resolveYMAD(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->resolveYMD(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/AbstractChronology;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/chrono/ChronoLocalDateImpl;-><init>()V
-Ljava/time/chrono/ChronoLocalDateImpl;->daysUntil(Ljava/time/chrono/ChronoLocalDate;)J
-Ljava/time/chrono/ChronoLocalDateImpl;->ensureValid(Ljava/time/chrono/Chronology;Ljava/time/temporal/Temporal;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->minusDays(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->minusMonths(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->minusWeeks(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->minusYears(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->monthsUntil(Ljava/time/chrono/ChronoLocalDate;)J
-Ljava/time/chrono/ChronoLocalDateImpl;->plusDays(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->plusMonths(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->plusWeeks(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/ChronoLocalDateImpl;->plusYears(J)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/HijrahChronology;-><init>(Ljava/lang/String;)V
-Ljava/time/chrono/HijrahChronology;->calendarProperties:Ljava/util/Properties;
-Ljava/time/chrono/HijrahChronology;->calendarType:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->checkCalendarInit()V
-Ljava/time/chrono/HijrahChronology;->checkValidDayOfYear(I)V
-Ljava/time/chrono/HijrahChronology;->checkValidMonth(I)V
-Ljava/time/chrono/HijrahChronology;->checkValidYear(J)I
-Ljava/time/chrono/HijrahChronology;->createEpochMonths(IIILjava/util/Map;)[I
-Ljava/time/chrono/HijrahChronology;->epochDayToEpochMonth(I)I
-Ljava/time/chrono/HijrahChronology;->epochMonthLength(I)I
-Ljava/time/chrono/HijrahChronology;->epochMonthToEpochDay(I)I
-Ljava/time/chrono/HijrahChronology;->epochMonthToMonth(I)I
-Ljava/time/chrono/HijrahChronology;->epochMonthToYear(I)I
-Ljava/time/chrono/HijrahChronology;->getDayOfYear(II)I
-Ljava/time/chrono/HijrahChronology;->getEpochDay(III)J
-Ljava/time/chrono/HijrahChronology;->getHijrahDateInfo(I)[I
-Ljava/time/chrono/HijrahChronology;->getMaximumDayOfYear()I
-Ljava/time/chrono/HijrahChronology;->getMaximumMonthLength()I
-Ljava/time/chrono/HijrahChronology;->getMaximumYear()I
-Ljava/time/chrono/HijrahChronology;->getMinimumMonthLength()I
-Ljava/time/chrono/HijrahChronology;->getMinimumYear()I
-Ljava/time/chrono/HijrahChronology;->getMonthLength(II)I
-Ljava/time/chrono/HijrahChronology;->getSmallestMaximumDayOfYear()I
-Ljava/time/chrono/HijrahChronology;->getYearLength(I)I
-Ljava/time/chrono/HijrahChronology;->hijrahEpochMonthStartDays:[I
-Ljava/time/chrono/HijrahChronology;->hijrahStartEpochMonth:I
-Ljava/time/chrono/HijrahChronology;->initComplete:Z
-Ljava/time/chrono/HijrahChronology;->KEY_ID:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->KEY_ISO_START:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->KEY_TYPE:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->KEY_VERSION:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->loadCalendarData()V
-Ljava/time/chrono/HijrahChronology;->maxEpochDay:I
-Ljava/time/chrono/HijrahChronology;->maxMonthLength:I
-Ljava/time/chrono/HijrahChronology;->maxYearLength:I
-Ljava/time/chrono/HijrahChronology;->minEpochDay:I
-Ljava/time/chrono/HijrahChronology;->minMonthLength:I
-Ljava/time/chrono/HijrahChronology;->minYearLength:I
-Ljava/time/chrono/HijrahChronology;->parseMonths(Ljava/lang/String;)[I
-Ljava/time/chrono/HijrahChronology;->parseYMD(Ljava/lang/String;)[I
-Ljava/time/chrono/HijrahChronology;->PROP_PREFIX:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->PROP_TYPE_SUFFIX:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->readConfigProperties(Ljava/lang/String;)Ljava/util/Properties;
-Ljava/time/chrono/HijrahChronology;->registerVariants()V
-Ljava/time/chrono/HijrahChronology;->typeId:Ljava/lang/String;
-Ljava/time/chrono/HijrahChronology;->yearMonthToDayOfYear(II)I
-Ljava/time/chrono/HijrahChronology;->yearToEpochMonth(I)I
-Ljava/time/chrono/HijrahDate;-><init>(Ljava/time/chrono/HijrahChronology;III)V
-Ljava/time/chrono/HijrahDate;-><init>(Ljava/time/chrono/HijrahChronology;J)V
-Ljava/time/chrono/HijrahDate;->chrono:Ljava/time/chrono/HijrahChronology;
-Ljava/time/chrono/HijrahDate;->dayOfMonth:I
-Ljava/time/chrono/HijrahDate;->getDayOfWeek()I
-Ljava/time/chrono/HijrahDate;->getDayOfYear()I
-Ljava/time/chrono/HijrahDate;->getEraValue()I
-Ljava/time/chrono/HijrahDate;->getProlepticMonth()J
-Ljava/time/chrono/HijrahDate;->minusDays(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->minusMonths(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->minusWeeks(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->minusYears(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->monthOfYear:I
-Ljava/time/chrono/HijrahDate;->of(Ljava/time/chrono/HijrahChronology;III)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->ofEpochDay(Ljava/time/chrono/HijrahChronology;J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->plusDays(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->plusMonths(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->plusWeeks(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->plusYears(J)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->prolepticYear:I
-Ljava/time/chrono/HijrahDate;->readExternal(Ljava/io/ObjectInput;)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->resolvePreviousValid(III)Ljava/time/chrono/HijrahDate;
-Ljava/time/chrono/HijrahDate;->writeExternal(Ljava/io/ObjectOutput;)V
-Ljava/time/chrono/IsoChronology;-><init>()V
-Ljava/time/chrono/IsoChronology;->resolveProlepticMonth(Ljava/util/Map;Ljava/time/format/ResolverStyle;)V
-Ljava/time/chrono/IsoChronology;->resolveYearOfEra(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;
-Ljava/time/chrono/IsoChronology;->resolveYMD(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;
-Ljava/time/chrono/JapaneseChronology;-><init>()V
-Ljava/time/chrono/JapaneseChronology;->createCalendar()Ljava/util/Calendar;
-Ljava/time/chrono/JapaneseChronology;->getCurrentEra()Ljava/time/chrono/JapaneseEra;
-Ljava/time/chrono/JapaneseChronology;->JCAL:Lsun/util/calendar/LocalGregorianCalendar;
-Ljava/time/chrono/JapaneseChronology;->LOCALE:Ljava/util/Locale;
-Ljava/time/chrono/JapaneseChronology;->prolepticYearLenient(Ljava/time/chrono/JapaneseEra;I)I
-Ljava/time/chrono/JapaneseChronology;->resolveYD(Ljava/time/chrono/JapaneseEra;ILjava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/JapaneseChronology;->resolveYearOfEra(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/JapaneseChronology;->resolveYMD(Ljava/time/chrono/JapaneseEra;ILjava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/chrono/JapaneseDate;-><init>(Ljava/time/chrono/JapaneseEra;ILjava/time/LocalDate;)V
-Ljava/time/chrono/JapaneseDate;-><init>(Ljava/time/LocalDate;)V
-Ljava/time/chrono/JapaneseDate;->era:Ljava/time/chrono/JapaneseEra;
-Ljava/time/chrono/JapaneseDate;->isoDate:Ljava/time/LocalDate;
-Ljava/time/chrono/JapaneseDate;->MEIJI_6_ISODATE:Ljava/time/LocalDate;
-Ljava/time/chrono/JapaneseDate;->minusDays(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->minusMonths(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->minusWeeks(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->minusYears(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->ofYearDay(Ljava/time/chrono/JapaneseEra;II)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->plusDays(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->plusMonths(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->plusWeeks(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->plusYears(J)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->readExternal(Ljava/io/DataInput;)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->toPrivateJapaneseDate(Ljava/time/LocalDate;)Lsun/util/calendar/LocalGregorianCalendar$Date;
-Ljava/time/chrono/JapaneseDate;->with(Ljava/time/LocalDate;)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->withYear(I)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->withYear(Ljava/time/chrono/JapaneseEra;I)Ljava/time/chrono/JapaneseDate;
-Ljava/time/chrono/JapaneseDate;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/chrono/JapaneseDate;->yearOfEra:I
-Ljava/time/chrono/JapaneseEra;-><init>(ILjava/time/LocalDate;)V
-Ljava/time/chrono/JapaneseEra;->eraValue:I
-Ljava/time/chrono/JapaneseEra;->ERA_CONFIG:[Lsun/util/calendar/Era;
-Ljava/time/chrono/JapaneseEra;->ERA_OFFSET:I
-Ljava/time/chrono/JapaneseEra;->from(Ljava/time/LocalDate;)Ljava/time/chrono/JapaneseEra;
-Ljava/time/chrono/JapaneseEra;->getAbbreviation()Ljava/lang/String;
-Ljava/time/chrono/JapaneseEra;->getName()Ljava/lang/String;
-Ljava/time/chrono/JapaneseEra;->getPrivateEra()Lsun/util/calendar/Era;
-Ljava/time/chrono/JapaneseEra;->KNOWN_ERAS:[Ljava/time/chrono/JapaneseEra;
-Ljava/time/chrono/JapaneseEra;->N_ERA_CONSTANTS:I
-Ljava/time/chrono/JapaneseEra;->ordinal(I)I
-Ljava/time/chrono/JapaneseEra;->privateEraFrom(Ljava/time/LocalDate;)Lsun/util/calendar/Era;
-Ljava/time/chrono/JapaneseEra;->readExternal(Ljava/io/DataInput;)Ljava/time/chrono/JapaneseEra;
-Ljava/time/chrono/JapaneseEra;->since:Ljava/time/LocalDate;
-Ljava/time/chrono/JapaneseEra;->toJapaneseEra(Lsun/util/calendar/Era;)Ljava/time/chrono/JapaneseEra;
-Ljava/time/chrono/JapaneseEra;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/chrono/MinguoChronology;-><init>()V
-Ljava/time/chrono/MinguoChronology;->YEARS_DIFFERENCE:I
-Ljava/time/chrono/MinguoDate;-><init>(Ljava/time/LocalDate;)V
-Ljava/time/chrono/MinguoDate;->getProlepticMonth()J
-Ljava/time/chrono/MinguoDate;->getProlepticYear()I
-Ljava/time/chrono/MinguoDate;->isoDate:Ljava/time/LocalDate;
-Ljava/time/chrono/MinguoDate;->minusDays(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->minusMonths(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->minusWeeks(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->minusYears(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->plusDays(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->plusMonths(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->plusWeeks(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->plusYears(J)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->readExternal(Ljava/io/DataInput;)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->with(Ljava/time/LocalDate;)Ljava/time/chrono/MinguoDate;
-Ljava/time/chrono/MinguoDate;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/chrono/ThaiBuddhistChronology;-><init>()V
-Ljava/time/chrono/ThaiBuddhistChronology;->ERA_FULL_NAMES:Ljava/util/HashMap;
-Ljava/time/chrono/ThaiBuddhistChronology;->ERA_NARROW_NAMES:Ljava/util/HashMap;
-Ljava/time/chrono/ThaiBuddhistChronology;->ERA_SHORT_NAMES:Ljava/util/HashMap;
-Ljava/time/chrono/ThaiBuddhistChronology;->FALLBACK_LANGUAGE:Ljava/lang/String;
-Ljava/time/chrono/ThaiBuddhistChronology;->TARGET_LANGUAGE:Ljava/lang/String;
-Ljava/time/chrono/ThaiBuddhistChronology;->YEARS_DIFFERENCE:I
-Ljava/time/chrono/ThaiBuddhistDate;-><init>(Ljava/time/LocalDate;)V
-Ljava/time/chrono/ThaiBuddhistDate;->getProlepticMonth()J
-Ljava/time/chrono/ThaiBuddhistDate;->getProlepticYear()I
-Ljava/time/chrono/ThaiBuddhistDate;->isoDate:Ljava/time/LocalDate;
-Ljava/time/chrono/ThaiBuddhistDate;->minusDays(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->minusMonths(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->minusWeeks(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->minusYears(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->plusDays(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->plusMonths(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->plusWeeks(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->plusYears(J)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->readExternal(Ljava/io/DataInput;)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->with(Ljava/time/LocalDate;)Ljava/time/chrono/ThaiBuddhistDate;
-Ljava/time/chrono/ThaiBuddhistDate;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/Clock$FixedClock;-><init>(Ljava/time/Instant;Ljava/time/ZoneId;)V
-Ljava/time/Clock$FixedClock;->instant:Ljava/time/Instant;
-Ljava/time/Clock$FixedClock;->zone:Ljava/time/ZoneId;
-Ljava/time/Clock$OffsetClock;-><init>(Ljava/time/Clock;Ljava/time/Duration;)V
-Ljava/time/Clock$OffsetClock;->baseClock:Ljava/time/Clock;
-Ljava/time/Clock$OffsetClock;->offset:Ljava/time/Duration;
-Ljava/time/Clock$SystemClock;-><init>(Ljava/time/ZoneId;)V
-Ljava/time/Clock$SystemClock;->zone:Ljava/time/ZoneId;
-Ljava/time/Clock$TickClock;-><init>(Ljava/time/Clock;J)V
-Ljava/time/Clock$TickClock;->baseClock:Ljava/time/Clock;
-Ljava/time/Clock$TickClock;->tickNanos:J
-Ljava/time/DayOfWeek;->ENUMS:[Ljava/time/DayOfWeek;
-Ljava/time/Duration$DurationUnits;-><init>()V
-Ljava/time/Duration$DurationUnits;->UNITS:Ljava/util/List;
-Ljava/time/Duration;-><init>(JI)V
-Ljava/time/Duration;->BI_NANOS_PER_SECOND:Ljava/math/BigInteger;
-Ljava/time/Duration;->create(JI)Ljava/time/Duration;
-Ljava/time/Duration;->create(Ljava/math/BigDecimal;)Ljava/time/Duration;
-Ljava/time/Duration;->create(ZJJJJI)Ljava/time/Duration;
-Ljava/time/Duration;->nanos:I
-Ljava/time/Duration;->parseFraction(Ljava/lang/CharSequence;Ljava/lang/String;I)I
-Ljava/time/Duration;->parseNumber(Ljava/lang/CharSequence;Ljava/lang/String;ILjava/lang/String;)J
-Ljava/time/Duration;->PATTERN:Ljava/util/regex/Pattern;
-Ljava/time/Duration;->plus(JJ)Ljava/time/Duration;
-Ljava/time/Duration;->readExternal(Ljava/io/DataInput;)Ljava/time/Duration;
-Ljava/time/Duration;->seconds:J
-Ljava/time/Duration;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/format/DateTimeFormatter$ClassicFormat;-><init>(Ljava/time/format/DateTimeFormatter;Ljava/time/temporal/TemporalQuery;)V
-Ljava/time/format/DateTimeFormatter$ClassicFormat;->formatter:Ljava/time/format/DateTimeFormatter;
-Ljava/time/format/DateTimeFormatter$ClassicFormat;->parseType:Ljava/time/temporal/TemporalQuery;
-Ljava/time/format/DateTimeFormatter;-><init>(Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;Ljava/util/Locale;Ljava/time/format/DecimalStyle;Ljava/time/format/ResolverStyle;Ljava/util/Set;Ljava/time/chrono/Chronology;Ljava/time/ZoneId;)V
-Ljava/time/format/DateTimeFormatter;->chrono:Ljava/time/chrono/Chronology;
-Ljava/time/format/DateTimeFormatter;->createError(Ljava/lang/CharSequence;Ljava/lang/RuntimeException;)Ljava/time/format/DateTimeParseException;
-Ljava/time/format/DateTimeFormatter;->decimalStyle:Ljava/time/format/DecimalStyle;
-Ljava/time/format/DateTimeFormatter;->locale:Ljava/util/Locale;
-Ljava/time/format/DateTimeFormatter;->PARSED_EXCESS_DAYS:Ljava/time/temporal/TemporalQuery;
-Ljava/time/format/DateTimeFormatter;->PARSED_LEAP_SECOND:Ljava/time/temporal/TemporalQuery;
-Ljava/time/format/DateTimeFormatter;->parseResolved0(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/temporal/TemporalAccessor;
-Ljava/time/format/DateTimeFormatter;->parseUnresolved0(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/format/DateTimeParseContext;
-Ljava/time/format/DateTimeFormatter;->printerParser:Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;
-Ljava/time/format/DateTimeFormatter;->resolverFields:Ljava/util/Set;
-Ljava/time/format/DateTimeFormatter;->resolverStyle:Ljava/time/format/ResolverStyle;
-Ljava/time/format/DateTimeFormatter;->toPrinterParser(Z)Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;
-Ljava/time/format/DateTimeFormatter;->zone:Ljava/time/ZoneId;
-Ljava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;-><init>(C)V
-Ljava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->literal:C
-Ljava/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$ChronoPrinterParser;-><init>(Ljava/time/format/TextStyle;)V
-Ljava/time/format/DateTimeFormatterBuilder$ChronoPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$ChronoPrinterParser;->getChronologyName(Ljava/time/chrono/Chronology;Ljava/util/Locale;)Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$ChronoPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$ChronoPrinterParser;->textStyle:Ljava/time/format/TextStyle;
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;-><init>(Ljava/util/List;Z)V
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;-><init>([Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;Z)V
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;->optional:Z
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;->printerParsers:[Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;->withOptional(Z)Ljava/time/format/DateTimeFormatterBuilder$CompositePrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$DefaultValueParser;-><init>(Ljava/time/temporal/TemporalField;J)V
-Ljava/time/format/DateTimeFormatterBuilder$DefaultValueParser;->field:Ljava/time/temporal/TemporalField;
-Ljava/time/format/DateTimeFormatterBuilder$DefaultValueParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$DefaultValueParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$DefaultValueParser;->value:J
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;-><init>(Ljava/time/temporal/TemporalField;IIZ)V
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->convertFromFraction(Ljava/math/BigDecimal;)J
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->convertToFraction(J)Ljava/math/BigDecimal;
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->decimalPoint:Z
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->field:Ljava/time/temporal/TemporalField;
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->maxWidth:I
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->minWidth:I
-Ljava/time/format/DateTimeFormatterBuilder$FractionPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;-><init>(I)V
-Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;->fractionalDigits:I
-Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;->SECONDS_0000_TO_1970:J
-Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;->SECONDS_PER_10000_YEARS:J
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedOffsetIdPrinterParser;-><init>(Ljava/time/format/TextStyle;)V
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedOffsetIdPrinterParser;->appendHMS(Ljava/lang/StringBuilder;I)Ljava/lang/StringBuilder;
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedOffsetIdPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedOffsetIdPrinterParser;->getDigit(Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedOffsetIdPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedOffsetIdPrinterParser;->style:Ljava/time/format/TextStyle;
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser;-><init>(Ljava/time/format/FormatStyle;Ljava/time/format/FormatStyle;)V
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser;->dateStyle:Ljava/time/format/FormatStyle;
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser;->formatter(Ljava/util/Locale;Ljava/time/chrono/Chronology;)Ljava/time/format/DateTimeFormatter;
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser;->FORMATTER_CACHE:Ljava/util/concurrent/ConcurrentMap;
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser;->timeStyle:Ljava/time/format/FormatStyle;
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;-><init>(Ljava/time/temporal/TemporalField;IILjava/time/format/SignStyle;)V
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;-><init>(Ljava/time/temporal/TemporalField;IILjava/time/format/SignStyle;I)V
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->EXCEED_POINTS:[J
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->field:Ljava/time/temporal/TemporalField;
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->getValue(Ljava/time/format/DateTimePrintContext;J)J
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->isFixedWidth(Ljava/time/format/DateTimeParseContext;)Z
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->maxWidth:I
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->minWidth:I
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->setValue(Ljava/time/format/DateTimeParseContext;JII)I
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->signStyle:Ljava/time/format/SignStyle;
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->subsequentWidth:I
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->withFixedWidth()Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;->withSubsequentWidth(I)Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->checkPattern(Ljava/lang/String;)I
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->INSTANCE_ID_Z:Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->INSTANCE_ID_ZERO:Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->noOffsetText:Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->parseNumber([IILjava/lang/CharSequence;Z)Z
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->PATTERNS:[Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->type:I
-Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;-><init>(Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;IC)V
-Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;->padChar:C
-Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;->padWidth:I
-Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;->printerParser:Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;)V
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;->isEqual(CC)Z
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;->newNode(Ljava/lang/String;Ljava/lang/String;Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;->prefixOf(Ljava/lang/CharSequence;II)Z
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$LENIENT;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;)V
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$LENIENT;->isLenientChar(C)Z
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$LENIENT;->match(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$LENIENT;->newNode(Ljava/lang/String;Ljava/lang/String;Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$LENIENT;->toKey(Ljava/lang/String;)Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;)V
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->add(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->add0(Ljava/lang/String;Ljava/lang/String;)Z
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->c0:C
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->child:Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->copyTree()Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->isEqual(CC)Z
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->key:Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->match(Ljava/lang/CharSequence;II)Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->match(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->newNode(Ljava/lang/String;Ljava/lang/String;Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->newTree(Ljava/time/format/DateTimeParseContext;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->newTree(Ljava/util/Set;Ljava/time/format/DateTimeParseContext;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->prefixLength(Ljava/lang/String;)I
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->prefixOf(Ljava/lang/CharSequence;II)Z
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->sibling:Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->toKey(Ljava/lang/String;)Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;->value:Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;-><init>(Ljava/time/temporal/TemporalField;IIILjava/time/chrono/ChronoLocalDate;)V
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;-><init>(Ljava/time/temporal/TemporalField;IIILjava/time/chrono/ChronoLocalDate;I)V
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->baseDate:Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->baseValue:I
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->BASE_DATE:Ljava/time/LocalDate;
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->getValue(Ljava/time/format/DateTimePrintContext;J)J
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->isFixedWidth(Ljava/time/format/DateTimeParseContext;)Z
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->setValue(Ljava/time/format/DateTimeParseContext;JII)I
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->withFixedWidth()Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;->withSubsequentWidth(I)Ljava/time/format/DateTimeFormatterBuilder$ReducedPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->INSENSITIVE:Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->LENIENT:Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->SENSITIVE:Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->STRICT:Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->valueOf(Ljava/lang/String;)Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;->values()[Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
-Ljava/time/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;-><init>(Ljava/lang/String;)V
-Ljava/time/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;->literal:Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;-><init>(Ljava/time/temporal/TemporalField;Ljava/time/format/TextStyle;Ljava/time/format/DateTimeTextProvider;)V
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;->field:Ljava/time/temporal/TemporalField;
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;->numberPrinterParser()Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;->numberPrinterParser:Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;->provider:Ljava/time/format/DateTimeTextProvider;
-Ljava/time/format/DateTimeFormatterBuilder$TextPrinterParser;->textStyle:Ljava/time/format/TextStyle;
-Ljava/time/format/DateTimeFormatterBuilder$WeekBasedFieldPrinterParser;-><init>(CI)V
-Ljava/time/format/DateTimeFormatterBuilder$WeekBasedFieldPrinterParser;->chr:C
-Ljava/time/format/DateTimeFormatterBuilder$WeekBasedFieldPrinterParser;->count:I
-Ljava/time/format/DateTimeFormatterBuilder$WeekBasedFieldPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$WeekBasedFieldPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$WeekBasedFieldPrinterParser;->printerParser(Ljava/util/Locale;)Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;-><init>(Ljava/time/temporal/TemporalQuery;Ljava/lang/String;)V
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->cachedPrefixTree:Ljava/util/Map$Entry;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->cachedPrefixTreeCI:Ljava/util/Map$Entry;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->description:Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->getTree(Ljava/time/format/DateTimeParseContext;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->parse(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->parseOffsetBased(Ljava/time/format/DateTimeParseContext;Ljava/lang/CharSequence;IILjava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;)I
-Ljava/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;->query:Ljava/time/temporal/TemporalQuery;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;-><init>(Ljava/time/format/TextStyle;Ljava/util/Set;)V
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->cache:Ljava/util/Map;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->cachedTree:Ljava/util/Map;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->cachedTreeCI:Ljava/util/Map;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->DST:I
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->format(Ljava/time/format/DateTimePrintContext;Ljava/lang/StringBuilder;)Z
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->FULL_TYPES:[Landroid/icu/text/TimeZoneNames$NameType;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->GENERIC:I
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->getDisplayName(Ljava/lang/String;ILjava/util/Locale;)Ljava/lang/String;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->getTree(Ljava/time/format/DateTimeParseContext;)Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->preferredZones:Ljava/util/Set;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->SHORT_TYPES:[Landroid/icu/text/TimeZoneNames$NameType;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->STD:I
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->textStyle:Ljava/time/format/TextStyle;
-Ljava/time/format/DateTimeFormatterBuilder$ZoneTextPrinterParser;->TYPES:[Landroid/icu/text/TimeZoneNames$NameType;
-Ljava/time/format/DateTimeFormatterBuilder;-><init>(Ljava/time/format/DateTimeFormatterBuilder;Z)V
-Ljava/time/format/DateTimeFormatterBuilder;->active:Ljava/time/format/DateTimeFormatterBuilder;
-Ljava/time/format/DateTimeFormatterBuilder;->appendInternal(Ljava/time/format/DateTimeFormatterBuilder$DateTimePrinterParser;)I
-Ljava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;)Ljava/time/format/DateTimeFormatterBuilder;
-Ljava/time/format/DateTimeFormatterBuilder;->convertStyle(Ljava/time/format/FormatStyle;)I
-Ljava/time/format/DateTimeFormatterBuilder;->FIELD_MAP:Ljava/util/Map;
-Ljava/time/format/DateTimeFormatterBuilder;->LENGTH_SORT:Ljava/util/Comparator;
-Ljava/time/format/DateTimeFormatterBuilder;->optional:Z
-Ljava/time/format/DateTimeFormatterBuilder;->padNextChar:C
-Ljava/time/format/DateTimeFormatterBuilder;->padNextWidth:I
-Ljava/time/format/DateTimeFormatterBuilder;->parent:Ljava/time/format/DateTimeFormatterBuilder;
-Ljava/time/format/DateTimeFormatterBuilder;->parseField(CILjava/time/temporal/TemporalField;)V
-Ljava/time/format/DateTimeFormatterBuilder;->parsePattern(Ljava/lang/String;)V
-Ljava/time/format/DateTimeFormatterBuilder;->printerParsers:Ljava/util/List;
-Ljava/time/format/DateTimeFormatterBuilder;->QUERY_REGION_ONLY:Ljava/time/temporal/TemporalQuery;
-Ljava/time/format/DateTimeFormatterBuilder;->toFormatter(Ljava/time/format/ResolverStyle;Ljava/time/chrono/Chronology;)Ljava/time/format/DateTimeFormatter;
-Ljava/time/format/DateTimeFormatterBuilder;->toFormatter(Ljava/util/Locale;Ljava/time/format/ResolverStyle;Ljava/time/chrono/Chronology;)Ljava/time/format/DateTimeFormatter;
-Ljava/time/format/DateTimeFormatterBuilder;->valueParserIndex:I
-Ljava/time/format/DateTimeParseContext;-><init>(Ljava/time/format/DateTimeFormatter;)V
-Ljava/time/format/DateTimeParseContext;->addChronoChangedListener(Ljava/util/function/Consumer;)V
-Ljava/time/format/DateTimeParseContext;->caseSensitive:Z
-Ljava/time/format/DateTimeParseContext;->charEquals(CC)Z
-Ljava/time/format/DateTimeParseContext;->charEqualsIgnoreCase(CC)Z
-Ljava/time/format/DateTimeParseContext;->chronoListeners:Ljava/util/ArrayList;
-Ljava/time/format/DateTimeParseContext;->copy()Ljava/time/format/DateTimeParseContext;
-Ljava/time/format/DateTimeParseContext;->currentParsed()Ljava/time/format/Parsed;
-Ljava/time/format/DateTimeParseContext;->endOptional(Z)V
-Ljava/time/format/DateTimeParseContext;->formatter:Ljava/time/format/DateTimeFormatter;
-Ljava/time/format/DateTimeParseContext;->getDecimalStyle()Ljava/time/format/DecimalStyle;
-Ljava/time/format/DateTimeParseContext;->getEffectiveChronology()Ljava/time/chrono/Chronology;
-Ljava/time/format/DateTimeParseContext;->getLocale()Ljava/util/Locale;
-Ljava/time/format/DateTimeParseContext;->getParsed(Ljava/time/temporal/TemporalField;)Ljava/lang/Long;
-Ljava/time/format/DateTimeParseContext;->isCaseSensitive()Z
-Ljava/time/format/DateTimeParseContext;->isStrict()Z
-Ljava/time/format/DateTimeParseContext;->parsed:Ljava/util/ArrayList;
-Ljava/time/format/DateTimeParseContext;->setCaseSensitive(Z)V
-Ljava/time/format/DateTimeParseContext;->setParsed(Ljava/time/chrono/Chronology;)V
-Ljava/time/format/DateTimeParseContext;->setParsed(Ljava/time/ZoneId;)V
-Ljava/time/format/DateTimeParseContext;->setParsedField(Ljava/time/temporal/TemporalField;JII)I
-Ljava/time/format/DateTimeParseContext;->setParsedLeapSecond()V
-Ljava/time/format/DateTimeParseContext;->setStrict(Z)V
-Ljava/time/format/DateTimeParseContext;->startOptional()V
-Ljava/time/format/DateTimeParseContext;->strict:Z
-Ljava/time/format/DateTimeParseContext;->subSequenceEquals(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z
-Ljava/time/format/DateTimeParseContext;->toResolved(Ljava/time/format/ResolverStyle;Ljava/util/Set;)Ljava/time/temporal/TemporalAccessor;
-Ljava/time/format/DateTimeParseContext;->toUnresolved()Ljava/time/format/Parsed;
-Ljava/time/format/DateTimeParseException;->errorIndex:I
-Ljava/time/format/DateTimeParseException;->parsedString:Ljava/lang/String;
-Ljava/time/format/DateTimePrintContext;-><init>(Ljava/time/temporal/TemporalAccessor;Ljava/time/format/DateTimeFormatter;)V
-Ljava/time/format/DateTimePrintContext;->adjust(Ljava/time/temporal/TemporalAccessor;Ljava/time/format/DateTimeFormatter;)Ljava/time/temporal/TemporalAccessor;
-Ljava/time/format/DateTimePrintContext;->endOptional()V
-Ljava/time/format/DateTimePrintContext;->formatter:Ljava/time/format/DateTimeFormatter;
-Ljava/time/format/DateTimePrintContext;->getDecimalStyle()Ljava/time/format/DecimalStyle;
-Ljava/time/format/DateTimePrintContext;->getLocale()Ljava/util/Locale;
-Ljava/time/format/DateTimePrintContext;->getTemporal()Ljava/time/temporal/TemporalAccessor;
-Ljava/time/format/DateTimePrintContext;->getValue(Ljava/time/temporal/TemporalField;)Ljava/lang/Long;
-Ljava/time/format/DateTimePrintContext;->getValue(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-Ljava/time/format/DateTimePrintContext;->optional:I
-Ljava/time/format/DateTimePrintContext;->startOptional()V
-Ljava/time/format/DateTimePrintContext;->temporal:Ljava/time/temporal/TemporalAccessor;
-Ljava/time/format/DateTimeTextProvider$LocaleStore;-><init>(Ljava/util/Map;)V
-Ljava/time/format/DateTimeTextProvider$LocaleStore;->getText(JLjava/time/format/TextStyle;)Ljava/lang/String;
-Ljava/time/format/DateTimeTextProvider$LocaleStore;->getTextIterator(Ljava/time/format/TextStyle;)Ljava/util/Iterator;
-Ljava/time/format/DateTimeTextProvider$LocaleStore;->parsable:Ljava/util/Map;
-Ljava/time/format/DateTimeTextProvider$LocaleStore;->valueTextMap:Ljava/util/Map;
-Ljava/time/format/DateTimeTextProvider;-><init>()V
-Ljava/time/format/DateTimeTextProvider;->CACHE:Ljava/util/concurrent/ConcurrentMap;
-Ljava/time/format/DateTimeTextProvider;->COMPARATOR:Ljava/util/Comparator;
-Ljava/time/format/DateTimeTextProvider;->createEntry(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map$Entry;
-Ljava/time/format/DateTimeTextProvider;->createStore(Ljava/time/temporal/TemporalField;Ljava/util/Locale;)Ljava/lang/Object;
-Ljava/time/format/DateTimeTextProvider;->extractQuarters(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)Ljava/util/Map;
-Ljava/time/format/DateTimeTextProvider;->findStore(Ljava/time/temporal/TemporalField;Ljava/util/Locale;)Ljava/lang/Object;
-Ljava/time/format/DateTimeTextProvider;->getInstance()Ljava/time/format/DateTimeTextProvider;
-Ljava/time/format/DateTimeTextProvider;->getText(Ljava/time/chrono/Chronology;Ljava/time/temporal/TemporalField;JLjava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;
-Ljava/time/format/DateTimeTextProvider;->getText(Ljava/time/temporal/TemporalField;JLjava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;
-Ljava/time/format/DateTimeTextProvider;->getTextIterator(Ljava/time/chrono/Chronology;Ljava/time/temporal/TemporalField;Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/util/Iterator;
-Ljava/time/format/DateTimeTextProvider;->getTextIterator(Ljava/time/temporal/TemporalField;Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/util/Iterator;
-Ljava/time/format/DateTimeTextProvider;->toWeekDay(I)I
-Ljava/time/format/DecimalStyle;-><init>(CCCC)V
-Ljava/time/format/DecimalStyle;->CACHE:Ljava/util/concurrent/ConcurrentMap;
-Ljava/time/format/DecimalStyle;->convertNumberToI18N(Ljava/lang/String;)Ljava/lang/String;
-Ljava/time/format/DecimalStyle;->convertToDigit(C)I
-Ljava/time/format/DecimalStyle;->create(Ljava/util/Locale;)Ljava/time/format/DecimalStyle;
-Ljava/time/format/DecimalStyle;->decimalSeparator:C
-Ljava/time/format/DecimalStyle;->negativeSign:C
-Ljava/time/format/DecimalStyle;->positiveSign:C
-Ljava/time/format/DecimalStyle;->zeroDigit:C
-Ljava/time/format/Parsed;-><init>()V
-Ljava/time/format/Parsed;->chrono:Ljava/time/chrono/Chronology;
-Ljava/time/format/Parsed;->copy()Ljava/time/format/Parsed;
-Ljava/time/format/Parsed;->crossCheck()V
-Ljava/time/format/Parsed;->crossCheck(Ljava/time/temporal/TemporalAccessor;)V
-Ljava/time/format/Parsed;->date:Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/format/Parsed;->excessDays:Ljava/time/Period;
-Ljava/time/format/Parsed;->fieldValues:Ljava/util/Map;
-Ljava/time/format/Parsed;->leapSecond:Z
-Ljava/time/format/Parsed;->resolve(Ljava/time/format/ResolverStyle;Ljava/util/Set;)Ljava/time/temporal/TemporalAccessor;
-Ljava/time/format/Parsed;->resolveDateFields()V
-Ljava/time/format/Parsed;->resolveFields()V
-Ljava/time/format/Parsed;->resolveFractional()V
-Ljava/time/format/Parsed;->resolveInstant()V
-Ljava/time/format/Parsed;->resolveInstantFields()V
-Ljava/time/format/Parsed;->resolveInstantFields0(Ljava/time/ZoneId;)V
-Ljava/time/format/Parsed;->resolvePeriod()V
-Ljava/time/format/Parsed;->resolverStyle:Ljava/time/format/ResolverStyle;
-Ljava/time/format/Parsed;->resolveTime(JJJJ)V
-Ljava/time/format/Parsed;->resolveTimeFields()V
-Ljava/time/format/Parsed;->resolveTimeLenient()V
-Ljava/time/format/Parsed;->time:Ljava/time/LocalTime;
-Ljava/time/format/Parsed;->updateCheckConflict(Ljava/time/chrono/ChronoLocalDate;)V
-Ljava/time/format/Parsed;->updateCheckConflict(Ljava/time/LocalTime;Ljava/time/Period;)V
-Ljava/time/format/Parsed;->updateCheckConflict(Ljava/time/temporal/TemporalField;Ljava/time/temporal/TemporalField;Ljava/lang/Long;)V
-Ljava/time/format/Parsed;->zone:Ljava/time/ZoneId;
-Ljava/time/format/SignStyle;->parse(ZZZ)Z
-Ljava/time/format/TextStyle;->calendarStyle:I
-Ljava/time/format/TextStyle;->toCalendarStyle()I
-Ljava/time/format/TextStyle;->zoneNameStyleIndex()I
-Ljava/time/format/TextStyle;->zoneNameStyleIndex:I
-Ljava/time/Instant;-><init>(JI)V
-Ljava/time/Instant;->create(JI)Ljava/time/Instant;
-Ljava/time/Instant;->MAX_SECOND:J
-Ljava/time/Instant;->MIN_SECOND:J
-Ljava/time/Instant;->nanos:I
-Ljava/time/Instant;->nanosUntil(Ljava/time/Instant;)J
-Ljava/time/Instant;->plus(JJ)Ljava/time/Instant;
-Ljava/time/Instant;->readExternal(Ljava/io/DataInput;)Ljava/time/Instant;
-Ljava/time/Instant;->seconds:J
-Ljava/time/Instant;->secondsUntil(Ljava/time/Instant;)J
-Ljava/time/Instant;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/LocalDate;-><init>(III)V
-Ljava/time/LocalDate;->compareTo0(Ljava/time/LocalDate;)I
-Ljava/time/LocalDate;->create(III)Ljava/time/LocalDate;
-Ljava/time/LocalDate;->day:S
-Ljava/time/LocalDate;->daysUntil(Ljava/time/LocalDate;)J
-Ljava/time/LocalDate;->DAYS_0000_TO_1970:J
-Ljava/time/LocalDate;->DAYS_PER_CYCLE:I
-Ljava/time/LocalDate;->get0(Ljava/time/temporal/TemporalField;)I
-Ljava/time/LocalDate;->getProlepticMonth()J
-Ljava/time/LocalDate;->month:S
-Ljava/time/LocalDate;->monthsUntil(Ljava/time/LocalDate;)J
-Ljava/time/LocalDate;->readExternal(Ljava/io/DataInput;)Ljava/time/LocalDate;
-Ljava/time/LocalDate;->resolvePreviousValid(III)Ljava/time/LocalDate;
-Ljava/time/LocalDate;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/LocalDate;->year:I
-Ljava/time/LocalDateTime;-><init>(Ljava/time/LocalDate;Ljava/time/LocalTime;)V
-Ljava/time/LocalDateTime;->compareTo0(Ljava/time/LocalDateTime;)I
-Ljava/time/LocalDateTime;->date:Ljava/time/LocalDate;
-Ljava/time/LocalDateTime;->plusWithOverflow(Ljava/time/LocalDate;JJJJI)Ljava/time/LocalDateTime;
-Ljava/time/LocalDateTime;->readExternal(Ljava/io/DataInput;)Ljava/time/LocalDateTime;
-Ljava/time/LocalDateTime;->time:Ljava/time/LocalTime;
-Ljava/time/LocalDateTime;->with(Ljava/time/LocalDate;Ljava/time/LocalTime;)Ljava/time/LocalDateTime;
-Ljava/time/LocalDateTime;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/LocalTime;-><init>(IIII)V
-Ljava/time/LocalTime;->create(IIII)Ljava/time/LocalTime;
-Ljava/time/LocalTime;->get0(Ljava/time/temporal/TemporalField;)I
-Ljava/time/LocalTime;->hour:B
-Ljava/time/LocalTime;->HOURS:[Ljava/time/LocalTime;
-Ljava/time/LocalTime;->HOURS_PER_DAY:I
-Ljava/time/LocalTime;->MICROS_PER_DAY:J
-Ljava/time/LocalTime;->MILLIS_PER_DAY:J
-Ljava/time/LocalTime;->minute:B
-Ljava/time/LocalTime;->MINUTES_PER_DAY:I
-Ljava/time/LocalTime;->MINUTES_PER_HOUR:I
-Ljava/time/LocalTime;->nano:I
-Ljava/time/LocalTime;->NANOS_PER_DAY:J
-Ljava/time/LocalTime;->NANOS_PER_HOUR:J
-Ljava/time/LocalTime;->NANOS_PER_MINUTE:J
-Ljava/time/LocalTime;->NANOS_PER_SECOND:J
-Ljava/time/LocalTime;->readExternal(Ljava/io/DataInput;)Ljava/time/LocalTime;
-Ljava/time/LocalTime;->second:B
-Ljava/time/LocalTime;->SECONDS_PER_DAY:I
-Ljava/time/LocalTime;->SECONDS_PER_HOUR:I
-Ljava/time/LocalTime;->SECONDS_PER_MINUTE:I
-Ljava/time/LocalTime;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/Month;->ENUMS:[Ljava/time/Month;
-Ljava/time/MonthDay;-><init>(II)V
-Ljava/time/MonthDay;->day:I
-Ljava/time/MonthDay;->month:I
-Ljava/time/MonthDay;->PARSER:Ljava/time/format/DateTimeFormatter;
-Ljava/time/MonthDay;->readExternal(Ljava/io/DataInput;)Ljava/time/MonthDay;
-Ljava/time/MonthDay;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/OffsetDateTime;->compareInstant(Ljava/time/OffsetDateTime;Ljava/time/OffsetDateTime;)I
-Ljava/time/OffsetDateTime;->dateTime:Ljava/time/LocalDateTime;
-Ljava/time/OffsetDateTime;->offset:Ljava/time/ZoneOffset;
-Ljava/time/OffsetDateTime;->readExternal(Ljava/io/ObjectInput;)Ljava/time/OffsetDateTime;
-Ljava/time/OffsetDateTime;->with(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;
-Ljava/time/OffsetDateTime;->writeExternal(Ljava/io/ObjectOutput;)V
-Ljava/time/OffsetTime;-><init>(Ljava/time/LocalTime;Ljava/time/ZoneOffset;)V
-Ljava/time/OffsetTime;->offset:Ljava/time/ZoneOffset;
-Ljava/time/OffsetTime;->readExternal(Ljava/io/ObjectInput;)Ljava/time/OffsetTime;
-Ljava/time/OffsetTime;->time:Ljava/time/LocalTime;
-Ljava/time/OffsetTime;->toEpochNano()J
-Ljava/time/OffsetTime;->with(Ljava/time/LocalTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;
-Ljava/time/OffsetTime;->writeExternal(Ljava/io/ObjectOutput;)V
-Ljava/time/Period;-><init>(III)V
-Ljava/time/Period;->create(III)Ljava/time/Period;
-Ljava/time/Period;->days:I
-Ljava/time/Period;->months:I
-Ljava/time/Period;->parseNumber(Ljava/lang/CharSequence;Ljava/lang/String;I)I
-Ljava/time/Period;->PATTERN:Ljava/util/regex/Pattern;
-Ljava/time/Period;->readExternal(Ljava/io/DataInput;)Ljava/time/Period;
-Ljava/time/Period;->SUPPORTED_UNITS:Ljava/util/List;
-Ljava/time/Period;->validateChrono(Ljava/time/temporal/TemporalAccessor;)V
-Ljava/time/Period;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/Period;->years:I
-Ljava/time/temporal/ChronoField;->baseUnit:Ljava/time/temporal/TemporalUnit;
-Ljava/time/temporal/ChronoField;->displayNameKey:Ljava/lang/String;
-Ljava/time/temporal/ChronoField;->getIcuFieldNumber(Ljava/time/temporal/ChronoField;)I
-Ljava/time/temporal/ChronoField;->name:Ljava/lang/String;
-Ljava/time/temporal/ChronoField;->range:Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/ChronoField;->rangeUnit:Ljava/time/temporal/TemporalUnit;
-Ljava/time/temporal/ChronoUnit;->duration:Ljava/time/Duration;
-Ljava/time/temporal/ChronoUnit;->name:Ljava/lang/String;
-Ljava/time/temporal/IsoFields$Field;->DAY_OF_QUARTER:Ljava/time/temporal/IsoFields$Field;
-Ljava/time/temporal/IsoFields$Field;->ensureIso(Ljava/time/temporal/TemporalAccessor;)V
-Ljava/time/temporal/IsoFields$Field;->getWeek(Ljava/time/LocalDate;)I
-Ljava/time/temporal/IsoFields$Field;->getWeekBasedYear(Ljava/time/LocalDate;)I
-Ljava/time/temporal/IsoFields$Field;->getWeekRange(I)I
-Ljava/time/temporal/IsoFields$Field;->getWeekRange(Ljava/time/LocalDate;)Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/IsoFields$Field;->isIso(Ljava/time/temporal/TemporalAccessor;)Z
-Ljava/time/temporal/IsoFields$Field;->QUARTER_DAYS:[I
-Ljava/time/temporal/IsoFields$Field;->QUARTER_OF_YEAR:Ljava/time/temporal/IsoFields$Field;
-Ljava/time/temporal/IsoFields$Field;->valueOf(Ljava/lang/String;)Ljava/time/temporal/IsoFields$Field;
-Ljava/time/temporal/IsoFields$Field;->values()[Ljava/time/temporal/IsoFields$Field;
-Ljava/time/temporal/IsoFields$Field;->WEEK_BASED_YEAR:Ljava/time/temporal/IsoFields$Field;
-Ljava/time/temporal/IsoFields$Field;->WEEK_OF_WEEK_BASED_YEAR:Ljava/time/temporal/IsoFields$Field;
-Ljava/time/temporal/IsoFields$Unit;->duration:Ljava/time/Duration;
-Ljava/time/temporal/IsoFields$Unit;->name:Ljava/lang/String;
-Ljava/time/temporal/IsoFields$Unit;->QUARTER_YEARS:Ljava/time/temporal/IsoFields$Unit;
-Ljava/time/temporal/IsoFields$Unit;->valueOf(Ljava/lang/String;)Ljava/time/temporal/IsoFields$Unit;
-Ljava/time/temporal/IsoFields$Unit;->values()[Ljava/time/temporal/IsoFields$Unit;
-Ljava/time/temporal/IsoFields$Unit;->WEEK_BASED_YEARS:Ljava/time/temporal/IsoFields$Unit;
-Ljava/time/temporal/IsoFields;-><init>()V
-Ljava/time/temporal/JulianFields$Field;->baseUnit:Ljava/time/temporal/TemporalUnit;
-Ljava/time/temporal/JulianFields$Field;->JULIAN_DAY:Ljava/time/temporal/JulianFields$Field;
-Ljava/time/temporal/JulianFields$Field;->MODIFIED_JULIAN_DAY:Ljava/time/temporal/JulianFields$Field;
-Ljava/time/temporal/JulianFields$Field;->name:Ljava/lang/String;
-Ljava/time/temporal/JulianFields$Field;->offset:J
-Ljava/time/temporal/JulianFields$Field;->range:Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/JulianFields$Field;->rangeUnit:Ljava/time/temporal/TemporalUnit;
-Ljava/time/temporal/JulianFields$Field;->RATA_DIE:Ljava/time/temporal/JulianFields$Field;
-Ljava/time/temporal/JulianFields$Field;->valueOf(Ljava/lang/String;)Ljava/time/temporal/JulianFields$Field;
-Ljava/time/temporal/JulianFields$Field;->values()[Ljava/time/temporal/JulianFields$Field;
-Ljava/time/temporal/JulianFields;-><init>()V
-Ljava/time/temporal/JulianFields;->JULIAN_DAY_OFFSET:J
-Ljava/time/temporal/TemporalAdjusters;-><init>()V
-Ljava/time/temporal/TemporalQueries;-><init>()V
-Ljava/time/temporal/TemporalQueries;->CHRONO:Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/TemporalQueries;->LOCAL_DATE:Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/TemporalQueries;->LOCAL_TIME:Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/TemporalQueries;->OFFSET:Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/TemporalQueries;->PRECISION:Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/TemporalQueries;->ZONE:Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/TemporalQueries;->ZONE_ID:Ljava/time/temporal/TemporalQuery;
-Ljava/time/temporal/ValueRange;-><init>(JJJJ)V
-Ljava/time/temporal/ValueRange;->genInvalidFieldMessage(Ljava/time/temporal/TemporalField;J)Ljava/lang/String;
-Ljava/time/temporal/ValueRange;->maxLargest:J
-Ljava/time/temporal/ValueRange;->maxSmallest:J
-Ljava/time/temporal/ValueRange;->minLargest:J
-Ljava/time/temporal/ValueRange;->minSmallest:J
-Ljava/time/temporal/WeekFields$ComputedDayOfField;-><init>(Ljava/lang/String;Ljava/time/temporal/WeekFields;Ljava/time/temporal/TemporalUnit;Ljava/time/temporal/TemporalUnit;Ljava/time/temporal/ValueRange;)V
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->baseUnit:Ljava/time/temporal/TemporalUnit;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->computeWeek(II)I
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->DAY_OF_WEEK_RANGE:Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->localizedDayOfWeek(I)I
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->localizedDayOfWeek(Ljava/time/temporal/TemporalAccessor;)I
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->localizedWeekBasedYear(Ljava/time/temporal/TemporalAccessor;)I
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->localizedWeekOfMonth(Ljava/time/temporal/TemporalAccessor;)J
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->localizedWeekOfWeekBasedYear(Ljava/time/temporal/TemporalAccessor;)I
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->localizedWeekOfYear(Ljava/time/temporal/TemporalAccessor;)J
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->name:Ljava/lang/String;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->ofDayOfWeekField(Ljava/time/temporal/WeekFields;)Ljava/time/temporal/WeekFields$ComputedDayOfField;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->ofWeekBasedYear(Ljava/time/chrono/Chronology;III)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->ofWeekBasedYearField(Ljava/time/temporal/WeekFields;)Ljava/time/temporal/WeekFields$ComputedDayOfField;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->ofWeekOfMonthField(Ljava/time/temporal/WeekFields;)Ljava/time/temporal/WeekFields$ComputedDayOfField;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->ofWeekOfWeekBasedYearField(Ljava/time/temporal/WeekFields;)Ljava/time/temporal/WeekFields$ComputedDayOfField;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->ofWeekOfYearField(Ljava/time/temporal/WeekFields;)Ljava/time/temporal/WeekFields$ComputedDayOfField;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->range:Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->rangeByWeek(Ljava/time/temporal/TemporalAccessor;Ljava/time/temporal/TemporalField;)Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->rangeUnit:Ljava/time/temporal/TemporalUnit;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->rangeWeekOfWeekBasedYear(Ljava/time/temporal/TemporalAccessor;)Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->resolveWBY(Ljava/util/Map;Ljava/time/chrono/Chronology;ILjava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->resolveWoM(Ljava/util/Map;Ljava/time/chrono/Chronology;IJJILjava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->resolveWoY(Ljava/util/Map;Ljava/time/chrono/Chronology;IJILjava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->startOfWeekOffset(II)I
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->weekDef:Ljava/time/temporal/WeekFields;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->WEEK_OF_MONTH_RANGE:Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->WEEK_OF_WEEK_BASED_YEAR_RANGE:Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/WeekFields$ComputedDayOfField;->WEEK_OF_YEAR_RANGE:Ljava/time/temporal/ValueRange;
-Ljava/time/temporal/WeekFields;-><init>(Ljava/time/DayOfWeek;I)V
-Ljava/time/temporal/WeekFields;->CACHE:Ljava/util/concurrent/ConcurrentMap;
-Ljava/time/temporal/WeekFields;->dayOfWeek:Ljava/time/temporal/TemporalField;
-Ljava/time/temporal/WeekFields;->firstDayOfWeek:Ljava/time/DayOfWeek;
-Ljava/time/temporal/WeekFields;->minimalDays:I
-Ljava/time/temporal/WeekFields;->weekBasedYear:Ljava/time/temporal/TemporalField;
-Ljava/time/temporal/WeekFields;->weekOfMonth:Ljava/time/temporal/TemporalField;
-Ljava/time/temporal/WeekFields;->weekOfWeekBasedYear:Ljava/time/temporal/TemporalField;
-Ljava/time/temporal/WeekFields;->weekOfYear:Ljava/time/temporal/TemporalField;
-Ljava/time/Year;-><init>(I)V
-Ljava/time/Year;->PARSER:Ljava/time/format/DateTimeFormatter;
-Ljava/time/Year;->readExternal(Ljava/io/DataInput;)Ljava/time/Year;
-Ljava/time/Year;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/Year;->year:I
-Ljava/time/YearMonth;-><init>(II)V
-Ljava/time/YearMonth;->getProlepticMonth()J
-Ljava/time/YearMonth;->month:I
-Ljava/time/YearMonth;->PARSER:Ljava/time/format/DateTimeFormatter;
-Ljava/time/YearMonth;->readExternal(Ljava/io/DataInput;)Ljava/time/YearMonth;
-Ljava/time/YearMonth;->with(II)Ljava/time/YearMonth;
-Ljava/time/YearMonth;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/YearMonth;->year:I
-Ljava/time/zone/ZoneOffsetTransition;-><init>(JLjava/time/ZoneOffset;Ljava/time/ZoneOffset;)V
-Ljava/time/zone/ZoneOffsetTransition;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)V
-Ljava/time/zone/ZoneOffsetTransition;->getDurationSeconds()I
-Ljava/time/zone/ZoneOffsetTransition;->getValidOffsets()Ljava/util/List;
-Ljava/time/zone/ZoneOffsetTransition;->offsetAfter:Ljava/time/ZoneOffset;
-Ljava/time/zone/ZoneOffsetTransition;->offsetBefore:Ljava/time/ZoneOffset;
-Ljava/time/zone/ZoneOffsetTransition;->readExternal(Ljava/io/DataInput;)Ljava/time/zone/ZoneOffsetTransition;
-Ljava/time/zone/ZoneOffsetTransition;->transition:Ljava/time/LocalDateTime;
-Ljava/time/zone/ZoneOffsetTransition;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/zone/ZoneOffsetTransitionRule;-><init>(Ljava/time/Month;ILjava/time/DayOfWeek;Ljava/time/LocalTime;ZLjava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)V
-Ljava/time/zone/ZoneOffsetTransitionRule;->dom:B
-Ljava/time/zone/ZoneOffsetTransitionRule;->dow:Ljava/time/DayOfWeek;
-Ljava/time/zone/ZoneOffsetTransitionRule;->month:Ljava/time/Month;
-Ljava/time/zone/ZoneOffsetTransitionRule;->offsetAfter:Ljava/time/ZoneOffset;
-Ljava/time/zone/ZoneOffsetTransitionRule;->offsetBefore:Ljava/time/ZoneOffset;
-Ljava/time/zone/ZoneOffsetTransitionRule;->readExternal(Ljava/io/DataInput;)Ljava/time/zone/ZoneOffsetTransitionRule;
-Ljava/time/zone/ZoneOffsetTransitionRule;->standardOffset:Ljava/time/ZoneOffset;
-Ljava/time/zone/ZoneOffsetTransitionRule;->time:Ljava/time/LocalTime;
-Ljava/time/zone/ZoneOffsetTransitionRule;->timeDefinition:Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;
-Ljava/time/zone/ZoneOffsetTransitionRule;->timeEndOfDay:Z
-Ljava/time/zone/ZoneOffsetTransitionRule;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/zone/ZoneRules;-><init>(Ljava/time/ZoneOffset;)V
-Ljava/time/zone/ZoneRules;-><init>(Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V
-Ljava/time/zone/ZoneRules;-><init>([J[Ljava/time/ZoneOffset;[J[Ljava/time/ZoneOffset;[Ljava/time/zone/ZoneOffsetTransitionRule;)V
-Ljava/time/zone/ZoneRules;->EMPTY_LASTRULES:[Ljava/time/zone/ZoneOffsetTransitionRule;
-Ljava/time/zone/ZoneRules;->EMPTY_LDT_ARRAY:[Ljava/time/LocalDateTime;
-Ljava/time/zone/ZoneRules;->EMPTY_LONG_ARRAY:[J
-Ljava/time/zone/ZoneRules;->findOffsetInfo(Ljava/time/LocalDateTime;Ljava/time/zone/ZoneOffsetTransition;)Ljava/lang/Object;
-Ljava/time/zone/ZoneRules;->findTransitionArray(I)[Ljava/time/zone/ZoneOffsetTransition;
-Ljava/time/zone/ZoneRules;->findYear(JLjava/time/ZoneOffset;)I
-Ljava/time/zone/ZoneRules;->getOffsetInfo(Ljava/time/LocalDateTime;)Ljava/lang/Object;
-Ljava/time/zone/ZoneRules;->lastRules:[Ljava/time/zone/ZoneOffsetTransitionRule;
-Ljava/time/zone/ZoneRules;->lastRulesCache:Ljava/util/concurrent/ConcurrentMap;
-Ljava/time/zone/ZoneRules;->LAST_CACHED_YEAR:I
-Ljava/time/zone/ZoneRules;->readExternal(Ljava/io/DataInput;)Ljava/time/zone/ZoneRules;
-Ljava/time/zone/ZoneRules;->savingsInstantTransitions:[J
-Ljava/time/zone/ZoneRules;->savingsLocalTransitions:[Ljava/time/LocalDateTime;
-Ljava/time/zone/ZoneRules;->standardOffsets:[Ljava/time/ZoneOffset;
-Ljava/time/zone/ZoneRules;->standardTransitions:[J
-Ljava/time/zone/ZoneRules;->wallOffsets:[Ljava/time/ZoneOffset;
-Ljava/time/zone/ZoneRules;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/ZonedDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)V
-Ljava/time/ZonedDateTime;->create(JILjava/time/ZoneId;)Ljava/time/ZonedDateTime;
-Ljava/time/ZonedDateTime;->dateTime:Ljava/time/LocalDateTime;
-Ljava/time/ZonedDateTime;->offset:Ljava/time/ZoneOffset;
-Ljava/time/ZonedDateTime;->ofLenient(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;
-Ljava/time/ZonedDateTime;->readExternal(Ljava/io/ObjectInput;)Ljava/time/ZonedDateTime;
-Ljava/time/ZonedDateTime;->resolveInstant(Ljava/time/LocalDateTime;)Ljava/time/ZonedDateTime;
-Ljava/time/ZonedDateTime;->resolveLocal(Ljava/time/LocalDateTime;)Ljava/time/ZonedDateTime;
-Ljava/time/ZonedDateTime;->resolveOffset(Ljava/time/ZoneOffset;)Ljava/time/ZonedDateTime;
-Ljava/time/ZonedDateTime;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/time/ZonedDateTime;->zone:Ljava/time/ZoneId;
-Ljava/time/ZoneId;-><init>()V
-Ljava/time/ZoneId;->ofWithPrefix(Ljava/lang/String;IZ)Ljava/time/ZoneId;
-Ljava/time/ZoneId;->toTemporal()Ljava/time/temporal/TemporalAccessor;
-Ljava/time/ZoneId;->write(Ljava/io/DataOutput;)V
-Ljava/time/ZoneOffset;-><init>(I)V
-Ljava/time/ZoneOffset;->buildId(I)Ljava/lang/String;
-Ljava/time/ZoneOffset;->id:Ljava/lang/String;
-Ljava/time/ZoneOffset;->ID_CACHE:Ljava/util/concurrent/ConcurrentMap;
-Ljava/time/ZoneOffset;->MAX_SECONDS:I
-Ljava/time/ZoneOffset;->parseNumber(Ljava/lang/CharSequence;IZ)I
-Ljava/time/ZoneOffset;->readExternal(Ljava/io/DataInput;)Ljava/time/ZoneOffset;
-Ljava/time/ZoneOffset;->SECONDS_CACHE:Ljava/util/concurrent/ConcurrentMap;
-Ljava/time/ZoneOffset;->totalSeconds(III)I
-Ljava/time/ZoneOffset;->totalSeconds:I
-Ljava/time/ZoneOffset;->validate(III)V
-Ljava/time/ZoneOffset;->write(Ljava/io/DataOutput;)V
-Ljava/time/ZoneOffset;->writeExternal(Ljava/io/DataOutput;)V
-Ljava/util/AbstractCollection;->finishToArray([Ljava/lang/Object;Ljava/util/Iterator;)[Ljava/lang/Object;
-Ljava/util/AbstractCollection;->hugeCapacity(I)I
-Ljava/util/AbstractCollection;->MAX_ARRAY_SIZE:I
-Ljava/util/AbstractList$Itr;->checkForComodification()V
-Ljava/util/AbstractList$Itr;->cursor:I
-Ljava/util/AbstractList$Itr;->expectedModCount:I
-Ljava/util/AbstractList$Itr;->lastRet:I
-Ljava/util/AbstractList;->outOfBoundsMsg(I)Ljava/lang/String;
-Ljava/util/AbstractList;->rangeCheckForAdd(I)V
-Ljava/util/AbstractMap$SimpleEntry;->key:Ljava/lang/Object;
-Ljava/util/AbstractMap$SimpleEntry;->value:Ljava/lang/Object;
-Ljava/util/AbstractMap$SimpleImmutableEntry;->key:Ljava/lang/Object;
-Ljava/util/AbstractMap$SimpleImmutableEntry;->value:Ljava/lang/Object;
-Ljava/util/AbstractMap;->eq(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/AbstractMap;->keySet:Ljava/util/Set;
-Ljava/util/AbstractMap;->values:Ljava/util/Collection;
-Ljava/util/ArrayDeque$DeqIterator;->cursor:I
-Ljava/util/ArrayDeque$DeqIterator;->fence:I
-Ljava/util/ArrayDeque$DeqIterator;->lastRet:I
-Ljava/util/ArrayDeque$DeqSpliterator;-><init>(Ljava/util/ArrayDeque;II)V
-Ljava/util/ArrayDeque$DeqSpliterator;->deq:Ljava/util/ArrayDeque;
-Ljava/util/ArrayDeque$DeqSpliterator;->fence:I
-Ljava/util/ArrayDeque$DeqSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/ArrayDeque$DeqSpliterator;->getFence()I
-Ljava/util/ArrayDeque$DeqSpliterator;->index:I
-Ljava/util/ArrayDeque$DeqSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/ArrayDeque$DescendingIterator;->cursor:I
-Ljava/util/ArrayDeque$DescendingIterator;->fence:I
-Ljava/util/ArrayDeque$DescendingIterator;->lastRet:I
-Ljava/util/ArrayDeque;->allocateElements(I)V
-Ljava/util/ArrayDeque;->checkInvariants()V
-Ljava/util/ArrayDeque;->delete(I)Z
-Ljava/util/ArrayDeque;->doubleCapacity()V
-Ljava/util/ArrayDeque;->MIN_INITIAL_CAPACITY:I
-Ljava/util/ArrayList$ArrayListSpliterator;-><init>(Ljava/util/ArrayList;III)V
-Ljava/util/ArrayList$ArrayListSpliterator;->expectedModCount:I
-Ljava/util/ArrayList$ArrayListSpliterator;->fence:I
-Ljava/util/ArrayList$ArrayListSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/ArrayList$ArrayListSpliterator;->getFence()I
-Ljava/util/ArrayList$ArrayListSpliterator;->index:I
-Ljava/util/ArrayList$ArrayListSpliterator;->list:Ljava/util/ArrayList;
-Ljava/util/ArrayList$ArrayListSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/ArrayList$Itr;->cursor:I
-Ljava/util/ArrayList$Itr;->expectedModCount:I
-Ljava/util/ArrayList$Itr;->lastRet:I
-Ljava/util/ArrayList$Itr;->limit:I
-Ljava/util/ArrayList$SubList;->outOfBoundsMsg(I)Ljava/lang/String;
-Ljava/util/ArrayList;->batchRemove(Ljava/util/Collection;Z)Z
-Ljava/util/ArrayList;->DEFAULTCAPACITY_EMPTY_ELEMENTDATA:[Ljava/lang/Object;
-Ljava/util/ArrayList;->DEFAULT_CAPACITY:I
-Ljava/util/ArrayList;->EMPTY_ELEMENTDATA:[Ljava/lang/Object;
-Ljava/util/ArrayList;->ensureCapacityInternal(I)V
-Ljava/util/ArrayList;->ensureExplicitCapacity(I)V
-Ljava/util/ArrayList;->fastRemove(I)V
-Ljava/util/ArrayList;->grow(I)V
-Ljava/util/ArrayList;->hugeCapacity(I)I
-Ljava/util/ArrayList;->MAX_ARRAY_SIZE:I
-Ljava/util/ArrayList;->outOfBoundsMsg(I)Ljava/lang/String;
-Ljava/util/ArrayList;->subListRangeCheck(III)V
-Ljava/util/Arrays$ArrayList;-><init>([Ljava/lang/Object;)V
-Ljava/util/Arrays$ArrayList;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Arrays$NaturalOrder;-><init>()V
-Ljava/util/Arrays$NaturalOrder;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-Ljava/util/Arrays$NaturalOrder;->INSTANCE:Ljava/util/Arrays$NaturalOrder;
-Ljava/util/Arrays;-><init>()V
-Ljava/util/Arrays;->binarySearch0([BIIB)I
-Ljava/util/Arrays;->binarySearch0([CIIC)I
-Ljava/util/Arrays;->binarySearch0([DIID)I
-Ljava/util/Arrays;->binarySearch0([FIIF)I
-Ljava/util/Arrays;->binarySearch0([IIII)I
-Ljava/util/Arrays;->binarySearch0([JIIJ)I
-Ljava/util/Arrays;->binarySearch0([Ljava/lang/Object;IILjava/lang/Object;)I
-Ljava/util/Arrays;->binarySearch0([Ljava/lang/Object;IILjava/lang/Object;Ljava/util/Comparator;)I
-Ljava/util/Arrays;->binarySearch0([SIIS)I
-Ljava/util/Arrays;->deepEquals0(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/Arrays;->INSERTIONSORT_THRESHOLD:I
-Ljava/util/Arrays;->mergeSort([Ljava/lang/Object;[Ljava/lang/Object;III)V
-Ljava/util/Arrays;->MIN_ARRAY_SORT_GRAN:I
-Ljava/util/Arrays;->rangeCheck(III)V
-Ljava/util/Arrays;->swap([Ljava/lang/Object;II)V
-Ljava/util/Base64$DecInputStream;-><init>(Ljava/io/InputStream;[IZ)V
-Ljava/util/Base64$DecInputStream;->base64:[I
-Ljava/util/Base64$DecInputStream;->bits:I
-Ljava/util/Base64$DecInputStream;->closed:Z
-Ljava/util/Base64$DecInputStream;->eof:Z
-Ljava/util/Base64$DecInputStream;->is:Ljava/io/InputStream;
-Ljava/util/Base64$DecInputStream;->isMIME:Z
-Ljava/util/Base64$DecInputStream;->nextin:I
-Ljava/util/Base64$DecInputStream;->nextout:I
-Ljava/util/Base64$DecInputStream;->sbBuf:[B
-Ljava/util/Base64$Decoder;-><init>(ZZ)V
-Ljava/util/Base64$Decoder;->decode0([BII[B)I
-Ljava/util/Base64$Decoder;->fromBase64:[I
-Ljava/util/Base64$Decoder;->fromBase64URL:[I
-Ljava/util/Base64$Decoder;->isMIME:Z
-Ljava/util/Base64$Decoder;->isURL:Z
-Ljava/util/Base64$Decoder;->outLength([BII)I
-Ljava/util/Base64$Decoder;->RFC2045:Ljava/util/Base64$Decoder;
-Ljava/util/Base64$Decoder;->RFC4648:Ljava/util/Base64$Decoder;
-Ljava/util/Base64$Decoder;->RFC4648_URLSAFE:Ljava/util/Base64$Decoder;
-Ljava/util/Base64$Encoder;-><init>(Z[BIZ)V
-Ljava/util/Base64$Encoder;->CRLF:[B
-Ljava/util/Base64$Encoder;->doPadding:Z
-Ljava/util/Base64$Encoder;->encode0([BII[B)I
-Ljava/util/Base64$Encoder;->isURL:Z
-Ljava/util/Base64$Encoder;->linemax:I
-Ljava/util/Base64$Encoder;->MIMELINEMAX:I
-Ljava/util/Base64$Encoder;->newline:[B
-Ljava/util/Base64$Encoder;->outLength(I)I
-Ljava/util/Base64$Encoder;->RFC2045:Ljava/util/Base64$Encoder;
-Ljava/util/Base64$Encoder;->RFC4648:Ljava/util/Base64$Encoder;
-Ljava/util/Base64$Encoder;->RFC4648_URLSAFE:Ljava/util/Base64$Encoder;
-Ljava/util/Base64$Encoder;->toBase64:[C
-Ljava/util/Base64$Encoder;->toBase64URL:[C
-Ljava/util/Base64$EncOutputStream;-><init>(Ljava/io/OutputStream;[C[BIZ)V
-Ljava/util/Base64$EncOutputStream;->b0:I
-Ljava/util/Base64$EncOutputStream;->b1:I
-Ljava/util/Base64$EncOutputStream;->b2:I
-Ljava/util/Base64$EncOutputStream;->base64:[C
-Ljava/util/Base64$EncOutputStream;->checkNewline()V
-Ljava/util/Base64$EncOutputStream;->closed:Z
-Ljava/util/Base64$EncOutputStream;->doPadding:Z
-Ljava/util/Base64$EncOutputStream;->leftover:I
-Ljava/util/Base64$EncOutputStream;->linemax:I
-Ljava/util/Base64$EncOutputStream;->linepos:I
-Ljava/util/Base64$EncOutputStream;->newline:[B
-Ljava/util/Base64;-><init>()V
-Ljava/util/BitSet;-><init>([J)V
-Ljava/util/BitSet;->ADDRESS_BITS_PER_WORD:I
-Ljava/util/BitSet;->BITS_PER_WORD:I
-Ljava/util/BitSet;->BIT_INDEX_MASK:I
-Ljava/util/BitSet;->checkInvariants()V
-Ljava/util/BitSet;->checkRange(II)V
-Ljava/util/BitSet;->ensureCapacity(I)V
-Ljava/util/BitSet;->expandTo(I)V
-Ljava/util/BitSet;->initWords(I)V
-Ljava/util/BitSet;->recalculateWordsInUse()V
-Ljava/util/BitSet;->sizeIsSticky:Z
-Ljava/util/BitSet;->trimToSize()V
-Ljava/util/BitSet;->wordIndex(I)I
-Ljava/util/BitSet;->words:[J
-Ljava/util/BitSet;->wordsInUse:I
-Ljava/util/BitSet;->WORD_MASK:J
-Ljava/util/Calendar$AvailableCalendarTypes;-><init>()V
-Ljava/util/Calendar$AvailableCalendarTypes;->SET:Ljava/util/Set;
-Ljava/util/Calendar$Builder;->allocateFields()V
-Ljava/util/Calendar$Builder;->fields:[I
-Ljava/util/Calendar$Builder;->firstDayOfWeek:I
-Ljava/util/Calendar$Builder;->instant:J
-Ljava/util/Calendar$Builder;->internalSet(II)V
-Ljava/util/Calendar$Builder;->isInstantSet()Z
-Ljava/util/Calendar$Builder;->isSet(I)Z
-Ljava/util/Calendar$Builder;->isValidWeekParameter(I)Z
-Ljava/util/Calendar$Builder;->lenient:Z
-Ljava/util/Calendar$Builder;->locale:Ljava/util/Locale;
-Ljava/util/Calendar$Builder;->maxFieldIndex:I
-Ljava/util/Calendar$Builder;->minimalDaysInFirstWeek:I
-Ljava/util/Calendar$Builder;->nextStamp:I
-Ljava/util/Calendar$Builder;->NFIELDS:I
-Ljava/util/Calendar$Builder;->type:Ljava/lang/String;
-Ljava/util/Calendar$Builder;->WEEK_YEAR:I
-Ljava/util/Calendar$Builder;->zone:Ljava/util/TimeZone;
-Ljava/util/Calendar$CalendarAccessControlContext;-><init>()V
-Ljava/util/Calendar$CalendarAccessControlContext;->INSTANCE:Ljava/security/AccessControlContext;
-Ljava/util/Calendar;->adjustStamp()V
-Ljava/util/Calendar;->aggregateStamp(II)I
-Ljava/util/Calendar;->ALL_FIELDS:I
-Ljava/util/Calendar;->AM_PM_MASK:I
-Ljava/util/Calendar;->appendValue(Ljava/lang/StringBuilder;Ljava/lang/String;ZJ)V
-Ljava/util/Calendar;->areAllFieldsSet:Z
-Ljava/util/Calendar;->cachedLocaleData:Ljava/util/concurrent/ConcurrentMap;
-Ljava/util/Calendar;->checkDisplayNameParams(IIIILjava/util/Locale;I)Z
-Ljava/util/Calendar;->compareTo(J)I
-Ljava/util/Calendar;->COMPUTED:I
-Ljava/util/Calendar;->createCalendar(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;
-Ljava/util/Calendar;->currentSerialVersion:I
-Ljava/util/Calendar;->DATE_MASK:I
-Ljava/util/Calendar;->DAY_OF_MONTH_MASK:I
-Ljava/util/Calendar;->DAY_OF_WEEK_IN_MONTH_MASK:I
-Ljava/util/Calendar;->DAY_OF_WEEK_MASK:I
-Ljava/util/Calendar;->DAY_OF_YEAR_MASK:I
-Ljava/util/Calendar;->DST_OFFSET_MASK:I
-Ljava/util/Calendar;->ERA_MASK:I
-Ljava/util/Calendar;->FIELD_NAME:[Ljava/lang/String;
-Ljava/util/Calendar;->firstDayOfWeek:I
-Ljava/util/Calendar;->getBaseStyle(I)I
-Ljava/util/Calendar;->getDisplayNamesImpl(IILjava/util/Locale;)Ljava/util/Map;
-Ljava/util/Calendar;->getFieldName(I)Ljava/lang/String;
-Ljava/util/Calendar;->getFieldStrings(IILjava/text/DateFormatSymbols;)[Ljava/lang/String;
-Ljava/util/Calendar;->getJapaneseImperialInstance(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;
-Ljava/util/Calendar;->getMillisOf(Ljava/util/Calendar;)J
-Ljava/util/Calendar;->getSetStateFields()I
-Ljava/util/Calendar;->getZone()Ljava/util/TimeZone;
-Ljava/util/Calendar;->HOUR_MASK:I
-Ljava/util/Calendar;->HOUR_OF_DAY_MASK:I
-Ljava/util/Calendar;->internalSet(II)V
-Ljava/util/Calendar;->invalidateWeekFields()V
-Ljava/util/Calendar;->isExternallySet(I)Z
-Ljava/util/Calendar;->isFieldSet(II)Z
-Ljava/util/Calendar;->isFullyNormalized()Z
-Ljava/util/Calendar;->isNarrowFormatStyle(I)Z
-Ljava/util/Calendar;->isNarrowStyle(I)Z
-Ljava/util/Calendar;->isPartiallyNormalized()Z
-Ljava/util/Calendar;->isStandaloneStyle(I)Z
-Ljava/util/Calendar;->lenient:Z
-Ljava/util/Calendar;->MILLISECOND_MASK:I
-Ljava/util/Calendar;->minimalDaysInFirstWeek:I
-Ljava/util/Calendar;->MINIMUM_USER_STAMP:I
-Ljava/util/Calendar;->MINUTE_MASK:I
-Ljava/util/Calendar;->MONTH_MASK:I
-Ljava/util/Calendar;->nextStamp:I
-Ljava/util/Calendar;->SECOND_MASK:I
-Ljava/util/Calendar;->selectFields()I
-Ljava/util/Calendar;->serialVersionOnStream:I
-Ljava/util/Calendar;->setFieldsComputed(I)V
-Ljava/util/Calendar;->setFieldsNormalized(I)V
-Ljava/util/Calendar;->setUnnormalized()V
-Ljava/util/Calendar;->setWeekCountData(Ljava/util/Locale;)V
-Ljava/util/Calendar;->setZoneShared(Z)V
-Ljava/util/Calendar;->sharedZone:Z
-Ljava/util/Calendar;->stamp:[I
-Ljava/util/Calendar;->STANDALONE_MASK:I
-Ljava/util/Calendar;->toStandaloneStyle(I)I
-Ljava/util/Calendar;->UNSET:I
-Ljava/util/Calendar;->updateTime()V
-Ljava/util/Calendar;->WEEK_OF_MONTH_MASK:I
-Ljava/util/Calendar;->WEEK_OF_YEAR_MASK:I
-Ljava/util/Calendar;->YEAR_MASK:I
-Ljava/util/Calendar;->ZONE_OFFSET_MASK:I
-Ljava/util/Collections$AsLIFOQueue;-><init>(Ljava/util/Deque;)V
-Ljava/util/Collections$AsLIFOQueue;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$AsLIFOQueue;->q:Ljava/util/Deque;
-Ljava/util/Collections$CheckedCollection;-><init>(Ljava/util/Collection;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedCollection;->badElementMsg(Ljava/lang/Object;)Ljava/lang/String;
-Ljava/util/Collections$CheckedCollection;->c:Ljava/util/Collection;
-Ljava/util/Collections$CheckedCollection;->checkedCopyOf(Ljava/util/Collection;)Ljava/util/Collection;
-Ljava/util/Collections$CheckedCollection;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$CheckedCollection;->type:Ljava/lang/Class;
-Ljava/util/Collections$CheckedCollection;->typeCheck(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/Collections$CheckedCollection;->zeroLengthElementArray()[Ljava/lang/Object;
-Ljava/util/Collections$CheckedCollection;->zeroLengthElementArray:[Ljava/lang/Object;
-Ljava/util/Collections$CheckedList;-><init>(Ljava/util/List;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedList;->list:Ljava/util/List;
-Ljava/util/Collections$CheckedMap$CheckedEntrySet$CheckedEntry;-><init>(Ljava/util/Map$Entry;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedMap$CheckedEntrySet$CheckedEntry;->badValueMsg(Ljava/lang/Object;)Ljava/lang/String;
-Ljava/util/Collections$CheckedMap$CheckedEntrySet$CheckedEntry;->e:Ljava/util/Map$Entry;
-Ljava/util/Collections$CheckedMap$CheckedEntrySet$CheckedEntry;->valueType:Ljava/lang/Class;
-Ljava/util/Collections$CheckedMap$CheckedEntrySet;-><init>(Ljava/util/Set;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedMap$CheckedEntrySet;->add(Ljava/util/Map$Entry;)Z
-Ljava/util/Collections$CheckedMap$CheckedEntrySet;->addAll(Ljava/util/Collection;)Z
-Ljava/util/Collections$CheckedMap$CheckedEntrySet;->batchRemove(Ljava/util/Collection;Z)Z
-Ljava/util/Collections$CheckedMap$CheckedEntrySet;->checkedEntry(Ljava/util/Map$Entry;Ljava/lang/Class;)Ljava/util/Collections$CheckedMap$CheckedEntrySet$CheckedEntry;
-Ljava/util/Collections$CheckedMap$CheckedEntrySet;->s:Ljava/util/Set;
-Ljava/util/Collections$CheckedMap$CheckedEntrySet;->valueType:Ljava/lang/Class;
-Ljava/util/Collections$CheckedMap;-><init>(Ljava/util/Map;Ljava/lang/Class;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedMap;->badKeyMsg(Ljava/lang/Object;)Ljava/lang/String;
-Ljava/util/Collections$CheckedMap;->badValueMsg(Ljava/lang/Object;)Ljava/lang/String;
-Ljava/util/Collections$CheckedMap;->entrySet:Ljava/util/Set;
-Ljava/util/Collections$CheckedMap;->keyType:Ljava/lang/Class;
-Ljava/util/Collections$CheckedMap;->m:Ljava/util/Map;
-Ljava/util/Collections$CheckedMap;->typeCheck(Ljava/lang/Object;Ljava/lang/Object;)V
-Ljava/util/Collections$CheckedMap;->typeCheck(Ljava/util/function/BiFunction;)Ljava/util/function/BiFunction;
-Ljava/util/Collections$CheckedMap;->valueType:Ljava/lang/Class;
-Ljava/util/Collections$CheckedNavigableMap;-><init>(Ljava/util/NavigableMap;Ljava/lang/Class;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedNavigableMap;->nm:Ljava/util/NavigableMap;
-Ljava/util/Collections$CheckedNavigableSet;-><init>(Ljava/util/NavigableSet;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedNavigableSet;->ns:Ljava/util/NavigableSet;
-Ljava/util/Collections$CheckedQueue;-><init>(Ljava/util/Queue;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedQueue;->queue:Ljava/util/Queue;
-Ljava/util/Collections$CheckedRandomAccessList;-><init>(Ljava/util/List;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedSet;-><init>(Ljava/util/Set;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedSortedMap;-><init>(Ljava/util/SortedMap;Ljava/lang/Class;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedSortedMap;->sm:Ljava/util/SortedMap;
-Ljava/util/Collections$CheckedSortedSet;-><init>(Ljava/util/SortedSet;Ljava/lang/Class;)V
-Ljava/util/Collections$CheckedSortedSet;->ss:Ljava/util/SortedSet;
-Ljava/util/Collections$CopiesList;-><init>(ILjava/lang/Object;)V
-Ljava/util/Collections$CopiesList;->element:Ljava/lang/Object;
-Ljava/util/Collections$CopiesList;->n:I
-Ljava/util/Collections$EmptyEnumeration;-><init>()V
-Ljava/util/Collections$EmptyEnumeration;->EMPTY_ENUMERATION:Ljava/util/Collections$EmptyEnumeration;
-Ljava/util/Collections$EmptyIterator;-><init>()V
-Ljava/util/Collections$EmptyIterator;->EMPTY_ITERATOR:Ljava/util/Collections$EmptyIterator;
-Ljava/util/Collections$EmptyList;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$EmptyListIterator;-><init>()V
-Ljava/util/Collections$EmptyListIterator;->EMPTY_ITERATOR:Ljava/util/Collections$EmptyListIterator;
-Ljava/util/Collections$EmptySet;-><init>()V
-Ljava/util/Collections$EmptySet;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$ReverseComparator2;-><init>(Ljava/util/Comparator;)V
-Ljava/util/Collections$ReverseComparator2;->cmp:Ljava/util/Comparator;
-Ljava/util/Collections$ReverseComparator;-><init>()V
-Ljava/util/Collections$ReverseComparator;->compare(Ljava/lang/Comparable;Ljava/lang/Comparable;)I
-Ljava/util/Collections$ReverseComparator;->REVERSE_ORDER:Ljava/util/Collections$ReverseComparator;
-Ljava/util/Collections$SetFromMap;-><init>(Ljava/util/Map;)V
-Ljava/util/Collections$SetFromMap;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$SetFromMap;->m:Ljava/util/Map;
-Ljava/util/Collections$SetFromMap;->s:Ljava/util/Set;
-Ljava/util/Collections$SingletonList;-><init>(Ljava/lang/Object;)V
-Ljava/util/Collections$SingletonList;->element:Ljava/lang/Object;
-Ljava/util/Collections$SingletonList;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$SingletonMap;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-Ljava/util/Collections$SingletonMap;->entrySet:Ljava/util/Set;
-Ljava/util/Collections$SingletonMap;->k:Ljava/lang/Object;
-Ljava/util/Collections$SingletonMap;->keySet:Ljava/util/Set;
-Ljava/util/Collections$SingletonMap;->v:Ljava/lang/Object;
-Ljava/util/Collections$SingletonMap;->values:Ljava/util/Collection;
-Ljava/util/Collections$SingletonSet;-><init>(Ljava/lang/Object;)V
-Ljava/util/Collections$SingletonSet;->element:Ljava/lang/Object;
-Ljava/util/Collections$SingletonSet;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$SynchronizedCollection;-><init>(Ljava/util/Collection;)V
-Ljava/util/Collections$SynchronizedCollection;-><init>(Ljava/util/Collection;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedCollection;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$SynchronizedCollection;->mutex:Ljava/lang/Object;
-Ljava/util/Collections$SynchronizedList;-><init>(Ljava/util/List;)V
-Ljava/util/Collections$SynchronizedList;-><init>(Ljava/util/List;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedMap;-><init>(Ljava/util/Map;)V
-Ljava/util/Collections$SynchronizedMap;-><init>(Ljava/util/Map;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedMap;->entrySet:Ljava/util/Set;
-Ljava/util/Collections$SynchronizedMap;->keySet:Ljava/util/Set;
-Ljava/util/Collections$SynchronizedMap;->mutex:Ljava/lang/Object;
-Ljava/util/Collections$SynchronizedMap;->values:Ljava/util/Collection;
-Ljava/util/Collections$SynchronizedNavigableMap;-><init>(Ljava/util/NavigableMap;)V
-Ljava/util/Collections$SynchronizedNavigableMap;-><init>(Ljava/util/NavigableMap;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedNavigableMap;->nm:Ljava/util/NavigableMap;
-Ljava/util/Collections$SynchronizedNavigableSet;-><init>(Ljava/util/NavigableSet;)V
-Ljava/util/Collections$SynchronizedNavigableSet;-><init>(Ljava/util/NavigableSet;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedNavigableSet;->ns:Ljava/util/NavigableSet;
-Ljava/util/Collections$SynchronizedRandomAccessList;-><init>(Ljava/util/List;)V
-Ljava/util/Collections$SynchronizedRandomAccessList;-><init>(Ljava/util/List;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedSet;-><init>(Ljava/util/Set;)V
-Ljava/util/Collections$SynchronizedSet;-><init>(Ljava/util/Set;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedSortedMap;-><init>(Ljava/util/SortedMap;)V
-Ljava/util/Collections$SynchronizedSortedMap;-><init>(Ljava/util/SortedMap;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedSortedMap;->sm:Ljava/util/SortedMap;
-Ljava/util/Collections$SynchronizedSortedSet;-><init>(Ljava/util/SortedSet;)V
-Ljava/util/Collections$SynchronizedSortedSet;-><init>(Ljava/util/SortedSet;Ljava/lang/Object;)V
-Ljava/util/Collections$SynchronizedSortedSet;->ss:Ljava/util/SortedSet;
-Ljava/util/Collections$UnmodifiableCollection;-><init>(Ljava/util/Collection;)V
-Ljava/util/Collections$UnmodifiableCollection;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$UnmodifiableList;-><init>(Ljava/util/List;)V
-Ljava/util/Collections$UnmodifiableList;->list:Ljava/util/List;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;-><init>(Ljava/util/Map$Entry;)V
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;->e:Ljava/util/Map$Entry;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntrySetSpliterator;-><init>(Ljava/util/Spliterator;)V
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntrySetSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntrySetSpliterator;->s:Ljava/util/Spliterator;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntrySetSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;-><init>(Ljava/util/Set;)V
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;->entryConsumer(Ljava/util/function/Consumer;)Ljava/util/function/Consumer;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/Collections$UnmodifiableMap;-><init>(Ljava/util/Map;)V
-Ljava/util/Collections$UnmodifiableMap;->entrySet:Ljava/util/Set;
-Ljava/util/Collections$UnmodifiableMap;->keySet:Ljava/util/Set;
-Ljava/util/Collections$UnmodifiableMap;->values:Ljava/util/Collection;
-Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;-><init>()V
-Ljava/util/Collections$UnmodifiableNavigableMap;-><init>(Ljava/util/NavigableMap;)V
-Ljava/util/Collections$UnmodifiableNavigableMap;->EMPTY_NAVIGABLE_MAP:Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;
-Ljava/util/Collections$UnmodifiableNavigableMap;->nm:Ljava/util/NavigableMap;
-Ljava/util/Collections$UnmodifiableNavigableSet$EmptyNavigableSet;-><init>()V
-Ljava/util/Collections$UnmodifiableNavigableSet;-><init>(Ljava/util/NavigableSet;)V
-Ljava/util/Collections$UnmodifiableNavigableSet;->EMPTY_NAVIGABLE_SET:Ljava/util/NavigableSet;
-Ljava/util/Collections$UnmodifiableNavigableSet;->ns:Ljava/util/NavigableSet;
-Ljava/util/Collections$UnmodifiableRandomAccessList;-><init>(Ljava/util/List;)V
-Ljava/util/Collections$UnmodifiableSet;-><init>(Ljava/util/Set;)V
-Ljava/util/Collections$UnmodifiableSortedMap;-><init>(Ljava/util/SortedMap;)V
-Ljava/util/Collections$UnmodifiableSortedMap;->sm:Ljava/util/SortedMap;
-Ljava/util/Collections$UnmodifiableSortedSet;-><init>(Ljava/util/SortedSet;)V
-Ljava/util/Collections$UnmodifiableSortedSet;->ss:Ljava/util/SortedSet;
-Ljava/util/Collections;-><init>()V
-Ljava/util/Collections;->BINARYSEARCH_THRESHOLD:I
-Ljava/util/Collections;->COPY_THRESHOLD:I
-Ljava/util/Collections;->eq(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/Collections;->FILL_THRESHOLD:I
-Ljava/util/Collections;->get(Ljava/util/ListIterator;I)Ljava/lang/Object;
-Ljava/util/Collections;->indexedBinarySearch(Ljava/util/List;Ljava/lang/Object;)I
-Ljava/util/Collections;->indexedBinarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I
-Ljava/util/Collections;->INDEXOFSUBLIST_THRESHOLD:I
-Ljava/util/Collections;->iteratorBinarySearch(Ljava/util/List;Ljava/lang/Object;)I
-Ljava/util/Collections;->iteratorBinarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I
-Ljava/util/Collections;->r:Ljava/util/Random;
-Ljava/util/Collections;->REPLACEALL_THRESHOLD:I
-Ljava/util/Collections;->REVERSE_THRESHOLD:I
-Ljava/util/Collections;->rotate1(Ljava/util/List;I)V
-Ljava/util/Collections;->rotate2(Ljava/util/List;I)V
-Ljava/util/Collections;->ROTATE_THRESHOLD:I
-Ljava/util/Collections;->SHUFFLE_THRESHOLD:I
-Ljava/util/Collections;->singletonIterator(Ljava/lang/Object;)Ljava/util/Iterator;
-Ljava/util/Collections;->singletonSpliterator(Ljava/lang/Object;)Ljava/util/Spliterator;
-Ljava/util/Collections;->swap([Ljava/lang/Object;II)V
-Ljava/util/Collections;->synchronizedCollection(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/Collection;
-Ljava/util/Collections;->synchronizedList(Ljava/util/List;Ljava/lang/Object;)Ljava/util/List;
-Ljava/util/Collections;->synchronizedSet(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set;
-Ljava/util/Collections;->zeroLengthArray(Ljava/lang/Class;)[Ljava/lang/Object;
-Ljava/util/concurrent/AbstractExecutorService;->cancelAll(Ljava/util/ArrayList;)V
-Ljava/util/concurrent/AbstractExecutorService;->cancelAll(Ljava/util/ArrayList;I)V
-Ljava/util/concurrent/AbstractExecutorService;->doInvokeAny(Ljava/util/Collection;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->cursor:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->detach()V
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->DETACHED:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->distance(III)I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->incCursor(I)I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->incorporateDequeues()V
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->invalidated(IIJI)Z
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->isDetached()Z
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->lastItem:Ljava/lang/Object;
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->lastRet:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->nextIndex:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->nextItem:Ljava/lang/Object;
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->NONE:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->noNext()V
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->prevCycles:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->prevTakeIndex:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->REMOVED:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->removedAt(I)Z
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->shutdown()V
-Ljava/util/concurrent/ArrayBlockingQueue$Itr;->takeIndexWrapped()Z
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs$Node;->next:Ljava/util/concurrent/ArrayBlockingQueue$Itrs$Node;
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->cycles:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->doSomeSweeping(Z)V
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->elementDequeued()V
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->head:Ljava/util/concurrent/ArrayBlockingQueue$Itrs$Node;
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->LONG_SWEEP_PROBES:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->queueIsEmpty()V
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->register(Ljava/util/concurrent/ArrayBlockingQueue$Itr;)V
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->removedAt(I)V
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->SHORT_SWEEP_PROBES:I
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->sweeper:Ljava/util/concurrent/ArrayBlockingQueue$Itrs$Node;
-Ljava/util/concurrent/ArrayBlockingQueue$Itrs;->takeIndexWrapped()V
-Ljava/util/concurrent/ArrayBlockingQueue;->count:I
-Ljava/util/concurrent/ArrayBlockingQueue;->dec(I)I
-Ljava/util/concurrent/ArrayBlockingQueue;->dequeue()Ljava/lang/Object;
-Ljava/util/concurrent/ArrayBlockingQueue;->enqueue(Ljava/lang/Object;)V
-Ljava/util/concurrent/ArrayBlockingQueue;->itemAt(I)Ljava/lang/Object;
-Ljava/util/concurrent/ArrayBlockingQueue;->items:[Ljava/lang/Object;
-Ljava/util/concurrent/ArrayBlockingQueue;->itrs:Ljava/util/concurrent/ArrayBlockingQueue$Itrs;
-Ljava/util/concurrent/ArrayBlockingQueue;->lock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/ArrayBlockingQueue;->notEmpty:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/ArrayBlockingQueue;->notFull:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/ArrayBlockingQueue;->putIndex:I
-Ljava/util/concurrent/ArrayBlockingQueue;->removeAt(I)V
-Ljava/util/concurrent/ArrayBlockingQueue;->takeIndex:I
-Ljava/util/concurrent/atomic/AtomicBoolean;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicBoolean;->value:I
-Ljava/util/concurrent/atomic/AtomicBoolean;->VALUE:J
-Ljava/util/concurrent/atomic/AtomicInteger;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicInteger;->VALUE:J
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->ABASE:I
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->array:[I
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->ASHIFT:I
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->byteOffset(I)J
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->checkedByteOffset(I)J
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->compareAndSetRaw(JII)Z
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->getRaw(J)I
-Ljava/util/concurrent/atomic/AtomicIntegerArray;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->accessCheck(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->cclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->offset:J
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->tclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->throwAccessCheckException(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicLong;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicLong;->VALUE:J
-Ljava/util/concurrent/atomic/AtomicLong;->value:J
-Ljava/util/concurrent/atomic/AtomicLong;->VMSupportsCS8()Z
-Ljava/util/concurrent/atomic/AtomicLong;->VM_SUPPORTS_LONG_CAS:Z
-Ljava/util/concurrent/atomic/AtomicLongArray;->ABASE:I
-Ljava/util/concurrent/atomic/AtomicLongArray;->array:[J
-Ljava/util/concurrent/atomic/AtomicLongArray;->ASHIFT:I
-Ljava/util/concurrent/atomic/AtomicLongArray;->byteOffset(I)J
-Ljava/util/concurrent/atomic/AtomicLongArray;->checkedByteOffset(I)J
-Ljava/util/concurrent/atomic/AtomicLongArray;->compareAndSetRaw(JJJ)Z
-Ljava/util/concurrent/atomic/AtomicLongArray;->getRaw(J)J
-Ljava/util/concurrent/atomic/AtomicLongArray;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->accessCheck(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->cclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->offset:J
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->tclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->throwAccessCheckException(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;->accessCheck(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;->accessCheckException(Ljava/lang/Object;)Ljava/lang/RuntimeException;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;->cclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;->offset:J
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;->tclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$LockedUpdater;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;-><init>(Ljava/lang/Object;Z)V
-Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;->mark:Z
-Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;->of(Ljava/lang/Object;Z)Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;
-Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;->reference:Ljava/lang/Object;
-Ljava/util/concurrent/atomic/AtomicMarkableReference;->casPair(Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;)Z
-Ljava/util/concurrent/atomic/AtomicMarkableReference;->PAIR:J
-Ljava/util/concurrent/atomic/AtomicMarkableReference;->pair:Ljava/util/concurrent/atomic/AtomicMarkableReference$Pair;
-Ljava/util/concurrent/atomic/AtomicMarkableReference;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicReference;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicReference;->VALUE:J
-Ljava/util/concurrent/atomic/AtomicReference;->value:Ljava/lang/Object;
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->ABASE:I
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->ARRAY:J
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->array:[Ljava/lang/Object;
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->ASHIFT:I
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->byteOffset(I)J
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->checkedByteOffset(I)J
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->compareAndSetRaw(JLjava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->getRaw(J)Ljava/lang/Object;
-Ljava/util/concurrent/atomic/AtomicReferenceArray;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;-><init>(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)V
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->accessCheck(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->cclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->offset:J
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->tclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->throwAccessCheckException(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->throwCCE()V
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->valueCheck(Ljava/lang/Object;)V
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->vclass:Ljava/lang/Class;
-Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;-><init>(Ljava/lang/Object;I)V
-Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;->of(Ljava/lang/Object;I)Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;
-Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;->reference:Ljava/lang/Object;
-Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;->stamp:I
-Ljava/util/concurrent/atomic/AtomicStampedReference;->casPair(Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;)Z
-Ljava/util/concurrent/atomic/AtomicStampedReference;->PAIR:J
-Ljava/util/concurrent/atomic/AtomicStampedReference;->pair:Ljava/util/concurrent/atomic/AtomicStampedReference$Pair;
-Ljava/util/concurrent/atomic/AtomicStampedReference;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/DoubleAccumulator$SerializationProxy;-><init>(DLjava/util/function/DoubleBinaryOperator;J)V
-Ljava/util/concurrent/atomic/DoubleAccumulator$SerializationProxy;->function:Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/concurrent/atomic/DoubleAccumulator$SerializationProxy;->identity:J
-Ljava/util/concurrent/atomic/DoubleAccumulator$SerializationProxy;->value:D
-Ljava/util/concurrent/atomic/DoubleAccumulator;->function:Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/concurrent/atomic/DoubleAccumulator;->identity:J
-Ljava/util/concurrent/atomic/DoubleAdder$SerializationProxy;-><init>(Ljava/util/concurrent/atomic/DoubleAdder;)V
-Ljava/util/concurrent/atomic/DoubleAdder$SerializationProxy;->value:D
-Ljava/util/concurrent/atomic/LongAccumulator$SerializationProxy;-><init>(JLjava/util/function/LongBinaryOperator;J)V
-Ljava/util/concurrent/atomic/LongAccumulator$SerializationProxy;->function:Ljava/util/function/LongBinaryOperator;
-Ljava/util/concurrent/atomic/LongAccumulator$SerializationProxy;->identity:J
-Ljava/util/concurrent/atomic/LongAccumulator$SerializationProxy;->value:J
-Ljava/util/concurrent/atomic/LongAccumulator;->function:Ljava/util/function/LongBinaryOperator;
-Ljava/util/concurrent/atomic/LongAccumulator;->identity:J
-Ljava/util/concurrent/atomic/LongAdder$SerializationProxy;-><init>(Ljava/util/concurrent/atomic/LongAdder;)V
-Ljava/util/concurrent/atomic/LongAdder$SerializationProxy;->value:J
-Ljava/util/concurrent/atomic/Striped64$Cell;-><init>(J)V
-Ljava/util/concurrent/atomic/Striped64$Cell;->cas(JJ)Z
-Ljava/util/concurrent/atomic/Striped64$Cell;->reset()V
-Ljava/util/concurrent/atomic/Striped64$Cell;->reset(J)V
-Ljava/util/concurrent/atomic/Striped64$Cell;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/atomic/Striped64$Cell;->VALUE:J
-Ljava/util/concurrent/atomic/Striped64$Cell;->value:J
-Ljava/util/concurrent/atomic/Striped64;-><init>()V
-Ljava/util/concurrent/atomic/Striped64;->advanceProbe(I)I
-Ljava/util/concurrent/atomic/Striped64;->apply(Ljava/util/function/DoubleBinaryOperator;JD)J
-Ljava/util/concurrent/atomic/Striped64;->BASE:J
-Ljava/util/concurrent/atomic/Striped64;->base:J
-Ljava/util/concurrent/atomic/Striped64;->casBase(JJ)Z
-Ljava/util/concurrent/atomic/Striped64;->casCellsBusy()Z
-Ljava/util/concurrent/atomic/Striped64;->cells:[Ljava/util/concurrent/atomic/Striped64$Cell;
-Ljava/util/concurrent/atomic/Striped64;->cellsBusy:I
-Ljava/util/concurrent/atomic/Striped64;->CELLSBUSY:J
-Ljava/util/concurrent/atomic/Striped64;->doubleAccumulate(DLjava/util/function/DoubleBinaryOperator;Z)V
-Ljava/util/concurrent/atomic/Striped64;->getProbe()I
-Ljava/util/concurrent/atomic/Striped64;->longAccumulate(JLjava/util/function/LongBinaryOperator;Z)V
-Ljava/util/concurrent/atomic/Striped64;->NCPU:I
-Ljava/util/concurrent/atomic/Striped64;->PROBE:J
-Ljava/util/concurrent/atomic/Striped64;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/CompletableFuture$AltResult;-><init>(Ljava/lang/Throwable;)V
-Ljava/util/concurrent/CompletableFuture$AltResult;->ex:Ljava/lang/Throwable;
-Ljava/util/concurrent/CompletableFuture$AsyncRun;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;)V
-Ljava/util/concurrent/CompletableFuture$AsyncRun;->dep:Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$AsyncRun;->fn:Ljava/lang/Runnable;
-Ljava/util/concurrent/CompletableFuture$AsyncRun;->setRawResult(Ljava/lang/Void;)V
-Ljava/util/concurrent/CompletableFuture$AsyncSupply;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Supplier;)V
-Ljava/util/concurrent/CompletableFuture$AsyncSupply;->dep:Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$AsyncSupply;->fn:Ljava/util/function/Supplier;
-Ljava/util/concurrent/CompletableFuture$AsyncSupply;->setRawResult(Ljava/lang/Void;)V
-Ljava/util/concurrent/CompletableFuture$BiAccept;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiConsumer;)V
-Ljava/util/concurrent/CompletableFuture$BiAccept;->fn:Ljava/util/function/BiConsumer;
-Ljava/util/concurrent/CompletableFuture$BiAccept;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$BiApply;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/CompletableFuture$BiApply;->fn:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/CompletableFuture$BiApply;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$BiCompletion;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;)V
-Ljava/util/concurrent/CompletableFuture$BiCompletion;->snd:Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$BiRelay;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;)V
-Ljava/util/concurrent/CompletableFuture$BiRelay;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$BiRun;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;)V
-Ljava/util/concurrent/CompletableFuture$BiRun;->fn:Ljava/lang/Runnable;
-Ljava/util/concurrent/CompletableFuture$BiRun;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$Canceller;-><init>(Ljava/util/concurrent/Future;)V
-Ljava/util/concurrent/CompletableFuture$Canceller;->accept(Ljava/lang/Object;Ljava/lang/Throwable;)V
-Ljava/util/concurrent/CompletableFuture$Canceller;->f:Ljava/util/concurrent/Future;
-Ljava/util/concurrent/CompletableFuture$CoCompletion;-><init>(Ljava/util/concurrent/CompletableFuture$BiCompletion;)V
-Ljava/util/concurrent/CompletableFuture$CoCompletion;->base:Ljava/util/concurrent/CompletableFuture$BiCompletion;
-Ljava/util/concurrent/CompletableFuture$CoCompletion;->isLive()Z
-Ljava/util/concurrent/CompletableFuture$CoCompletion;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$Completion;-><init>()V
-Ljava/util/concurrent/CompletableFuture$Completion;->isLive()Z
-Ljava/util/concurrent/CompletableFuture$Completion;->next:Ljava/util/concurrent/CompletableFuture$Completion;
-Ljava/util/concurrent/CompletableFuture$Completion;->setRawResult(Ljava/lang/Void;)V
-Ljava/util/concurrent/CompletableFuture$Completion;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$DelayedCompleter;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/lang/Object;)V
-Ljava/util/concurrent/CompletableFuture$DelayedCompleter;->f:Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$DelayedCompleter;->u:Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture$DelayedExecutor;-><init>(JLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/Executor;)V
-Ljava/util/concurrent/CompletableFuture$DelayedExecutor;->delay:J
-Ljava/util/concurrent/CompletableFuture$DelayedExecutor;->executor:Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture$DelayedExecutor;->unit:Ljava/util/concurrent/TimeUnit;
-Ljava/util/concurrent/CompletableFuture$Delayer$DaemonThreadFactory;-><init>()V
-Ljava/util/concurrent/CompletableFuture$Delayer;-><init>()V
-Ljava/util/concurrent/CompletableFuture$Delayer;->delay(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
-Ljava/util/concurrent/CompletableFuture$Delayer;->delayer:Ljava/util/concurrent/ScheduledThreadPoolExecutor;
-Ljava/util/concurrent/CompletableFuture$MinimalStage;-><init>()V
-Ljava/util/concurrent/CompletableFuture$MinimalStage;-><init>(Ljava/lang/Object;)V
-Ljava/util/concurrent/CompletableFuture$MinimalStage;->completeAsync(Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$MinimalStage;->completeAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$MinimalStage;->completeOnTimeout(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$MinimalStage;->newIncompleteFuture()Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$MinimalStage;->orTimeout(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$OrAccept;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/CompletableFuture$OrAccept;->fn:Ljava/util/function/Consumer;
-Ljava/util/concurrent/CompletableFuture$OrAccept;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$OrApply;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;)V
-Ljava/util/concurrent/CompletableFuture$OrApply;->fn:Ljava/util/function/Function;
-Ljava/util/concurrent/CompletableFuture$OrApply;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$OrRelay;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;)V
-Ljava/util/concurrent/CompletableFuture$OrRelay;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$OrRun;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;)V
-Ljava/util/concurrent/CompletableFuture$OrRun;->fn:Ljava/lang/Runnable;
-Ljava/util/concurrent/CompletableFuture$OrRun;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$Signaller;-><init>(ZJJ)V
-Ljava/util/concurrent/CompletableFuture$Signaller;->deadline:J
-Ljava/util/concurrent/CompletableFuture$Signaller;->interrupted:Z
-Ljava/util/concurrent/CompletableFuture$Signaller;->interruptible:Z
-Ljava/util/concurrent/CompletableFuture$Signaller;->isLive()Z
-Ljava/util/concurrent/CompletableFuture$Signaller;->nanos:J
-Ljava/util/concurrent/CompletableFuture$Signaller;->thread:Ljava/lang/Thread;
-Ljava/util/concurrent/CompletableFuture$Signaller;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$TaskSubmitter;-><init>(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)V
-Ljava/util/concurrent/CompletableFuture$TaskSubmitter;->action:Ljava/lang/Runnable;
-Ljava/util/concurrent/CompletableFuture$TaskSubmitter;->executor:Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture$ThreadPerTaskExecutor;-><init>()V
-Ljava/util/concurrent/CompletableFuture$Timeout;-><init>(Ljava/util/concurrent/CompletableFuture;)V
-Ljava/util/concurrent/CompletableFuture$Timeout;->f:Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniAccept;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/CompletableFuture$UniAccept;->fn:Ljava/util/function/Consumer;
-Ljava/util/concurrent/CompletableFuture$UniAccept;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniApply;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;)V
-Ljava/util/concurrent/CompletableFuture$UniApply;->fn:Ljava/util/function/Function;
-Ljava/util/concurrent/CompletableFuture$UniApply;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniCompletion;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;)V
-Ljava/util/concurrent/CompletableFuture$UniCompletion;->claim()Z
-Ljava/util/concurrent/CompletableFuture$UniCompletion;->dep:Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniCompletion;->executor:Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture$UniCompletion;->isLive()Z
-Ljava/util/concurrent/CompletableFuture$UniCompletion;->src:Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniCompose;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;)V
-Ljava/util/concurrent/CompletableFuture$UniCompose;->fn:Ljava/util/function/Function;
-Ljava/util/concurrent/CompletableFuture$UniCompose;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniExceptionally;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;)V
-Ljava/util/concurrent/CompletableFuture$UniExceptionally;->fn:Ljava/util/function/Function;
-Ljava/util/concurrent/CompletableFuture$UniExceptionally;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniHandle;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/CompletableFuture$UniHandle;->fn:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/CompletableFuture$UniHandle;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniRelay;-><init>(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;)V
-Ljava/util/concurrent/CompletableFuture$UniRelay;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniRun;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;)V
-Ljava/util/concurrent/CompletableFuture$UniRun;->fn:Ljava/lang/Runnable;
-Ljava/util/concurrent/CompletableFuture$UniRun;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$UniWhenComplete;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiConsumer;)V
-Ljava/util/concurrent/CompletableFuture$UniWhenComplete;->fn:Ljava/util/function/BiConsumer;
-Ljava/util/concurrent/CompletableFuture$UniWhenComplete;->tryFire(I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;-><init>(Ljava/lang/Object;)V
-Ljava/util/concurrent/CompletableFuture;->andTree([Ljava/util/concurrent/CompletableFuture;II)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->ASYNC:I
-Ljava/util/concurrent/CompletableFuture;->asyncRunStage(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->asyncSupplyStage(Ljava/util/concurrent/Executor;Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->ASYNC_POOL:Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture;->biAccept(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiConsumer;Ljava/util/concurrent/CompletableFuture$BiAccept;)Z
-Ljava/util/concurrent/CompletableFuture;->biAcceptStage(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->biApply(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiFunction;Ljava/util/concurrent/CompletableFuture$BiApply;)Z
-Ljava/util/concurrent/CompletableFuture;->biApplyStage(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->bipush(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture$BiCompletion;)V
-Ljava/util/concurrent/CompletableFuture;->biRelay(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;)Z
-Ljava/util/concurrent/CompletableFuture;->biRun(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;Ljava/util/concurrent/CompletableFuture$BiRun;)Z
-Ljava/util/concurrent/CompletableFuture;->biRunStage(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->casStack(Ljava/util/concurrent/CompletableFuture$Completion;Ljava/util/concurrent/CompletableFuture$Completion;)Z
-Ljava/util/concurrent/CompletableFuture;->cleanStack()V
-Ljava/util/concurrent/CompletableFuture;->completeAsync(Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->completeAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->completedStage(Ljava/lang/Object;)Ljava/util/concurrent/CompletionStage;
-Ljava/util/concurrent/CompletableFuture;->completeNull()Z
-Ljava/util/concurrent/CompletableFuture;->completeOnTimeout(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->completeRelay(Ljava/lang/Object;)Z
-Ljava/util/concurrent/CompletableFuture;->completeThrowable(Ljava/lang/Throwable;)Z
-Ljava/util/concurrent/CompletableFuture;->completeThrowable(Ljava/lang/Throwable;Ljava/lang/Object;)Z
-Ljava/util/concurrent/CompletableFuture;->completeValue(Ljava/lang/Object;)Z
-Ljava/util/concurrent/CompletableFuture;->copy()Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->defaultExecutor()Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture;->delayedExecutor(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture;->delayedExecutor(JLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture;->encodeOutcome(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->encodeRelay(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->encodeThrowable(Ljava/lang/Throwable;)Ljava/util/concurrent/CompletableFuture$AltResult;
-Ljava/util/concurrent/CompletableFuture;->encodeThrowable(Ljava/lang/Throwable;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->encodeValue(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->failedFuture(Ljava/lang/Throwable;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->failedStage(Ljava/lang/Throwable;)Ljava/util/concurrent/CompletionStage;
-Ljava/util/concurrent/CompletableFuture;->internalComplete(Ljava/lang/Object;)Z
-Ljava/util/concurrent/CompletableFuture;->lazySetNext(Ljava/util/concurrent/CompletableFuture$Completion;Ljava/util/concurrent/CompletableFuture$Completion;)V
-Ljava/util/concurrent/CompletableFuture;->minimalCompletionStage()Ljava/util/concurrent/CompletionStage;
-Ljava/util/concurrent/CompletableFuture;->NESTED:I
-Ljava/util/concurrent/CompletableFuture;->newIncompleteFuture()Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->NEXT:J
-Ljava/util/concurrent/CompletableFuture;->NIL:Ljava/util/concurrent/CompletableFuture$AltResult;
-Ljava/util/concurrent/CompletableFuture;->orAccept(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Consumer;Ljava/util/concurrent/CompletableFuture$OrAccept;)Z
-Ljava/util/concurrent/CompletableFuture;->orAcceptStage(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->orApply(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;Ljava/util/concurrent/CompletableFuture$OrApply;)Z
-Ljava/util/concurrent/CompletableFuture;->orApplyStage(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->orpush(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture$BiCompletion;)V
-Ljava/util/concurrent/CompletableFuture;->orRelay(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;)Z
-Ljava/util/concurrent/CompletableFuture;->orRun(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;Ljava/util/concurrent/CompletableFuture$OrRun;)Z
-Ljava/util/concurrent/CompletableFuture;->orRunStage(Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->orTimeout(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->orTree([Ljava/util/concurrent/CompletableFuture;II)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->postComplete()V
-Ljava/util/concurrent/CompletableFuture;->postFire(Ljava/util/concurrent/CompletableFuture;I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->postFire(Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;I)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->push(Ljava/util/concurrent/CompletableFuture$UniCompletion;)V
-Ljava/util/concurrent/CompletableFuture;->pushStack(Ljava/util/concurrent/CompletableFuture$Completion;)V
-Ljava/util/concurrent/CompletableFuture;->reportGet(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->reportJoin(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->RESULT:J
-Ljava/util/concurrent/CompletableFuture;->result:Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->screenExecutor(Ljava/util/concurrent/Executor;)Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/CompletableFuture;->SPINS:I
-Ljava/util/concurrent/CompletableFuture;->STACK:J
-Ljava/util/concurrent/CompletableFuture;->stack:Ljava/util/concurrent/CompletableFuture$Completion;
-Ljava/util/concurrent/CompletableFuture;->SYNC:I
-Ljava/util/concurrent/CompletableFuture;->timedGet(J)Ljava/lang/Object;
-Ljava/util/concurrent/CompletableFuture;->tryPushStack(Ljava/util/concurrent/CompletableFuture$Completion;)Z
-Ljava/util/concurrent/CompletableFuture;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/CompletableFuture;->uniAccept(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Consumer;Ljava/util/concurrent/CompletableFuture$UniAccept;)Z
-Ljava/util/concurrent/CompletableFuture;->uniAcceptStage(Ljava/util/concurrent/Executor;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->uniApply(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;Ljava/util/concurrent/CompletableFuture$UniApply;)Z
-Ljava/util/concurrent/CompletableFuture;->uniApplyStage(Ljava/util/concurrent/Executor;Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->uniAsMinimalStage()Ljava/util/concurrent/CompletableFuture$MinimalStage;
-Ljava/util/concurrent/CompletableFuture;->uniCompose(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;Ljava/util/concurrent/CompletableFuture$UniCompose;)Z
-Ljava/util/concurrent/CompletableFuture;->uniComposeStage(Ljava/util/concurrent/Executor;Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->uniCopyStage()Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->uniExceptionally(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/Function;Ljava/util/concurrent/CompletableFuture$UniExceptionally;)Z
-Ljava/util/concurrent/CompletableFuture;->uniExceptionallyStage(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->uniHandle(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiFunction;Ljava/util/concurrent/CompletableFuture$UniHandle;)Z
-Ljava/util/concurrent/CompletableFuture;->uniHandleStage(Ljava/util/concurrent/Executor;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->uniRelay(Ljava/util/concurrent/CompletableFuture;)Z
-Ljava/util/concurrent/CompletableFuture;->uniRun(Ljava/util/concurrent/CompletableFuture;Ljava/lang/Runnable;Ljava/util/concurrent/CompletableFuture$UniRun;)Z
-Ljava/util/concurrent/CompletableFuture;->uniRunStage(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->uniWhenComplete(Ljava/util/concurrent/CompletableFuture;Ljava/util/function/BiConsumer;Ljava/util/concurrent/CompletableFuture$UniWhenComplete;)Z
-Ljava/util/concurrent/CompletableFuture;->uniWhenCompleteStage(Ljava/util/concurrent/Executor;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture;->USE_COMMON_POOL:Z
-Ljava/util/concurrent/CompletableFuture;->waitingGet(Z)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasNext()Z
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->lastReturned:Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->map:Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->remove()V
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->advance()Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->baseIndex:I
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->baseLimit:I
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->baseSize:I
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->batch:I
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->index:I
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->next:Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->pushState([Ljava/util/concurrent/ConcurrentHashMap$Node;II)V
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->recoverState(I)V
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->spare:Ljava/util/concurrent/ConcurrentHashMap$TableStack;
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->stack:Ljava/util/concurrent/ConcurrentHashMap$TableStack;
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;->tab:[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$CollectionView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$CollectionView;->getMap()Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/util/concurrent/ConcurrentHashMap$CollectionView;->map:Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/util/concurrent/ConcurrentHashMap$CollectionView;->OOME_MSG:Ljava/lang/String;
-Ljava/util/concurrent/ConcurrentHashMap$CounterCell;-><init>(J)V
-Ljava/util/concurrent/ConcurrentHashMap$CounterCell;->value:J
-Ljava/util/concurrent/ConcurrentHashMap$EntryIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;->add(Ljava/util/Map$Entry;)Z
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;->addAll(Ljava/util/Collection;)Z
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;->removeIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentHashMap$EntrySpliterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIIJLjava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$EntrySpliterator;->est:J
-Ljava/util/concurrent/ConcurrentHashMap$EntrySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$EntrySpliterator;->map:Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/util/concurrent/ConcurrentHashMap$EntrySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentHashMap$ForEachEntryTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachEntryTask;->action:Ljava/util/function/Consumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachKeyTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachKeyTask;->action:Ljava/util/function/Consumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachMappingTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/BiConsumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachMappingTask;->action:Ljava/util/function/BiConsumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedEntryTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Function;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedEntryTask;->action:Ljava/util/function/Consumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedEntryTask;->transformer:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedKeyTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Function;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedKeyTask;->action:Ljava/util/function/Consumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedKeyTask;->transformer:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedMappingTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/BiFunction;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedMappingTask;->action:Ljava/util/function/Consumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedMappingTask;->transformer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedValueTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Function;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedValueTask;->action:Ljava/util/function/Consumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedValueTask;->transformer:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachValueTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForEachValueTask;->action:Ljava/util/function/Consumer;
-Ljava/util/concurrent/ConcurrentHashMap$ForwardingNode;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-Ljava/util/concurrent/ConcurrentHashMap$ForwardingNode;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$ForwardingNode;->nextTable:[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$KeyIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$KeySetView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;Ljava/lang/Object;)V
-Ljava/util/concurrent/ConcurrentHashMap$KeySetView;->value:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$KeySpliterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIIJ)V
-Ljava/util/concurrent/ConcurrentHashMap$KeySpliterator;->est:J
-Ljava/util/concurrent/ConcurrentHashMap$KeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$KeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentHashMap$MapEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapEntry;->key:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$MapEntry;->map:Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/util/concurrent/ConcurrentHashMap$MapEntry;->val:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;Ljava/util/function/Function;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;->reducer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;->transformer:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;Ljava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;->basis:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;->reducer:Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;->result:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;->transformer:Ljava/util/function/ToDoubleFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;Ljava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;->basis:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;->reducer:Ljava/util/function/IntBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;->result:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;->transformer:Ljava/util/function/ToIntFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;Ljava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;->basis:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;->reducer:Ljava/util/function/LongBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;->result:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;->transformer:Ljava/util/function/ToLongFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;Ljava/util/function/Function;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;->reducer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;->transformer:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;Ljava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;->basis:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;->reducer:Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;->result:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;->transformer:Ljava/util/function/ToDoubleFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;Ljava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;->basis:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;->reducer:Ljava/util/function/IntBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;->result:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;->transformer:Ljava/util/function/ToIntFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;Ljava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;->basis:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;->reducer:Ljava/util/function/LongBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;->result:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;->transformer:Ljava/util/function/ToLongFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;Ljava/util/function/BiFunction;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;->reducer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;->transformer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;Ljava/util/function/ToDoubleBiFunction;DLjava/util/function/DoubleBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;->basis:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;->reducer:Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;->result:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;->transformer:Ljava/util/function/ToDoubleBiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;Ljava/util/function/ToIntBiFunction;ILjava/util/function/IntBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;->basis:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;->reducer:Ljava/util/function/IntBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;->result:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;->transformer:Ljava/util/function/ToIntBiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;Ljava/util/function/ToLongBiFunction;JLjava/util/function/LongBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;->basis:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;->reducer:Ljava/util/function/LongBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;->result:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;->transformer:Ljava/util/function/ToLongBiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;Ljava/util/function/Function;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;->reducer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;->transformer:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;Ljava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;->basis:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;->reducer:Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;->result:D
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;->transformer:Ljava/util/function/ToDoubleFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;Ljava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;->basis:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;->reducer:Ljava/util/function/IntBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;->result:I
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;->transformer:Ljava/util/function/ToIntFunction;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;Ljava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)V
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;->basis:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;->reducer:Ljava/util/function/LongBinaryOperator;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;->result:J
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;->transformer:Ljava/util/function/ToLongFunction;
-Ljava/util/concurrent/ConcurrentHashMap$Node;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-Ljava/util/concurrent/ConcurrentHashMap$Node;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$Node;->hash:I
-Ljava/util/concurrent/ConcurrentHashMap$Node;->key:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$Node;->next:Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$Node;->val:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;->reducer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;->result:Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;->reducer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;Ljava/util/function/BiFunction;)V
-Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;->nextRight:Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;->reducer:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;->rights:Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReservationNode;-><init>()V
-Ljava/util/concurrent/ConcurrentHashMap$ReservationNode;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$SearchEntriesTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Function;Ljava/util/concurrent/atomic/AtomicReference;)V
-Ljava/util/concurrent/ConcurrentHashMap$SearchEntriesTask;->result:Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/ConcurrentHashMap$SearchEntriesTask;->searchFunction:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$SearchKeysTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Function;Ljava/util/concurrent/atomic/AtomicReference;)V
-Ljava/util/concurrent/ConcurrentHashMap$SearchKeysTask;->result:Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/ConcurrentHashMap$SearchKeysTask;->searchFunction:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$SearchMappingsTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/BiFunction;Ljava/util/concurrent/atomic/AtomicReference;)V
-Ljava/util/concurrent/ConcurrentHashMap$SearchMappingsTask;->result:Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/ConcurrentHashMap$SearchMappingsTask;->searchFunction:Ljava/util/function/BiFunction;
-Ljava/util/concurrent/ConcurrentHashMap$SearchValuesTask;-><init>(Ljava/util/concurrent/ConcurrentHashMap$BulkTask;III[Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/function/Function;Ljava/util/concurrent/atomic/AtomicReference;)V
-Ljava/util/concurrent/ConcurrentHashMap$SearchValuesTask;->result:Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/ConcurrentHashMap$SearchValuesTask;->searchFunction:Ljava/util/function/Function;
-Ljava/util/concurrent/ConcurrentHashMap$Segment;-><init>(F)V
-Ljava/util/concurrent/ConcurrentHashMap$Segment;->loadFactor:F
-Ljava/util/concurrent/ConcurrentHashMap$TableStack;-><init>()V
-Ljava/util/concurrent/ConcurrentHashMap$TableStack;->index:I
-Ljava/util/concurrent/ConcurrentHashMap$TableStack;->length:I
-Ljava/util/concurrent/ConcurrentHashMap$TableStack;->next:Ljava/util/concurrent/ConcurrentHashMap$TableStack;
-Ljava/util/concurrent/ConcurrentHashMap$TableStack;->tab:[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;III)V
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->advance()Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->baseIndex:I
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->baseLimit:I
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->baseSize:I
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->index:I
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->next:Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->pushState([Ljava/util/concurrent/ConcurrentHashMap$Node;II)V
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->recoverState(I)V
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->spare:Ljava/util/concurrent/ConcurrentHashMap$TableStack;
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->stack:Ljava/util/concurrent/ConcurrentHashMap$TableStack;
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;->tab:[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;-><init>(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)V
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->balanceDeletion(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->balanceInsertion(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->checkInvariants(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Z
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->contendedLock()V
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->first:Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->lockRoot()V
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->lockState:I
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->LOCKSTATE:J
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->putTreeVal(ILjava/lang/Object;Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->READER:I
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->removeTreeNode(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Z
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->root:Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->rotateLeft(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->rotateRight(Ljava/util/concurrent/ConcurrentHashMap$TreeNode;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->tieBreakOrder(Ljava/lang/Object;Ljava/lang/Object;)I
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->unlockRoot()V
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->WAITER:I
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->waiter:Ljava/lang/Thread;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;->WRITER:I
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$TreeNode;)V
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;->find(ILjava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;->findTreeNode(ILjava/lang/Object;Ljava/lang/Class;)Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;->left:Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;->parent:Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;->prev:Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;->red:Z
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;->right:Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIILjava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$ValueSpliterator;-><init>([Ljava/util/concurrent/ConcurrentHashMap$Node;IIIJ)V
-Ljava/util/concurrent/ConcurrentHashMap$ValueSpliterator;->est:J
-Ljava/util/concurrent/ConcurrentHashMap$ValueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ValueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;-><init>(Ljava/util/concurrent/ConcurrentHashMap;)V
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;->add(Ljava/lang/Object;)Z
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;->addAll(Ljava/util/Collection;)Z
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;->removeIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentHashMap;->ABASE:I
-Ljava/util/concurrent/ConcurrentHashMap;->addCount(JI)V
-Ljava/util/concurrent/ConcurrentHashMap;->ASHIFT:I
-Ljava/util/concurrent/ConcurrentHashMap;->BASECOUNT:J
-Ljava/util/concurrent/ConcurrentHashMap;->baseCount:J
-Ljava/util/concurrent/ConcurrentHashMap;->batchFor(J)I
-Ljava/util/concurrent/ConcurrentHashMap;->casTabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$Node;)Z
-Ljava/util/concurrent/ConcurrentHashMap;->cellsBusy:I
-Ljava/util/concurrent/ConcurrentHashMap;->CELLSBUSY:J
-Ljava/util/concurrent/ConcurrentHashMap;->CELLVALUE:J
-Ljava/util/concurrent/ConcurrentHashMap;->comparableClassFor(Ljava/lang/Object;)Ljava/lang/Class;
-Ljava/util/concurrent/ConcurrentHashMap;->compareComparables(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;)I
-Ljava/util/concurrent/ConcurrentHashMap;->counterCells:[Ljava/util/concurrent/ConcurrentHashMap$CounterCell;
-Ljava/util/concurrent/ConcurrentHashMap;->DEFAULT_CAPACITY:I
-Ljava/util/concurrent/ConcurrentHashMap;->DEFAULT_CONCURRENCY_LEVEL:I
-Ljava/util/concurrent/ConcurrentHashMap;->entrySet:Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;
-Ljava/util/concurrent/ConcurrentHashMap;->fullAddCount(JZ)V
-Ljava/util/concurrent/ConcurrentHashMap;->HASH_BITS:I
-Ljava/util/concurrent/ConcurrentHashMap;->helpTransfer([Ljava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$Node;)[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap;->initTable()[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap;->keySet:Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
-Ljava/util/concurrent/ConcurrentHashMap;->LOAD_FACTOR:F
-Ljava/util/concurrent/ConcurrentHashMap;->MAXIMUM_CAPACITY:I
-Ljava/util/concurrent/ConcurrentHashMap;->MAX_ARRAY_SIZE:I
-Ljava/util/concurrent/ConcurrentHashMap;->MAX_RESIZERS:I
-Ljava/util/concurrent/ConcurrentHashMap;->MIN_TRANSFER_STRIDE:I
-Ljava/util/concurrent/ConcurrentHashMap;->MIN_TREEIFY_CAPACITY:I
-Ljava/util/concurrent/ConcurrentHashMap;->MOVED:I
-Ljava/util/concurrent/ConcurrentHashMap;->NCPU:I
-Ljava/util/concurrent/ConcurrentHashMap;->nextTable:[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap;->putVal(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap;->removeEntryIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentHashMap;->removeValueIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentHashMap;->RESERVED:I
-Ljava/util/concurrent/ConcurrentHashMap;->resizeStamp(I)I
-Ljava/util/concurrent/ConcurrentHashMap;->RESIZE_STAMP_BITS:I
-Ljava/util/concurrent/ConcurrentHashMap;->RESIZE_STAMP_SHIFT:I
-Ljava/util/concurrent/ConcurrentHashMap;->setTabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;)V
-Ljava/util/concurrent/ConcurrentHashMap;->sizeCtl:I
-Ljava/util/concurrent/ConcurrentHashMap;->SIZECTL:J
-Ljava/util/concurrent/ConcurrentHashMap;->spread(I)I
-Ljava/util/concurrent/ConcurrentHashMap;->sumCount()J
-Ljava/util/concurrent/ConcurrentHashMap;->tabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;I)Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap;->table:[Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap;->tableSizeFor(I)I
-Ljava/util/concurrent/ConcurrentHashMap;->transfer([Ljava/util/concurrent/ConcurrentHashMap$Node;[Ljava/util/concurrent/ConcurrentHashMap$Node;)V
-Ljava/util/concurrent/ConcurrentHashMap;->transferIndex:I
-Ljava/util/concurrent/ConcurrentHashMap;->TRANSFERINDEX:J
-Ljava/util/concurrent/ConcurrentHashMap;->TREEBIN:I
-Ljava/util/concurrent/ConcurrentHashMap;->treeifyBin([Ljava/util/concurrent/ConcurrentHashMap$Node;I)V
-Ljava/util/concurrent/ConcurrentHashMap;->TREEIFY_THRESHOLD:I
-Ljava/util/concurrent/ConcurrentHashMap;->tryPresize(I)V
-Ljava/util/concurrent/ConcurrentHashMap;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentHashMap;->untreeify(Ljava/util/concurrent/ConcurrentHashMap$Node;)Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap;->UNTREEIFY_THRESHOLD:I
-Ljava/util/concurrent/ConcurrentHashMap;->values:Ljava/util/concurrent/ConcurrentHashMap$ValuesView;
-Ljava/util/concurrent/ConcurrentLinkedDeque$AbstractItr;->advance()V
-Ljava/util/concurrent/ConcurrentLinkedDeque$AbstractItr;->lastRet:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$AbstractItr;->nextItem:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentLinkedDeque$AbstractItr;->nextNode(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$AbstractItr;->nextNode:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$AbstractItr;->startNode()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;-><init>(Ljava/util/concurrent/ConcurrentLinkedDeque;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;->batch:I
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;->current:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;->exhausted:Z
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;->MAX_BATCH:I
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;->queue:Ljava/util/concurrent/ConcurrentLinkedDeque;
-Ljava/util/concurrent/ConcurrentLinkedDeque$CLDSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentLinkedDeque$DescendingItr;->nextNode(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$DescendingItr;->startNode()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$Itr;->nextNode(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$Itr;->startNode()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;-><init>()V
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;-><init>(Ljava/lang/Object;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->casItem(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->casNext(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Z
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->casPrev(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Z
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->ITEM:J
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->item:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->lazySetNext(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->lazySetPrev(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->NEXT:J
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->next:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->PREV:J
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->prev:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque$Node;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->casHead(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Z
-Ljava/util/concurrent/ConcurrentLinkedDeque;->casTail(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Z
-Ljava/util/concurrent/ConcurrentLinkedDeque;->first()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->HEAD:J
-Ljava/util/concurrent/ConcurrentLinkedDeque;->head:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->HOPS:I
-Ljava/util/concurrent/ConcurrentLinkedDeque;->initHeadTail(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->last()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->linkFirst(Ljava/lang/Object;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->linkLast(Ljava/lang/Object;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->nextTerminator()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->NEXT_TERMINATOR:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->pred(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->prevTerminator()Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->PREV_TERMINATOR:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->screenNullResult(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->skipDeletedPredecessors(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->skipDeletedSuccessors(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->succ(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->TAIL:J
-Ljava/util/concurrent/ConcurrentLinkedDeque;->tail:Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->toArrayInternal([Ljava/lang/Object;)[Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentLinkedDeque;->unlink(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->unlinkFirst(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->unlinkLast(Ljava/util/concurrent/ConcurrentLinkedDeque$Node;Ljava/util/concurrent/ConcurrentLinkedDeque$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->updateHead()V
-Ljava/util/concurrent/ConcurrentLinkedDeque;->updateTail()V
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;-><init>(Ljava/util/concurrent/ConcurrentLinkedQueue;)V
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;->batch:I
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;->current:Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;->exhausted:Z
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;->MAX_BATCH:I
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;->queue:Ljava/util/concurrent/ConcurrentLinkedQueue;
-Ljava/util/concurrent/ConcurrentLinkedQueue$CLQSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentLinkedQueue$Itr;->lastRet:Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Itr;->nextItem:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Itr;->nextNode:Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Node;-><init>()V
-Ljava/util/concurrent/ConcurrentLinkedQueue$Node;->item:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Node;->next:Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->casHead(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)Z
-Ljava/util/concurrent/ConcurrentLinkedQueue;->casItem(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/concurrent/ConcurrentLinkedQueue;->casNext(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)Z
-Ljava/util/concurrent/ConcurrentLinkedQueue;->casTail(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)Z
-Ljava/util/concurrent/ConcurrentLinkedQueue;->first()Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->HEAD:J
-Ljava/util/concurrent/ConcurrentLinkedQueue;->head:Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->ITEM:J
-Ljava/util/concurrent/ConcurrentLinkedQueue;->lazySetNext(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)V
-Ljava/util/concurrent/ConcurrentLinkedQueue;->newNode(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->NEXT:J
-Ljava/util/concurrent/ConcurrentLinkedQueue;->succ(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->TAIL:J
-Ljava/util/concurrent/ConcurrentLinkedQueue;->tail:Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->toArrayInternal([Ljava/lang/Object;)[Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentLinkedQueue;->updateHead(Ljava/util/concurrent/ConcurrentLinkedQueue$Node;Ljava/util/concurrent/ConcurrentLinkedQueue$Node;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$CSLMSpliterator;-><init>(Ljava/util/Comparator;Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/lang/Object;I)V
-Ljava/util/concurrent/ConcurrentSkipListMap$CSLMSpliterator;->comparator:Ljava/util/Comparator;
-Ljava/util/concurrent/ConcurrentSkipListMap$CSLMSpliterator;->current:Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$CSLMSpliterator;->est:I
-Ljava/util/concurrent/ConcurrentSkipListMap$CSLMSpliterator;->estimateSize()J
-Ljava/util/concurrent/ConcurrentSkipListMap$CSLMSpliterator;->fence:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$CSLMSpliterator;->row:Ljava/util/concurrent/ConcurrentSkipListMap$Index;
-Ljava/util/concurrent/ConcurrentSkipListMap$EntrySet;-><init>(Ljava/util/concurrent/ConcurrentNavigableMap;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$EntrySet;->m:Ljava/util/concurrent/ConcurrentNavigableMap;
-Ljava/util/concurrent/ConcurrentSkipListMap$EntrySet;->removeIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$EntrySpliterator;-><init>(Ljava/util/Comparator;Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/lang/Object;I)V
-Ljava/util/concurrent/ConcurrentSkipListMap$EntrySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$EntrySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$HeadIndex;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Index;I)V
-Ljava/util/concurrent/ConcurrentSkipListMap$HeadIndex;->level:I
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Index;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->casRight(Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Index;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->down:Ljava/util/concurrent/ConcurrentSkipListMap$Index;
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->indexesDeletedNode()Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->link(Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Index;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->node:Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->RIGHT:J
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->right:Ljava/util/concurrent/ConcurrentSkipListMap$Index;
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentSkipListMap$Index;->unlink(Ljava/util/concurrent/ConcurrentSkipListMap$Index;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Iter;->advance()V
-Ljava/util/concurrent/ConcurrentSkipListMap$Iter;->lastReturned:Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$Iter;->next:Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$Iter;->nextValue:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;-><init>(Ljava/util/concurrent/ConcurrentNavigableMap;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->ceiling(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->floor(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->headSet(Ljava/lang/Object;)Ljava/util/NavigableSet;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->headSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->higher(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->lower(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->m:Ljava/util/concurrent/ConcurrentNavigableMap;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/NavigableSet;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->subSet(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableSet;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->tailSet(Ljava/lang/Object;)Ljava/util/NavigableSet;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;->tailSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySpliterator;-><init>(Ljava/util/Comparator;Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/lang/Object;I)V
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$KeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/concurrent/ConcurrentSkipListMap$Node;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap$Node;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->appendMarker(Ljava/util/concurrent/ConcurrentSkipListMap$Node;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->casNext(Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/util/concurrent/ConcurrentSkipListMap$Node;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->casValue(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->createSnapshot()Ljava/util/AbstractMap$SimpleImmutableEntry;
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->getValidValue()Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->helpDelete(Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/util/concurrent/ConcurrentSkipListMap$Node;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->isBaseHeader()Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->isMarker()Z
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->key:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->NEXT:J
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->next:Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->VALUE:J
-Ljava/util/concurrent/ConcurrentSkipListMap$Node;->value:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter;->advance()V
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter;->ascend()V
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter;->descend()V
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter;->lastReturned:Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter;->next:Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap$SubMapIter;->nextValue:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;-><init>(Ljava/util/concurrent/ConcurrentSkipListMap;Ljava/lang/Object;ZLjava/lang/Object;ZZ)V
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->checkKeyBounds(Ljava/lang/Object;Ljava/util/Comparator;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->entrySetView:Ljava/util/Set;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->getNearEntry(Ljava/lang/Object;I)Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->getNearKey(Ljava/lang/Object;I)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->hi:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->highestEntry()Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->highestKey()Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->hiInclusive:Z
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->hiNode(Ljava/util/Comparator;)Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->inBounds(Ljava/lang/Object;Ljava/util/Comparator;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->isBeforeEnd(Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/util/Comparator;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->isDescending:Z
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->keySetView:Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->lo:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->loInclusive:Z
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->loNode(Ljava/util/Comparator;)Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->lowestEntry()Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->lowestKey()Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->m:Ljava/util/concurrent/ConcurrentSkipListMap;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->newSubMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->removeHighest()Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->removeLowest()Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->tooHigh(Ljava/lang/Object;Ljava/util/Comparator;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->tooLow(Ljava/lang/Object;Ljava/util/Comparator;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->valuesView:Ljava/util/Collection;
-Ljava/util/concurrent/ConcurrentSkipListMap$Values;-><init>(Ljava/util/concurrent/ConcurrentNavigableMap;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$Values;->m:Ljava/util/concurrent/ConcurrentNavigableMap;
-Ljava/util/concurrent/ConcurrentSkipListMap$Values;->removeIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap$ValueSpliterator;-><init>(Ljava/util/Comparator;Ljava/util/concurrent/ConcurrentSkipListMap$Index;Ljava/util/concurrent/ConcurrentSkipListMap$Node;Ljava/lang/Object;I)V
-Ljava/util/concurrent/ConcurrentSkipListMap$ValueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/ConcurrentSkipListMap$ValueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap;->BASE_HEADER:Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap;->buildFromSorted(Ljava/util/SortedMap;)V
-Ljava/util/concurrent/ConcurrentSkipListMap;->casHead(Ljava/util/concurrent/ConcurrentSkipListMap$HeadIndex;Ljava/util/concurrent/ConcurrentSkipListMap$HeadIndex;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap;->clearIndexToFirst()V
-Ljava/util/concurrent/ConcurrentSkipListMap;->comparator:Ljava/util/Comparator;
-Ljava/util/concurrent/ConcurrentSkipListMap;->cpr(Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)I
-Ljava/util/concurrent/ConcurrentSkipListMap;->descendingMap:Ljava/util/concurrent/ConcurrentNavigableMap;
-Ljava/util/concurrent/ConcurrentSkipListMap;->doGet(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap;->doPut(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap;->doRemove(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/concurrent/ConcurrentSkipListMap;->doRemoveFirstEntry()Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentSkipListMap;->doRemoveLastEntry()Ljava/util/Map$Entry;
-Ljava/util/concurrent/ConcurrentSkipListMap;->entrySet:Ljava/util/concurrent/ConcurrentSkipListMap$EntrySet;
-Ljava/util/concurrent/ConcurrentSkipListMap;->entrySpliterator()Ljava/util/concurrent/ConcurrentSkipListMap$EntrySpliterator;
-Ljava/util/concurrent/ConcurrentSkipListMap;->EQ:I
-Ljava/util/concurrent/ConcurrentSkipListMap;->findFirst()Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap;->findLast()Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap;->findNear(Ljava/lang/Object;ILjava/util/Comparator;)Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap;->findNode(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap;->findPredecessor(Ljava/lang/Object;Ljava/util/Comparator;)Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap;->findPredecessorOfLast()Ljava/util/concurrent/ConcurrentSkipListMap$Node;
-Ljava/util/concurrent/ConcurrentSkipListMap;->getNear(Ljava/lang/Object;I)Ljava/util/AbstractMap$SimpleImmutableEntry;
-Ljava/util/concurrent/ConcurrentSkipListMap;->GT:I
-Ljava/util/concurrent/ConcurrentSkipListMap;->HEAD:J
-Ljava/util/concurrent/ConcurrentSkipListMap;->head:Ljava/util/concurrent/ConcurrentSkipListMap$HeadIndex;
-Ljava/util/concurrent/ConcurrentSkipListMap;->initialize()V
-Ljava/util/concurrent/ConcurrentSkipListMap;->keySet:Ljava/util/concurrent/ConcurrentSkipListMap$KeySet;
-Ljava/util/concurrent/ConcurrentSkipListMap;->keySpliterator()Ljava/util/concurrent/ConcurrentSkipListMap$KeySpliterator;
-Ljava/util/concurrent/ConcurrentSkipListMap;->LT:I
-Ljava/util/concurrent/ConcurrentSkipListMap;->removeEntryIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap;->removeValueIf(Ljava/util/function/Predicate;)Z
-Ljava/util/concurrent/ConcurrentSkipListMap;->toList(Ljava/util/Collection;)Ljava/util/List;
-Ljava/util/concurrent/ConcurrentSkipListMap;->tryReduceLevel()V
-Ljava/util/concurrent/ConcurrentSkipListMap;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ConcurrentSkipListMap;->values:Ljava/util/concurrent/ConcurrentSkipListMap$Values;
-Ljava/util/concurrent/ConcurrentSkipListMap;->valueSpliterator()Ljava/util/concurrent/ConcurrentSkipListMap$ValueSpliterator;
-Ljava/util/concurrent/ConcurrentSkipListSet;-><init>(Ljava/util/concurrent/ConcurrentNavigableMap;)V
-Ljava/util/concurrent/ConcurrentSkipListSet;->m:Ljava/util/concurrent/ConcurrentNavigableMap;
-Ljava/util/concurrent/ConcurrentSkipListSet;->MAP:J
-Ljava/util/concurrent/ConcurrentSkipListSet;->setMap(Ljava/util/concurrent/ConcurrentNavigableMap;)V
-Ljava/util/concurrent/ConcurrentSkipListSet;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;-><init>([Ljava/lang/Object;I)V
-Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;->cursor:I
-Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;->snapshot:[Ljava/lang/Object;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;-><init>(Ljava/util/concurrent/CopyOnWriteArrayList;II)V
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;->checkForComodification()V
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;->expectedArray:[Ljava/lang/Object;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;->l:Ljava/util/concurrent/CopyOnWriteArrayList;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;->offset:I
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;->rangeCheck(I)V
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubList;->size:I
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubListIterator;-><init>(Ljava/util/List;III)V
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubListIterator;->it:Ljava/util/ListIterator;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubListIterator;->offset:I
-Ljava/util/concurrent/CopyOnWriteArrayList$COWSubListIterator;->size:I
-Ljava/util/concurrent/CopyOnWriteArrayList;->addIfAbsent(Ljava/lang/Object;[Ljava/lang/Object;)Z
-Ljava/util/concurrent/CopyOnWriteArrayList;->get([Ljava/lang/Object;I)Ljava/lang/Object;
-Ljava/util/concurrent/CopyOnWriteArrayList;->getArray()[Ljava/lang/Object;
-Ljava/util/concurrent/CopyOnWriteArrayList;->indexOf(Ljava/lang/Object;[Ljava/lang/Object;II)I
-Ljava/util/concurrent/CopyOnWriteArrayList;->lastIndexOf(Ljava/lang/Object;[Ljava/lang/Object;I)I
-Ljava/util/concurrent/CopyOnWriteArrayList;->LOCK:J
-Ljava/util/concurrent/CopyOnWriteArrayList;->lock:Ljava/lang/Object;
-Ljava/util/concurrent/CopyOnWriteArrayList;->outOfBounds(II)Ljava/lang/String;
-Ljava/util/concurrent/CopyOnWriteArrayList;->remove(Ljava/lang/Object;[Ljava/lang/Object;I)Z
-Ljava/util/concurrent/CopyOnWriteArrayList;->removeRange(II)V
-Ljava/util/concurrent/CopyOnWriteArrayList;->resetLock()V
-Ljava/util/concurrent/CopyOnWriteArrayList;->setArray([Ljava/lang/Object;)V
-Ljava/util/concurrent/CopyOnWriteArrayList;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/CopyOnWriteArraySet;->compareSets([Ljava/lang/Object;Ljava/util/Set;)I
-Ljava/util/concurrent/CountDownLatch$Sync;-><init>(I)V
-Ljava/util/concurrent/CountDownLatch$Sync;->getCount()I
-Ljava/util/concurrent/CountDownLatch;->sync:Ljava/util/concurrent/CountDownLatch$Sync;
-Ljava/util/concurrent/CountedCompleter;->completer:Ljava/util/concurrent/CountedCompleter;
-Ljava/util/concurrent/CountedCompleter;->internalPropagateException(Ljava/lang/Throwable;)V
-Ljava/util/concurrent/CountedCompleter;->pending:I
-Ljava/util/concurrent/CountedCompleter;->PENDING:J
-Ljava/util/concurrent/CountedCompleter;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/CyclicBarrier$Generation;-><init>()V
-Ljava/util/concurrent/CyclicBarrier$Generation;->broken:Z
-Ljava/util/concurrent/CyclicBarrier;->barrierCommand:Ljava/lang/Runnable;
-Ljava/util/concurrent/CyclicBarrier;->breakBarrier()V
-Ljava/util/concurrent/CyclicBarrier;->count:I
-Ljava/util/concurrent/CyclicBarrier;->dowait(ZJ)I
-Ljava/util/concurrent/CyclicBarrier;->generation:Ljava/util/concurrent/CyclicBarrier$Generation;
-Ljava/util/concurrent/CyclicBarrier;->lock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/CyclicBarrier;->nextGeneration()V
-Ljava/util/concurrent/CyclicBarrier;->parties:I
-Ljava/util/concurrent/CyclicBarrier;->trip:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/DelayQueue$Itr;->array:[Ljava/lang/Object;
-Ljava/util/concurrent/DelayQueue$Itr;->cursor:I
-Ljava/util/concurrent/DelayQueue$Itr;->lastRet:I
-Ljava/util/concurrent/DelayQueue;->available:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/DelayQueue;->leader:Ljava/lang/Thread;
-Ljava/util/concurrent/DelayQueue;->lock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/DelayQueue;->peekExpired()Ljava/util/concurrent/Delayed;
-Ljava/util/concurrent/DelayQueue;->q:Ljava/util/PriorityQueue;
-Ljava/util/concurrent/DelayQueue;->removeEQ(Ljava/lang/Object;)V
-Ljava/util/concurrent/Exchanger$Node;-><init>()V
-Ljava/util/concurrent/Exchanger$Node;->bound:I
-Ljava/util/concurrent/Exchanger$Node;->collides:I
-Ljava/util/concurrent/Exchanger$Node;->hash:I
-Ljava/util/concurrent/Exchanger$Node;->index:I
-Ljava/util/concurrent/Exchanger$Node;->item:Ljava/lang/Object;
-Ljava/util/concurrent/Exchanger$Node;->match:Ljava/lang/Object;
-Ljava/util/concurrent/Exchanger$Node;->parked:Ljava/lang/Thread;
-Ljava/util/concurrent/Exchanger$Participant;-><init>()V
-Ljava/util/concurrent/Exchanger;->ABASE:I
-Ljava/util/concurrent/Exchanger;->arena:[Ljava/util/concurrent/Exchanger$Node;
-Ljava/util/concurrent/Exchanger;->arenaExchange(Ljava/lang/Object;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/Exchanger;->ASHIFT:I
-Ljava/util/concurrent/Exchanger;->BLOCKER:J
-Ljava/util/concurrent/Exchanger;->bound:I
-Ljava/util/concurrent/Exchanger;->BOUND:J
-Ljava/util/concurrent/Exchanger;->FULL:I
-Ljava/util/concurrent/Exchanger;->MATCH:J
-Ljava/util/concurrent/Exchanger;->MMASK:I
-Ljava/util/concurrent/Exchanger;->NCPU:I
-Ljava/util/concurrent/Exchanger;->NULL_ITEM:Ljava/lang/Object;
-Ljava/util/concurrent/Exchanger;->participant:Ljava/util/concurrent/Exchanger$Participant;
-Ljava/util/concurrent/Exchanger;->SEQ:I
-Ljava/util/concurrent/Exchanger;->SLOT:J
-Ljava/util/concurrent/Exchanger;->slot:Ljava/util/concurrent/Exchanger$Node;
-Ljava/util/concurrent/Exchanger;->slotExchange(Ljava/lang/Object;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/Exchanger;->SPINS:I
-Ljava/util/concurrent/Exchanger;->TIMED_OUT:Ljava/lang/Object;
-Ljava/util/concurrent/Exchanger;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ExecutorCompletionService$QueueingFuture;-><init>(Ljava/util/concurrent/RunnableFuture;Ljava/util/concurrent/BlockingQueue;)V
-Ljava/util/concurrent/ExecutorCompletionService$QueueingFuture;->completionQueue:Ljava/util/concurrent/BlockingQueue;
-Ljava/util/concurrent/ExecutorCompletionService$QueueingFuture;->task:Ljava/util/concurrent/Future;
-Ljava/util/concurrent/ExecutorCompletionService;->aes:Ljava/util/concurrent/AbstractExecutorService;
-Ljava/util/concurrent/ExecutorCompletionService;->completionQueue:Ljava/util/concurrent/BlockingQueue;
-Ljava/util/concurrent/ExecutorCompletionService;->executor:Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/ExecutorCompletionService;->newTaskFor(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/RunnableFuture;
-Ljava/util/concurrent/ExecutorCompletionService;->newTaskFor(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/RunnableFuture;
-Ljava/util/concurrent/Executors$DefaultThreadFactory;-><init>()V
-Ljava/util/concurrent/Executors$DefaultThreadFactory;->group:Ljava/lang/ThreadGroup;
-Ljava/util/concurrent/Executors$DefaultThreadFactory;->namePrefix:Ljava/lang/String;
-Ljava/util/concurrent/Executors$DefaultThreadFactory;->poolNumber:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/concurrent/Executors$DefaultThreadFactory;->threadNumber:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/concurrent/Executors$DelegatedExecutorService;-><init>(Ljava/util/concurrent/ExecutorService;)V
-Ljava/util/concurrent/Executors$DelegatedExecutorService;->e:Ljava/util/concurrent/ExecutorService;
-Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;-><init>(Ljava/util/concurrent/ScheduledExecutorService;)V
-Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;->e:Ljava/util/concurrent/ScheduledExecutorService;
-Ljava/util/concurrent/Executors$FinalizableDelegatedExecutorService;-><init>(Ljava/util/concurrent/ExecutorService;)V
-Ljava/util/concurrent/Executors$PrivilegedCallable;-><init>(Ljava/util/concurrent/Callable;)V
-Ljava/util/concurrent/Executors$PrivilegedCallable;->acc:Ljava/security/AccessControlContext;
-Ljava/util/concurrent/Executors$PrivilegedCallable;->task:Ljava/util/concurrent/Callable;
-Ljava/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader;-><init>(Ljava/util/concurrent/Callable;)V
-Ljava/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader;->acc:Ljava/security/AccessControlContext;
-Ljava/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader;->ccl:Ljava/lang/ClassLoader;
-Ljava/util/concurrent/Executors$PrivilegedCallableUsingCurrentClassLoader;->task:Ljava/util/concurrent/Callable;
-Ljava/util/concurrent/Executors$PrivilegedThreadFactory;-><init>()V
-Ljava/util/concurrent/Executors$PrivilegedThreadFactory;->acc:Ljava/security/AccessControlContext;
-Ljava/util/concurrent/Executors$PrivilegedThreadFactory;->ccl:Ljava/lang/ClassLoader;
-Ljava/util/concurrent/Executors$RunnableAdapter;-><init>(Ljava/lang/Runnable;Ljava/lang/Object;)V
-Ljava/util/concurrent/Executors$RunnableAdapter;->result:Ljava/lang/Object;
-Ljava/util/concurrent/Executors;-><init>()V
-Ljava/util/concurrent/ForkJoinPool$AuxState;-><init>()V
-Ljava/util/concurrent/ForkJoinPool$AuxState;->indexSeed:J
-Ljava/util/concurrent/ForkJoinPool$AuxState;->stealCount:J
-Ljava/util/concurrent/ForkJoinPool$DefaultForkJoinWorkerThreadFactory;-><init>()V
-Ljava/util/concurrent/ForkJoinPool$EmptyTask;-><init>()V
-Ljava/util/concurrent/ForkJoinPool$EmptyTask;->setRawResult(Ljava/lang/Void;)V
-Ljava/util/concurrent/ForkJoinPool$InnocuousForkJoinWorkerThreadFactory;-><init>()V
-Ljava/util/concurrent/ForkJoinPool$InnocuousForkJoinWorkerThreadFactory;->innocuousAcc:Ljava/security/AccessControlContext;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;-><init>(Ljava/util/concurrent/ForkJoinPool;Ljava/util/concurrent/ForkJoinWorkerThread;)V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->ABASE:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->array:[Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->ASHIFT:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->base:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->cancelAll()V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->config:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->currentJoin:Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->currentSteal:Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->getPoolIndex()I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->growAndSharedPush(Ljava/util/concurrent/ForkJoinTask;)V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->growArray()[Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->hint:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->INITIAL_QUEUE_CAPACITY:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->isApparentlyUnblocked()Z
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->isEmpty()Z
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->localPollAndExec()V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->localPopAndExec()V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->MAXIMUM_QUEUE_CAPACITY:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->nextLocalTask()Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->nsteals:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->owner:Ljava/util/concurrent/ForkJoinWorkerThread;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->parker:Ljava/lang/Thread;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->peek()Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->poll()Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->pollAndExecCC(Ljava/util/concurrent/CountedCompleter;)I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->pollAt(I)Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->pool:Ljava/util/concurrent/ForkJoinPool;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->pop()Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->popCC(Ljava/util/concurrent/CountedCompleter;I)Ljava/util/concurrent/CountedCompleter;
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->push(Ljava/util/concurrent/ForkJoinTask;)V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->qlock:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->QLOCK:J
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->queueSize()I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->runTask(Ljava/util/concurrent/ForkJoinTask;)V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->scanState:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->sharedPush(Ljava/util/concurrent/ForkJoinTask;)I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->stackPred:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->top:I
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->transferStealCount(Ljava/util/concurrent/ForkJoinPool;)V
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->tryRemoveAndExec(Ljava/util/concurrent/ForkJoinTask;)Z
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->trySharedUnpush(Ljava/util/concurrent/ForkJoinTask;)Z
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->tryUnpush(Ljava/util/concurrent/ForkJoinTask;)Z
-Ljava/util/concurrent/ForkJoinPool$WorkQueue;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ForkJoinPool;-><init>(ILjava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;Ljava/lang/Thread$UncaughtExceptionHandler;ILjava/lang/String;)V
-Ljava/util/concurrent/ForkJoinPool;->ABASE:I
-Ljava/util/concurrent/ForkJoinPool;->AC_MASK:J
-Ljava/util/concurrent/ForkJoinPool;->AC_SHIFT:I
-Ljava/util/concurrent/ForkJoinPool;->AC_UNIT:J
-Ljava/util/concurrent/ForkJoinPool;->ADD_WORKER:J
-Ljava/util/concurrent/ForkJoinPool;->ASHIFT:I
-Ljava/util/concurrent/ForkJoinPool;->auxState:Ljava/util/concurrent/ForkJoinPool$AuxState;
-Ljava/util/concurrent/ForkJoinPool;->awaitJoin(Ljava/util/concurrent/ForkJoinPool$WorkQueue;Ljava/util/concurrent/ForkJoinTask;J)I
-Ljava/util/concurrent/ForkJoinPool;->awaitWork(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)I
-Ljava/util/concurrent/ForkJoinPool;->checkFactory(Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;)Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;
-Ljava/util/concurrent/ForkJoinPool;->checkParallelism(I)I
-Ljava/util/concurrent/ForkJoinPool;->checkPermission()V
-Ljava/util/concurrent/ForkJoinPool;->common:Ljava/util/concurrent/ForkJoinPool;
-Ljava/util/concurrent/ForkJoinPool;->commonSubmitterQueue()Ljava/util/concurrent/ForkJoinPool$WorkQueue;
-Ljava/util/concurrent/ForkJoinPool;->COMMON_MAX_SPARES:I
-Ljava/util/concurrent/ForkJoinPool;->COMMON_PARALLELISM:I
-Ljava/util/concurrent/ForkJoinPool;->config:I
-Ljava/util/concurrent/ForkJoinPool;->createWorker(Z)Z
-Ljava/util/concurrent/ForkJoinPool;->CTL:J
-Ljava/util/concurrent/ForkJoinPool;->ctl:J
-Ljava/util/concurrent/ForkJoinPool;->DEFAULT_COMMON_MAX_SPARES:I
-Ljava/util/concurrent/ForkJoinPool;->deregisterWorker(Ljava/util/concurrent/ForkJoinWorkerThread;Ljava/lang/Throwable;)V
-Ljava/util/concurrent/ForkJoinPool;->EVENMASK:I
-Ljava/util/concurrent/ForkJoinPool;->externalHelpComplete(Ljava/util/concurrent/CountedCompleter;I)I
-Ljava/util/concurrent/ForkJoinPool;->externalPush(Ljava/util/concurrent/ForkJoinTask;)V
-Ljava/util/concurrent/ForkJoinPool;->externalSubmit(Ljava/util/concurrent/ForkJoinTask;)Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool;->factory:Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;
-Ljava/util/concurrent/ForkJoinPool;->FIFO_QUEUE:I
-Ljava/util/concurrent/ForkJoinPool;->findNonEmptyStealQueue()Ljava/util/concurrent/ForkJoinPool$WorkQueue;
-Ljava/util/concurrent/ForkJoinPool;->getSurplusQueuedTaskCount()I
-Ljava/util/concurrent/ForkJoinPool;->helpComplete(Ljava/util/concurrent/ForkJoinPool$WorkQueue;Ljava/util/concurrent/CountedCompleter;I)I
-Ljava/util/concurrent/ForkJoinPool;->helpQuiescePool(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V
-Ljava/util/concurrent/ForkJoinPool;->helpStealer(Ljava/util/concurrent/ForkJoinPool$WorkQueue;Ljava/util/concurrent/ForkJoinTask;)V
-Ljava/util/concurrent/ForkJoinPool;->IDLE_TIMEOUT_MS:J
-Ljava/util/concurrent/ForkJoinPool;->inactivate(Ljava/util/concurrent/ForkJoinPool$WorkQueue;I)V
-Ljava/util/concurrent/ForkJoinPool;->IS_OWNED:I
-Ljava/util/concurrent/ForkJoinPool;->LIFO_QUEUE:I
-Ljava/util/concurrent/ForkJoinPool;->makeCommonPool()Ljava/util/concurrent/ForkJoinPool;
-Ljava/util/concurrent/ForkJoinPool;->MAX_CAP:I
-Ljava/util/concurrent/ForkJoinPool;->MODE_MASK:I
-Ljava/util/concurrent/ForkJoinPool;->modifyThreadPermission:Ljava/lang/RuntimePermission;
-Ljava/util/concurrent/ForkJoinPool;->nextPoolId()I
-Ljava/util/concurrent/ForkJoinPool;->nextTaskFor(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinPool;->POLL_LIMIT:I
-Ljava/util/concurrent/ForkJoinPool;->poolNumberSequence:I
-Ljava/util/concurrent/ForkJoinPool;->quiesceCommonPool()V
-Ljava/util/concurrent/ForkJoinPool;->registerWorker(Ljava/util/concurrent/ForkJoinWorkerThread;)Ljava/util/concurrent/ForkJoinPool$WorkQueue;
-Ljava/util/concurrent/ForkJoinPool;->runState:I
-Ljava/util/concurrent/ForkJoinPool;->RUNSTATE:J
-Ljava/util/concurrent/ForkJoinPool;->runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V
-Ljava/util/concurrent/ForkJoinPool;->scan(Ljava/util/concurrent/ForkJoinPool$WorkQueue;III)I
-Ljava/util/concurrent/ForkJoinPool;->SEED_INCREMENT:I
-Ljava/util/concurrent/ForkJoinPool;->SHUTDOWN:I
-Ljava/util/concurrent/ForkJoinPool;->signalWork()V
-Ljava/util/concurrent/ForkJoinPool;->SMASK:I
-Ljava/util/concurrent/ForkJoinPool;->SPARE_WORKER:I
-Ljava/util/concurrent/ForkJoinPool;->SP_MASK:J
-Ljava/util/concurrent/ForkJoinPool;->SQMASK:I
-Ljava/util/concurrent/ForkJoinPool;->SS_SEQ:I
-Ljava/util/concurrent/ForkJoinPool;->STARTED:I
-Ljava/util/concurrent/ForkJoinPool;->STOP:I
-Ljava/util/concurrent/ForkJoinPool;->TC_MASK:J
-Ljava/util/concurrent/ForkJoinPool;->TC_SHIFT:I
-Ljava/util/concurrent/ForkJoinPool;->TC_UNIT:J
-Ljava/util/concurrent/ForkJoinPool;->TERMINATED:I
-Ljava/util/concurrent/ForkJoinPool;->timedAwaitWork(Ljava/util/concurrent/ForkJoinPool$WorkQueue;J)I
-Ljava/util/concurrent/ForkJoinPool;->TIMEOUT_SLOP_MS:J
-Ljava/util/concurrent/ForkJoinPool;->tryAddWorker(J)V
-Ljava/util/concurrent/ForkJoinPool;->tryCompensate(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)Z
-Ljava/util/concurrent/ForkJoinPool;->tryCreateExternalQueue(I)V
-Ljava/util/concurrent/ForkJoinPool;->tryDropSpare(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)Z
-Ljava/util/concurrent/ForkJoinPool;->tryExternalUnpush(Ljava/util/concurrent/ForkJoinTask;)Z
-Ljava/util/concurrent/ForkJoinPool;->tryInitialize(Z)V
-Ljava/util/concurrent/ForkJoinPool;->tryReactivate(Ljava/util/concurrent/ForkJoinPool$WorkQueue;[Ljava/util/concurrent/ForkJoinPool$WorkQueue;I)V
-Ljava/util/concurrent/ForkJoinPool;->tryRelease(JLjava/util/concurrent/ForkJoinPool$WorkQueue;J)Z
-Ljava/util/concurrent/ForkJoinPool;->tryTerminate(ZZ)I
-Ljava/util/concurrent/ForkJoinPool;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ForkJoinPool;->UC_MASK:J
-Ljava/util/concurrent/ForkJoinPool;->ueh:Ljava/lang/Thread$UncaughtExceptionHandler;
-Ljava/util/concurrent/ForkJoinPool;->UNREGISTERED:I
-Ljava/util/concurrent/ForkJoinPool;->UNSIGNALLED:I
-Ljava/util/concurrent/ForkJoinPool;->workerNamePrefix:Ljava/lang/String;
-Ljava/util/concurrent/ForkJoinPool;->workQueues:[Ljava/util/concurrent/ForkJoinPool$WorkQueue;
-Ljava/util/concurrent/ForkJoinTask$AdaptedCallable;-><init>(Ljava/util/concurrent/Callable;)V
-Ljava/util/concurrent/ForkJoinTask$AdaptedCallable;->callable:Ljava/util/concurrent/Callable;
-Ljava/util/concurrent/ForkJoinTask$AdaptedCallable;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ForkJoinTask$AdaptedCallable;->setRawResult(Ljava/lang/Object;)V
-Ljava/util/concurrent/ForkJoinTask$AdaptedRunnable;-><init>(Ljava/lang/Runnable;Ljava/lang/Object;)V
-Ljava/util/concurrent/ForkJoinTask$AdaptedRunnable;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ForkJoinTask$AdaptedRunnable;->runnable:Ljava/lang/Runnable;
-Ljava/util/concurrent/ForkJoinTask$AdaptedRunnable;->setRawResult(Ljava/lang/Object;)V
-Ljava/util/concurrent/ForkJoinTask$AdaptedRunnableAction;-><init>(Ljava/lang/Runnable;)V
-Ljava/util/concurrent/ForkJoinTask$AdaptedRunnableAction;->runnable:Ljava/lang/Runnable;
-Ljava/util/concurrent/ForkJoinTask$AdaptedRunnableAction;->setRawResult(Ljava/lang/Void;)V
-Ljava/util/concurrent/ForkJoinTask$ExceptionNode;-><init>(Ljava/util/concurrent/ForkJoinTask;Ljava/lang/Throwable;Ljava/util/concurrent/ForkJoinTask$ExceptionNode;Ljava/lang/ref/ReferenceQueue;)V
-Ljava/util/concurrent/ForkJoinTask$ExceptionNode;->ex:Ljava/lang/Throwable;
-Ljava/util/concurrent/ForkJoinTask$ExceptionNode;->hashCode:I
-Ljava/util/concurrent/ForkJoinTask$ExceptionNode;->next:Ljava/util/concurrent/ForkJoinTask$ExceptionNode;
-Ljava/util/concurrent/ForkJoinTask$ExceptionNode;->thrower:J
-Ljava/util/concurrent/ForkJoinTask$RunnableExecuteAction;-><init>(Ljava/lang/Runnable;)V
-Ljava/util/concurrent/ForkJoinTask$RunnableExecuteAction;->internalPropagateException(Ljava/lang/Throwable;)V
-Ljava/util/concurrent/ForkJoinTask$RunnableExecuteAction;->runnable:Ljava/lang/Runnable;
-Ljava/util/concurrent/ForkJoinTask$RunnableExecuteAction;->setRawResult(Ljava/lang/Void;)V
-Ljava/util/concurrent/ForkJoinTask;->cancelIgnoringExceptions(Ljava/util/concurrent/ForkJoinTask;)V
-Ljava/util/concurrent/ForkJoinTask;->CANCELLED:I
-Ljava/util/concurrent/ForkJoinTask;->clearExceptionalCompletion()V
-Ljava/util/concurrent/ForkJoinTask;->doExec()I
-Ljava/util/concurrent/ForkJoinTask;->doInvoke()I
-Ljava/util/concurrent/ForkJoinTask;->doJoin()I
-Ljava/util/concurrent/ForkJoinTask;->DONE_MASK:I
-Ljava/util/concurrent/ForkJoinTask;->EXCEPTIONAL:I
-Ljava/util/concurrent/ForkJoinTask;->exceptionTable:[Ljava/util/concurrent/ForkJoinTask$ExceptionNode;
-Ljava/util/concurrent/ForkJoinTask;->exceptionTableLock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/ForkJoinTask;->exceptionTableRefQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/util/concurrent/ForkJoinTask;->EXCEPTION_MAP_CAPACITY:I
-Ljava/util/concurrent/ForkJoinTask;->expungeStaleExceptions()V
-Ljava/util/concurrent/ForkJoinTask;->externalAwaitDone()I
-Ljava/util/concurrent/ForkJoinTask;->externalInterruptibleAwaitDone()I
-Ljava/util/concurrent/ForkJoinTask;->getThrowableException()Ljava/lang/Throwable;
-Ljava/util/concurrent/ForkJoinTask;->helpExpungeStaleExceptions()V
-Ljava/util/concurrent/ForkJoinTask;->internalPropagateException(Ljava/lang/Throwable;)V
-Ljava/util/concurrent/ForkJoinTask;->internalWait(J)V
-Ljava/util/concurrent/ForkJoinTask;->NORMAL:I
-Ljava/util/concurrent/ForkJoinTask;->pollSubmission()Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinTask;->recordExceptionalCompletion(Ljava/lang/Throwable;)I
-Ljava/util/concurrent/ForkJoinTask;->reportException(I)V
-Ljava/util/concurrent/ForkJoinTask;->rethrow(Ljava/lang/Throwable;)V
-Ljava/util/concurrent/ForkJoinTask;->setCompletion(I)I
-Ljava/util/concurrent/ForkJoinTask;->setExceptionalCompletion(Ljava/lang/Throwable;)I
-Ljava/util/concurrent/ForkJoinTask;->SIGNAL:I
-Ljava/util/concurrent/ForkJoinTask;->SMASK:I
-Ljava/util/concurrent/ForkJoinTask;->status:I
-Ljava/util/concurrent/ForkJoinTask;->STATUS:J
-Ljava/util/concurrent/ForkJoinTask;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ForkJoinTask;->uncheckedThrow(Ljava/lang/Throwable;)V
-Ljava/util/concurrent/ForkJoinWorkerThread$InnocuousForkJoinWorkerThread;-><init>(Ljava/util/concurrent/ForkJoinPool;)V
-Ljava/util/concurrent/ForkJoinWorkerThread$InnocuousForkJoinWorkerThread;->afterTopLevelExec()V
-Ljava/util/concurrent/ForkJoinWorkerThread$InnocuousForkJoinWorkerThread;->createThreadGroup()Ljava/lang/ThreadGroup;
-Ljava/util/concurrent/ForkJoinWorkerThread$InnocuousForkJoinWorkerThread;->innocuousThreadGroup:Ljava/lang/ThreadGroup;
-Ljava/util/concurrent/ForkJoinWorkerThread$InnocuousForkJoinWorkerThread;->INNOCUOUS_ACC:Ljava/security/AccessControlContext;
-Ljava/util/concurrent/ForkJoinWorkerThread;-><init>(Ljava/util/concurrent/ForkJoinPool;Ljava/lang/ThreadGroup;Ljava/security/AccessControlContext;)V
-Ljava/util/concurrent/ForkJoinWorkerThread;->afterTopLevelExec()V
-Ljava/util/concurrent/ForkJoinWorkerThread;->eraseThreadLocals()V
-Ljava/util/concurrent/ForkJoinWorkerThread;->INHERITABLETHREADLOCALS:J
-Ljava/util/concurrent/ForkJoinWorkerThread;->INHERITEDACCESSCONTROLCONTEXT:J
-Ljava/util/concurrent/ForkJoinWorkerThread;->pool:Ljava/util/concurrent/ForkJoinPool;
-Ljava/util/concurrent/ForkJoinWorkerThread;->THREADLOCALS:J
-Ljava/util/concurrent/ForkJoinWorkerThread;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ForkJoinWorkerThread;->workQueue:Ljava/util/concurrent/ForkJoinPool$WorkQueue;
-Ljava/util/concurrent/FutureTask$WaitNode;-><init>()V
-Ljava/util/concurrent/FutureTask$WaitNode;->next:Ljava/util/concurrent/FutureTask$WaitNode;
-Ljava/util/concurrent/FutureTask$WaitNode;->thread:Ljava/lang/Thread;
-Ljava/util/concurrent/FutureTask;->awaitDone(ZJ)I
-Ljava/util/concurrent/FutureTask;->CANCELLED:I
-Ljava/util/concurrent/FutureTask;->COMPLETING:I
-Ljava/util/concurrent/FutureTask;->finishCompletion()V
-Ljava/util/concurrent/FutureTask;->handlePossibleCancellationInterrupt(I)V
-Ljava/util/concurrent/FutureTask;->INTERRUPTED:I
-Ljava/util/concurrent/FutureTask;->INTERRUPTING:I
-Ljava/util/concurrent/FutureTask;->NEW:I
-Ljava/util/concurrent/FutureTask;->NORMAL:I
-Ljava/util/concurrent/FutureTask;->removeWaiter(Ljava/util/concurrent/FutureTask$WaitNode;)V
-Ljava/util/concurrent/FutureTask;->report(I)Ljava/lang/Object;
-Ljava/util/concurrent/FutureTask;->RUNNER:J
-Ljava/util/concurrent/FutureTask;->runner:Ljava/lang/Thread;
-Ljava/util/concurrent/FutureTask;->STATE:J
-Ljava/util/concurrent/FutureTask;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/FutureTask;->WAITERS:J
-Ljava/util/concurrent/FutureTask;->waiters:Ljava/util/concurrent/FutureTask$WaitNode;
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;->advance()V
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;->firstNode()Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;->lastRet:Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;->next:Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;->nextItem:Ljava/lang/Object;
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;->nextNode(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$AbstractItr;->succ(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$DescendingItr;->firstNode()Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$DescendingItr;->nextNode(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$Itr;->firstNode()Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$Itr;->nextNode(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;-><init>(Ljava/util/concurrent/LinkedBlockingDeque;)V
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->batch:I
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->current:Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->est:J
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->exhausted:Z
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->MAX_BATCH:I
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->queue:Ljava/util/concurrent/LinkedBlockingDeque;
-Ljava/util/concurrent/LinkedBlockingDeque$LBDSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/LinkedBlockingDeque$Node;-><init>(Ljava/lang/Object;)V
-Ljava/util/concurrent/LinkedBlockingDeque$Node;->item:Ljava/lang/Object;
-Ljava/util/concurrent/LinkedBlockingDeque$Node;->next:Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque$Node;->prev:Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque;->capacity:I
-Ljava/util/concurrent/LinkedBlockingDeque;->count:I
-Ljava/util/concurrent/LinkedBlockingDeque;->last:Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque;->linkFirst(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Z
-Ljava/util/concurrent/LinkedBlockingDeque;->linkLast(Ljava/util/concurrent/LinkedBlockingDeque$Node;)Z
-Ljava/util/concurrent/LinkedBlockingDeque;->notEmpty:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/LinkedBlockingDeque;->notFull:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/LinkedBlockingDeque;->unlink(Ljava/util/concurrent/LinkedBlockingDeque$Node;)V
-Ljava/util/concurrent/LinkedBlockingDeque;->unlinkFirst()Ljava/lang/Object;
-Ljava/util/concurrent/LinkedBlockingDeque;->unlinkLast()Ljava/lang/Object;
-Ljava/util/concurrent/LinkedBlockingQueue$Itr;->current:Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/LinkedBlockingQueue$Itr;->currentElement:Ljava/lang/Object;
-Ljava/util/concurrent/LinkedBlockingQueue$Itr;->lastRet:Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;-><init>(Ljava/util/concurrent/LinkedBlockingQueue;)V
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->batch:I
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->current:Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->est:J
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->exhausted:Z
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->MAX_BATCH:I
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->queue:Ljava/util/concurrent/LinkedBlockingQueue;
-Ljava/util/concurrent/LinkedBlockingQueue$LBQSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/LinkedBlockingQueue$Node;-><init>(Ljava/lang/Object;)V
-Ljava/util/concurrent/LinkedBlockingQueue$Node;->item:Ljava/lang/Object;
-Ljava/util/concurrent/LinkedBlockingQueue$Node;->next:Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/LinkedBlockingQueue;->count:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/concurrent/LinkedBlockingQueue;->dequeue()Ljava/lang/Object;
-Ljava/util/concurrent/LinkedBlockingQueue;->enqueue(Ljava/util/concurrent/LinkedBlockingQueue$Node;)V
-Ljava/util/concurrent/LinkedBlockingQueue;->fullyLock()V
-Ljava/util/concurrent/LinkedBlockingQueue;->fullyUnlock()V
-Ljava/util/concurrent/LinkedBlockingQueue;->last:Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/LinkedBlockingQueue;->notEmpty:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/LinkedBlockingQueue;->notFull:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/LinkedBlockingQueue;->signalNotEmpty()V
-Ljava/util/concurrent/LinkedBlockingQueue;->signalNotFull()V
-Ljava/util/concurrent/LinkedBlockingQueue;->unlink(Ljava/util/concurrent/LinkedBlockingQueue$Node;Ljava/util/concurrent/LinkedBlockingQueue$Node;)V
-Ljava/util/concurrent/LinkedTransferQueue$Itr;->advance(Ljava/util/concurrent/LinkedTransferQueue$Node;)V
-Ljava/util/concurrent/LinkedTransferQueue$Itr;->lastPred:Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue$Itr;->lastRet:Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue$Itr;->nextItem:Ljava/lang/Object;
-Ljava/util/concurrent/LinkedTransferQueue$Itr;->nextNode:Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue$LTQSpliterator;->batch:I
-Ljava/util/concurrent/LinkedTransferQueue$LTQSpliterator;->current:Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue$LTQSpliterator;->exhausted:Z
-Ljava/util/concurrent/LinkedTransferQueue$LTQSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/LinkedTransferQueue$LTQSpliterator;->MAX_BATCH:I
-Ljava/util/concurrent/LinkedTransferQueue$LTQSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;-><init>(Ljava/lang/Object;Z)V
-Ljava/util/concurrent/LinkedTransferQueue$Node;->cannotPrecede(Z)Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;->casItem(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;->casNext(Ljava/util/concurrent/LinkedTransferQueue$Node;Ljava/util/concurrent/LinkedTransferQueue$Node;)Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;->forgetContents()V
-Ljava/util/concurrent/LinkedTransferQueue$Node;->forgetNext()V
-Ljava/util/concurrent/LinkedTransferQueue$Node;->isData:Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;->isMatched()Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;->isUnmatchedRequest()Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;->ITEM:J
-Ljava/util/concurrent/LinkedTransferQueue$Node;->item:Ljava/lang/Object;
-Ljava/util/concurrent/LinkedTransferQueue$Node;->NEXT:J
-Ljava/util/concurrent/LinkedTransferQueue$Node;->next:Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue$Node;->tryMatchData()Z
-Ljava/util/concurrent/LinkedTransferQueue$Node;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/LinkedTransferQueue$Node;->WAITER:J
-Ljava/util/concurrent/LinkedTransferQueue$Node;->waiter:Ljava/lang/Thread;
-Ljava/util/concurrent/LinkedTransferQueue;->ASYNC:I
-Ljava/util/concurrent/LinkedTransferQueue;->awaitMatch(Ljava/util/concurrent/LinkedTransferQueue$Node;Ljava/util/concurrent/LinkedTransferQueue$Node;Ljava/lang/Object;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/LinkedTransferQueue;->casHead(Ljava/util/concurrent/LinkedTransferQueue$Node;Ljava/util/concurrent/LinkedTransferQueue$Node;)Z
-Ljava/util/concurrent/LinkedTransferQueue;->casSweepVotes(II)Z
-Ljava/util/concurrent/LinkedTransferQueue;->casTail(Ljava/util/concurrent/LinkedTransferQueue$Node;Ljava/util/concurrent/LinkedTransferQueue$Node;)Z
-Ljava/util/concurrent/LinkedTransferQueue;->CHAINED_SPINS:I
-Ljava/util/concurrent/LinkedTransferQueue;->countOfMode(Z)I
-Ljava/util/concurrent/LinkedTransferQueue;->findAndRemove(Ljava/lang/Object;)Z
-Ljava/util/concurrent/LinkedTransferQueue;->firstDataNode()Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue;->FRONT_SPINS:I
-Ljava/util/concurrent/LinkedTransferQueue;->HEAD:J
-Ljava/util/concurrent/LinkedTransferQueue;->head:Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue;->MP:Z
-Ljava/util/concurrent/LinkedTransferQueue;->NOW:I
-Ljava/util/concurrent/LinkedTransferQueue;->spinsFor(Ljava/util/concurrent/LinkedTransferQueue$Node;Z)I
-Ljava/util/concurrent/LinkedTransferQueue;->succ(Ljava/util/concurrent/LinkedTransferQueue$Node;)Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue;->sweep()V
-Ljava/util/concurrent/LinkedTransferQueue;->sweepVotes:I
-Ljava/util/concurrent/LinkedTransferQueue;->SWEEPVOTES:J
-Ljava/util/concurrent/LinkedTransferQueue;->SWEEP_THRESHOLD:I
-Ljava/util/concurrent/LinkedTransferQueue;->SYNC:I
-Ljava/util/concurrent/LinkedTransferQueue;->TAIL:J
-Ljava/util/concurrent/LinkedTransferQueue;->tail:Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue;->TIMED:I
-Ljava/util/concurrent/LinkedTransferQueue;->toArrayInternal([Ljava/lang/Object;)[Ljava/lang/Object;
-Ljava/util/concurrent/LinkedTransferQueue;->tryAppend(Ljava/util/concurrent/LinkedTransferQueue$Node;Z)Ljava/util/concurrent/LinkedTransferQueue$Node;
-Ljava/util/concurrent/LinkedTransferQueue;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/LinkedTransferQueue;->unsplice(Ljava/util/concurrent/LinkedTransferQueue$Node;Ljava/util/concurrent/LinkedTransferQueue$Node;)V
-Ljava/util/concurrent/LinkedTransferQueue;->xfer(Ljava/lang/Object;ZIJ)Ljava/lang/Object;
-Ljava/util/concurrent/locks/AbstractOwnableSynchronizer;->exclusiveOwnerThread:Ljava/lang/Thread;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->addConditionWaiter()Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->checkInterruptWhileWaiting(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)I
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->doSignal(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->doSignalAll(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->firstWaiter:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->isOwnedBy(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->lastWaiter:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->REINTERRUPT:I
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->reportInterruptAfterWait(I)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->THROW_IE:I
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->unlinkCancelledWaiters()V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->acquireQueued(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;J)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->addWaiter(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->apparentlyFirstQueuedIsExclusive()Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->cancelAcquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->compareAndSetTail(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->doAcquireInterruptibly(J)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->doAcquireNanos(JJ)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->doAcquireShared(J)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->doAcquireSharedInterruptibly(J)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->doAcquireSharedNanos(JJ)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->doReleaseShared()V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->enq(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->findNodeFromTail(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->fullGetFirstQueuedThread()Ljava/lang/Thread;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->fullyRelease(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)J
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->HEAD:J
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->head:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->initializeSyncQueue()V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->isOnSyncQueue(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->parkAndCheckInterrupt()Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->selfInterrupt()V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->setHead(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->setHeadAndPropagate(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;J)V
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->shouldParkAfterFailedAcquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->SPIN_FOR_TIMEOUT_THRESHOLD:J
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->STATE:J
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->state:J
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->TAIL:J
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->tail:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->transferAfterCancelledWait(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->transferForSignal(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->unparkSuccessor(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->addConditionWaiter()Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->checkInterruptWhileWaiting(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->doSignal(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->doSignalAll(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->firstWaiter:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->isOwnedBy(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->lastWaiter:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->REINTERRUPT:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->reportInterruptAfterWait(I)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->THROW_IE:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->unlinkCancelledWaiters()V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;-><init>()V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;-><init>(I)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;-><init>(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->CANCELLED:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->compareAndSetNext(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->compareAndSetWaitStatus(II)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->CONDITION:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->EXCLUSIVE:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->isShared()Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->NEXT:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->next:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->nextWaiter:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->predecessor()Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->PREV:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->prev:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->PROPAGATE:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->SHARED:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->SIGNAL:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->THREAD:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->thread:Ljava/lang/Thread;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->waitStatus:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->WAITSTATUS:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->acquireQueued(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;I)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->addWaiter(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->apparentlyFirstQueuedIsExclusive()Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->cancelAcquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->compareAndSetTail(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->doAcquireInterruptibly(I)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->doAcquireNanos(IJ)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->doAcquireShared(I)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->doAcquireSharedInterruptibly(I)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->doAcquireSharedNanos(IJ)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->doReleaseShared()V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->enq(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->findNodeFromTail(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->fullGetFirstQueuedThread()Ljava/lang/Thread;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->fullyRelease(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->HEAD:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->head:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->initializeSyncQueue()V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->isOnSyncQueue(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->parkAndCheckInterrupt()Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->selfInterrupt()V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->setHead(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->setHeadAndPropagate(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;I)V
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->shouldParkAfterFailedAcquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->SPIN_FOR_TIMEOUT_THRESHOLD:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->state:I
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->STATE:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->TAIL:J
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->tail:Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->transferAfterCancelledWait(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->transferForSignal(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)Z
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->unparkSuccessor(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V
-Ljava/util/concurrent/locks/LockSupport;-><init>()V
-Ljava/util/concurrent/locks/LockSupport;->nextSecondarySeed()I
-Ljava/util/concurrent/locks/LockSupport;->PARKBLOCKER:J
-Ljava/util/concurrent/locks/LockSupport;->SECONDARY:J
-Ljava/util/concurrent/locks/LockSupport;->setBlocker(Ljava/lang/Thread;Ljava/lang/Object;)V
-Ljava/util/concurrent/locks/LockSupport;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/locks/ReentrantLock$FairSync;-><init>()V
-Ljava/util/concurrent/locks/ReentrantLock$FairSync;->lock()V
-Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;-><init>()V
-Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;->lock()V
-Ljava/util/concurrent/locks/ReentrantLock$Sync;-><init>()V
-Ljava/util/concurrent/locks/ReentrantLock$Sync;->getHoldCount()I
-Ljava/util/concurrent/locks/ReentrantLock$Sync;->getOwner()Ljava/lang/Thread;
-Ljava/util/concurrent/locks/ReentrantLock$Sync;->isLocked()Z
-Ljava/util/concurrent/locks/ReentrantLock$Sync;->lock()V
-Ljava/util/concurrent/locks/ReentrantLock$Sync;->newCondition()Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;
-Ljava/util/concurrent/locks/ReentrantLock$Sync;->nonfairTryAcquire(I)Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;-><init>()V
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;->readerShouldBlock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;->writerShouldBlock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;-><init>()V
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;->readerShouldBlock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;->writerShouldBlock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;->sync:Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;-><init>()V
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;->count:I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;->tid:J
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;-><init>()V
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;-><init>()V
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->cachedHoldCounter:Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->exclusiveCount(I)I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->EXCLUSIVE_MASK:I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->firstReader:Ljava/lang/Thread;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->firstReaderHoldCount:I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->fullTryAcquireShared(Ljava/lang/Thread;)I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->getCount()I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->getOwner()Ljava/lang/Thread;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->getReadHoldCount()I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->getReadLockCount()I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->getWriteHoldCount()I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->isWriteLocked()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->MAX_COUNT:I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->newCondition()Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->readerShouldBlock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->readHolds:Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->sharedCount(I)I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->SHARED_SHIFT:I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->SHARED_UNIT:I
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->tryReadLock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->tryWriteLock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->unmatchedUnlockException()Ljava/lang/IllegalMonitorStateException;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->writerShouldBlock()Z
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;->sync:Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;->getThreadId(Ljava/lang/Thread;)J
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;->readerLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;->sync:Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;->TID:J
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;->writerLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;
-Ljava/util/concurrent/locks/StampedLock$WNode;-><init>(ILjava/util/concurrent/locks/StampedLock$WNode;)V
-Ljava/util/concurrent/locks/StampedLock$WNode;->cowait:Ljava/util/concurrent/locks/StampedLock$WNode;
-Ljava/util/concurrent/locks/StampedLock$WNode;->mode:I
-Ljava/util/concurrent/locks/StampedLock$WNode;->next:Ljava/util/concurrent/locks/StampedLock$WNode;
-Ljava/util/concurrent/locks/StampedLock$WNode;->prev:Ljava/util/concurrent/locks/StampedLock$WNode;
-Ljava/util/concurrent/locks/StampedLock$WNode;->status:I
-Ljava/util/concurrent/locks/StampedLock$WNode;->thread:Ljava/lang/Thread;
-Ljava/util/concurrent/locks/StampedLock;->ABITS:J
-Ljava/util/concurrent/locks/StampedLock;->acquireRead(ZJ)J
-Ljava/util/concurrent/locks/StampedLock;->acquireWrite(ZJ)J
-Ljava/util/concurrent/locks/StampedLock;->CANCELLED:I
-Ljava/util/concurrent/locks/StampedLock;->cancelWaiter(Ljava/util/concurrent/locks/StampedLock$WNode;Ljava/util/concurrent/locks/StampedLock$WNode;Z)J
-Ljava/util/concurrent/locks/StampedLock;->getReadLockCount(J)I
-Ljava/util/concurrent/locks/StampedLock;->HEAD_SPINS:I
-Ljava/util/concurrent/locks/StampedLock;->INTERRUPTED:J
-Ljava/util/concurrent/locks/StampedLock;->LG_READERS:I
-Ljava/util/concurrent/locks/StampedLock;->MAX_HEAD_SPINS:I
-Ljava/util/concurrent/locks/StampedLock;->NCPU:I
-Ljava/util/concurrent/locks/StampedLock;->ORIGIN:J
-Ljava/util/concurrent/locks/StampedLock;->OVERFLOW_YIELD_RATE:I
-Ljava/util/concurrent/locks/StampedLock;->PARKBLOCKER:J
-Ljava/util/concurrent/locks/StampedLock;->RBITS:J
-Ljava/util/concurrent/locks/StampedLock;->readerOverflow:I
-Ljava/util/concurrent/locks/StampedLock;->readLockView:Ljava/util/concurrent/locks/StampedLock$ReadLockView;
-Ljava/util/concurrent/locks/StampedLock;->readWriteLockView:Ljava/util/concurrent/locks/StampedLock$ReadWriteLockView;
-Ljava/util/concurrent/locks/StampedLock;->release(Ljava/util/concurrent/locks/StampedLock$WNode;)V
-Ljava/util/concurrent/locks/StampedLock;->RFULL:J
-Ljava/util/concurrent/locks/StampedLock;->RMODE:I
-Ljava/util/concurrent/locks/StampedLock;->RUNIT:J
-Ljava/util/concurrent/locks/StampedLock;->SBITS:J
-Ljava/util/concurrent/locks/StampedLock;->SPINS:I
-Ljava/util/concurrent/locks/StampedLock;->STATE:J
-Ljava/util/concurrent/locks/StampedLock;->state:J
-Ljava/util/concurrent/locks/StampedLock;->tryDecReaderOverflow(J)J
-Ljava/util/concurrent/locks/StampedLock;->tryIncReaderOverflow(J)J
-Ljava/util/concurrent/locks/StampedLock;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/locks/StampedLock;->unstampedUnlockRead()V
-Ljava/util/concurrent/locks/StampedLock;->unstampedUnlockWrite()V
-Ljava/util/concurrent/locks/StampedLock;->WAITING:I
-Ljava/util/concurrent/locks/StampedLock;->WBIT:J
-Ljava/util/concurrent/locks/StampedLock;->WCOWAIT:J
-Ljava/util/concurrent/locks/StampedLock;->WHEAD:J
-Ljava/util/concurrent/locks/StampedLock;->whead:Ljava/util/concurrent/locks/StampedLock$WNode;
-Ljava/util/concurrent/locks/StampedLock;->WMODE:I
-Ljava/util/concurrent/locks/StampedLock;->WNEXT:J
-Ljava/util/concurrent/locks/StampedLock;->writeLockView:Ljava/util/concurrent/locks/StampedLock$WriteLockView;
-Ljava/util/concurrent/locks/StampedLock;->WSTATUS:J
-Ljava/util/concurrent/locks/StampedLock;->WTAIL:J
-Ljava/util/concurrent/locks/StampedLock;->wtail:Ljava/util/concurrent/locks/StampedLock$WNode;
-Ljava/util/concurrent/Phaser$QNode;-><init>(Ljava/util/concurrent/Phaser;IZZJ)V
-Ljava/util/concurrent/Phaser$QNode;->deadline:J
-Ljava/util/concurrent/Phaser$QNode;->interruptible:Z
-Ljava/util/concurrent/Phaser$QNode;->nanos:J
-Ljava/util/concurrent/Phaser$QNode;->next:Ljava/util/concurrent/Phaser$QNode;
-Ljava/util/concurrent/Phaser$QNode;->phase:I
-Ljava/util/concurrent/Phaser$QNode;->phaser:Ljava/util/concurrent/Phaser;
-Ljava/util/concurrent/Phaser$QNode;->thread:Ljava/lang/Thread;
-Ljava/util/concurrent/Phaser$QNode;->timed:Z
-Ljava/util/concurrent/Phaser$QNode;->wasInterrupted:Z
-Ljava/util/concurrent/Phaser;->abortWait(I)I
-Ljava/util/concurrent/Phaser;->arrivedOf(J)I
-Ljava/util/concurrent/Phaser;->badArrive(J)Ljava/lang/String;
-Ljava/util/concurrent/Phaser;->badRegister(J)Ljava/lang/String;
-Ljava/util/concurrent/Phaser;->COUNTS_MASK:J
-Ljava/util/concurrent/Phaser;->doArrive(I)I
-Ljava/util/concurrent/Phaser;->doRegister(I)I
-Ljava/util/concurrent/Phaser;->EMPTY:I
-Ljava/util/concurrent/Phaser;->evenQ:Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/Phaser;->internalAwaitAdvance(ILjava/util/concurrent/Phaser$QNode;)I
-Ljava/util/concurrent/Phaser;->MAX_PARTIES:I
-Ljava/util/concurrent/Phaser;->MAX_PHASE:I
-Ljava/util/concurrent/Phaser;->NCPU:I
-Ljava/util/concurrent/Phaser;->oddQ:Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/Phaser;->ONE_ARRIVAL:I
-Ljava/util/concurrent/Phaser;->ONE_DEREGISTER:I
-Ljava/util/concurrent/Phaser;->ONE_PARTY:I
-Ljava/util/concurrent/Phaser;->parent:Ljava/util/concurrent/Phaser;
-Ljava/util/concurrent/Phaser;->partiesOf(J)I
-Ljava/util/concurrent/Phaser;->PARTIES_MASK:J
-Ljava/util/concurrent/Phaser;->PARTIES_SHIFT:I
-Ljava/util/concurrent/Phaser;->phaseOf(J)I
-Ljava/util/concurrent/Phaser;->PHASE_SHIFT:I
-Ljava/util/concurrent/Phaser;->queueFor(I)Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/Phaser;->reconcileState()J
-Ljava/util/concurrent/Phaser;->releaseWaiters(I)V
-Ljava/util/concurrent/Phaser;->root:Ljava/util/concurrent/Phaser;
-Ljava/util/concurrent/Phaser;->SPINS_PER_ARRIVAL:I
-Ljava/util/concurrent/Phaser;->STATE:J
-Ljava/util/concurrent/Phaser;->state:J
-Ljava/util/concurrent/Phaser;->stateToString(J)Ljava/lang/String;
-Ljava/util/concurrent/Phaser;->TERMINATION_BIT:J
-Ljava/util/concurrent/Phaser;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/Phaser;->unarrivedOf(J)I
-Ljava/util/concurrent/Phaser;->UNARRIVED_MASK:I
-Ljava/util/concurrent/PriorityBlockingQueue$Itr;->array:[Ljava/lang/Object;
-Ljava/util/concurrent/PriorityBlockingQueue$Itr;->cursor:I
-Ljava/util/concurrent/PriorityBlockingQueue$Itr;->lastRet:I
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;-><init>(Ljava/util/concurrent/PriorityBlockingQueue;[Ljava/lang/Object;II)V
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;->array:[Ljava/lang/Object;
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;->fence:I
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;->getFence()I
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;->index:I
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;->queue:Ljava/util/concurrent/PriorityBlockingQueue;
-Ljava/util/concurrent/PriorityBlockingQueue$PBQSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/concurrent/PriorityBlockingQueue;->allocationSpinLock:I
-Ljava/util/concurrent/PriorityBlockingQueue;->ALLOCATIONSPINLOCK:J
-Ljava/util/concurrent/PriorityBlockingQueue;->comparator:Ljava/util/Comparator;
-Ljava/util/concurrent/PriorityBlockingQueue;->DEFAULT_INITIAL_CAPACITY:I
-Ljava/util/concurrent/PriorityBlockingQueue;->heapify()V
-Ljava/util/concurrent/PriorityBlockingQueue;->indexOf(Ljava/lang/Object;)I
-Ljava/util/concurrent/PriorityBlockingQueue;->MAX_ARRAY_SIZE:I
-Ljava/util/concurrent/PriorityBlockingQueue;->q:Ljava/util/PriorityQueue;
-Ljava/util/concurrent/PriorityBlockingQueue;->queue:[Ljava/lang/Object;
-Ljava/util/concurrent/PriorityBlockingQueue;->removeAt(I)V
-Ljava/util/concurrent/PriorityBlockingQueue;->removeEQ(Ljava/lang/Object;)V
-Ljava/util/concurrent/PriorityBlockingQueue;->siftDownComparable(ILjava/lang/Object;[Ljava/lang/Object;I)V
-Ljava/util/concurrent/PriorityBlockingQueue;->siftDownUsingComparator(ILjava/lang/Object;[Ljava/lang/Object;ILjava/util/Comparator;)V
-Ljava/util/concurrent/PriorityBlockingQueue;->siftUpComparable(ILjava/lang/Object;[Ljava/lang/Object;)V
-Ljava/util/concurrent/PriorityBlockingQueue;->siftUpUsingComparator(ILjava/lang/Object;[Ljava/lang/Object;Ljava/util/Comparator;)V
-Ljava/util/concurrent/PriorityBlockingQueue;->size:I
-Ljava/util/concurrent/PriorityBlockingQueue;->tryGrow([Ljava/lang/Object;I)V
-Ljava/util/concurrent/PriorityBlockingQueue;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/RecursiveTask;->result:Ljava/lang/Object;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;->array:[Ljava/util/concurrent/RunnableScheduledFuture;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;->cursor:I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;->lastRet:I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;-><init>()V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->add(Ljava/lang/Runnable;)Z
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->available:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->drainTo(Ljava/util/Collection;)I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->drainTo(Ljava/util/Collection;I)I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->finishPoll(Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->grow()V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->indexOf(Ljava/lang/Object;)I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->INITIAL_CAPACITY:I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->leader:Ljava/lang/Thread;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->lock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->offer(Ljava/lang/Runnable;)Z
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->offer(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Z
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->peekExpired()Ljava/util/concurrent/RunnableScheduledFuture;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->put(Ljava/lang/Runnable;)V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->queue:[Ljava/util/concurrent/RunnableScheduledFuture;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->setIndex(Ljava/util/concurrent/RunnableScheduledFuture;I)V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->siftDown(ILjava/util/concurrent/RunnableScheduledFuture;)V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->siftUp(ILjava/util/concurrent/RunnableScheduledFuture;)V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;->size:I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->compareTo(Ljava/util/concurrent/Delayed;)I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->heapIndex:I
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->outerTask:Ljava/util/concurrent/RunnableScheduledFuture;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->period:J
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->sequenceNumber:J
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->setNextRunTime()V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;->time:J
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->canRunInCurrentRunState(Z)Z
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->continueExistingPeriodicTasksAfterShutdown:Z
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->DEFAULT_KEEPALIVE_MILLIS:J
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->delayedExecute(Ljava/util/concurrent/RunnableScheduledFuture;)V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->executeExistingDelayedTasksAfterShutdown:Z
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->onShutdown()V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->overflowFree(J)J
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->reExecutePeriodic(Ljava/util/concurrent/RunnableScheduledFuture;)V
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->removeOnCancel:Z
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->sequencer:Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->triggerTime(J)J
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;->triggerTime(JLjava/util/concurrent/TimeUnit;)J
-Ljava/util/concurrent/Semaphore$FairSync;-><init>(I)V
-Ljava/util/concurrent/Semaphore$NonfairSync;-><init>(I)V
-Ljava/util/concurrent/Semaphore$Sync;-><init>(I)V
-Ljava/util/concurrent/Semaphore$Sync;->drainPermits()I
-Ljava/util/concurrent/Semaphore$Sync;->getPermits()I
-Ljava/util/concurrent/Semaphore$Sync;->nonfairTryAcquireShared(I)I
-Ljava/util/concurrent/Semaphore$Sync;->reducePermits(I)V
-Ljava/util/concurrent/Semaphore;->sync:Ljava/util/concurrent/Semaphore$Sync;
-Ljava/util/concurrent/SynchronousQueue$FifoWaitQueue;-><init>()V
-Ljava/util/concurrent/SynchronousQueue$LifoWaitQueue;-><init>()V
-Ljava/util/concurrent/SynchronousQueue$Transferer;-><init>()V
-Ljava/util/concurrent/SynchronousQueue$Transferer;->transfer(Ljava/lang/Object;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;-><init>(Ljava/lang/Object;Z)V
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->casItem(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->casNext(Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;)Z
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->isCancelled()Z
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->isData:Z
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->isOffList()Z
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->ITEM:J
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->item:Ljava/lang/Object;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->NEXT:J
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->next:Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->tryCancel(Ljava/lang/Object;)V
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;->waiter:Ljava/lang/Thread;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;-><init>()V
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->advanceHead(Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;)V
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->advanceTail(Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;)V
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->awaitFulfill(Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;Ljava/lang/Object;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->casCleanMe(Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;)Z
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->clean(Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;)V
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->CLEANME:J
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->cleanMe:Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->HEAD:J
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->head:Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->TAIL:J
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->tail:Ljava/util/concurrent/SynchronousQueue$TransferQueue$QNode;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->transfer(Ljava/lang/Object;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/SynchronousQueue$TransferQueue;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;-><init>(Ljava/lang/Object;)V
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->casNext(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)Z
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->isCancelled()Z
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->item:Ljava/lang/Object;
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->MATCH:J
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->match:Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->mode:I
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->NEXT:J
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->next:Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->tryCancel()V
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->tryMatch(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)Z
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;->waiter:Ljava/lang/Thread;
-Ljava/util/concurrent/SynchronousQueue$TransferStack;-><init>()V
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->awaitFulfill(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;ZJ)Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->casHead(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)Z
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->clean(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)V
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->DATA:I
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->FULFILLING:I
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->HEAD:J
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->head:Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->isFulfilling(I)Z
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->REQUEST:I
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->shouldSpin(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;)Z
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->snode(Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;Ljava/lang/Object;Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;I)Ljava/util/concurrent/SynchronousQueue$TransferStack$SNode;
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->transfer(Ljava/lang/Object;ZJ)Ljava/lang/Object;
-Ljava/util/concurrent/SynchronousQueue$TransferStack;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/SynchronousQueue$WaitQueue;-><init>()V
-Ljava/util/concurrent/SynchronousQueue;->MAX_TIMED_SPINS:I
-Ljava/util/concurrent/SynchronousQueue;->MAX_UNTIMED_SPINS:I
-Ljava/util/concurrent/SynchronousQueue;->qlock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/SynchronousQueue;->SPIN_FOR_TIMEOUT_THRESHOLD:J
-Ljava/util/concurrent/SynchronousQueue;->transferer:Ljava/util/concurrent/SynchronousQueue$Transferer;
-Ljava/util/concurrent/SynchronousQueue;->waitingConsumers:Ljava/util/concurrent/SynchronousQueue$WaitQueue;
-Ljava/util/concurrent/SynchronousQueue;->waitingProducers:Ljava/util/concurrent/SynchronousQueue$WaitQueue;
-Ljava/util/concurrent/ThreadLocalRandom$RandomDoublesSpliterator;-><init>(JJDD)V
-Ljava/util/concurrent/ThreadLocalRandom$RandomDoublesSpliterator;->bound:D
-Ljava/util/concurrent/ThreadLocalRandom$RandomDoublesSpliterator;->fence:J
-Ljava/util/concurrent/ThreadLocalRandom$RandomDoublesSpliterator;->index:J
-Ljava/util/concurrent/ThreadLocalRandom$RandomDoublesSpliterator;->origin:D
-Ljava/util/concurrent/ThreadLocalRandom$RandomIntsSpliterator;-><init>(JJII)V
-Ljava/util/concurrent/ThreadLocalRandom$RandomIntsSpliterator;->bound:I
-Ljava/util/concurrent/ThreadLocalRandom$RandomIntsSpliterator;->fence:J
-Ljava/util/concurrent/ThreadLocalRandom$RandomIntsSpliterator;->index:J
-Ljava/util/concurrent/ThreadLocalRandom$RandomIntsSpliterator;->origin:I
-Ljava/util/concurrent/ThreadLocalRandom$RandomLongsSpliterator;-><init>(JJJJ)V
-Ljava/util/concurrent/ThreadLocalRandom$RandomLongsSpliterator;->bound:J
-Ljava/util/concurrent/ThreadLocalRandom$RandomLongsSpliterator;->fence:J
-Ljava/util/concurrent/ThreadLocalRandom$RandomLongsSpliterator;->index:J
-Ljava/util/concurrent/ThreadLocalRandom$RandomLongsSpliterator;->origin:J
-Ljava/util/concurrent/ThreadLocalRandom;-><init>()V
-Ljava/util/concurrent/ThreadLocalRandom;->advanceProbe(I)I
-Ljava/util/concurrent/ThreadLocalRandom;->BAD_BOUND:Ljava/lang/String;
-Ljava/util/concurrent/ThreadLocalRandom;->BAD_RANGE:Ljava/lang/String;
-Ljava/util/concurrent/ThreadLocalRandom;->BAD_SIZE:Ljava/lang/String;
-Ljava/util/concurrent/ThreadLocalRandom;->DOUBLE_UNIT:D
-Ljava/util/concurrent/ThreadLocalRandom;->FLOAT_UNIT:F
-Ljava/util/concurrent/ThreadLocalRandom;->GAMMA:J
-Ljava/util/concurrent/ThreadLocalRandom;->getProbe()I
-Ljava/util/concurrent/ThreadLocalRandom;->initialized:Z
-Ljava/util/concurrent/ThreadLocalRandom;->instance:Ljava/util/concurrent/ThreadLocalRandom;
-Ljava/util/concurrent/ThreadLocalRandom;->internalNextDouble(DD)D
-Ljava/util/concurrent/ThreadLocalRandom;->internalNextInt(II)I
-Ljava/util/concurrent/ThreadLocalRandom;->internalNextLong(JJ)J
-Ljava/util/concurrent/ThreadLocalRandom;->localInit()V
-Ljava/util/concurrent/ThreadLocalRandom;->mix32(J)I
-Ljava/util/concurrent/ThreadLocalRandom;->mix64(J)J
-Ljava/util/concurrent/ThreadLocalRandom;->nextLocalGaussian:Ljava/lang/ThreadLocal;
-Ljava/util/concurrent/ThreadLocalRandom;->nextSecondarySeed()I
-Ljava/util/concurrent/ThreadLocalRandom;->nextSeed()J
-Ljava/util/concurrent/ThreadLocalRandom;->PROBE:J
-Ljava/util/concurrent/ThreadLocalRandom;->probeGenerator:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/concurrent/ThreadLocalRandom;->PROBE_INCREMENT:I
-Ljava/util/concurrent/ThreadLocalRandom;->SECONDARY:J
-Ljava/util/concurrent/ThreadLocalRandom;->SEED:J
-Ljava/util/concurrent/ThreadLocalRandom;->seeder:Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/concurrent/ThreadLocalRandom;->SEEDER_INCREMENT:J
-Ljava/util/concurrent/ThreadLocalRandom;->U:Lsun/misc/Unsafe;
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->completedTasks:J
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->firstTask:Ljava/lang/Runnable;
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->interruptIfStarted()V
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->isLocked()Z
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->lock()V
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->thread:Ljava/lang/Thread;
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->tryLock()Z
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;->unlock()V
-Ljava/util/concurrent/ThreadPoolExecutor;->addWorker(Ljava/lang/Runnable;Z)Z
-Ljava/util/concurrent/ThreadPoolExecutor;->addWorkerFailed(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V
-Ljava/util/concurrent/ThreadPoolExecutor;->advanceRunState(I)V
-Ljava/util/concurrent/ThreadPoolExecutor;->CAPACITY:I
-Ljava/util/concurrent/ThreadPoolExecutor;->checkShutdownAccess()V
-Ljava/util/concurrent/ThreadPoolExecutor;->compareAndDecrementWorkerCount(I)Z
-Ljava/util/concurrent/ThreadPoolExecutor;->compareAndIncrementWorkerCount(I)Z
-Ljava/util/concurrent/ThreadPoolExecutor;->completedTaskCount:J
-Ljava/util/concurrent/ThreadPoolExecutor;->corePoolSize:I
-Ljava/util/concurrent/ThreadPoolExecutor;->COUNT_BITS:I
-Ljava/util/concurrent/ThreadPoolExecutor;->ctlOf(II)I
-Ljava/util/concurrent/ThreadPoolExecutor;->decrementWorkerCount()V
-Ljava/util/concurrent/ThreadPoolExecutor;->drainQueue()Ljava/util/List;
-Ljava/util/concurrent/ThreadPoolExecutor;->ensurePrestart()V
-Ljava/util/concurrent/ThreadPoolExecutor;->getTask()Ljava/lang/Runnable;
-Ljava/util/concurrent/ThreadPoolExecutor;->handler:Ljava/util/concurrent/RejectedExecutionHandler;
-Ljava/util/concurrent/ThreadPoolExecutor;->interruptIdleWorkers()V
-Ljava/util/concurrent/ThreadPoolExecutor;->interruptIdleWorkers(Z)V
-Ljava/util/concurrent/ThreadPoolExecutor;->interruptWorkers()V
-Ljava/util/concurrent/ThreadPoolExecutor;->isRunning(I)Z
-Ljava/util/concurrent/ThreadPoolExecutor;->isRunningOrShutdown(Z)Z
-Ljava/util/concurrent/ThreadPoolExecutor;->keepAliveTime:J
-Ljava/util/concurrent/ThreadPoolExecutor;->largestPoolSize:I
-Ljava/util/concurrent/ThreadPoolExecutor;->maximumPoolSize:I
-Ljava/util/concurrent/ThreadPoolExecutor;->ONLY_ONE:Z
-Ljava/util/concurrent/ThreadPoolExecutor;->onShutdown()V
-Ljava/util/concurrent/ThreadPoolExecutor;->processWorkerExit(Ljava/util/concurrent/ThreadPoolExecutor$Worker;Z)V
-Ljava/util/concurrent/ThreadPoolExecutor;->reject(Ljava/lang/Runnable;)V
-Ljava/util/concurrent/ThreadPoolExecutor;->RUNNING:I
-Ljava/util/concurrent/ThreadPoolExecutor;->runStateAtLeast(II)Z
-Ljava/util/concurrent/ThreadPoolExecutor;->runStateLessThan(II)Z
-Ljava/util/concurrent/ThreadPoolExecutor;->runStateOf(I)I
-Ljava/util/concurrent/ThreadPoolExecutor;->runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V
-Ljava/util/concurrent/ThreadPoolExecutor;->SHUTDOWN:I
-Ljava/util/concurrent/ThreadPoolExecutor;->shutdownPerm:Ljava/lang/RuntimePermission;
-Ljava/util/concurrent/ThreadPoolExecutor;->STOP:I
-Ljava/util/concurrent/ThreadPoolExecutor;->TERMINATED:I
-Ljava/util/concurrent/ThreadPoolExecutor;->termination:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/ThreadPoolExecutor;->threadFactory:Ljava/util/concurrent/ThreadFactory;
-Ljava/util/concurrent/ThreadPoolExecutor;->TIDYING:I
-Ljava/util/concurrent/ThreadPoolExecutor;->tryTerminate()V
-Ljava/util/concurrent/ThreadPoolExecutor;->workerCountOf(I)I
-Ljava/util/concurrent/ThreadPoolExecutor;->workers:Ljava/util/HashSet;
-Ljava/util/concurrent/ThreadPoolExecutor;->workQueue:Ljava/util/concurrent/BlockingQueue;
-Ljava/util/concurrent/TimeUnit;->C0:J
-Ljava/util/concurrent/TimeUnit;->C1:J
-Ljava/util/concurrent/TimeUnit;->C2:J
-Ljava/util/concurrent/TimeUnit;->C3:J
-Ljava/util/concurrent/TimeUnit;->C4:J
-Ljava/util/concurrent/TimeUnit;->C5:J
-Ljava/util/concurrent/TimeUnit;->C6:J
-Ljava/util/concurrent/TimeUnit;->excessNanos(JJ)I
-Ljava/util/concurrent/TimeUnit;->MAX:J
-Ljava/util/concurrent/TimeUnit;->x(JJJ)J
-Ljava/util/Currency;-><init>(Landroid/icu/util/Currency;)V
-Ljava/util/Currency;->available:Ljava/util/HashSet;
-Ljava/util/Currency;->currencyCode:Ljava/lang/String;
-Ljava/util/Currency;->icuCurrency:Landroid/icu/util/Currency;
-Ljava/util/Currency;->instances:Ljava/util/concurrent/ConcurrentMap;
-Ljava/util/Date;->cdate:Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/Date;->convertToAbbr(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/lang/StringBuilder;
-Ljava/util/Date;->defaultCenturyStart:I
-Ljava/util/Date;->fastTime:J
-Ljava/util/Date;->gcal:Lsun/util/calendar/BaseCalendar;
-Ljava/util/Date;->getCalendarDate()Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/Date;->getCalendarSystem(I)Lsun/util/calendar/BaseCalendar;
-Ljava/util/Date;->getCalendarSystem(J)Lsun/util/calendar/BaseCalendar;
-Ljava/util/Date;->getCalendarSystem(Lsun/util/calendar/BaseCalendar$Date;)Lsun/util/calendar/BaseCalendar;
-Ljava/util/Date;->getJulianCalendar()Lsun/util/calendar/BaseCalendar;
-Ljava/util/Date;->getMillisOf(Ljava/util/Date;)J
-Ljava/util/Date;->getTimeImpl()J
-Ljava/util/Date;->jcal:Lsun/util/calendar/BaseCalendar;
-Ljava/util/Date;->normalize()Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/Date;->normalize(Lsun/util/calendar/BaseCalendar$Date;)Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/Date;->ttb:[I
-Ljava/util/Date;->wtb:[Ljava/lang/String;
-Ljava/util/DoubleSummaryStatistics;->count:J
-Ljava/util/DoubleSummaryStatistics;->max:D
-Ljava/util/DoubleSummaryStatistics;->min:D
-Ljava/util/DoubleSummaryStatistics;->simpleSum:D
-Ljava/util/DoubleSummaryStatistics;->sum:D
-Ljava/util/DoubleSummaryStatistics;->sumCompensation:D
-Ljava/util/DoubleSummaryStatistics;->sumWithCompensation(D)V
-Ljava/util/DuplicateFormatFlagsException;->flags:Ljava/lang/String;
-Ljava/util/EnumMap$EntryIterator$Entry;->checkIndexForEntryUse()V
-Ljava/util/EnumMap$EntryIterator$Entry;->index:I
-Ljava/util/EnumMap$EntryIterator;->lastReturnedEntry:Ljava/util/EnumMap$EntryIterator$Entry;
-Ljava/util/EnumMap$EntrySet;->fillEntryArray([Ljava/lang/Object;)[Ljava/lang/Object;
-Ljava/util/EnumMap$EnumMapIterator;->checkLastReturnedIndex()V
-Ljava/util/EnumMap$EnumMapIterator;->index:I
-Ljava/util/EnumMap$EnumMapIterator;->lastReturnedIndex:I
-Ljava/util/EnumMap;->containsMapping(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/EnumMap;->entryHashCode(I)I
-Ljava/util/EnumMap;->entrySet:Ljava/util/Set;
-Ljava/util/EnumMap;->equals(Ljava/util/EnumMap;)Z
-Ljava/util/EnumMap;->getKeyUniverse(Ljava/lang/Class;)[Ljava/lang/Enum;
-Ljava/util/EnumMap;->isValidKey(Ljava/lang/Object;)Z
-Ljava/util/EnumMap;->keyUniverse:[Ljava/lang/Enum;
-Ljava/util/EnumMap;->maskNull(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/EnumMap;->NULL:Ljava/lang/Object;
-Ljava/util/EnumMap;->removeMapping(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/EnumMap;->size:I
-Ljava/util/EnumMap;->typeCheck(Ljava/lang/Enum;)V
-Ljava/util/EnumMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/EnumMap;->vals:[Ljava/lang/Object;
-Ljava/util/EnumMap;->ZERO_LENGTH_ENUM_ARRAY:[Ljava/lang/Enum;
-Ljava/util/EnumSet$SerializationProxy;-><init>(Ljava/util/EnumSet;)V
-Ljava/util/EnumSet$SerializationProxy;->elements:[Ljava/lang/Enum;
-Ljava/util/EnumSet$SerializationProxy;->elementType:Ljava/lang/Class;
-Ljava/util/EnumSet;-><init>(Ljava/lang/Class;[Ljava/lang/Enum;)V
-Ljava/util/EnumSet;->addAll()V
-Ljava/util/EnumSet;->addRange(Ljava/lang/Enum;Ljava/lang/Enum;)V
-Ljava/util/EnumSet;->complement()V
-Ljava/util/EnumSet;->getUniverse(Ljava/lang/Class;)[Ljava/lang/Enum;
-Ljava/util/EnumSet;->typeCheck(Ljava/lang/Enum;)V
-Ljava/util/EnumSet;->universe:[Ljava/lang/Enum;
-Ljava/util/EnumSet;->ZERO_LENGTH_ENUM_ARRAY:[Ljava/lang/Enum;
-Ljava/util/EventListenerProxy;->listener:Ljava/util/EventListener;
-Ljava/util/FormatFlagsConversionMismatchException;->c:C
-Ljava/util/FormatFlagsConversionMismatchException;->f:Ljava/lang/String;
-Ljava/util/FormattableFlags;-><init>()V
-Ljava/util/Formatter$Conversion;-><init>()V
-Ljava/util/Formatter$Conversion;->BOOLEAN:C
-Ljava/util/Formatter$Conversion;->BOOLEAN_UPPER:C
-Ljava/util/Formatter$Conversion;->CHARACTER:C
-Ljava/util/Formatter$Conversion;->CHARACTER_UPPER:C
-Ljava/util/Formatter$Conversion;->DATE_TIME:C
-Ljava/util/Formatter$Conversion;->DATE_TIME_UPPER:C
-Ljava/util/Formatter$Conversion;->DECIMAL_FLOAT:C
-Ljava/util/Formatter$Conversion;->DECIMAL_INTEGER:C
-Ljava/util/Formatter$Conversion;->GENERAL:C
-Ljava/util/Formatter$Conversion;->GENERAL_UPPER:C
-Ljava/util/Formatter$Conversion;->HASHCODE:C
-Ljava/util/Formatter$Conversion;->HASHCODE_UPPER:C
-Ljava/util/Formatter$Conversion;->HEXADECIMAL_FLOAT:C
-Ljava/util/Formatter$Conversion;->HEXADECIMAL_FLOAT_UPPER:C
-Ljava/util/Formatter$Conversion;->HEXADECIMAL_INTEGER:C
-Ljava/util/Formatter$Conversion;->HEXADECIMAL_INTEGER_UPPER:C
-Ljava/util/Formatter$Conversion;->isCharacter(C)Z
-Ljava/util/Formatter$Conversion;->isFloat(C)Z
-Ljava/util/Formatter$Conversion;->isGeneral(C)Z
-Ljava/util/Formatter$Conversion;->isInteger(C)Z
-Ljava/util/Formatter$Conversion;->isText(C)Z
-Ljava/util/Formatter$Conversion;->isValid(C)Z
-Ljava/util/Formatter$Conversion;->LINE_SEPARATOR:C
-Ljava/util/Formatter$Conversion;->OCTAL_INTEGER:C
-Ljava/util/Formatter$Conversion;->PERCENT_SIGN:C
-Ljava/util/Formatter$Conversion;->SCIENTIFIC:C
-Ljava/util/Formatter$Conversion;->SCIENTIFIC_UPPER:C
-Ljava/util/Formatter$Conversion;->STRING:C
-Ljava/util/Formatter$Conversion;->STRING_UPPER:C
-Ljava/util/Formatter$DateTime;-><init>()V
-Ljava/util/Formatter$DateTime;->AM_PM:C
-Ljava/util/Formatter$DateTime;->CENTURY:C
-Ljava/util/Formatter$DateTime;->DATE:C
-Ljava/util/Formatter$DateTime;->DATE_TIME:C
-Ljava/util/Formatter$DateTime;->DAY_OF_MONTH:C
-Ljava/util/Formatter$DateTime;->DAY_OF_MONTH_0:C
-Ljava/util/Formatter$DateTime;->DAY_OF_YEAR:C
-Ljava/util/Formatter$DateTime;->HOUR:C
-Ljava/util/Formatter$DateTime;->HOUR_0:C
-Ljava/util/Formatter$DateTime;->HOUR_OF_DAY:C
-Ljava/util/Formatter$DateTime;->HOUR_OF_DAY_0:C
-Ljava/util/Formatter$DateTime;->ISO_STANDARD_DATE:C
-Ljava/util/Formatter$DateTime;->isValid(C)Z
-Ljava/util/Formatter$DateTime;->MILLISECOND:C
-Ljava/util/Formatter$DateTime;->MILLISECOND_SINCE_EPOCH:C
-Ljava/util/Formatter$DateTime;->MINUTE:C
-Ljava/util/Formatter$DateTime;->MONTH:C
-Ljava/util/Formatter$DateTime;->NAME_OF_DAY:C
-Ljava/util/Formatter$DateTime;->NAME_OF_DAY_ABBREV:C
-Ljava/util/Formatter$DateTime;->NAME_OF_MONTH:C
-Ljava/util/Formatter$DateTime;->NAME_OF_MONTH_ABBREV:C
-Ljava/util/Formatter$DateTime;->NAME_OF_MONTH_ABBREV_X:C
-Ljava/util/Formatter$DateTime;->NANOSECOND:C
-Ljava/util/Formatter$DateTime;->SECOND:C
-Ljava/util/Formatter$DateTime;->SECONDS_SINCE_EPOCH:C
-Ljava/util/Formatter$DateTime;->TIME:C
-Ljava/util/Formatter$DateTime;->TIME_12_HOUR:C
-Ljava/util/Formatter$DateTime;->TIME_24_HOUR:C
-Ljava/util/Formatter$DateTime;->YEAR_2:C
-Ljava/util/Formatter$DateTime;->YEAR_4:C
-Ljava/util/Formatter$DateTime;->ZONE:C
-Ljava/util/Formatter$DateTime;->ZONE_NUMERIC:C
-Ljava/util/Formatter$FixedString;->index()I
-Ljava/util/Formatter$FixedString;->print(Ljava/lang/Object;Ljava/util/Locale;)V
-Ljava/util/Formatter$FixedString;->s:Ljava/lang/String;
-Ljava/util/Formatter$Flags;-><init>(I)V
-Ljava/util/Formatter$Flags;->add(Ljava/util/Formatter$Flags;)Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->ALTERNATE:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->contains(Ljava/util/Formatter$Flags;)Z
-Ljava/util/Formatter$Flags;->dup()Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->flags:I
-Ljava/util/Formatter$Flags;->GROUP:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->LEADING_SPACE:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->LEFT_JUSTIFY:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->NONE:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->PARENTHESES:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->parse(C)Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->parse(Ljava/lang/String;)Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->PLUS:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->PREVIOUS:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->remove(Ljava/util/Formatter$Flags;)Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->toString(Ljava/util/Formatter$Flags;)Ljava/lang/String;
-Ljava/util/Formatter$Flags;->UPPERCASE:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$Flags;->valueOf()I
-Ljava/util/Formatter$Flags;->ZERO_PAD:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->dot:Z
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->exp:Ljava/lang/StringBuilder;
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->exponent()[C
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->hasDot()Z
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->layout(Ljava/math/BigInteger;ILjava/util/Formatter$BigDecimalLayoutForm;)V
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->layoutChars()[C
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->mant:Ljava/lang/StringBuilder;
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->mantissa()[C
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->scale()I
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->scale:I
-Ljava/util/Formatter$FormatSpecifier$BigDecimalLayout;->toCharArray(Ljava/lang/StringBuilder;)[C
-Ljava/util/Formatter$FormatSpecifier;->addDot([C)[C
-Ljava/util/Formatter$FormatSpecifier;->addZeros([CI)[C
-Ljava/util/Formatter$FormatSpecifier;->adjustWidth(ILjava/util/Formatter$Flags;Z)I
-Ljava/util/Formatter$FormatSpecifier;->c:C
-Ljava/util/Formatter$FormatSpecifier;->checkCharacter()V
-Ljava/util/Formatter$FormatSpecifier;->checkDateTime()V
-Ljava/util/Formatter$FormatSpecifier;->checkFloat()V
-Ljava/util/Formatter$FormatSpecifier;->checkGeneral()V
-Ljava/util/Formatter$FormatSpecifier;->checkInteger()V
-Ljava/util/Formatter$FormatSpecifier;->checkNumeric()V
-Ljava/util/Formatter$FormatSpecifier;->checkText()V
-Ljava/util/Formatter$FormatSpecifier;->conversion()C
-Ljava/util/Formatter$FormatSpecifier;->conversion(Ljava/lang/String;)C
-Ljava/util/Formatter$FormatSpecifier;->dt:Z
-Ljava/util/Formatter$FormatSpecifier;->f:Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$FormatSpecifier;->failConversion(CLjava/lang/Object;)V
-Ljava/util/Formatter$FormatSpecifier;->failMismatch(Ljava/util/Formatter$Flags;C)V
-Ljava/util/Formatter$FormatSpecifier;->flags()Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$FormatSpecifier;->flags(Ljava/lang/String;)Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$FormatSpecifier;->getZero(Ljava/util/Locale;)C
-Ljava/util/Formatter$FormatSpecifier;->hexDouble(DI)Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifier;->index()I
-Ljava/util/Formatter$FormatSpecifier;->index(Ljava/lang/String;)I
-Ljava/util/Formatter$FormatSpecifier;->index:I
-Ljava/util/Formatter$FormatSpecifier;->justify(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifier;->leadingSign(Ljava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
-Ljava/util/Formatter$FormatSpecifier;->localizedMagnitude(Ljava/lang/StringBuilder;JLjava/util/Formatter$Flags;ILjava/util/Locale;)Ljava/lang/StringBuilder;
-Ljava/util/Formatter$FormatSpecifier;->localizedMagnitude(Ljava/lang/StringBuilder;[CLjava/util/Formatter$Flags;ILjava/util/Locale;)Ljava/lang/StringBuilder;
-Ljava/util/Formatter$FormatSpecifier;->precision()I
-Ljava/util/Formatter$FormatSpecifier;->precision(Ljava/lang/String;)I
-Ljava/util/Formatter$FormatSpecifier;->precision:I
-Ljava/util/Formatter$FormatSpecifier;->print(BLjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(DLjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(FLjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(ILjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(JLjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/lang/Object;Ljava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/lang/String;)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;DLjava/util/Locale;Ljava/util/Formatter$Flags;CIZ)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;Ljava/math/BigDecimal;Ljava/util/Locale;Ljava/util/Formatter$Flags;CIZ)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;Ljava/time/temporal/TemporalAccessor;CLjava/util/Locale;)Ljava/lang/Appendable;
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/lang/StringBuilder;Ljava/util/Calendar;CLjava/util/Locale;)Ljava/lang/Appendable;
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/math/BigDecimal;Ljava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/math/BigInteger;Ljava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/time/temporal/TemporalAccessor;CLjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(Ljava/util/Calendar;CLjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->print(SLjava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->printBoolean(Ljava/lang/Object;)V
-Ljava/util/Formatter$FormatSpecifier;->printCharacter(Ljava/lang/Object;)V
-Ljava/util/Formatter$FormatSpecifier;->printDateTime(Ljava/lang/Object;Ljava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->printFloat(Ljava/lang/Object;Ljava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->printHashCode(Ljava/lang/Object;)V
-Ljava/util/Formatter$FormatSpecifier;->printInteger(Ljava/lang/Object;Ljava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->printString(Ljava/lang/Object;Ljava/util/Locale;)V
-Ljava/util/Formatter$FormatSpecifier;->trailingSign(Ljava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
-Ljava/util/Formatter$FormatSpecifier;->trailingZeros([CI)[C
-Ljava/util/Formatter$FormatSpecifier;->width()I
-Ljava/util/Formatter$FormatSpecifier;->width(Ljava/lang/String;)I
-Ljava/util/Formatter$FormatSpecifier;->width:I
-Ljava/util/Formatter$FormatSpecifierParser;->advance()C
-Ljava/util/Formatter$FormatSpecifierParser;->back(I)V
-Ljava/util/Formatter$FormatSpecifierParser;->conv:Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->cursor:I
-Ljava/util/Formatter$FormatSpecifierParser;->FLAGS:Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->flags:Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->format:Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->fs:Ljava/util/Formatter$FormatSpecifier;
-Ljava/util/Formatter$FormatSpecifierParser;->getEndIdx()I
-Ljava/util/Formatter$FormatSpecifierParser;->getFormatSpecifier()Ljava/util/Formatter$FormatSpecifier;
-Ljava/util/Formatter$FormatSpecifierParser;->index:Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->isEnd()Z
-Ljava/util/Formatter$FormatSpecifierParser;->nextInt()Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->nextIsInt()Z
-Ljava/util/Formatter$FormatSpecifierParser;->peek()C
-Ljava/util/Formatter$FormatSpecifierParser;->precision:Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->tT:Ljava/lang/String;
-Ljava/util/Formatter$FormatSpecifierParser;->width:Ljava/lang/String;
-Ljava/util/Formatter$FormatString;->index()I
-Ljava/util/Formatter$FormatString;->print(Ljava/lang/Object;Ljava/util/Locale;)V
-Ljava/util/Formatter;-><init>(Ljava/nio/charset/Charset;Ljava/util/Locale;Ljava/io/File;)V
-Ljava/util/Formatter;-><init>(Ljava/util/Locale;Ljava/lang/Appendable;)V
-Ljava/util/Formatter;->a:Ljava/lang/Appendable;
-Ljava/util/Formatter;->ensureOpen()V
-Ljava/util/Formatter;->getZero(Ljava/util/Locale;)C
-Ljava/util/Formatter;->l:Ljava/util/Locale;
-Ljava/util/Formatter;->lastException:Ljava/io/IOException;
-Ljava/util/Formatter;->MAX_FD_CHARS:I
-Ljava/util/Formatter;->nonNullAppendable(Ljava/lang/Appendable;)Ljava/lang/Appendable;
-Ljava/util/Formatter;->parse(Ljava/lang/String;)[Ljava/util/Formatter$FormatString;
-Ljava/util/Formatter;->scaleUp:D
-Ljava/util/Formatter;->toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/util/Formatter;->zero:C
-Ljava/util/GregorianCalendar;-><init>(IIIIIII)V
-Ljava/util/GregorianCalendar;-><init>(J)V
-Ljava/util/GregorianCalendar;-><init>(Ljava/util/TimeZone;Ljava/util/Locale;Z)V
-Ljava/util/GregorianCalendar;->actualMonthLength()I
-Ljava/util/GregorianCalendar;->adjustDstOffsetForInvalidWallClock(JLjava/util/TimeZone;I)I
-Ljava/util/GregorianCalendar;->adjustForZoneAndDaylightSavingsTime(IJLjava/util/TimeZone;)J
-Ljava/util/GregorianCalendar;->BCE:I
-Ljava/util/GregorianCalendar;->cachedFixedDate:J
-Ljava/util/GregorianCalendar;->calsys:Lsun/util/calendar/BaseCalendar;
-Ljava/util/GregorianCalendar;->cdate:Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/GregorianCalendar;->CE:I
-Ljava/util/GregorianCalendar;->computeFields(II)I
-Ljava/util/GregorianCalendar;->DEFAULT_GREGORIAN_CUTOVER:J
-Ljava/util/GregorianCalendar;->EPOCH_OFFSET:I
-Ljava/util/GregorianCalendar;->EPOCH_YEAR:I
-Ljava/util/GregorianCalendar;->gcal:Lsun/util/calendar/Gregorian;
-Ljava/util/GregorianCalendar;->gdate:Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/GregorianCalendar;->getCalendarDate(J)Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/GregorianCalendar;->getCurrentFixedDate()J
-Ljava/util/GregorianCalendar;->getCutoverCalendarSystem()Lsun/util/calendar/BaseCalendar;
-Ljava/util/GregorianCalendar;->getFixedDate(Lsun/util/calendar/BaseCalendar;II)J
-Ljava/util/GregorianCalendar;->getFixedDateJan1(Lsun/util/calendar/BaseCalendar$Date;J)J
-Ljava/util/GregorianCalendar;->getFixedDateMonth1(Lsun/util/calendar/BaseCalendar$Date;J)J
-Ljava/util/GregorianCalendar;->getGregorianCutoverDate()Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/GregorianCalendar;->getJulianCalendarSystem()Lsun/util/calendar/BaseCalendar;
-Ljava/util/GregorianCalendar;->getLastJulianDate()Lsun/util/calendar/BaseCalendar$Date;
-Ljava/util/GregorianCalendar;->getNormalizedCalendar()Ljava/util/GregorianCalendar;
-Ljava/util/GregorianCalendar;->getRolledValue(IIII)I
-Ljava/util/GregorianCalendar;->getWeekNumber(JJ)I
-Ljava/util/GregorianCalendar;->getYearOffsetInMillis()J
-Ljava/util/GregorianCalendar;->gregorianCutover:J
-Ljava/util/GregorianCalendar;->gregorianCutoverDate:J
-Ljava/util/GregorianCalendar;->gregorianCutoverYear:I
-Ljava/util/GregorianCalendar;->gregorianCutoverYearJulian:I
-Ljava/util/GregorianCalendar;->internalGetEra()I
-Ljava/util/GregorianCalendar;->isCutoverYear(I)Z
-Ljava/util/GregorianCalendar;->jcal:Lsun/util/calendar/JulianCalendar;
-Ljava/util/GregorianCalendar;->jeras:[Lsun/util/calendar/Era;
-Ljava/util/GregorianCalendar;->LEAP_MONTH_LENGTH:[I
-Ljava/util/GregorianCalendar;->LEAST_MAX_VALUES:[I
-Ljava/util/GregorianCalendar;->MAX_VALUES:[I
-Ljava/util/GregorianCalendar;->MIN_VALUES:[I
-Ljava/util/GregorianCalendar;->monthLength(I)I
-Ljava/util/GregorianCalendar;->monthLength(II)I
-Ljava/util/GregorianCalendar;->MONTH_LENGTH:[I
-Ljava/util/GregorianCalendar;->ONE_DAY:J
-Ljava/util/GregorianCalendar;->ONE_HOUR:I
-Ljava/util/GregorianCalendar;->ONE_MINUTE:I
-Ljava/util/GregorianCalendar;->ONE_SECOND:I
-Ljava/util/GregorianCalendar;->ONE_WEEK:J
-Ljava/util/GregorianCalendar;->originalFields:[I
-Ljava/util/GregorianCalendar;->pinDayOfMonth()V
-Ljava/util/GregorianCalendar;->setGregorianChange(J)V
-Ljava/util/GregorianCalendar;->yearLength()I
-Ljava/util/GregorianCalendar;->yearLength(I)I
-Ljava/util/GregorianCalendar;->zoneOffsets:[I
-Ljava/util/HashMap$EntrySet;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/HashMap$EntrySpliterator;-><init>(Ljava/util/HashMap;IIII)V
-Ljava/util/HashMap$EntrySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/HashMap$EntrySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/HashMap$HashIterator;->current:Ljava/util/HashMap$Node;
-Ljava/util/HashMap$HashIterator;->expectedModCount:I
-Ljava/util/HashMap$HashIterator;->index:I
-Ljava/util/HashMap$HashIterator;->next:Ljava/util/HashMap$Node;
-Ljava/util/HashMap$HashIterator;->nextNode()Ljava/util/HashMap$Node;
-Ljava/util/HashMap$HashMapSpliterator;-><init>(Ljava/util/HashMap;IIII)V
-Ljava/util/HashMap$HashMapSpliterator;->current:Ljava/util/HashMap$Node;
-Ljava/util/HashMap$HashMapSpliterator;->est:I
-Ljava/util/HashMap$HashMapSpliterator;->estimateSize()J
-Ljava/util/HashMap$HashMapSpliterator;->expectedModCount:I
-Ljava/util/HashMap$HashMapSpliterator;->fence:I
-Ljava/util/HashMap$HashMapSpliterator;->getFence()I
-Ljava/util/HashMap$HashMapSpliterator;->index:I
-Ljava/util/HashMap$HashMapSpliterator;->map:Ljava/util/HashMap;
-Ljava/util/HashMap$KeySet;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/HashMap$KeySpliterator;-><init>(Ljava/util/HashMap;IIII)V
-Ljava/util/HashMap$KeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/HashMap$KeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/HashMap$Node;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
-Ljava/util/HashMap$Node;->hash:I
-Ljava/util/HashMap$TreeNode;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
-Ljava/util/HashMap$TreeNode;->balanceDeletion(Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->balanceInsertion(Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->checkInvariants(Ljava/util/HashMap$TreeNode;)Z
-Ljava/util/HashMap$TreeNode;->find(ILjava/lang/Object;Ljava/lang/Class;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->getTreeNode(ILjava/lang/Object;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->left:Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->moveRootToFront([Ljava/util/HashMap$Node;Ljava/util/HashMap$TreeNode;)V
-Ljava/util/HashMap$TreeNode;->parent:Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->prev:Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->putTreeVal(Ljava/util/HashMap;[Ljava/util/HashMap$Node;ILjava/lang/Object;Ljava/lang/Object;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->red:Z
-Ljava/util/HashMap$TreeNode;->removeTreeNode(Ljava/util/HashMap;[Ljava/util/HashMap$Node;Z)V
-Ljava/util/HashMap$TreeNode;->right:Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->root()Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->rotateLeft(Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->rotateRight(Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$TreeNode;->split(Ljava/util/HashMap;[Ljava/util/HashMap$Node;II)V
-Ljava/util/HashMap$TreeNode;->tieBreakOrder(Ljava/lang/Object;Ljava/lang/Object;)I
-Ljava/util/HashMap$TreeNode;->treeify([Ljava/util/HashMap$Node;)V
-Ljava/util/HashMap$TreeNode;->untreeify(Ljava/util/HashMap;)Ljava/util/HashMap$Node;
-Ljava/util/HashMap$Values;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/HashMap$ValueSpliterator;-><init>(Ljava/util/HashMap;IIII)V
-Ljava/util/HashMap$ValueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/HashMap$ValueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/HashMap;->afterNodeAccess(Ljava/util/HashMap$Node;)V
-Ljava/util/HashMap;->afterNodeInsertion(Z)V
-Ljava/util/HashMap;->afterNodeRemoval(Ljava/util/HashMap$Node;)V
-Ljava/util/HashMap;->capacity()I
-Ljava/util/HashMap;->comparableClassFor(Ljava/lang/Object;)Ljava/lang/Class;
-Ljava/util/HashMap;->compareComparables(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;)I
-Ljava/util/HashMap;->DEFAULT_INITIAL_CAPACITY:I
-Ljava/util/HashMap;->DEFAULT_LOAD_FACTOR:F
-Ljava/util/HashMap;->entrySet:Ljava/util/Set;
-Ljava/util/HashMap;->getNode(ILjava/lang/Object;)Ljava/util/HashMap$Node;
-Ljava/util/HashMap;->hash(Ljava/lang/Object;)I
-Ljava/util/HashMap;->internalWriteEntries(Ljava/io/ObjectOutputStream;)V
-Ljava/util/HashMap;->loadFactor()F
-Ljava/util/HashMap;->loadFactor:F
-Ljava/util/HashMap;->MAXIMUM_CAPACITY:I
-Ljava/util/HashMap;->MIN_TREEIFY_CAPACITY:I
-Ljava/util/HashMap;->newNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
-Ljava/util/HashMap;->newTreeNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap;->putMapEntries(Ljava/util/Map;Z)V
-Ljava/util/HashMap;->putVal(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object;
-Ljava/util/HashMap;->reinitialize()V
-Ljava/util/HashMap;->removeNode(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/util/HashMap$Node;
-Ljava/util/HashMap;->replacementNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
-Ljava/util/HashMap;->replacementTreeNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap;->resize()[Ljava/util/HashMap$Node;
-Ljava/util/HashMap;->size:I
-Ljava/util/HashMap;->tableSizeFor(I)I
-Ljava/util/HashMap;->threshold:I
-Ljava/util/HashMap;->treeifyBin([Ljava/util/HashMap$Node;I)V
-Ljava/util/HashMap;->TREEIFY_THRESHOLD:I
-Ljava/util/HashMap;->UNTREEIFY_THRESHOLD:I
-Ljava/util/HashSet;-><init>(IFZ)V
-Ljava/util/HashSet;->PRESENT:Ljava/lang/Object;
-Ljava/util/Hashtable$EntrySet;->add(Ljava/util/Map$Entry;)Z
-Ljava/util/Hashtable$Enumerator;->entry:Ljava/util/Hashtable$HashtableEntry;
-Ljava/util/Hashtable$Enumerator;->expectedModCount:I
-Ljava/util/Hashtable$Enumerator;->index:I
-Ljava/util/Hashtable$Enumerator;->iterator:Z
-Ljava/util/Hashtable$Enumerator;->lastReturned:Ljava/util/Hashtable$HashtableEntry;
-Ljava/util/Hashtable$Enumerator;->table:[Ljava/util/Hashtable$HashtableEntry;
-Ljava/util/Hashtable$Enumerator;->type:I
-Ljava/util/Hashtable$HashtableEntry;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/Hashtable$HashtableEntry;)V
-Ljava/util/Hashtable$HashtableEntry;->hash:I
-Ljava/util/Hashtable$HashtableEntry;->key:Ljava/lang/Object;
-Ljava/util/Hashtable$HashtableEntry;->next:Ljava/util/Hashtable$HashtableEntry;
-Ljava/util/Hashtable$HashtableEntry;->value:Ljava/lang/Object;
-Ljava/util/Hashtable;->addEntry(ILjava/lang/Object;Ljava/lang/Object;I)V
-Ljava/util/Hashtable;->count:I
-Ljava/util/Hashtable;->ENTRIES:I
-Ljava/util/Hashtable;->entrySet:Ljava/util/Set;
-Ljava/util/Hashtable;->getEnumeration(I)Ljava/util/Enumeration;
-Ljava/util/Hashtable;->getIterator(I)Ljava/util/Iterator;
-Ljava/util/Hashtable;->KEYS:I
-Ljava/util/Hashtable;->keySet:Ljava/util/Set;
-Ljava/util/Hashtable;->loadFactor:F
-Ljava/util/Hashtable;->MAX_ARRAY_SIZE:I
-Ljava/util/Hashtable;->modCount:I
-Ljava/util/Hashtable;->reconstitutionPut([Ljava/util/Hashtable$HashtableEntry;Ljava/lang/Object;Ljava/lang/Object;)V
-Ljava/util/Hashtable;->table:[Ljava/util/Hashtable$HashtableEntry;
-Ljava/util/Hashtable;->threshold:I
-Ljava/util/Hashtable;->VALUES:I
-Ljava/util/Hashtable;->values:Ljava/util/Collection;
-Ljava/util/IdentityHashMap$EntryIterator$Entry;->checkIndexForEntryUse()V
-Ljava/util/IdentityHashMap$EntryIterator$Entry;->index:I
-Ljava/util/IdentityHashMap$EntryIterator;->lastReturnedEntry:Ljava/util/IdentityHashMap$EntryIterator$Entry;
-Ljava/util/IdentityHashMap$EntrySpliterator;-><init>(Ljava/util/IdentityHashMap;IIII)V
-Ljava/util/IdentityHashMap$EntrySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/IdentityHashMap$EntrySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/IdentityHashMap$IdentityHashMapIterator;->expectedModCount:I
-Ljava/util/IdentityHashMap$IdentityHashMapIterator;->index:I
-Ljava/util/IdentityHashMap$IdentityHashMapIterator;->indexValid:Z
-Ljava/util/IdentityHashMap$IdentityHashMapIterator;->lastReturnedIndex:I
-Ljava/util/IdentityHashMap$IdentityHashMapIterator;->nextIndex()I
-Ljava/util/IdentityHashMap$IdentityHashMapIterator;->traversalTable:[Ljava/lang/Object;
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;-><init>(Ljava/util/IdentityHashMap;IIII)V
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;->est:I
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;->estimateSize()J
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;->expectedModCount:I
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;->fence:I
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;->getFence()I
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;->index:I
-Ljava/util/IdentityHashMap$IdentityHashMapSpliterator;->map:Ljava/util/IdentityHashMap;
-Ljava/util/IdentityHashMap$KeySpliterator;-><init>(Ljava/util/IdentityHashMap;IIII)V
-Ljava/util/IdentityHashMap$KeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/IdentityHashMap$KeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/IdentityHashMap$ValueSpliterator;-><init>(Ljava/util/IdentityHashMap;IIII)V
-Ljava/util/IdentityHashMap$ValueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/IdentityHashMap$ValueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/IdentityHashMap;->capacity(I)I
-Ljava/util/IdentityHashMap;->closeDeletion(I)V
-Ljava/util/IdentityHashMap;->containsMapping(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/IdentityHashMap;->DEFAULT_CAPACITY:I
-Ljava/util/IdentityHashMap;->entrySet:Ljava/util/Set;
-Ljava/util/IdentityHashMap;->hash(Ljava/lang/Object;I)I
-Ljava/util/IdentityHashMap;->init(I)V
-Ljava/util/IdentityHashMap;->maskNull(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/IdentityHashMap;->MAXIMUM_CAPACITY:I
-Ljava/util/IdentityHashMap;->MINIMUM_CAPACITY:I
-Ljava/util/IdentityHashMap;->modCount:I
-Ljava/util/IdentityHashMap;->nextKeyIndex(II)I
-Ljava/util/IdentityHashMap;->NULL_KEY:Ljava/lang/Object;
-Ljava/util/IdentityHashMap;->putForCreate(Ljava/lang/Object;Ljava/lang/Object;)V
-Ljava/util/IdentityHashMap;->removeMapping(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/IdentityHashMap;->resize(I)Z
-Ljava/util/IdentityHashMap;->size:I
-Ljava/util/IdentityHashMap;->table:[Ljava/lang/Object;
-Ljava/util/IdentityHashMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/IllegalFormatCodePointException;->c:I
-Ljava/util/IllegalFormatConversionException;->arg:Ljava/lang/Class;
-Ljava/util/IllegalFormatConversionException;->c:C
-Ljava/util/IllegalFormatException;-><init>()V
-Ljava/util/IllegalFormatFlagsException;->flags:Ljava/lang/String;
-Ljava/util/IllegalFormatPrecisionException;->p:I
-Ljava/util/IllegalFormatWidthException;->w:I
-Ljava/util/IllformedLocaleException;->_errIdx:I
-Ljava/util/IntSummaryStatistics;->count:J
-Ljava/util/IntSummaryStatistics;->max:I
-Ljava/util/IntSummaryStatistics;->min:I
-Ljava/util/IntSummaryStatistics;->sum:J
-Ljava/util/jar/Attributes$Name;->hashCode:I
-Ljava/util/jar/Attributes$Name;->isAlpha(C)Z
-Ljava/util/jar/Attributes$Name;->isDigit(C)Z
-Ljava/util/jar/Attributes$Name;->isValid(C)Z
-Ljava/util/jar/Attributes$Name;->isValid(Ljava/lang/String;)Z
-Ljava/util/jar/Attributes$Name;->name:Ljava/lang/String;
-Ljava/util/jar/Attributes$Name;->NAME:Ljava/util/jar/Attributes$Name;
-Ljava/util/jar/Attributes;->read(Ljava/util/jar/Manifest$FastInputStream;[B)V
-Ljava/util/jar/Attributes;->write(Ljava/io/DataOutputStream;)V
-Ljava/util/jar/Attributes;->writeMain(Ljava/io/DataOutputStream;)V
-Ljava/util/jar/JarEntry;->attr:Ljava/util/jar/Attributes;
-Ljava/util/jar/JarEntry;->certs:[Ljava/security/cert/Certificate;
-Ljava/util/jar/JarEntry;->signers:[Ljava/security/CodeSigner;
-Ljava/util/jar/JarFile$JarEntryIterator;->e:Ljava/util/Enumeration;
-Ljava/util/jar/JarFile;->checkForSpecialAttributes()V
-Ljava/util/jar/JarFile;->CLASSPATH_CHARS:[C
-Ljava/util/jar/JarFile;->CLASSPATH_LASTOCC:[I
-Ljava/util/jar/JarFile;->CLASSPATH_OPTOSFT:[I
-Ljava/util/jar/JarFile;->getBytes(Ljava/util/zip/ZipEntry;)[B
-Ljava/util/jar/JarFile;->getManEntry()Ljava/util/jar/JarEntry;
-Ljava/util/jar/JarFile;->getManifestFromReference()Ljava/util/jar/Manifest;
-Ljava/util/jar/JarFile;->getMetaInfEntryNames()[Ljava/lang/String;
-Ljava/util/jar/JarFile;->hasCheckedSpecialAttributes:Z
-Ljava/util/jar/JarFile;->hasClassPathAttribute()Z
-Ljava/util/jar/JarFile;->hasClassPathAttribute:Z
-Ljava/util/jar/JarFile;->initializeVerifier()V
-Ljava/util/jar/JarFile;->jv:Ljava/util/jar/JarVerifier;
-Ljava/util/jar/JarFile;->jvInitialized:Z
-Ljava/util/jar/JarFile;->manEntry:Ljava/util/jar/JarEntry;
-Ljava/util/jar/JarFile;->match([C[B[I[I)Z
-Ljava/util/jar/JarFile;->maybeInstantiateVerifier()V
-Ljava/util/jar/JarFile;->META_DIR:Ljava/lang/String;
-Ljava/util/jar/JarFile;->newEntry(Ljava/util/zip/ZipEntry;)Ljava/util/jar/JarEntry;
-Ljava/util/jar/JarFile;->verify:Z
-Ljava/util/jar/JarInputStream;->checkManifest(Ljava/util/jar/JarEntry;)Ljava/util/jar/JarEntry;
-Ljava/util/jar/JarInputStream;->doVerify:Z
-Ljava/util/jar/JarInputStream;->first:Ljava/util/jar/JarEntry;
-Ljava/util/jar/JarInputStream;->getBytes(Ljava/io/InputStream;)[B
-Ljava/util/jar/JarInputStream;->jv:Ljava/util/jar/JarVerifier;
-Ljava/util/jar/JarInputStream;->man:Ljava/util/jar/Manifest;
-Ljava/util/jar/JarInputStream;->mev:Lsun/security/util/ManifestEntryVerifier;
-Ljava/util/jar/JarInputStream;->tryManifest:Z
-Ljava/util/jar/JarOutputStream;->firstEntry:Z
-Ljava/util/jar/JarOutputStream;->get16([BI)I
-Ljava/util/jar/JarOutputStream;->hasMagic([B)Z
-Ljava/util/jar/JarOutputStream;->JAR_MAGIC:I
-Ljava/util/jar/JarOutputStream;->set16([BII)V
-Ljava/util/jar/JarVerifier$VerifierCodeSource;-><init>(Ljava/lang/Object;Ljava/net/URL;[Ljava/security/cert/Certificate;)V
-Ljava/util/jar/JarVerifier$VerifierCodeSource;-><init>(Ljava/lang/Object;Ljava/net/URL;[Ljava/security/CodeSigner;)V
-Ljava/util/jar/JarVerifier$VerifierCodeSource;->csdomain:Ljava/lang/Object;
-Ljava/util/jar/JarVerifier$VerifierCodeSource;->getPrivateCertificates()[Ljava/security/cert/Certificate;
-Ljava/util/jar/JarVerifier$VerifierCodeSource;->getPrivateSigners()[Ljava/security/CodeSigner;
-Ljava/util/jar/JarVerifier$VerifierCodeSource;->isSameDomain(Ljava/lang/Object;)Z
-Ljava/util/jar/JarVerifier$VerifierCodeSource;->vcerts:[Ljava/security/cert/Certificate;
-Ljava/util/jar/JarVerifier$VerifierCodeSource;->vlocation:Ljava/net/URL;
-Ljava/util/jar/JarVerifier$VerifierCodeSource;->vsigners:[Ljava/security/CodeSigner;
-Ljava/util/jar/JarVerifier$VerifierStream;-><init>(Ljava/util/jar/Manifest;Ljava/util/jar/JarEntry;Ljava/io/InputStream;Ljava/util/jar/JarVerifier;)V
-Ljava/util/jar/JarVerifier$VerifierStream;->is:Ljava/io/InputStream;
-Ljava/util/jar/JarVerifier$VerifierStream;->jv:Ljava/util/jar/JarVerifier;
-Ljava/util/jar/JarVerifier$VerifierStream;->mev:Lsun/security/util/ManifestEntryVerifier;
-Ljava/util/jar/JarVerifier$VerifierStream;->numLeft:J
-Ljava/util/jar/JarVerifier;-><init>([B)V
-Ljava/util/jar/JarVerifier;->anyToVerify:Z
-Ljava/util/jar/JarVerifier;->baos:Ljava/io/ByteArrayOutputStream;
-Ljava/util/jar/JarVerifier;->beginEntry(Ljava/util/jar/JarEntry;Lsun/security/util/ManifestEntryVerifier;)V
-Ljava/util/jar/JarVerifier;->csdomain:Ljava/lang/Object;
-Ljava/util/jar/JarVerifier;->debug:Lsun/security/util/Debug;
-Ljava/util/jar/JarVerifier;->doneWithMeta()V
-Ljava/util/jar/JarVerifier;->eagerValidation:Z
-Ljava/util/jar/JarVerifier;->emptyEnumeration:Ljava/util/Enumeration;
-Ljava/util/jar/JarVerifier;->emptySigner:[Ljava/security/CodeSigner;
-Ljava/util/jar/JarVerifier;->entries2(Ljava/util/jar/JarFile;Ljava/util/Enumeration;)Ljava/util/Enumeration;
-Ljava/util/jar/JarVerifier;->entryNames(Ljava/util/jar/JarFile;[Ljava/security/CodeSource;)Ljava/util/Enumeration;
-Ljava/util/jar/JarVerifier;->findMatchingSigners(Ljava/security/CodeSource;)[Ljava/security/CodeSigner;
-Ljava/util/jar/JarVerifier;->getCerts(Ljava/lang/String;)[Ljava/security/cert/Certificate;
-Ljava/util/jar/JarVerifier;->getCerts(Ljava/util/jar/JarFile;Ljava/util/jar/JarEntry;)[Ljava/security/cert/Certificate;
-Ljava/util/jar/JarVerifier;->getCodeSigners(Ljava/lang/String;)[Ljava/security/CodeSigner;
-Ljava/util/jar/JarVerifier;->getCodeSigners(Ljava/util/jar/JarFile;Ljava/util/jar/JarEntry;)[Ljava/security/CodeSigner;
-Ljava/util/jar/JarVerifier;->getCodeSource(Ljava/net/URL;Ljava/lang/String;)Ljava/security/CodeSource;
-Ljava/util/jar/JarVerifier;->getCodeSource(Ljava/net/URL;Ljava/util/jar/JarFile;Ljava/util/jar/JarEntry;)Ljava/security/CodeSource;
-Ljava/util/jar/JarVerifier;->getCodeSources(Ljava/util/jar/JarFile;Ljava/net/URL;)[Ljava/security/CodeSource;
-Ljava/util/jar/JarVerifier;->getJarCodeSigners()Ljava/util/List;
-Ljava/util/jar/JarVerifier;->getManifestDigests()Ljava/util/List;
-Ljava/util/jar/JarVerifier;->getUnsignedCS(Ljava/net/URL;)Ljava/security/CodeSource;
-Ljava/util/jar/JarVerifier;->isSigningRelated(Ljava/lang/String;)Z
-Ljava/util/jar/JarVerifier;->jarCodeSigners:Ljava/util/List;
-Ljava/util/jar/JarVerifier;->lastURL:Ljava/net/URL;
-Ljava/util/jar/JarVerifier;->lastURLMap:Ljava/util/Map;
-Ljava/util/jar/JarVerifier;->manDig:Lsun/security/util/ManifestDigester;
-Ljava/util/jar/JarVerifier;->manifestDigests:Ljava/util/List;
-Ljava/util/jar/JarVerifier;->manifestRawBytes:[B
-Ljava/util/jar/JarVerifier;->mapSignersToCertArray([Ljava/security/CodeSigner;)[Ljava/security/cert/Certificate;
-Ljava/util/jar/JarVerifier;->mapSignersToCodeSource(Ljava/net/URL;[Ljava/security/CodeSigner;)Ljava/security/CodeSource;
-Ljava/util/jar/JarVerifier;->mapSignersToCodeSources(Ljava/net/URL;Ljava/util/List;Z)[Ljava/security/CodeSource;
-Ljava/util/jar/JarVerifier;->nothingToVerify()Z
-Ljava/util/jar/JarVerifier;->parsingBlockOrSF:Z
-Ljava/util/jar/JarVerifier;->parsingMeta:Z
-Ljava/util/jar/JarVerifier;->pendingBlocks:Ljava/util/ArrayList;
-Ljava/util/jar/JarVerifier;->processEntry(Lsun/security/util/ManifestEntryVerifier;)V
-Ljava/util/jar/JarVerifier;->setEagerValidation(Z)V
-Ljava/util/jar/JarVerifier;->sigFileData:Ljava/util/Hashtable;
-Ljava/util/jar/JarVerifier;->sigFileSigners:Ljava/util/Hashtable;
-Ljava/util/jar/JarVerifier;->signerCache:Ljava/util/ArrayList;
-Ljava/util/jar/JarVerifier;->signerMap()Ljava/util/Map;
-Ljava/util/jar/JarVerifier;->signerMap:Ljava/util/Map;
-Ljava/util/jar/JarVerifier;->signerToCodeSource:Ljava/util/Map;
-Ljava/util/jar/JarVerifier;->unsignedEntryNames(Ljava/util/jar/JarFile;)Ljava/util/Enumeration;
-Ljava/util/jar/JarVerifier;->update(ILsun/security/util/ManifestEntryVerifier;)V
-Ljava/util/jar/JarVerifier;->update(I[BIILsun/security/util/ManifestEntryVerifier;)V
-Ljava/util/jar/JarVerifier;->urlToCodeSourceMap:Ljava/util/Map;
-Ljava/util/jar/JarVerifier;->verifiedSigners:Ljava/util/Hashtable;
-Ljava/util/jar/Manifest$FastInputStream;-><init>(Ljava/io/InputStream;)V
-Ljava/util/jar/Manifest$FastInputStream;-><init>(Ljava/io/InputStream;I)V
-Ljava/util/jar/Manifest$FastInputStream;->buf:[B
-Ljava/util/jar/Manifest$FastInputStream;->count:I
-Ljava/util/jar/Manifest$FastInputStream;->fill()V
-Ljava/util/jar/Manifest$FastInputStream;->peek()B
-Ljava/util/jar/Manifest$FastInputStream;->pos:I
-Ljava/util/jar/Manifest$FastInputStream;->readLine([B)I
-Ljava/util/jar/Manifest$FastInputStream;->readLine([BII)I
-Ljava/util/jar/Manifest;->attr:Ljava/util/jar/Attributes;
-Ljava/util/jar/Manifest;->entries:Ljava/util/Map;
-Ljava/util/jar/Manifest;->make72Safe(Ljava/lang/StringBuffer;)V
-Ljava/util/jar/Manifest;->parseName([BI)Ljava/lang/String;
-Ljava/util/jar/Manifest;->toLower(I)I
-Ljava/util/jar/Pack200;-><init>()V
-Ljava/util/jar/Pack200;->newInstance(Ljava/lang/String;)Ljava/lang/Object;
-Ljava/util/jar/Pack200;->packerImpl:Ljava/lang/Class;
-Ljava/util/jar/Pack200;->PACK_PROVIDER:Ljava/lang/String;
-Ljava/util/jar/Pack200;->unpackerImpl:Ljava/lang/Class;
-Ljava/util/jar/Pack200;->UNPACK_PROVIDER:Ljava/lang/String;
-Ljava/util/LinkedHashMap$LinkedEntrySet;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/LinkedHashMap$LinkedHashIterator;->current:Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap$LinkedHashIterator;->expectedModCount:I
-Ljava/util/LinkedHashMap$LinkedHashIterator;->next:Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap$LinkedHashIterator;->nextNode()Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap$LinkedHashIterator;->remove()V
-Ljava/util/LinkedHashMap$LinkedHashMapEntry;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
-Ljava/util/LinkedHashMap$LinkedHashMapEntry;->after:Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap$LinkedHashMapEntry;->before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap$LinkedKeySet;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/LinkedHashMap$LinkedValues;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/LinkedHashMap;->afterNodeAccess(Ljava/util/HashMap$Node;)V
-Ljava/util/LinkedHashMap;->afterNodeInsertion(Z)V
-Ljava/util/LinkedHashMap;->afterNodeRemoval(Ljava/util/HashMap$Node;)V
-Ljava/util/LinkedHashMap;->head:Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap;->internalWriteEntries(Ljava/io/ObjectOutputStream;)V
-Ljava/util/LinkedHashMap;->linkNodeLast(Ljava/util/LinkedHashMap$LinkedHashMapEntry;)V
-Ljava/util/LinkedHashMap;->newNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
-Ljava/util/LinkedHashMap;->newTreeNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-Ljava/util/LinkedHashMap;->reinitialize()V
-Ljava/util/LinkedHashMap;->replacementNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
-Ljava/util/LinkedHashMap;->replacementTreeNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-Ljava/util/LinkedHashMap;->tail:Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap;->transferLinks(Ljava/util/LinkedHashMap$LinkedHashMapEntry;Ljava/util/LinkedHashMap$LinkedHashMapEntry;)V
-Ljava/util/LinkedList$DescendingIterator;->itr:Ljava/util/LinkedList$ListItr;
-Ljava/util/LinkedList$ListItr;->checkForComodification()V
-Ljava/util/LinkedList$ListItr;->expectedModCount:I
-Ljava/util/LinkedList$ListItr;->lastReturned:Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList$ListItr;->next:Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList$ListItr;->nextIndex:I
-Ljava/util/LinkedList$LLSpliterator;-><init>(Ljava/util/LinkedList;II)V
-Ljava/util/LinkedList$LLSpliterator;->batch:I
-Ljava/util/LinkedList$LLSpliterator;->BATCH_UNIT:I
-Ljava/util/LinkedList$LLSpliterator;->current:Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList$LLSpliterator;->est:I
-Ljava/util/LinkedList$LLSpliterator;->expectedModCount:I
-Ljava/util/LinkedList$LLSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/LinkedList$LLSpliterator;->getEst()I
-Ljava/util/LinkedList$LLSpliterator;->list:Ljava/util/LinkedList;
-Ljava/util/LinkedList$LLSpliterator;->MAX_BATCH:I
-Ljava/util/LinkedList$LLSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/LinkedList$Node;-><init>(Ljava/util/LinkedList$Node;Ljava/lang/Object;Ljava/util/LinkedList$Node;)V
-Ljava/util/LinkedList$Node;->prev:Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList;->checkElementIndex(I)V
-Ljava/util/LinkedList;->checkPositionIndex(I)V
-Ljava/util/LinkedList;->isElementIndex(I)Z
-Ljava/util/LinkedList;->isPositionIndex(I)Z
-Ljava/util/LinkedList;->last:Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList;->linkBefore(Ljava/lang/Object;Ljava/util/LinkedList$Node;)V
-Ljava/util/LinkedList;->linkFirst(Ljava/lang/Object;)V
-Ljava/util/LinkedList;->linkLast(Ljava/lang/Object;)V
-Ljava/util/LinkedList;->node(I)Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList;->outOfBoundsMsg(I)Ljava/lang/String;
-Ljava/util/LinkedList;->superClone()Ljava/util/LinkedList;
-Ljava/util/LinkedList;->unlink(Ljava/util/LinkedList$Node;)Ljava/lang/Object;
-Ljava/util/LinkedList;->unlinkFirst(Ljava/util/LinkedList$Node;)Ljava/lang/Object;
-Ljava/util/LinkedList;->unlinkLast(Ljava/util/LinkedList$Node;)Ljava/lang/Object;
-Ljava/util/ListResourceBundle;->loadLookup()V
-Ljava/util/ListResourceBundle;->lookup:Ljava/util/Map;
-Ljava/util/Locale$Builder;->localeBuilder:Lsun/util/locale/InternalLocaleBuilder;
-Ljava/util/Locale$Cache;-><init>()V
-Ljava/util/Locale$Cache;->createObject(Ljava/util/Locale$LocaleKey;)Ljava/util/Locale;
-Ljava/util/Locale$Category;->countryKey:Ljava/lang/String;
-Ljava/util/Locale$Category;->languageKey:Ljava/lang/String;
-Ljava/util/Locale$Category;->scriptKey:Ljava/lang/String;
-Ljava/util/Locale$Category;->variantKey:Ljava/lang/String;
-Ljava/util/Locale$LanguageRange;->hash:I
-Ljava/util/Locale$LanguageRange;->isSubtagIllFormed(Ljava/lang/String;Z)Z
-Ljava/util/Locale$LanguageRange;->range:Ljava/lang/String;
-Ljava/util/Locale$LanguageRange;->weight:D
-Ljava/util/Locale$LocaleKey;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)V
-Ljava/util/Locale$LocaleKey;->base:Lsun/util/locale/BaseLocale;
-Ljava/util/Locale$LocaleKey;->exts:Lsun/util/locale/LocaleExtensions;
-Ljava/util/Locale$LocaleKey;->hash:I
-Ljava/util/Locale$NoImagePreloadHolder;-><init>()V
-Ljava/util/Locale$NoImagePreloadHolder;->defaultLocale:Ljava/util/Locale;
-Ljava/util/Locale;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)V
-Ljava/util/Locale;->adjustLanguageCode(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/Locale;->baseLocale:Lsun/util/locale/BaseLocale;
-Ljava/util/Locale;->composeList(Ljava/text/MessageFormat;[Ljava/lang/String;)[Ljava/lang/String;
-Ljava/util/Locale;->convertOldISOCodes(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/Locale;->defaultDisplayLocale:Ljava/util/Locale;
-Ljava/util/Locale;->defaultFormatLocale:Ljava/util/Locale;
-Ljava/util/Locale;->DISPLAY_COUNTRY:I
-Ljava/util/Locale;->DISPLAY_LANGUAGE:I
-Ljava/util/Locale;->DISPLAY_SCRIPT:I
-Ljava/util/Locale;->DISPLAY_VARIANT:I
-Ljava/util/Locale;->formatList([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/Locale;->getBaseLocale()Lsun/util/locale/BaseLocale;
-Ljava/util/Locale;->getCompatibilityExtensions(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/LocaleExtensions;
-Ljava/util/Locale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale;
-Ljava/util/Locale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
-Ljava/util/Locale;->getLocaleExtensions()Lsun/util/locale/LocaleExtensions;
-Ljava/util/Locale;->hashCodeValue:I
-Ljava/util/Locale;->initDefault()Ljava/util/Locale;
-Ljava/util/Locale;->initDefault(Ljava/util/Locale$Category;)Ljava/util/Locale;
-Ljava/util/Locale;->isAsciiAlphaNum(Ljava/lang/String;)Z
-Ljava/util/Locale;->isoCountries:[Ljava/lang/String;
-Ljava/util/Locale;->isoLanguages:[Ljava/lang/String;
-Ljava/util/Locale;->isUnicodeExtensionKey(Ljava/lang/String;)Z
-Ljava/util/Locale;->isUnM49AreaCode(Ljava/lang/String;)Z
-Ljava/util/Locale;->isValidBcp47Alpha(Ljava/lang/String;II)Z
-Ljava/util/Locale;->isValidVariantSubtag(Ljava/lang/String;)Z
-Ljava/util/Locale;->languageTag:Ljava/lang/String;
-Ljava/util/Locale;->LOCALECACHE:Ljava/util/Locale$Cache;
-Ljava/util/Locale;->localeExtensions:Lsun/util/locale/LocaleExtensions;
-Ljava/util/Locale;->normalizeAndValidateLanguage(Ljava/lang/String;Z)Ljava/lang/String;
-Ljava/util/Locale;->normalizeAndValidateRegion(Ljava/lang/String;Z)Ljava/lang/String;
-Ljava/util/Locale;->normalizeAndValidateVariant(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/Locale;->UNDETERMINED_LANGUAGE:Ljava/lang/String;
-Ljava/util/logging/ConsoleHandler;->configure()V
-Ljava/util/logging/ErrorManager;->reported:Z
-Ljava/util/logging/FileHandler$InitializationErrorManager;-><init>()V
-Ljava/util/logging/FileHandler$InitializationErrorManager;->lastException:Ljava/lang/Exception;
-Ljava/util/logging/FileHandler$MeteredStream;->out:Ljava/io/OutputStream;
-Ljava/util/logging/FileHandler$MeteredStream;->written:I
-Ljava/util/logging/FileHandler;->append:Z
-Ljava/util/logging/FileHandler;->configure()V
-Ljava/util/logging/FileHandler;->count:I
-Ljava/util/logging/FileHandler;->files:[Ljava/io/File;
-Ljava/util/logging/FileHandler;->generate(Ljava/lang/String;II)Ljava/io/File;
-Ljava/util/logging/FileHandler;->isParentWritable(Ljava/nio/file/Path;)Z
-Ljava/util/logging/FileHandler;->limit:I
-Ljava/util/logging/FileHandler;->lockFileChannel:Ljava/nio/channels/FileChannel;
-Ljava/util/logging/FileHandler;->lockFileName:Ljava/lang/String;
-Ljava/util/logging/FileHandler;->locks:Ljava/util/Set;
-Ljava/util/logging/FileHandler;->MAX_LOCKS:I
-Ljava/util/logging/FileHandler;->meter:Ljava/util/logging/FileHandler$MeteredStream;
-Ljava/util/logging/FileHandler;->open(Ljava/io/File;Z)V
-Ljava/util/logging/FileHandler;->openFiles()V
-Ljava/util/logging/FileHandler;->pattern:Ljava/lang/String;
-Ljava/util/logging/FileHandler;->rotate()V
-Ljava/util/logging/Handler;->checkPermission()V
-Ljava/util/logging/Handler;->encoding:Ljava/lang/String;
-Ljava/util/logging/Handler;->errorManager:Ljava/util/logging/ErrorManager;
-Ljava/util/logging/Handler;->filter:Ljava/util/logging/Filter;
-Ljava/util/logging/Handler;->formatter:Ljava/util/logging/Formatter;
-Ljava/util/logging/Handler;->logLevel:Ljava/util/logging/Level;
-Ljava/util/logging/Handler;->manager:Ljava/util/logging/LogManager;
-Ljava/util/logging/Handler;->offValue:I
-Ljava/util/logging/Level$KnownLevel;-><init>(Ljava/util/logging/Level;)V
-Ljava/util/logging/Level$KnownLevel;->add(Ljava/util/logging/Level;)V
-Ljava/util/logging/Level$KnownLevel;->findByLocalizedLevelName(Ljava/lang/String;)Ljava/util/logging/Level$KnownLevel;
-Ljava/util/logging/Level$KnownLevel;->findByName(Ljava/lang/String;)Ljava/util/logging/Level$KnownLevel;
-Ljava/util/logging/Level$KnownLevel;->findByValue(I)Ljava/util/logging/Level$KnownLevel;
-Ljava/util/logging/Level$KnownLevel;->intToLevels:Ljava/util/Map;
-Ljava/util/logging/Level$KnownLevel;->levelObject:Ljava/util/logging/Level;
-Ljava/util/logging/Level$KnownLevel;->matches(Ljava/util/logging/Level;)Ljava/util/logging/Level$KnownLevel;
-Ljava/util/logging/Level$KnownLevel;->mirroredLevel:Ljava/util/logging/Level;
-Ljava/util/logging/Level$KnownLevel;->nameToLevels:Ljava/util/Map;
-Ljava/util/logging/Level;-><init>(Ljava/lang/String;ILjava/lang/String;Z)V
-Ljava/util/logging/Level;->cachedLocale:Ljava/util/Locale;
-Ljava/util/logging/Level;->computeLocalizedLevelName(Ljava/util/Locale;)Ljava/lang/String;
-Ljava/util/logging/Level;->defaultBundle:Ljava/lang/String;
-Ljava/util/logging/Level;->findLevel(Ljava/lang/String;)Ljava/util/logging/Level;
-Ljava/util/logging/Level;->getCachedLocalizedLevelName()Ljava/lang/String;
-Ljava/util/logging/Level;->getLevelName()Ljava/lang/String;
-Ljava/util/logging/Level;->getLocalizedLevelName()Ljava/lang/String;
-Ljava/util/logging/Level;->localizedLevelName:Ljava/lang/String;
-Ljava/util/logging/Level;->name:Ljava/lang/String;
-Ljava/util/logging/Level;->resourceBundleName:Ljava/lang/String;
-Ljava/util/logging/Level;->value:I
-Ljava/util/logging/Logger$LoggerBundle;-><init>(Ljava/lang/String;Ljava/util/ResourceBundle;)V
-Ljava/util/logging/Logger$LoggerBundle;->get(Ljava/lang/String;Ljava/util/ResourceBundle;)Ljava/util/logging/Logger$LoggerBundle;
-Ljava/util/logging/Logger$LoggerBundle;->isSystemBundle()Z
-Ljava/util/logging/Logger$LoggerBundle;->resourceBundleName:Ljava/lang/String;
-Ljava/util/logging/Logger$LoggerBundle;->userBundle:Ljava/util/ResourceBundle;
-Ljava/util/logging/Logger$SystemLoggerHelper;-><init>()V
-Ljava/util/logging/Logger$SystemLoggerHelper;->disableCallerCheck:Z
-Ljava/util/logging/Logger$SystemLoggerHelper;->getBooleanProperty(Ljava/lang/String;)Z
-Ljava/util/logging/Logger;-><init>(Ljava/lang/String;)V
-Ljava/util/logging/Logger;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;Ljava/util/logging/LogManager;Z)V
-Ljava/util/logging/Logger;->accessCheckedHandlers()[Ljava/util/logging/Handler;
-Ljava/util/logging/Logger;->anonymous:Z
-Ljava/util/logging/Logger;->callersClassLoaderRef:Ljava/lang/ref/WeakReference;
-Ljava/util/logging/Logger;->catalog:Ljava/util/ResourceBundle;
-Ljava/util/logging/Logger;->catalogLocale:Ljava/util/Locale;
-Ljava/util/logging/Logger;->catalogName:Ljava/lang/String;
-Ljava/util/logging/Logger;->checkPermission()V
-Ljava/util/logging/Logger;->demandLogger(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)Ljava/util/logging/Logger;
-Ljava/util/logging/Logger;->doLog(Ljava/util/logging/LogRecord;)V
-Ljava/util/logging/Logger;->doLog(Ljava/util/logging/LogRecord;Ljava/lang/String;)V
-Ljava/util/logging/Logger;->doLog(Ljava/util/logging/LogRecord;Ljava/util/ResourceBundle;)V
-Ljava/util/logging/Logger;->doSetParent(Ljava/util/logging/Logger;)V
-Ljava/util/logging/Logger;->emptyHandlers:[Ljava/util/logging/Handler;
-Ljava/util/logging/Logger;->filter:Ljava/util/logging/Filter;
-Ljava/util/logging/Logger;->findResourceBundle(Ljava/lang/String;Z)Ljava/util/ResourceBundle;
-Ljava/util/logging/Logger;->findSystemResourceBundle(Ljava/util/Locale;)Ljava/util/ResourceBundle;
-Ljava/util/logging/Logger;->getCallersClassLoader()Ljava/lang/ClassLoader;
-Ljava/util/logging/Logger;->getEffectiveLoggerBundle()Ljava/util/logging/Logger$LoggerBundle;
-Ljava/util/logging/Logger;->getPlatformLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
-Ljava/util/logging/Logger;->handlers:Ljava/util/concurrent/CopyOnWriteArrayList;
-Ljava/util/logging/Logger;->isLevelInitialized()Z
-Ljava/util/logging/Logger;->isSystemLogger:Z
-Ljava/util/logging/Logger;->kids:Ljava/util/ArrayList;
-Ljava/util/logging/Logger;->levelObject:Ljava/util/logging/Level;
-Ljava/util/logging/Logger;->levelValue:I
-Ljava/util/logging/Logger;->loggerBundle:Ljava/util/logging/Logger$LoggerBundle;
-Ljava/util/logging/Logger;->manager:Ljava/util/logging/LogManager;
-Ljava/util/logging/Logger;->name:Ljava/lang/String;
-Ljava/util/logging/Logger;->NO_RESOURCE_BUNDLE:Ljava/util/logging/Logger$LoggerBundle;
-Ljava/util/logging/Logger;->offValue:I
-Ljava/util/logging/Logger;->parent:Ljava/util/logging/Logger;
-Ljava/util/logging/Logger;->removeChildLogger(Ljava/util/logging/LogManager$LoggerWeakRef;)V
-Ljava/util/logging/Logger;->setCallersClassLoaderRef(Ljava/lang/Class;)V
-Ljava/util/logging/Logger;->setLogManager(Ljava/util/logging/LogManager;)V
-Ljava/util/logging/Logger;->setupResourceInfo(Ljava/lang/String;Ljava/lang/Class;)V
-Ljava/util/logging/Logger;->SYSTEM_BUNDLE:Ljava/util/logging/Logger$LoggerBundle;
-Ljava/util/logging/Logger;->SYSTEM_LOGGER_RB_NAME:Ljava/lang/String;
-Ljava/util/logging/Logger;->updateEffectiveLevel()V
-Ljava/util/logging/Logger;->useParentHandlers:Z
-Ljava/util/logging/LogManager$Beans;-><init>()V
-Ljava/util/logging/LogManager$Beans;->getClass(Ljava/lang/String;)Ljava/lang/Class;
-Ljava/util/logging/LogManager$Beans;->invokePropertyChange(Ljava/lang/Object;Ljava/lang/Object;)V
-Ljava/util/logging/LogManager$Beans;->isBeansPresent()Z
-Ljava/util/logging/LogManager$Beans;->newPropertyChangeEvent(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/logging/LogManager$Beans;->propertyChangeEventClass:Ljava/lang/Class;
-Ljava/util/logging/LogManager$Beans;->propertyChangeListenerClass:Ljava/lang/Class;
-Ljava/util/logging/LogManager$Beans;->propertyChangeMethod:Ljava/lang/reflect/Method;
-Ljava/util/logging/LogManager$Beans;->propertyEventCtor:Ljava/lang/reflect/Constructor;
-Ljava/util/logging/LogManager$LoggerContext;->addLocalLogger(Ljava/util/logging/Logger;)Z
-Ljava/util/logging/LogManager$LoggerContext;->addLocalLogger(Ljava/util/logging/Logger;Ljava/util/logging/LogManager;)Z
-Ljava/util/logging/LogManager$LoggerContext;->addLocalLogger(Ljava/util/logging/Logger;Z)Z
-Ljava/util/logging/LogManager$LoggerContext;->addLocalLogger(Ljava/util/logging/Logger;ZLjava/util/logging/LogManager;)Z
-Ljava/util/logging/LogManager$LoggerContext;->demandLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager$LoggerContext;->ensureAllDefaultLoggers(Ljava/util/logging/Logger;)V
-Ljava/util/logging/LogManager$LoggerContext;->ensureDefaultLogger(Ljava/util/logging/Logger;)V
-Ljava/util/logging/LogManager$LoggerContext;->ensureInitialized()V
-Ljava/util/logging/LogManager$LoggerContext;->findLogger(Ljava/lang/String;)Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager$LoggerContext;->getGlobalLogger()Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager$LoggerContext;->getLoggerNames()Ljava/util/Enumeration;
-Ljava/util/logging/LogManager$LoggerContext;->getNode(Ljava/lang/String;)Ljava/util/logging/LogManager$LogNode;
-Ljava/util/logging/LogManager$LoggerContext;->getOwner()Ljava/util/logging/LogManager;
-Ljava/util/logging/LogManager$LoggerContext;->getRootLogger()Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager$LoggerContext;->namedLoggers:Ljava/util/Hashtable;
-Ljava/util/logging/LogManager$LoggerContext;->processParentHandlers(Ljava/util/logging/Logger;Ljava/lang/String;)V
-Ljava/util/logging/LogManager$LoggerContext;->removeLoggerRef(Ljava/lang/String;Ljava/util/logging/LogManager$LoggerWeakRef;)V
-Ljava/util/logging/LogManager$LoggerContext;->requiresDefaultLoggers()Z
-Ljava/util/logging/LogManager$LoggerContext;->root:Ljava/util/logging/LogManager$LogNode;
-Ljava/util/logging/LogManager$LoggerWeakRef;->dispose()V
-Ljava/util/logging/LogManager$LoggerWeakRef;->disposed:Z
-Ljava/util/logging/LogManager$LoggerWeakRef;->name:Ljava/lang/String;
-Ljava/util/logging/LogManager$LoggerWeakRef;->node:Ljava/util/logging/LogManager$LogNode;
-Ljava/util/logging/LogManager$LoggerWeakRef;->parentRef:Ljava/lang/ref/WeakReference;
-Ljava/util/logging/LogManager$LoggerWeakRef;->setNode(Ljava/util/logging/LogManager$LogNode;)V
-Ljava/util/logging/LogManager$LoggerWeakRef;->setParentRef(Ljava/lang/ref/WeakReference;)V
-Ljava/util/logging/LogManager$LogNode;-><init>(Ljava/util/logging/LogManager$LogNode;Ljava/util/logging/LogManager$LoggerContext;)V
-Ljava/util/logging/LogManager$LogNode;->children:Ljava/util/HashMap;
-Ljava/util/logging/LogManager$LogNode;->context:Ljava/util/logging/LogManager$LoggerContext;
-Ljava/util/logging/LogManager$LogNode;->loggerRef:Ljava/util/logging/LogManager$LoggerWeakRef;
-Ljava/util/logging/LogManager$LogNode;->parent:Ljava/util/logging/LogManager$LogNode;
-Ljava/util/logging/LogManager$LogNode;->walkAndSetParent(Ljava/util/logging/Logger;)V
-Ljava/util/logging/LogManager$RootLogger;->accessCheckedHandlers()[Ljava/util/logging/Handler;
-Ljava/util/logging/LogManager$SystemLoggerContext;->demandLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager;-><init>(Ljava/lang/Void;)V
-Ljava/util/logging/LogManager;->checkPermission()V
-Ljava/util/logging/LogManager;->checkSubclassPermissions()Ljava/lang/Void;
-Ljava/util/logging/LogManager;->contexts()Ljava/util/List;
-Ljava/util/logging/LogManager;->contextsMap:Ljava/util/WeakHashMap;
-Ljava/util/logging/LogManager;->controlPermission:Ljava/security/Permission;
-Ljava/util/logging/LogManager;->deathImminent:Z
-Ljava/util/logging/LogManager;->defaultLevel:Ljava/util/logging/Level;
-Ljava/util/logging/LogManager;->demandLogger(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager;->demandSystemLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager;->doSetLevel(Ljava/util/logging/Logger;Ljava/util/logging/Level;)V
-Ljava/util/logging/LogManager;->doSetParent(Ljava/util/logging/Logger;Ljava/util/logging/Logger;)V
-Ljava/util/logging/LogManager;->drainLoggerRefQueueBounded()V
-Ljava/util/logging/LogManager;->ensureLogManagerInitialized()V
-Ljava/util/logging/LogManager;->getBooleanProperty(Ljava/lang/String;Z)Z
-Ljava/util/logging/LogManager;->getClassInstance(Ljava/lang/String;)Ljava/lang/Class;
-Ljava/util/logging/LogManager;->getFilterProperty(Ljava/lang/String;Ljava/util/logging/Filter;)Ljava/util/logging/Filter;
-Ljava/util/logging/LogManager;->getIntProperty(Ljava/lang/String;I)I
-Ljava/util/logging/LogManager;->getLevelProperty(Ljava/lang/String;Ljava/util/logging/Level;)Ljava/util/logging/Level;
-Ljava/util/logging/LogManager;->getStringProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/logging/LogManager;->getSystemContext()Ljava/util/logging/LogManager$LoggerContext;
-Ljava/util/logging/LogManager;->getUserContext()Ljava/util/logging/LogManager$LoggerContext;
-Ljava/util/logging/LogManager;->initializationDone:Z
-Ljava/util/logging/LogManager;->initializedCalled:Z
-Ljava/util/logging/LogManager;->initializedGlobalHandlers:Z
-Ljava/util/logging/LogManager;->initializeGlobalHandlers()V
-Ljava/util/logging/LogManager;->listenerMap:Ljava/util/Map;
-Ljava/util/logging/LogManager;->loadLoggerHandlers(Ljava/util/logging/Logger;Ljava/lang/String;Ljava/lang/String;)V
-Ljava/util/logging/LogManager;->loggerRefQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/util/logging/LogManager;->loggingMXBean:Ljava/util/logging/LoggingMXBean;
-Ljava/util/logging/LogManager;->manager:Ljava/util/logging/LogManager;
-Ljava/util/logging/LogManager;->MAX_ITERATIONS:I
-Ljava/util/logging/LogManager;->parseClassNames(Ljava/lang/String;)[Ljava/lang/String;
-Ljava/util/logging/LogManager;->props:Ljava/util/Properties;
-Ljava/util/logging/LogManager;->readPrimordialConfiguration()V
-Ljava/util/logging/LogManager;->readPrimordialConfiguration:Z
-Ljava/util/logging/LogManager;->resetLogger(Ljava/util/logging/Logger;)V
-Ljava/util/logging/LogManager;->rootLogger:Ljava/util/logging/Logger;
-Ljava/util/logging/LogManager;->setLevelsOnExistingLoggers()V
-Ljava/util/logging/LogManager;->systemContext:Ljava/util/logging/LogManager$LoggerContext;
-Ljava/util/logging/LogManager;->userContext:Ljava/util/logging/LogManager$LoggerContext;
-Ljava/util/logging/LogRecord;->defaultThreadID()I
-Ljava/util/logging/LogRecord;->globalSequenceNumber:Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/logging/LogRecord;->inferCaller()V
-Ljava/util/logging/LogRecord;->isLoggerImplFrame(Ljava/lang/String;)Z
-Ljava/util/logging/LogRecord;->level:Ljava/util/logging/Level;
-Ljava/util/logging/LogRecord;->loggerName:Ljava/lang/String;
-Ljava/util/logging/LogRecord;->message:Ljava/lang/String;
-Ljava/util/logging/LogRecord;->millis:J
-Ljava/util/logging/LogRecord;->MIN_SEQUENTIAL_THREAD_ID:I
-Ljava/util/logging/LogRecord;->needToInferCaller:Z
-Ljava/util/logging/LogRecord;->nextThreadId:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/logging/LogRecord;->parameters:[Ljava/lang/Object;
-Ljava/util/logging/LogRecord;->resourceBundle:Ljava/util/ResourceBundle;
-Ljava/util/logging/LogRecord;->resourceBundleName:Ljava/lang/String;
-Ljava/util/logging/LogRecord;->sequenceNumber:J
-Ljava/util/logging/LogRecord;->sourceClassName:Ljava/lang/String;
-Ljava/util/logging/LogRecord;->sourceMethodName:Ljava/lang/String;
-Ljava/util/logging/LogRecord;->threadID:I
-Ljava/util/logging/LogRecord;->threadIds:Ljava/lang/ThreadLocal;
-Ljava/util/logging/LogRecord;->thrown:Ljava/lang/Throwable;
-Ljava/util/logging/MemoryHandler;->buffer:[Ljava/util/logging/LogRecord;
-Ljava/util/logging/MemoryHandler;->configure()V
-Ljava/util/logging/MemoryHandler;->count:I
-Ljava/util/logging/MemoryHandler;->DEFAULT_SIZE:I
-Ljava/util/logging/MemoryHandler;->init()V
-Ljava/util/logging/MemoryHandler;->pushLevel:Ljava/util/logging/Level;
-Ljava/util/logging/MemoryHandler;->size:I
-Ljava/util/logging/MemoryHandler;->start:I
-Ljava/util/logging/MemoryHandler;->target:Ljava/util/logging/Handler;
-Ljava/util/logging/SimpleFormatter;->dat:Ljava/util/Date;
-Ljava/util/logging/SimpleFormatter;->format:Ljava/lang/String;
-Ljava/util/logging/SocketHandler;->configure()V
-Ljava/util/logging/SocketHandler;->connect()V
-Ljava/util/logging/SocketHandler;->host:Ljava/lang/String;
-Ljava/util/logging/SocketHandler;->port:I
-Ljava/util/logging/SocketHandler;->sock:Ljava/net/Socket;
-Ljava/util/logging/StreamHandler;->configure()V
-Ljava/util/logging/StreamHandler;->doneHeader:Z
-Ljava/util/logging/StreamHandler;->flushAndClose()V
-Ljava/util/logging/StreamHandler;->output:Ljava/io/OutputStream;
-Ljava/util/logging/StreamHandler;->writer:Ljava/io/Writer;
-Ljava/util/logging/XMLFormatter;->a2(Ljava/lang/StringBuilder;I)V
-Ljava/util/logging/XMLFormatter;->appendISO8601(Ljava/lang/StringBuilder;J)V
-Ljava/util/logging/XMLFormatter;->escape(Ljava/lang/StringBuilder;Ljava/lang/String;)V
-Ljava/util/logging/XMLFormatter;->manager:Ljava/util/logging/LogManager;
-Ljava/util/LongSummaryStatistics;->count:J
-Ljava/util/LongSummaryStatistics;->max:J
-Ljava/util/LongSummaryStatistics;->min:J
-Ljava/util/LongSummaryStatistics;->sum:J
-Ljava/util/MissingFormatArgumentException;->s:Ljava/lang/String;
-Ljava/util/MissingFormatWidthException;->s:Ljava/lang/String;
-Ljava/util/MissingResourceException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/util/MissingResourceException;->className:Ljava/lang/String;
-Ljava/util/MissingResourceException;->key:Ljava/lang/String;
-Ljava/util/Objects;-><init>()V
-Ljava/util/Observable;->changed:Z
-Ljava/util/Observable;->obs:Ljava/util/Vector;
-Ljava/util/Optional;-><init>()V
-Ljava/util/Optional;-><init>(Ljava/lang/Object;)V
-Ljava/util/Optional;->EMPTY:Ljava/util/Optional;
-Ljava/util/Optional;->value:Ljava/lang/Object;
-Ljava/util/OptionalDouble;-><init>()V
-Ljava/util/OptionalDouble;-><init>(D)V
-Ljava/util/OptionalDouble;->EMPTY:Ljava/util/OptionalDouble;
-Ljava/util/OptionalDouble;->isPresent:Z
-Ljava/util/OptionalDouble;->value:D
-Ljava/util/OptionalInt;-><init>()V
-Ljava/util/OptionalInt;-><init>(I)V
-Ljava/util/OptionalInt;->EMPTY:Ljava/util/OptionalInt;
-Ljava/util/OptionalInt;->isPresent:Z
-Ljava/util/OptionalInt;->value:I
-Ljava/util/OptionalLong;-><init>()V
-Ljava/util/OptionalLong;-><init>(J)V
-Ljava/util/OptionalLong;->EMPTY:Ljava/util/OptionalLong;
-Ljava/util/OptionalLong;->isPresent:Z
-Ljava/util/OptionalLong;->value:J
-Ljava/util/prefs/AbstractPreferences$EventDispatchThread;-><init>()V
-Ljava/util/prefs/AbstractPreferences;->absolutePath:Ljava/lang/String;
-Ljava/util/prefs/AbstractPreferences;->EMPTY_ABSTRACT_PREFS_ARRAY:[Ljava/util/prefs/AbstractPreferences;
-Ljava/util/prefs/AbstractPreferences;->EMPTY_STRING_ARRAY:[Ljava/lang/String;
-Ljava/util/prefs/AbstractPreferences;->enqueueNodeAddedEvent(Ljava/util/prefs/Preferences;)V
-Ljava/util/prefs/AbstractPreferences;->enqueueNodeRemovedEvent(Ljava/util/prefs/Preferences;)V
-Ljava/util/prefs/AbstractPreferences;->enqueuePreferenceChangeEvent(Ljava/lang/String;Ljava/lang/String;)V
-Ljava/util/prefs/AbstractPreferences;->eventDispatchThread:Ljava/lang/Thread;
-Ljava/util/prefs/AbstractPreferences;->eventQueue:Ljava/util/List;
-Ljava/util/prefs/AbstractPreferences;->flush2()V
-Ljava/util/prefs/AbstractPreferences;->kidCache:Ljava/util/Map;
-Ljava/util/prefs/AbstractPreferences;->name:Ljava/lang/String;
-Ljava/util/prefs/AbstractPreferences;->node(Ljava/util/StringTokenizer;)Ljava/util/prefs/Preferences;
-Ljava/util/prefs/AbstractPreferences;->nodeExists(Ljava/util/StringTokenizer;)Z
-Ljava/util/prefs/AbstractPreferences;->nodeListeners()[Ljava/util/prefs/NodeChangeListener;
-Ljava/util/prefs/AbstractPreferences;->nodeListeners:Ljava/util/ArrayList;
-Ljava/util/prefs/AbstractPreferences;->parent:Ljava/util/prefs/AbstractPreferences;
-Ljava/util/prefs/AbstractPreferences;->prefListeners()[Ljava/util/prefs/PreferenceChangeListener;
-Ljava/util/prefs/AbstractPreferences;->prefListeners:Ljava/util/ArrayList;
-Ljava/util/prefs/AbstractPreferences;->removed:Z
-Ljava/util/prefs/AbstractPreferences;->removeNode2()V
-Ljava/util/prefs/AbstractPreferences;->root:Ljava/util/prefs/AbstractPreferences;
-Ljava/util/prefs/AbstractPreferences;->startEventDispatchThreadIfNecessary()V
-Ljava/util/prefs/AbstractPreferences;->sync2()V
-Ljava/util/prefs/FileSystemPreferences$Change;->replay()V
-Ljava/util/prefs/FileSystemPreferences$NodeCreate;->replay()V
-Ljava/util/prefs/FileSystemPreferences$Put;->key:Ljava/lang/String;
-Ljava/util/prefs/FileSystemPreferences$Put;->replay()V
-Ljava/util/prefs/FileSystemPreferences$Put;->value:Ljava/lang/String;
-Ljava/util/prefs/FileSystemPreferences$Remove;->key:Ljava/lang/String;
-Ljava/util/prefs/FileSystemPreferences$Remove;->replay()V
-Ljava/util/prefs/FileSystemPreferences;-><init>(Ljava/lang/String;Ljava/io/File;Z)V
-Ljava/util/prefs/FileSystemPreferences;-><init>(Ljava/util/prefs/FileSystemPreferences;Ljava/lang/String;)V
-Ljava/util/prefs/FileSystemPreferences;-><init>(Z)V
-Ljava/util/prefs/FileSystemPreferences;->byteArray(Ljava/lang/String;)[B
-Ljava/util/prefs/FileSystemPreferences;->changeLog:Ljava/util/List;
-Ljava/util/prefs/FileSystemPreferences;->checkLockFile0ErrorCode(I)V
-Ljava/util/prefs/FileSystemPreferences;->chmod(Ljava/lang/String;I)I
-Ljava/util/prefs/FileSystemPreferences;->dir:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->dirName(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/prefs/FileSystemPreferences;->EACCES:I
-Ljava/util/prefs/FileSystemPreferences;->EAGAIN:I
-Ljava/util/prefs/FileSystemPreferences;->EMPTY_STRING_ARRAY:[Ljava/lang/String;
-Ljava/util/prefs/FileSystemPreferences;->ERROR_CODE:I
-Ljava/util/prefs/FileSystemPreferences;->getLogger()Lsun/util/logging/PlatformLogger;
-Ljava/util/prefs/FileSystemPreferences;->getSystemRoot()Ljava/util/prefs/Preferences;
-Ljava/util/prefs/FileSystemPreferences;->getUserRoot()Ljava/util/prefs/Preferences;
-Ljava/util/prefs/FileSystemPreferences;->initCacheIfNecessary()V
-Ljava/util/prefs/FileSystemPreferences;->INIT_SLEEP_TIME:I
-Ljava/util/prefs/FileSystemPreferences;->isDirChar(C)Z
-Ljava/util/prefs/FileSystemPreferences;->isSystemRootModified:Z
-Ljava/util/prefs/FileSystemPreferences;->isSystemRootWritable:Z
-Ljava/util/prefs/FileSystemPreferences;->isUserNode:Z
-Ljava/util/prefs/FileSystemPreferences;->isUserRootModified:Z
-Ljava/util/prefs/FileSystemPreferences;->isUserRootWritable:Z
-Ljava/util/prefs/FileSystemPreferences;->lastSyncTime:J
-Ljava/util/prefs/FileSystemPreferences;->loadCache()V
-Ljava/util/prefs/FileSystemPreferences;->lockFile(Z)Z
-Ljava/util/prefs/FileSystemPreferences;->lockFile0(Ljava/lang/String;IZ)[I
-Ljava/util/prefs/FileSystemPreferences;->LOCK_HANDLE:I
-Ljava/util/prefs/FileSystemPreferences;->MAX_ATTEMPTS:I
-Ljava/util/prefs/FileSystemPreferences;->nodeCreate:Ljava/util/prefs/FileSystemPreferences$NodeCreate;
-Ljava/util/prefs/FileSystemPreferences;->nodeName(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/prefs/FileSystemPreferences;->prefsCache:Ljava/util/Map;
-Ljava/util/prefs/FileSystemPreferences;->prefsFile:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->replayChanges()V
-Ljava/util/prefs/FileSystemPreferences;->setupSystemRoot()V
-Ljava/util/prefs/FileSystemPreferences;->setupUserRoot()V
-Ljava/util/prefs/FileSystemPreferences;->syncSpiPrivileged()V
-Ljava/util/prefs/FileSystemPreferences;->syncWorld()V
-Ljava/util/prefs/FileSystemPreferences;->systemLockFile:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->systemRoot:Ljava/util/prefs/Preferences;
-Ljava/util/prefs/FileSystemPreferences;->systemRootDir:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->systemRootLockHandle:I
-Ljava/util/prefs/FileSystemPreferences;->systemRootModFile:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->systemRootModTime:J
-Ljava/util/prefs/FileSystemPreferences;->tmpFile:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->unlockFile()V
-Ljava/util/prefs/FileSystemPreferences;->unlockFile0(I)I
-Ljava/util/prefs/FileSystemPreferences;->userLockFile:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->userRoot:Ljava/util/prefs/Preferences;
-Ljava/util/prefs/FileSystemPreferences;->userRootDir:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->userRootLockHandle:I
-Ljava/util/prefs/FileSystemPreferences;->userRootModFile:Ljava/io/File;
-Ljava/util/prefs/FileSystemPreferences;->userRootModTime:J
-Ljava/util/prefs/FileSystemPreferences;->USER_READ_WRITE:I
-Ljava/util/prefs/FileSystemPreferences;->USER_RWX:I
-Ljava/util/prefs/FileSystemPreferences;->USER_RWX_ALL_RX:I
-Ljava/util/prefs/FileSystemPreferences;->USER_RW_ALL_READ:I
-Ljava/util/prefs/FileSystemPreferences;->writeBackCache()V
-Ljava/util/prefs/NodeChangeEvent;->child:Ljava/util/prefs/Preferences;
-Ljava/util/prefs/PreferenceChangeEvent;->key:Ljava/lang/String;
-Ljava/util/prefs/PreferenceChangeEvent;->newValue:Ljava/lang/String;
-Ljava/util/prefs/Preferences;->factory:Ljava/util/prefs/PreferencesFactory;
-Ljava/util/prefs/Preferences;->findPreferencesFactory()Ljava/util/prefs/PreferencesFactory;
-Ljava/util/prefs/Preferences;->nodeName(Ljava/lang/Class;)Ljava/lang/String;
-Ljava/util/prefs/Preferences;->prefsPerm:Ljava/security/Permission;
-Ljava/util/prefs/Preferences;->setPreferencesFactory(Ljava/util/prefs/PreferencesFactory;)Ljava/util/prefs/PreferencesFactory;
-Ljava/util/PriorityQueue$Itr;->cursor:I
-Ljava/util/PriorityQueue$Itr;->expectedModCount:I
-Ljava/util/PriorityQueue$Itr;->forgetMeNot:Ljava/util/ArrayDeque;
-Ljava/util/PriorityQueue$Itr;->lastRet:I
-Ljava/util/PriorityQueue$Itr;->lastRetElt:Ljava/lang/Object;
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;-><init>(Ljava/util/PriorityQueue;III)V
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;->expectedModCount:I
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;->fence:I
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;->getFence()I
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;->index:I
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;->pq:Ljava/util/PriorityQueue;
-Ljava/util/PriorityQueue$PriorityQueueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/PriorityQueue;->comparator:Ljava/util/Comparator;
-Ljava/util/PriorityQueue;->DEFAULT_INITIAL_CAPACITY:I
-Ljava/util/PriorityQueue;->grow(I)V
-Ljava/util/PriorityQueue;->heapify()V
-Ljava/util/PriorityQueue;->hugeCapacity(I)I
-Ljava/util/PriorityQueue;->indexOf(Ljava/lang/Object;)I
-Ljava/util/PriorityQueue;->initElementsFromCollection(Ljava/util/Collection;)V
-Ljava/util/PriorityQueue;->initFromCollection(Ljava/util/Collection;)V
-Ljava/util/PriorityQueue;->initFromPriorityQueue(Ljava/util/PriorityQueue;)V
-Ljava/util/PriorityQueue;->MAX_ARRAY_SIZE:I
-Ljava/util/PriorityQueue;->removeAt(I)Ljava/lang/Object;
-Ljava/util/PriorityQueue;->removeEq(Ljava/lang/Object;)Z
-Ljava/util/PriorityQueue;->siftDown(ILjava/lang/Object;)V
-Ljava/util/PriorityQueue;->siftDownComparable(ILjava/lang/Object;)V
-Ljava/util/PriorityQueue;->siftDownUsingComparator(ILjava/lang/Object;)V
-Ljava/util/PriorityQueue;->siftUp(ILjava/lang/Object;)V
-Ljava/util/PriorityQueue;->siftUpComparable(ILjava/lang/Object;)V
-Ljava/util/PriorityQueue;->siftUpUsingComparator(ILjava/lang/Object;)V
-Ljava/util/Properties$LineReader;->inByteBuf:[B
-Ljava/util/Properties$LineReader;->inCharBuf:[C
-Ljava/util/Properties$LineReader;->inLimit:I
-Ljava/util/Properties$LineReader;->inOff:I
-Ljava/util/Properties$LineReader;->inStream:Ljava/io/InputStream;
-Ljava/util/Properties$LineReader;->lineBuf:[C
-Ljava/util/Properties$LineReader;->reader:Ljava/io/Reader;
-Ljava/util/Properties$LineReader;->readLine()I
-Ljava/util/Properties;->enumerate(Ljava/util/Hashtable;)V
-Ljava/util/Properties;->enumerateStringProperties(Ljava/util/Hashtable;)V
-Ljava/util/Properties;->hexDigit:[C
-Ljava/util/Properties;->load0(Ljava/util/Properties$LineReader;)V
-Ljava/util/Properties;->loadConvert([CII[C)Ljava/lang/String;
-Ljava/util/Properties;->store0(Ljava/io/BufferedWriter;Ljava/lang/String;Z)V
-Ljava/util/Properties;->toHex(I)C
-Ljava/util/Properties;->writeComments(Ljava/io/BufferedWriter;Ljava/lang/String;)V
-Ljava/util/PropertyResourceBundle;->lookup:Ljava/util/Map;
-Ljava/util/Random$RandomDoublesSpliterator;-><init>(Ljava/util/Random;JJDD)V
-Ljava/util/Random$RandomDoublesSpliterator;->bound:D
-Ljava/util/Random$RandomDoublesSpliterator;->fence:J
-Ljava/util/Random$RandomDoublesSpliterator;->index:J
-Ljava/util/Random$RandomDoublesSpliterator;->origin:D
-Ljava/util/Random$RandomDoublesSpliterator;->rng:Ljava/util/Random;
-Ljava/util/Random$RandomIntsSpliterator;-><init>(Ljava/util/Random;JJII)V
-Ljava/util/Random$RandomIntsSpliterator;->bound:I
-Ljava/util/Random$RandomIntsSpliterator;->fence:J
-Ljava/util/Random$RandomIntsSpliterator;->index:J
-Ljava/util/Random$RandomIntsSpliterator;->origin:I
-Ljava/util/Random$RandomIntsSpliterator;->rng:Ljava/util/Random;
-Ljava/util/Random$RandomLongsSpliterator;-><init>(Ljava/util/Random;JJJJ)V
-Ljava/util/Random$RandomLongsSpliterator;->bound:J
-Ljava/util/Random$RandomLongsSpliterator;->fence:J
-Ljava/util/Random$RandomLongsSpliterator;->index:J
-Ljava/util/Random$RandomLongsSpliterator;->origin:J
-Ljava/util/Random$RandomLongsSpliterator;->rng:Ljava/util/Random;
-Ljava/util/Random;->addend:J
-Ljava/util/Random;->BadBound:Ljava/lang/String;
-Ljava/util/Random;->BadRange:Ljava/lang/String;
-Ljava/util/Random;->BadSize:Ljava/lang/String;
-Ljava/util/Random;->DOUBLE_UNIT:D
-Ljava/util/Random;->haveNextNextGaussian:Z
-Ljava/util/Random;->initialScramble(J)J
-Ljava/util/Random;->internalNextDouble(DD)D
-Ljava/util/Random;->internalNextInt(II)I
-Ljava/util/Random;->internalNextLong(JJ)J
-Ljava/util/Random;->mask:J
-Ljava/util/Random;->multiplier:J
-Ljava/util/Random;->nextNextGaussian:D
-Ljava/util/Random;->resetSeed(J)V
-Ljava/util/Random;->seed:Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/Random;->seedOffset:J
-Ljava/util/Random;->seedUniquifier:Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/Random;->unsafe:Lsun/misc/Unsafe;
-Ljava/util/regex/Matcher$OffsetBasedMatchResult;-><init>(Ljava/lang/String;[I)V
-Ljava/util/regex/Matcher$OffsetBasedMatchResult;->input:Ljava/lang/String;
-Ljava/util/regex/Matcher$OffsetBasedMatchResult;->offsets:[I
-Ljava/util/regex/Matcher;-><init>(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)V
-Ljava/util/regex/Matcher;->address:J
-Ljava/util/regex/Matcher;->anchoringBounds:Z
-Ljava/util/regex/Matcher;->appendEvaluated(Ljava/lang/StringBuffer;Ljava/lang/String;)V
-Ljava/util/regex/Matcher;->ensureMatch()V
-Ljava/util/regex/Matcher;->findImpl(JI[I)Z
-Ljava/util/regex/Matcher;->findNextImpl(J[I)Z
-Ljava/util/regex/Matcher;->getMatchedGroupIndex(JLjava/lang/String;)I
-Ljava/util/regex/Matcher;->getMatchedGroupIndex0(JLjava/lang/String;)I
-Ljava/util/regex/Matcher;->getNativeFinalizer()J
-Ljava/util/regex/Matcher;->groupCountImpl(J)I
-Ljava/util/regex/Matcher;->hitEndImpl(J)Z
-Ljava/util/regex/Matcher;->input:Ljava/lang/String;
-Ljava/util/regex/Matcher;->lookingAtImpl(J[I)Z
-Ljava/util/regex/Matcher;->matchesImpl(J[I)Z
-Ljava/util/regex/Matcher;->matchFound:Z
-Ljava/util/regex/Matcher;->matchOffsets:[I
-Ljava/util/regex/Matcher;->nativeFinalizer:Ljava/lang/Runnable;
-Ljava/util/regex/Matcher;->nativeSize()I
-Ljava/util/regex/Matcher;->openImpl(J)J
-Ljava/util/regex/Matcher;->originalInput:Ljava/lang/CharSequence;
-Ljava/util/regex/Matcher;->pattern:Ljava/util/regex/Pattern;
-Ljava/util/regex/Matcher;->regionEnd:I
-Ljava/util/regex/Matcher;->regionStart:I
-Ljava/util/regex/Matcher;->registry:Llibcore/util/NativeAllocationRegistry;
-Ljava/util/regex/Matcher;->requireEndImpl(J)Z
-Ljava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;II)Ljava/util/regex/Matcher;
-Ljava/util/regex/Matcher;->resetForInput()V
-Ljava/util/regex/Matcher;->setInputImpl(JLjava/lang/String;II)V
-Ljava/util/regex/Matcher;->transparentBounds:Z
-Ljava/util/regex/Matcher;->useAnchoringBoundsImpl(JZ)V
-Ljava/util/regex/Matcher;->useTransparentBoundsImpl(JZ)V
-Ljava/util/regex/Pattern;-><init>(Ljava/lang/String;I)V
-Ljava/util/regex/Pattern;->address:J
-Ljava/util/regex/Pattern;->compile()V
-Ljava/util/regex/Pattern;->compileImpl(Ljava/lang/String;I)J
-Ljava/util/regex/Pattern;->fastSplit(Ljava/lang/String;Ljava/lang/String;I)[Ljava/lang/String;
-Ljava/util/regex/Pattern;->FASTSPLIT_METACHARACTERS:Ljava/lang/String;
-Ljava/util/regex/Pattern;->flags:I
-Ljava/util/regex/Pattern;->getNativeFinalizer()J
-Ljava/util/regex/Pattern;->nativeSize()I
-Ljava/util/regex/Pattern;->pattern:Ljava/lang/String;
-Ljava/util/regex/Pattern;->registry:Llibcore/util/NativeAllocationRegistry;
-Ljava/util/regex/PatternSyntaxException;->desc:Ljava/lang/String;
-Ljava/util/regex/PatternSyntaxException;->index:I
-Ljava/util/regex/PatternSyntaxException;->nl:Ljava/lang/String;
-Ljava/util/regex/PatternSyntaxException;->pattern:Ljava/lang/String;
-Ljava/util/ResourceBundle$BundleReference;-><init>(Ljava/util/ResourceBundle;Ljava/lang/ref/ReferenceQueue;Ljava/util/ResourceBundle$CacheKey;)V
-Ljava/util/ResourceBundle$BundleReference;->cacheKey:Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$BundleReference;->getCacheKey()Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$CacheKey;-><init>(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)V
-Ljava/util/ResourceBundle$CacheKey;->calculateHashCode()V
-Ljava/util/ResourceBundle$CacheKey;->cause:Ljava/lang/Throwable;
-Ljava/util/ResourceBundle$CacheKey;->expirationTime:J
-Ljava/util/ResourceBundle$CacheKey;->format:Ljava/lang/String;
-Ljava/util/ResourceBundle$CacheKey;->getCause()Ljava/lang/Throwable;
-Ljava/util/ResourceBundle$CacheKey;->getFormat()Ljava/lang/String;
-Ljava/util/ResourceBundle$CacheKey;->getLoader()Ljava/lang/ClassLoader;
-Ljava/util/ResourceBundle$CacheKey;->getLocale()Ljava/util/Locale;
-Ljava/util/ResourceBundle$CacheKey;->getName()Ljava/lang/String;
-Ljava/util/ResourceBundle$CacheKey;->hashCodeCache:I
-Ljava/util/ResourceBundle$CacheKey;->loaderRef:Ljava/util/ResourceBundle$LoaderReference;
-Ljava/util/ResourceBundle$CacheKey;->loadTime:J
-Ljava/util/ResourceBundle$CacheKey;->locale:Ljava/util/Locale;
-Ljava/util/ResourceBundle$CacheKey;->name:Ljava/lang/String;
-Ljava/util/ResourceBundle$CacheKey;->setCause(Ljava/lang/Throwable;)V
-Ljava/util/ResourceBundle$CacheKey;->setFormat(Ljava/lang/String;)V
-Ljava/util/ResourceBundle$CacheKey;->setLocale(Ljava/util/Locale;)Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$CacheKey;->setName(Ljava/lang/String;)Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$CacheKeyReference;->getCacheKey()Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$Control$CandidateListCache;-><init>()V
-Ljava/util/ResourceBundle$Control$CandidateListCache;->createObject(Lsun/util/locale/BaseLocale;)Ljava/util/List;
-Ljava/util/ResourceBundle$Control$CandidateListCache;->getDefaultList(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
-Ljava/util/ResourceBundle$Control;->CANDIDATES_CACHE:Ljava/util/ResourceBundle$Control$CandidateListCache;
-Ljava/util/ResourceBundle$Control;->INSTANCE:Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle$Control;->toResourceName0(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/ResourceBundle$LoaderReference;-><init>(Ljava/lang/ClassLoader;Ljava/lang/ref/ReferenceQueue;Ljava/util/ResourceBundle$CacheKey;)V
-Ljava/util/ResourceBundle$LoaderReference;->cacheKey:Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$LoaderReference;->getCacheKey()Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle$NoFallbackControl;-><init>(Ljava/util/List;)V
-Ljava/util/ResourceBundle$NoFallbackControl;->CLASS_ONLY_NO_FALLBACK:Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle$NoFallbackControl;->NO_FALLBACK:Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle$NoFallbackControl;->PROPERTIES_ONLY_NO_FALLBACK:Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle$RBClassLoader;-><init>()V
-Ljava/util/ResourceBundle$RBClassLoader;->INSTANCE:Ljava/util/ResourceBundle$RBClassLoader;
-Ljava/util/ResourceBundle$RBClassLoader;->loader:Ljava/lang/ClassLoader;
-Ljava/util/ResourceBundle$SingleFormatControl;-><init>(Ljava/util/List;)V
-Ljava/util/ResourceBundle$SingleFormatControl;->CLASS_ONLY:Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle$SingleFormatControl;->formats:Ljava/util/List;
-Ljava/util/ResourceBundle$SingleFormatControl;->PROPERTIES_ONLY:Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle;->cacheKey:Ljava/util/ResourceBundle$CacheKey;
-Ljava/util/ResourceBundle;->cacheList:Ljava/util/concurrent/ConcurrentMap;
-Ljava/util/ResourceBundle;->checkList(Ljava/util/List;)Z
-Ljava/util/ResourceBundle;->expired:Z
-Ljava/util/ResourceBundle;->findBundle(Ljava/util/ResourceBundle$CacheKey;Ljava/util/List;Ljava/util/List;ILjava/util/ResourceBundle$Control;Ljava/util/ResourceBundle;)Ljava/util/ResourceBundle;
-Ljava/util/ResourceBundle;->findBundleInCache(Ljava/util/ResourceBundle$CacheKey;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;
-Ljava/util/ResourceBundle;->getBundleImpl(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;
-Ljava/util/ResourceBundle;->getDefaultControl(Ljava/lang/String;)Ljava/util/ResourceBundle$Control;
-Ljava/util/ResourceBundle;->getLoader(Ljava/lang/ClassLoader;)Ljava/lang/ClassLoader;
-Ljava/util/ResourceBundle;->hasValidParentChain(Ljava/util/ResourceBundle;)Z
-Ljava/util/ResourceBundle;->INITIAL_CACHE_SIZE:I
-Ljava/util/ResourceBundle;->isValidBundle(Ljava/util/ResourceBundle;)Z
-Ljava/util/ResourceBundle;->keySet:Ljava/util/Set;
-Ljava/util/ResourceBundle;->loadBundle(Ljava/util/ResourceBundle$CacheKey;Ljava/util/List;Ljava/util/ResourceBundle$Control;Z)Ljava/util/ResourceBundle;
-Ljava/util/ResourceBundle;->locale:Ljava/util/Locale;
-Ljava/util/ResourceBundle;->name:Ljava/lang/String;
-Ljava/util/ResourceBundle;->NONEXISTENT_BUNDLE:Ljava/util/ResourceBundle;
-Ljava/util/ResourceBundle;->putBundleInCache(Ljava/util/ResourceBundle$CacheKey;Ljava/util/ResourceBundle;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;
-Ljava/util/ResourceBundle;->referenceQueue:Ljava/lang/ref/ReferenceQueue;
-Ljava/util/ResourceBundle;->setExpirationTime(Ljava/util/ResourceBundle$CacheKey;Ljava/util/ResourceBundle$Control;)V
-Ljava/util/ResourceBundle;->throwMissingResourceException(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/Throwable;)V
-Ljava/util/Scanner;-><init>(Ljava/io/File;Ljava/nio/charset/CharsetDecoder;)V
-Ljava/util/Scanner;-><init>(Ljava/lang/Readable;Ljava/util/regex/Pattern;)V
-Ljava/util/Scanner;-><init>(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)V
-Ljava/util/Scanner;->BOOLEAN_PATTERN:Ljava/lang/String;
-Ljava/util/Scanner;->boolPattern()Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->boolPattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->buf:Ljava/nio/CharBuffer;
-Ljava/util/Scanner;->BUFFER_SIZE:I
-Ljava/util/Scanner;->buildFloatAndDecimalPattern()V
-Ljava/util/Scanner;->buildIntegerPatternString()Ljava/lang/String;
-Ljava/util/Scanner;->cacheResult()V
-Ljava/util/Scanner;->cacheResult(Ljava/lang/String;)V
-Ljava/util/Scanner;->clearCaches()V
-Ljava/util/Scanner;->closed:Z
-Ljava/util/Scanner;->decimalPattern()Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->decimalPattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->decimalSeparator:Ljava/lang/String;
-Ljava/util/Scanner;->defaultRadix:I
-Ljava/util/Scanner;->delimPattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->digits:Ljava/lang/String;
-Ljava/util/Scanner;->ensureOpen()V
-Ljava/util/Scanner;->findPatternInBuffer(Ljava/util/regex/Pattern;I)Ljava/lang/String;
-Ljava/util/Scanner;->FIND_ANY_PATTERN:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->floatPattern()Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->floatPattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->getCachedResult()Ljava/lang/String;
-Ljava/util/Scanner;->getCompleteTokenInBuffer(Ljava/util/regex/Pattern;)Ljava/lang/String;
-Ljava/util/Scanner;->groupSeparator:Ljava/lang/String;
-Ljava/util/Scanner;->hasNextPattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->hasNextPosition:I
-Ljava/util/Scanner;->hasNextResult:Ljava/lang/String;
-Ljava/util/Scanner;->hasTokenInBuffer()Z
-Ljava/util/Scanner;->infinityString:Ljava/lang/String;
-Ljava/util/Scanner;->integerPattern()Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->integerPattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->lastException:Ljava/io/IOException;
-Ljava/util/Scanner;->linePattern()Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->linePattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->LINE_PATTERN:Ljava/lang/String;
-Ljava/util/Scanner;->LINE_SEPARATOR_PATTERN:Ljava/lang/String;
-Ljava/util/Scanner;->locale:Ljava/util/Locale;
-Ljava/util/Scanner;->makeReadable(Ljava/io/InputStream;Ljava/nio/charset/Charset;)Ljava/lang/Readable;
-Ljava/util/Scanner;->makeReadable(Ljava/nio/channels/ReadableByteChannel;)Ljava/lang/Readable;
-Ljava/util/Scanner;->makeReadable(Ljava/nio/channels/ReadableByteChannel;Ljava/nio/charset/CharsetDecoder;)Ljava/lang/Readable;
-Ljava/util/Scanner;->makeSpace()Z
-Ljava/util/Scanner;->matcher:Ljava/util/regex/Matcher;
-Ljava/util/Scanner;->matchPatternInBuffer(Ljava/util/regex/Pattern;)Ljava/lang/String;
-Ljava/util/Scanner;->matchValid:Z
-Ljava/util/Scanner;->nanString:Ljava/lang/String;
-Ljava/util/Scanner;->needInput:Z
-Ljava/util/Scanner;->negativePrefix:Ljava/lang/String;
-Ljava/util/Scanner;->negativeSuffix:Ljava/lang/String;
-Ljava/util/Scanner;->non0Digit:Ljava/lang/String;
-Ljava/util/Scanner;->NON_ASCII_DIGIT:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->patternCache:Lsun/misc/LRUCache;
-Ljava/util/Scanner;->position:I
-Ljava/util/Scanner;->positivePrefix:Ljava/lang/String;
-Ljava/util/Scanner;->positiveSuffix:Ljava/lang/String;
-Ljava/util/Scanner;->processFloatToken(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/Scanner;->processIntegerToken(Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/Scanner;->radix:I
-Ljava/util/Scanner;->readInput()V
-Ljava/util/Scanner;->revertState()V
-Ljava/util/Scanner;->revertState(Z)Z
-Ljava/util/Scanner;->savedScannerPosition:I
-Ljava/util/Scanner;->saveState()V
-Ljava/util/Scanner;->separatorPattern()Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->separatorPattern:Ljava/util/regex/Pattern;
-Ljava/util/Scanner;->setRadix(I)V
-Ljava/util/Scanner;->SIMPLE_GROUP_INDEX:I
-Ljava/util/Scanner;->skipped:Z
-Ljava/util/Scanner;->source:Ljava/lang/Readable;
-Ljava/util/Scanner;->sourceClosed:Z
-Ljava/util/Scanner;->throwFor()V
-Ljava/util/Scanner;->toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;
-Ljava/util/Scanner;->toDecoder(Ljava/lang/String;)Ljava/nio/charset/CharsetDecoder;
-Ljava/util/Scanner;->translateSavedIndexes(I)V
-Ljava/util/Scanner;->typeCache:Ljava/lang/Object;
-Ljava/util/Scanner;->useTypeCache()V
-Ljava/util/Scanner;->WHITESPACE_PATTERN:Ljava/util/regex/Pattern;
-Ljava/util/ServiceLoader$LazyIterator;->configs:Ljava/util/Enumeration;
-Ljava/util/ServiceLoader$LazyIterator;->hasNextService()Z
-Ljava/util/ServiceLoader$LazyIterator;->loader:Ljava/lang/ClassLoader;
-Ljava/util/ServiceLoader$LazyIterator;->nextName:Ljava/lang/String;
-Ljava/util/ServiceLoader$LazyIterator;->nextService()Ljava/lang/Object;
-Ljava/util/ServiceLoader$LazyIterator;->pending:Ljava/util/Iterator;
-Ljava/util/ServiceLoader$LazyIterator;->service:Ljava/lang/Class;
-Ljava/util/ServiceLoader;-><init>(Ljava/lang/Class;Ljava/lang/ClassLoader;)V
-Ljava/util/ServiceLoader;->fail(Ljava/lang/Class;Ljava/lang/String;)V
-Ljava/util/ServiceLoader;->fail(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/util/ServiceLoader;->fail(Ljava/lang/Class;Ljava/net/URL;ILjava/lang/String;)V
-Ljava/util/ServiceLoader;->loader:Ljava/lang/ClassLoader;
-Ljava/util/ServiceLoader;->loadFromSystemProperty(Ljava/lang/Class;)Ljava/lang/Object;
-Ljava/util/ServiceLoader;->lookupIterator:Ljava/util/ServiceLoader$LazyIterator;
-Ljava/util/ServiceLoader;->parse(Ljava/lang/Class;Ljava/net/URL;)Ljava/util/Iterator;
-Ljava/util/ServiceLoader;->parseLine(Ljava/lang/Class;Ljava/net/URL;Ljava/io/BufferedReader;ILjava/util/List;)I
-Ljava/util/ServiceLoader;->PREFIX:Ljava/lang/String;
-Ljava/util/ServiceLoader;->providers:Ljava/util/LinkedHashMap;
-Ljava/util/ServiceLoader;->service:Ljava/lang/Class;
-Ljava/util/SimpleTimeZone;->cacheEnd:J
-Ljava/util/SimpleTimeZone;->cacheStart:J
-Ljava/util/SimpleTimeZone;->cacheYear:J
-Ljava/util/SimpleTimeZone;->currentSerialVersion:I
-Ljava/util/SimpleTimeZone;->decodeEndRule()V
-Ljava/util/SimpleTimeZone;->decodeRules()V
-Ljava/util/SimpleTimeZone;->decodeStartRule()V
-Ljava/util/SimpleTimeZone;->DOM_MODE:I
-Ljava/util/SimpleTimeZone;->DOW_GE_DOM_MODE:I
-Ljava/util/SimpleTimeZone;->DOW_IN_MONTH_MODE:I
-Ljava/util/SimpleTimeZone;->DOW_LE_DOM_MODE:I
-Ljava/util/SimpleTimeZone;->dstSavings:I
-Ljava/util/SimpleTimeZone;->endDay:I
-Ljava/util/SimpleTimeZone;->endDayOfWeek:I
-Ljava/util/SimpleTimeZone;->endMode:I
-Ljava/util/SimpleTimeZone;->endMonth:I
-Ljava/util/SimpleTimeZone;->endTime:I
-Ljava/util/SimpleTimeZone;->endTimeMode:I
-Ljava/util/SimpleTimeZone;->gcal:Lsun/util/calendar/Gregorian;
-Ljava/util/SimpleTimeZone;->getEnd(Lsun/util/calendar/BaseCalendar;Lsun/util/calendar/BaseCalendar$Date;I)J
-Ljava/util/SimpleTimeZone;->getOffset(Lsun/util/calendar/BaseCalendar;Lsun/util/calendar/BaseCalendar$Date;IJ)I
-Ljava/util/SimpleTimeZone;->getOffsets(J[I)I
-Ljava/util/SimpleTimeZone;->getStart(Lsun/util/calendar/BaseCalendar;Lsun/util/calendar/BaseCalendar$Date;I)J
-Ljava/util/SimpleTimeZone;->getTransition(Lsun/util/calendar/BaseCalendar;Lsun/util/calendar/BaseCalendar$Date;IIIIII)J
-Ljava/util/SimpleTimeZone;->invalidateCache()V
-Ljava/util/SimpleTimeZone;->makeRulesCompatible()V
-Ljava/util/SimpleTimeZone;->millisPerDay:I
-Ljava/util/SimpleTimeZone;->millisPerHour:I
-Ljava/util/SimpleTimeZone;->monthLength:[B
-Ljava/util/SimpleTimeZone;->packRules()[B
-Ljava/util/SimpleTimeZone;->packTimes()[I
-Ljava/util/SimpleTimeZone;->rawOffset:I
-Ljava/util/SimpleTimeZone;->serialVersionOnStream:I
-Ljava/util/SimpleTimeZone;->startDay:I
-Ljava/util/SimpleTimeZone;->startDayOfWeek:I
-Ljava/util/SimpleTimeZone;->startMode:I
-Ljava/util/SimpleTimeZone;->startMonth:I
-Ljava/util/SimpleTimeZone;->startTime:I
-Ljava/util/SimpleTimeZone;->startTimeMode:I
-Ljava/util/SimpleTimeZone;->startYear:I
-Ljava/util/SimpleTimeZone;->staticLeapMonthLength:[B
-Ljava/util/SimpleTimeZone;->staticMonthLength:[B
-Ljava/util/SimpleTimeZone;->unpackRules([B)V
-Ljava/util/SimpleTimeZone;->unpackTimes([I)V
-Ljava/util/SimpleTimeZone;->useDaylight:Z
-Ljava/util/Spliterators$AbstractDoubleSpliterator$HoldingDoubleConsumer;-><init>()V
-Ljava/util/Spliterators$AbstractDoubleSpliterator$HoldingDoubleConsumer;->value:D
-Ljava/util/Spliterators$AbstractDoubleSpliterator;->batch:I
-Ljava/util/Spliterators$AbstractDoubleSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$AbstractDoubleSpliterator;->characteristics:I
-Ljava/util/Spliterators$AbstractDoubleSpliterator;->est:J
-Ljava/util/Spliterators$AbstractDoubleSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators$AbstractIntSpliterator$HoldingIntConsumer;-><init>()V
-Ljava/util/Spliterators$AbstractIntSpliterator$HoldingIntConsumer;->value:I
-Ljava/util/Spliterators$AbstractIntSpliterator;->batch:I
-Ljava/util/Spliterators$AbstractIntSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$AbstractIntSpliterator;->characteristics:I
-Ljava/util/Spliterators$AbstractIntSpliterator;->est:J
-Ljava/util/Spliterators$AbstractIntSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators$AbstractLongSpliterator$HoldingLongConsumer;-><init>()V
-Ljava/util/Spliterators$AbstractLongSpliterator$HoldingLongConsumer;->value:J
-Ljava/util/Spliterators$AbstractLongSpliterator;->batch:I
-Ljava/util/Spliterators$AbstractLongSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$AbstractLongSpliterator;->characteristics:I
-Ljava/util/Spliterators$AbstractLongSpliterator;->est:J
-Ljava/util/Spliterators$AbstractLongSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators$AbstractSpliterator$HoldingConsumer;-><init>()V
-Ljava/util/Spliterators$AbstractSpliterator$HoldingConsumer;->value:Ljava/lang/Object;
-Ljava/util/Spliterators$AbstractSpliterator;->batch:I
-Ljava/util/Spliterators$AbstractSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$AbstractSpliterator;->characteristics:I
-Ljava/util/Spliterators$AbstractSpliterator;->est:J
-Ljava/util/Spliterators$AbstractSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;I)V
-Ljava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;III)V
-Ljava/util/Spliterators$ArraySpliterator;->array:[Ljava/lang/Object;
-Ljava/util/Spliterators$ArraySpliterator;->characteristics:I
-Ljava/util/Spliterators$ArraySpliterator;->fence:I
-Ljava/util/Spliterators$ArraySpliterator;->index:I
-Ljava/util/Spliterators$DoubleArraySpliterator;-><init>([DI)V
-Ljava/util/Spliterators$DoubleArraySpliterator;-><init>([DIII)V
-Ljava/util/Spliterators$DoubleArraySpliterator;->array:[D
-Ljava/util/Spliterators$DoubleArraySpliterator;->characteristics:I
-Ljava/util/Spliterators$DoubleArraySpliterator;->fence:I
-Ljava/util/Spliterators$DoubleArraySpliterator;->index:I
-Ljava/util/Spliterators$DoubleIteratorSpliterator;-><init>(Ljava/util/PrimitiveIterator$OfDouble;I)V
-Ljava/util/Spliterators$DoubleIteratorSpliterator;-><init>(Ljava/util/PrimitiveIterator$OfDouble;JI)V
-Ljava/util/Spliterators$DoubleIteratorSpliterator;->batch:I
-Ljava/util/Spliterators$DoubleIteratorSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$DoubleIteratorSpliterator;->characteristics:I
-Ljava/util/Spliterators$DoubleIteratorSpliterator;->est:J
-Ljava/util/Spliterators$DoubleIteratorSpliterator;->it:Ljava/util/PrimitiveIterator$OfDouble;
-Ljava/util/Spliterators$DoubleIteratorSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators$EmptySpliterator$OfDouble;-><init>()V
-Ljava/util/Spliterators$EmptySpliterator$OfInt;-><init>()V
-Ljava/util/Spliterators$EmptySpliterator$OfLong;-><init>()V
-Ljava/util/Spliterators$EmptySpliterator$OfRef;-><init>()V
-Ljava/util/Spliterators$EmptySpliterator;-><init>()V
-Ljava/util/Spliterators$EmptySpliterator;->characteristics()I
-Ljava/util/Spliterators$EmptySpliterator;->estimateSize()J
-Ljava/util/Spliterators$EmptySpliterator;->forEachRemaining(Ljava/lang/Object;)V
-Ljava/util/Spliterators$EmptySpliterator;->tryAdvance(Ljava/lang/Object;)Z
-Ljava/util/Spliterators$EmptySpliterator;->trySplit()Ljava/util/Spliterator;
-Ljava/util/Spliterators$IntArraySpliterator;-><init>([II)V
-Ljava/util/Spliterators$IntArraySpliterator;-><init>([IIII)V
-Ljava/util/Spliterators$IntArraySpliterator;->array:[I
-Ljava/util/Spliterators$IntArraySpliterator;->characteristics:I
-Ljava/util/Spliterators$IntArraySpliterator;->fence:I
-Ljava/util/Spliterators$IntArraySpliterator;->index:I
-Ljava/util/Spliterators$IntIteratorSpliterator;-><init>(Ljava/util/PrimitiveIterator$OfInt;I)V
-Ljava/util/Spliterators$IntIteratorSpliterator;-><init>(Ljava/util/PrimitiveIterator$OfInt;JI)V
-Ljava/util/Spliterators$IntIteratorSpliterator;->batch:I
-Ljava/util/Spliterators$IntIteratorSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$IntIteratorSpliterator;->characteristics:I
-Ljava/util/Spliterators$IntIteratorSpliterator;->est:J
-Ljava/util/Spliterators$IntIteratorSpliterator;->it:Ljava/util/PrimitiveIterator$OfInt;
-Ljava/util/Spliterators$IntIteratorSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators$IteratorSpliterator;-><init>(Ljava/util/Collection;I)V
-Ljava/util/Spliterators$IteratorSpliterator;-><init>(Ljava/util/Iterator;I)V
-Ljava/util/Spliterators$IteratorSpliterator;-><init>(Ljava/util/Iterator;JI)V
-Ljava/util/Spliterators$IteratorSpliterator;->batch:I
-Ljava/util/Spliterators$IteratorSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$IteratorSpliterator;->characteristics:I
-Ljava/util/Spliterators$IteratorSpliterator;->collection:Ljava/util/Collection;
-Ljava/util/Spliterators$IteratorSpliterator;->est:J
-Ljava/util/Spliterators$IteratorSpliterator;->it:Ljava/util/Iterator;
-Ljava/util/Spliterators$IteratorSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators$LongArraySpliterator;-><init>([JI)V
-Ljava/util/Spliterators$LongArraySpliterator;-><init>([JIII)V
-Ljava/util/Spliterators$LongArraySpliterator;->array:[J
-Ljava/util/Spliterators$LongArraySpliterator;->characteristics:I
-Ljava/util/Spliterators$LongArraySpliterator;->fence:I
-Ljava/util/Spliterators$LongArraySpliterator;->index:I
-Ljava/util/Spliterators$LongIteratorSpliterator;-><init>(Ljava/util/PrimitiveIterator$OfLong;I)V
-Ljava/util/Spliterators$LongIteratorSpliterator;-><init>(Ljava/util/PrimitiveIterator$OfLong;JI)V
-Ljava/util/Spliterators$LongIteratorSpliterator;->batch:I
-Ljava/util/Spliterators$LongIteratorSpliterator;->BATCH_UNIT:I
-Ljava/util/Spliterators$LongIteratorSpliterator;->characteristics:I
-Ljava/util/Spliterators$LongIteratorSpliterator;->est:J
-Ljava/util/Spliterators$LongIteratorSpliterator;->it:Ljava/util/PrimitiveIterator$OfLong;
-Ljava/util/Spliterators$LongIteratorSpliterator;->MAX_BATCH:I
-Ljava/util/Spliterators;-><init>()V
-Ljava/util/Spliterators;->checkFromToBounds(III)V
-Ljava/util/Spliterators;->EMPTY_DOUBLE_SPLITERATOR:Ljava/util/Spliterator$OfDouble;
-Ljava/util/Spliterators;->EMPTY_INT_SPLITERATOR:Ljava/util/Spliterator$OfInt;
-Ljava/util/Spliterators;->EMPTY_LONG_SPLITERATOR:Ljava/util/Spliterator$OfLong;
-Ljava/util/Spliterators;->EMPTY_SPLITERATOR:Ljava/util/Spliterator;
-Ljava/util/SplittableRandom$RandomDoublesSpliterator;-><init>(Ljava/util/SplittableRandom;JJDD)V
-Ljava/util/SplittableRandom$RandomDoublesSpliterator;->bound:D
-Ljava/util/SplittableRandom$RandomDoublesSpliterator;->fence:J
-Ljava/util/SplittableRandom$RandomDoublesSpliterator;->index:J
-Ljava/util/SplittableRandom$RandomDoublesSpliterator;->origin:D
-Ljava/util/SplittableRandom$RandomDoublesSpliterator;->rng:Ljava/util/SplittableRandom;
-Ljava/util/SplittableRandom$RandomIntsSpliterator;-><init>(Ljava/util/SplittableRandom;JJII)V
-Ljava/util/SplittableRandom$RandomIntsSpliterator;->bound:I
-Ljava/util/SplittableRandom$RandomIntsSpliterator;->fence:J
-Ljava/util/SplittableRandom$RandomIntsSpliterator;->index:J
-Ljava/util/SplittableRandom$RandomIntsSpliterator;->origin:I
-Ljava/util/SplittableRandom$RandomIntsSpliterator;->rng:Ljava/util/SplittableRandom;
-Ljava/util/SplittableRandom$RandomLongsSpliterator;-><init>(Ljava/util/SplittableRandom;JJJJ)V
-Ljava/util/SplittableRandom$RandomLongsSpliterator;->bound:J
-Ljava/util/SplittableRandom$RandomLongsSpliterator;->fence:J
-Ljava/util/SplittableRandom$RandomLongsSpliterator;->index:J
-Ljava/util/SplittableRandom$RandomLongsSpliterator;->origin:J
-Ljava/util/SplittableRandom$RandomLongsSpliterator;->rng:Ljava/util/SplittableRandom;
-Ljava/util/SplittableRandom;-><init>(JJ)V
-Ljava/util/SplittableRandom;->BAD_BOUND:Ljava/lang/String;
-Ljava/util/SplittableRandom;->BAD_RANGE:Ljava/lang/String;
-Ljava/util/SplittableRandom;->BAD_SIZE:Ljava/lang/String;
-Ljava/util/SplittableRandom;->defaultGen:Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/SplittableRandom;->DOUBLE_UNIT:D
-Ljava/util/SplittableRandom;->gamma:J
-Ljava/util/SplittableRandom;->GOLDEN_GAMMA:J
-Ljava/util/SplittableRandom;->internalNextDouble(DD)D
-Ljava/util/SplittableRandom;->internalNextInt(II)I
-Ljava/util/SplittableRandom;->internalNextLong(JJ)J
-Ljava/util/SplittableRandom;->mix32(J)I
-Ljava/util/SplittableRandom;->mix64(J)J
-Ljava/util/SplittableRandom;->mixGamma(J)J
-Ljava/util/SplittableRandom;->nextSeed()J
-Ljava/util/SplittableRandom;->seed:J
-Ljava/util/stream/AbstractPipeline;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/AbstractPipeline;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/AbstractPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-Ljava/util/stream/AbstractPipeline;->combinedFlags:I
-Ljava/util/stream/AbstractPipeline;->copyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V
-Ljava/util/stream/AbstractPipeline;->copyIntoWithCancel(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V
-Ljava/util/stream/AbstractPipeline;->depth:I
-Ljava/util/stream/AbstractPipeline;->evaluate(Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/AbstractPipeline;->evaluate(Ljava/util/stream/TerminalOp;)Ljava/lang/Object;
-Ljava/util/stream/AbstractPipeline;->evaluateToArrayNode(Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/AbstractPipeline;->evaluateToNode(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/AbstractPipeline;->exactOutputSizeIfKnown(Ljava/util/Spliterator;)J
-Ljava/util/stream/AbstractPipeline;->forEachWithCancel(Ljava/util/Spliterator;Ljava/util/stream/Sink;)V
-Ljava/util/stream/AbstractPipeline;->getOutputShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/AbstractPipeline;->getSourceShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/AbstractPipeline;->getStreamAndOpFlags()I
-Ljava/util/stream/AbstractPipeline;->getStreamFlags()I
-Ljava/util/stream/AbstractPipeline;->isOrdered()Z
-Ljava/util/stream/AbstractPipeline;->lazySpliterator(Ljava/util/function/Supplier;)Ljava/util/Spliterator;
-Ljava/util/stream/AbstractPipeline;->linkedOrConsumed:Z
-Ljava/util/stream/AbstractPipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-Ljava/util/stream/AbstractPipeline;->MSG_CONSUMED:Ljava/lang/String;
-Ljava/util/stream/AbstractPipeline;->MSG_STREAM_LINKED:Ljava/lang/String;
-Ljava/util/stream/AbstractPipeline;->nextStage:Ljava/util/stream/AbstractPipeline;
-Ljava/util/stream/AbstractPipeline;->opEvaluateParallel(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/AbstractPipeline;->opEvaluateParallelLazy(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/util/Spliterator;
-Ljava/util/stream/AbstractPipeline;->opIsStateful()Z
-Ljava/util/stream/AbstractPipeline;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-Ljava/util/stream/AbstractPipeline;->parallel:Z
-Ljava/util/stream/AbstractPipeline;->previousStage:Ljava/util/stream/AbstractPipeline;
-Ljava/util/stream/AbstractPipeline;->sourceAnyStateful:Z
-Ljava/util/stream/AbstractPipeline;->sourceCloseAction:Ljava/lang/Runnable;
-Ljava/util/stream/AbstractPipeline;->sourceOrOpFlags:I
-Ljava/util/stream/AbstractPipeline;->sourceSpliterator(I)Ljava/util/Spliterator;
-Ljava/util/stream/AbstractPipeline;->sourceSpliterator:Ljava/util/Spliterator;
-Ljava/util/stream/AbstractPipeline;->sourceStage:Ljava/util/stream/AbstractPipeline;
-Ljava/util/stream/AbstractPipeline;->sourceStageSpliterator()Ljava/util/Spliterator;
-Ljava/util/stream/AbstractPipeline;->sourceSupplier:Ljava/util/function/Supplier;
-Ljava/util/stream/AbstractPipeline;->wrap(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)Ljava/util/Spliterator;
-Ljava/util/stream/AbstractPipeline;->wrapAndCopyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)Ljava/util/stream/Sink;
-Ljava/util/stream/AbstractPipeline;->wrapSink(Ljava/util/stream/Sink;)Ljava/util/stream/Sink;
-Ljava/util/stream/AbstractPipeline;->wrapSpliterator(Ljava/util/Spliterator;)Ljava/util/Spliterator;
-Ljava/util/stream/AbstractSpinedBuffer;-><init>()V
-Ljava/util/stream/AbstractSpinedBuffer;-><init>(I)V
-Ljava/util/stream/AbstractSpinedBuffer;->chunkSize(I)I
-Ljava/util/stream/AbstractSpinedBuffer;->clear()V
-Ljava/util/stream/AbstractSpinedBuffer;->count()J
-Ljava/util/stream/AbstractSpinedBuffer;->elementIndex:I
-Ljava/util/stream/AbstractSpinedBuffer;->initialChunkPower:I
-Ljava/util/stream/AbstractSpinedBuffer;->isEmpty()Z
-Ljava/util/stream/AbstractSpinedBuffer;->MAX_CHUNK_POWER:I
-Ljava/util/stream/AbstractSpinedBuffer;->MIN_CHUNK_POWER:I
-Ljava/util/stream/AbstractSpinedBuffer;->MIN_CHUNK_SIZE:I
-Ljava/util/stream/AbstractSpinedBuffer;->MIN_SPINE_SIZE:I
-Ljava/util/stream/AbstractSpinedBuffer;->priorElementCount:[J
-Ljava/util/stream/AbstractSpinedBuffer;->spineIndex:I
-Ljava/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
-Ljava/util/stream/Collectors$CollectorImpl;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/Set;)V
-Ljava/util/stream/Collectors$CollectorImpl;->accumulator:Ljava/util/function/BiConsumer;
-Ljava/util/stream/Collectors$CollectorImpl;->characteristics:Ljava/util/Set;
-Ljava/util/stream/Collectors$CollectorImpl;->combiner:Ljava/util/function/BinaryOperator;
-Ljava/util/stream/Collectors$CollectorImpl;->finisher:Ljava/util/function/Function;
-Ljava/util/stream/Collectors$CollectorImpl;->supplier:Ljava/util/function/Supplier;
-Ljava/util/stream/Collectors$Partition;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-Ljava/util/stream/Collectors$Partition;->forFalse:Ljava/lang/Object;
-Ljava/util/stream/Collectors$Partition;->forTrue:Ljava/lang/Object;
-Ljava/util/stream/Collectors;-><init>()V
-Ljava/util/stream/Collectors;->boxSupplier(Ljava/lang/Object;)Ljava/util/function/Supplier;
-Ljava/util/stream/Collectors;->castingIdentity()Ljava/util/function/Function;
-Ljava/util/stream/Collectors;->CH_CONCURRENT_ID:Ljava/util/Set;
-Ljava/util/stream/Collectors;->CH_CONCURRENT_NOID:Ljava/util/Set;
-Ljava/util/stream/Collectors;->CH_ID:Ljava/util/Set;
-Ljava/util/stream/Collectors;->CH_NOID:Ljava/util/Set;
-Ljava/util/stream/Collectors;->CH_UNORDERED_ID:Ljava/util/Set;
-Ljava/util/stream/Collectors;->computeFinalSum([D)D
-Ljava/util/stream/Collectors;->mapMerger(Ljava/util/function/BinaryOperator;)Ljava/util/function/BinaryOperator;
-Ljava/util/stream/Collectors;->sumWithCompensation([DD)[D
-Ljava/util/stream/Collectors;->throwingMerger()Ljava/util/function/BinaryOperator;
-Ljava/util/stream/DoublePipeline$Head;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/DoublePipeline$Head;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/DoublePipeline$Head;->opIsStateful()Z
-Ljava/util/stream/DoublePipeline$Head;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-Ljava/util/stream/DoublePipeline$StatefulOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/DoublePipeline$StatefulOp;->opEvaluateParallel(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/DoublePipeline$StatefulOp;->opIsStateful()Z
-Ljava/util/stream/DoublePipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/DoublePipeline$StatelessOp;->opIsStateful()Z
-Ljava/util/stream/DoublePipeline;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/DoublePipeline;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/DoublePipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-Ljava/util/stream/DoublePipeline;->adapt(Ljava/util/Spliterator;)Ljava/util/Spliterator$OfDouble;
-Ljava/util/stream/DoublePipeline;->adapt(Ljava/util/stream/Sink;)Ljava/util/function/DoubleConsumer;
-Ljava/util/stream/DoublePipeline;->evaluateToNode(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/DoublePipeline;->forEachWithCancel(Ljava/util/Spliterator;Ljava/util/stream/Sink;)V
-Ljava/util/stream/DoublePipeline;->getOutputShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/DoublePipeline;->lazySpliterator(Ljava/util/function/Supplier;)Ljava/util/Spliterator$OfDouble;
-Ljava/util/stream/DoublePipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-Ljava/util/stream/DoublePipeline;->wrap(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)Ljava/util/Spliterator;
-Ljava/util/stream/IntPipeline$Head;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/IntPipeline$Head;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/IntPipeline$Head;->opIsStateful()Z
-Ljava/util/stream/IntPipeline$Head;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-Ljava/util/stream/IntPipeline$StatefulOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/IntPipeline$StatefulOp;->opEvaluateParallel(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/IntPipeline$StatefulOp;->opIsStateful()Z
-Ljava/util/stream/IntPipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/IntPipeline$StatelessOp;->opIsStateful()Z
-Ljava/util/stream/IntPipeline;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/IntPipeline;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/IntPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-Ljava/util/stream/IntPipeline;->adapt(Ljava/util/Spliterator;)Ljava/util/Spliterator$OfInt;
-Ljava/util/stream/IntPipeline;->adapt(Ljava/util/stream/Sink;)Ljava/util/function/IntConsumer;
-Ljava/util/stream/IntPipeline;->evaluateToNode(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/IntPipeline;->forEachWithCancel(Ljava/util/Spliterator;Ljava/util/stream/Sink;)V
-Ljava/util/stream/IntPipeline;->getOutputShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/IntPipeline;->lazySpliterator(Ljava/util/function/Supplier;)Ljava/util/Spliterator$OfInt;
-Ljava/util/stream/IntPipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-Ljava/util/stream/IntPipeline;->wrap(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)Ljava/util/Spliterator;
-Ljava/util/stream/LongPipeline$Head;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/LongPipeline$Head;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/LongPipeline$Head;->opIsStateful()Z
-Ljava/util/stream/LongPipeline$Head;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-Ljava/util/stream/LongPipeline$StatefulOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/LongPipeline$StatefulOp;->opEvaluateParallel(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/LongPipeline$StatefulOp;->opIsStateful()Z
-Ljava/util/stream/LongPipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/LongPipeline$StatelessOp;->opIsStateful()Z
-Ljava/util/stream/LongPipeline;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/LongPipeline;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/LongPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-Ljava/util/stream/LongPipeline;->adapt(Ljava/util/Spliterator;)Ljava/util/Spliterator$OfLong;
-Ljava/util/stream/LongPipeline;->adapt(Ljava/util/stream/Sink;)Ljava/util/function/LongConsumer;
-Ljava/util/stream/LongPipeline;->evaluateToNode(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/LongPipeline;->forEachWithCancel(Ljava/util/Spliterator;Ljava/util/stream/Sink;)V
-Ljava/util/stream/LongPipeline;->getOutputShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/LongPipeline;->lazySpliterator(Ljava/util/function/Supplier;)Ljava/util/Spliterator$OfLong;
-Ljava/util/stream/LongPipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-Ljava/util/stream/LongPipeline;->wrap(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)Ljava/util/Spliterator;
-Ljava/util/stream/Node$Builder$OfDouble;->build()Ljava/util/stream/Node$OfDouble;
-Ljava/util/stream/Node$Builder$OfInt;->build()Ljava/util/stream/Node$OfInt;
-Ljava/util/stream/Node$Builder$OfLong;->build()Ljava/util/stream/Node$OfLong;
-Ljava/util/stream/Node$Builder;->build()Ljava/util/stream/Node;
-Ljava/util/stream/Node$OfDouble;->copyInto([Ljava/lang/Double;I)V
-Ljava/util/stream/Node$OfDouble;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/Node$OfDouble;->getShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/Node$OfDouble;->newArray(I)[D
-Ljava/util/stream/Node$OfDouble;->truncate(JJLjava/util/function/IntFunction;)Ljava/util/stream/Node$OfDouble;
-Ljava/util/stream/Node$OfInt;->copyInto([Ljava/lang/Integer;I)V
-Ljava/util/stream/Node$OfInt;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/Node$OfInt;->getShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/Node$OfInt;->newArray(I)[I
-Ljava/util/stream/Node$OfInt;->truncate(JJLjava/util/function/IntFunction;)Ljava/util/stream/Node$OfInt;
-Ljava/util/stream/Node$OfLong;->copyInto([Ljava/lang/Long;I)V
-Ljava/util/stream/Node$OfLong;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/Node$OfLong;->getShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/Node$OfLong;->newArray(I)[J
-Ljava/util/stream/Node$OfLong;->truncate(JJLjava/util/function/IntFunction;)Ljava/util/stream/Node$OfLong;
-Ljava/util/stream/Node$OfPrimitive;->asArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-Ljava/util/stream/Node$OfPrimitive;->asPrimitiveArray()Ljava/lang/Object;
-Ljava/util/stream/Node$OfPrimitive;->copyInto(Ljava/lang/Object;I)V
-Ljava/util/stream/Node$OfPrimitive;->forEach(Ljava/lang/Object;)V
-Ljava/util/stream/Node$OfPrimitive;->getChild(I)Ljava/util/stream/Node$OfPrimitive;
-Ljava/util/stream/Node$OfPrimitive;->newArray(I)Ljava/lang/Object;
-Ljava/util/stream/Node$OfPrimitive;->spliterator()Ljava/util/Spliterator$OfPrimitive;
-Ljava/util/stream/Node$OfPrimitive;->truncate(JJLjava/util/function/IntFunction;)Ljava/util/stream/Node$OfPrimitive;
-Ljava/util/stream/Node;->asArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-Ljava/util/stream/Node;->copyInto([Ljava/lang/Object;I)V
-Ljava/util/stream/Node;->count()J
-Ljava/util/stream/Node;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/Node;->getChild(I)Ljava/util/stream/Node;
-Ljava/util/stream/Node;->getChildCount()I
-Ljava/util/stream/Node;->getShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/Node;->spliterator()Ljava/util/Spliterator;
-Ljava/util/stream/Node;->truncate(JJLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/PipelineHelper;-><init>()V
-Ljava/util/stream/PipelineHelper;->copyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V
-Ljava/util/stream/PipelineHelper;->copyIntoWithCancel(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V
-Ljava/util/stream/PipelineHelper;->evaluate(Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/PipelineHelper;->exactOutputSizeIfKnown(Ljava/util/Spliterator;)J
-Ljava/util/stream/PipelineHelper;->getSourceShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/PipelineHelper;->getStreamAndOpFlags()I
-Ljava/util/stream/PipelineHelper;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-Ljava/util/stream/PipelineHelper;->wrapAndCopyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)Ljava/util/stream/Sink;
-Ljava/util/stream/PipelineHelper;->wrapSink(Ljava/util/stream/Sink;)Ljava/util/stream/Sink;
-Ljava/util/stream/PipelineHelper;->wrapSpliterator(Ljava/util/Spliterator;)Ljava/util/Spliterator;
-Ljava/util/stream/ReferencePipeline$Head;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/ReferencePipeline$Head;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/ReferencePipeline$Head;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/ReferencePipeline$Head;->forEachOrdered(Ljava/util/function/Consumer;)V
-Ljava/util/stream/ReferencePipeline$Head;->opIsStateful()Z
-Ljava/util/stream/ReferencePipeline$Head;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
-Ljava/util/stream/ReferencePipeline$StatefulOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/ReferencePipeline$StatefulOp;->opEvaluateParallel(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/ReferencePipeline$StatefulOp;->opIsStateful()Z
-Ljava/util/stream/ReferencePipeline$StatelessOp;-><init>(Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;I)V
-Ljava/util/stream/ReferencePipeline$StatelessOp;->opIsStateful()Z
-Ljava/util/stream/ReferencePipeline;-><init>(Ljava/util/function/Supplier;IZ)V
-Ljava/util/stream/ReferencePipeline;-><init>(Ljava/util/Spliterator;IZ)V
-Ljava/util/stream/ReferencePipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
-Ljava/util/stream/ReferencePipeline;->allMatch(Ljava/util/function/Predicate;)Z
-Ljava/util/stream/ReferencePipeline;->anyMatch(Ljava/util/function/Predicate;)Z
-Ljava/util/stream/ReferencePipeline;->collect(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;
-Ljava/util/stream/ReferencePipeline;->collect(Ljava/util/stream/Collector;)Ljava/lang/Object;
-Ljava/util/stream/ReferencePipeline;->evaluateToNode(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
-Ljava/util/stream/ReferencePipeline;->filter(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;
-Ljava/util/stream/ReferencePipeline;->flatMap(Ljava/util/function/Function;)Ljava/util/stream/Stream;
-Ljava/util/stream/ReferencePipeline;->flatMapToDouble(Ljava/util/function/Function;)Ljava/util/stream/DoubleStream;
-Ljava/util/stream/ReferencePipeline;->flatMapToInt(Ljava/util/function/Function;)Ljava/util/stream/IntStream;
-Ljava/util/stream/ReferencePipeline;->flatMapToLong(Ljava/util/function/Function;)Ljava/util/stream/LongStream;
-Ljava/util/stream/ReferencePipeline;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/ReferencePipeline;->forEachOrdered(Ljava/util/function/Consumer;)V
-Ljava/util/stream/ReferencePipeline;->forEachWithCancel(Ljava/util/Spliterator;Ljava/util/stream/Sink;)V
-Ljava/util/stream/ReferencePipeline;->getOutputShape()Ljava/util/stream/StreamShape;
-Ljava/util/stream/ReferencePipeline;->lazySpliterator(Ljava/util/function/Supplier;)Ljava/util/Spliterator;
-Ljava/util/stream/ReferencePipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
-Ljava/util/stream/ReferencePipeline;->map(Ljava/util/function/Function;)Ljava/util/stream/Stream;
-Ljava/util/stream/ReferencePipeline;->mapToDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/DoubleStream;
-Ljava/util/stream/ReferencePipeline;->mapToInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/IntStream;
-Ljava/util/stream/ReferencePipeline;->mapToLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/LongStream;
-Ljava/util/stream/ReferencePipeline;->max(Ljava/util/Comparator;)Ljava/util/Optional;
-Ljava/util/stream/ReferencePipeline;->min(Ljava/util/Comparator;)Ljava/util/Optional;
-Ljava/util/stream/ReferencePipeline;->noneMatch(Ljava/util/function/Predicate;)Z
-Ljava/util/stream/ReferencePipeline;->peek(Ljava/util/function/Consumer;)Ljava/util/stream/Stream;
-Ljava/util/stream/ReferencePipeline;->reduce(Ljava/lang/Object;Ljava/util/function/BiFunction;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;
-Ljava/util/stream/ReferencePipeline;->reduce(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;
-Ljava/util/stream/ReferencePipeline;->reduce(Ljava/util/function/BinaryOperator;)Ljava/util/Optional;
-Ljava/util/stream/ReferencePipeline;->sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;
-Ljava/util/stream/ReferencePipeline;->wrap(Ljava/util/stream/PipelineHelper;Ljava/util/function/Supplier;Z)Ljava/util/Spliterator;
-Ljava/util/stream/Sink$ChainedDouble;-><init>(Ljava/util/stream/Sink;)V
-Ljava/util/stream/Sink$ChainedDouble;->begin(J)V
-Ljava/util/stream/Sink$ChainedDouble;->cancellationRequested()Z
-Ljava/util/stream/Sink$ChainedDouble;->downstream:Ljava/util/stream/Sink;
-Ljava/util/stream/Sink$ChainedDouble;->end()V
-Ljava/util/stream/Sink$ChainedInt;-><init>(Ljava/util/stream/Sink;)V
-Ljava/util/stream/Sink$ChainedInt;->begin(J)V
-Ljava/util/stream/Sink$ChainedInt;->cancellationRequested()Z
-Ljava/util/stream/Sink$ChainedInt;->downstream:Ljava/util/stream/Sink;
-Ljava/util/stream/Sink$ChainedInt;->end()V
-Ljava/util/stream/Sink$ChainedLong;-><init>(Ljava/util/stream/Sink;)V
-Ljava/util/stream/Sink$ChainedLong;->begin(J)V
-Ljava/util/stream/Sink$ChainedLong;->cancellationRequested()Z
-Ljava/util/stream/Sink$ChainedLong;->downstream:Ljava/util/stream/Sink;
-Ljava/util/stream/Sink$ChainedLong;->end()V
-Ljava/util/stream/Sink$ChainedReference;-><init>(Ljava/util/stream/Sink;)V
-Ljava/util/stream/Sink$ChainedReference;->begin(J)V
-Ljava/util/stream/Sink$ChainedReference;->cancellationRequested()Z
-Ljava/util/stream/Sink$ChainedReference;->downstream:Ljava/util/stream/Sink;
-Ljava/util/stream/Sink$ChainedReference;->end()V
-Ljava/util/stream/Sink$OfDouble;->accept(Ljava/lang/Double;)V
-Ljava/util/stream/Sink$OfInt;->accept(Ljava/lang/Integer;)V
-Ljava/util/stream/Sink$OfLong;->accept(Ljava/lang/Long;)V
-Ljava/util/stream/Sink;->accept(D)V
-Ljava/util/stream/Sink;->accept(I)V
-Ljava/util/stream/Sink;->accept(J)V
-Ljava/util/stream/Sink;->begin(J)V
-Ljava/util/stream/Sink;->cancellationRequested()Z
-Ljava/util/stream/Sink;->end()V
-Ljava/util/stream/SpinedBuffer$OfDouble;-><init>()V
-Ljava/util/stream/SpinedBuffer$OfDouble;-><init>(I)V
-Ljava/util/stream/SpinedBuffer$OfDouble;->arrayForEach([DIILjava/util/function/DoubleConsumer;)V
-Ljava/util/stream/SpinedBuffer$OfDouble;->arrayLength([D)I
-Ljava/util/stream/SpinedBuffer$OfDouble;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/SpinedBuffer$OfDouble;->get(J)D
-Ljava/util/stream/SpinedBuffer$OfDouble;->newArray(I)[D
-Ljava/util/stream/SpinedBuffer$OfDouble;->newArrayArray(I)[[D
-Ljava/util/stream/SpinedBuffer$OfInt;-><init>()V
-Ljava/util/stream/SpinedBuffer$OfInt;-><init>(I)V
-Ljava/util/stream/SpinedBuffer$OfInt;->arrayForEach([IIILjava/util/function/IntConsumer;)V
-Ljava/util/stream/SpinedBuffer$OfInt;->arrayLength([I)I
-Ljava/util/stream/SpinedBuffer$OfInt;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/SpinedBuffer$OfInt;->get(J)I
-Ljava/util/stream/SpinedBuffer$OfInt;->newArray(I)[I
-Ljava/util/stream/SpinedBuffer$OfInt;->newArrayArray(I)[[I
-Ljava/util/stream/SpinedBuffer$OfLong;-><init>()V
-Ljava/util/stream/SpinedBuffer$OfLong;-><init>(I)V
-Ljava/util/stream/SpinedBuffer$OfLong;->arrayForEach([JIILjava/util/function/LongConsumer;)V
-Ljava/util/stream/SpinedBuffer$OfLong;->arrayLength([J)I
-Ljava/util/stream/SpinedBuffer$OfLong;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/SpinedBuffer$OfLong;->get(J)J
-Ljava/util/stream/SpinedBuffer$OfLong;->newArray(I)[J
-Ljava/util/stream/SpinedBuffer$OfLong;->newArrayArray(I)[[J
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->arrayForOne(Ljava/lang/Object;ILjava/lang/Object;)V
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->arraySpliterator(Ljava/lang/Object;II)Ljava/util/Spliterator$OfPrimitive;
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->lastSpineElementFence:I
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->lastSpineIndex:I
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->newSpliterator(IIII)Ljava/util/Spliterator$OfPrimitive;
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->splChunk:Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->splElementIndex:I
-Ljava/util/stream/SpinedBuffer$OfPrimitive$BaseSpliterator;->splSpineIndex:I
-Ljava/util/stream/SpinedBuffer$OfPrimitive;-><init>()V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;-><init>(I)V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->arrayForEach(Ljava/lang/Object;IILjava/lang/Object;)V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->arrayLength(Ljava/lang/Object;)I
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->asPrimitiveArray()Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->capacity()J
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->chunkFor(J)I
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->clear()V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->copyInto(Ljava/lang/Object;I)V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->curChunk:Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->ensureCapacity(J)V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->forEach(Ljava/lang/Object;)V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->increaseCapacity()V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->inflateSpine()V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->newArray(I)Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->newArrayArray(I)[Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->preAccept()V
-Ljava/util/stream/SpinedBuffer$OfPrimitive;->spine:[Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer;-><init>()V
-Ljava/util/stream/SpinedBuffer;-><init>(I)V
-Ljava/util/stream/SpinedBuffer;->accept(Ljava/lang/Object;)V
-Ljava/util/stream/SpinedBuffer;->asArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer;->capacity()J
-Ljava/util/stream/SpinedBuffer;->clear()V
-Ljava/util/stream/SpinedBuffer;->copyInto([Ljava/lang/Object;I)V
-Ljava/util/stream/SpinedBuffer;->curChunk:[Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer;->ensureCapacity(J)V
-Ljava/util/stream/SpinedBuffer;->forEach(Ljava/util/function/Consumer;)V
-Ljava/util/stream/SpinedBuffer;->get(J)Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer;->increaseCapacity()V
-Ljava/util/stream/SpinedBuffer;->inflateSpine()V
-Ljava/util/stream/SpinedBuffer;->spine:[[Ljava/lang/Object;
-Ljava/util/stream/SpinedBuffer;->SPLITERATOR_CHARACTERISTICS:I
-Ljava/util/stream/StreamOpFlag$MaskBuilder;-><init>(Ljava/util/Map;)V
-Ljava/util/stream/StreamOpFlag$MaskBuilder;->build()Ljava/util/Map;
-Ljava/util/stream/StreamOpFlag$MaskBuilder;->clear(Ljava/util/stream/StreamOpFlag$Type;)Ljava/util/stream/StreamOpFlag$MaskBuilder;
-Ljava/util/stream/StreamOpFlag$MaskBuilder;->map:Ljava/util/Map;
-Ljava/util/stream/StreamOpFlag$MaskBuilder;->mask(Ljava/util/stream/StreamOpFlag$Type;Ljava/lang/Integer;)Ljava/util/stream/StreamOpFlag$MaskBuilder;
-Ljava/util/stream/StreamOpFlag$MaskBuilder;->set(Ljava/util/stream/StreamOpFlag$Type;)Ljava/util/stream/StreamOpFlag$MaskBuilder;
-Ljava/util/stream/StreamOpFlag$MaskBuilder;->setAndClear(Ljava/util/stream/StreamOpFlag$Type;)Ljava/util/stream/StreamOpFlag$MaskBuilder;
-Ljava/util/stream/StreamOpFlag$Type;->OP:Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag$Type;->SPLITERATOR:Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag$Type;->STREAM:Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag$Type;->TERMINAL_OP:Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag$Type;->UPSTREAM_TERMINAL_OP:Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag$Type;->valueOf(Ljava/lang/String;)Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag$Type;->values()[Ljava/util/stream/StreamOpFlag$Type;
-Ljava/util/stream/StreamOpFlag;->bitPosition:I
-Ljava/util/stream/StreamOpFlag;->canSet(Ljava/util/stream/StreamOpFlag$Type;)Z
-Ljava/util/stream/StreamOpFlag;->clear()I
-Ljava/util/stream/StreamOpFlag;->clear:I
-Ljava/util/stream/StreamOpFlag;->CLEAR_BITS:I
-Ljava/util/stream/StreamOpFlag;->combineOpFlags(II)I
-Ljava/util/stream/StreamOpFlag;->createFlagMask()I
-Ljava/util/stream/StreamOpFlag;->createMask(Ljava/util/stream/StreamOpFlag$Type;)I
-Ljava/util/stream/StreamOpFlag;->DISTINCT:Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamOpFlag;->FLAG_MASK:I
-Ljava/util/stream/StreamOpFlag;->FLAG_MASK_IS:I
-Ljava/util/stream/StreamOpFlag;->FLAG_MASK_NOT:I
-Ljava/util/stream/StreamOpFlag;->fromCharacteristics(I)I
-Ljava/util/stream/StreamOpFlag;->fromCharacteristics(Ljava/util/Spliterator;)I
-Ljava/util/stream/StreamOpFlag;->getMask(I)I
-Ljava/util/stream/StreamOpFlag;->INITIAL_OPS_VALUE:I
-Ljava/util/stream/StreamOpFlag;->isCleared(I)Z
-Ljava/util/stream/StreamOpFlag;->isKnown(I)Z
-Ljava/util/stream/StreamOpFlag;->isPreserved(I)Z
-Ljava/util/stream/StreamOpFlag;->isStreamFlag()Z
-Ljava/util/stream/StreamOpFlag;->IS_DISTINCT:I
-Ljava/util/stream/StreamOpFlag;->IS_ORDERED:I
-Ljava/util/stream/StreamOpFlag;->IS_SHORT_CIRCUIT:I
-Ljava/util/stream/StreamOpFlag;->IS_SIZED:I
-Ljava/util/stream/StreamOpFlag;->IS_SORTED:I
-Ljava/util/stream/StreamOpFlag;->maskTable:Ljava/util/Map;
-Ljava/util/stream/StreamOpFlag;->NOT_DISTINCT:I
-Ljava/util/stream/StreamOpFlag;->NOT_ORDERED:I
-Ljava/util/stream/StreamOpFlag;->NOT_SIZED:I
-Ljava/util/stream/StreamOpFlag;->NOT_SORTED:I
-Ljava/util/stream/StreamOpFlag;->OP_MASK:I
-Ljava/util/stream/StreamOpFlag;->ORDERED:Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamOpFlag;->preserve:I
-Ljava/util/stream/StreamOpFlag;->PRESERVE_BITS:I
-Ljava/util/stream/StreamOpFlag;->set()I
-Ljava/util/stream/StreamOpFlag;->set(Ljava/util/stream/StreamOpFlag$Type;)Ljava/util/stream/StreamOpFlag$MaskBuilder;
-Ljava/util/stream/StreamOpFlag;->set:I
-Ljava/util/stream/StreamOpFlag;->SET_BITS:I
-Ljava/util/stream/StreamOpFlag;->SHORT_CIRCUIT:Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamOpFlag;->SIZED:Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamOpFlag;->SORTED:Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamOpFlag;->SPLITERATOR_CHARACTERISTICS_MASK:I
-Ljava/util/stream/StreamOpFlag;->STREAM_MASK:I
-Ljava/util/stream/StreamOpFlag;->TERMINAL_OP_MASK:I
-Ljava/util/stream/StreamOpFlag;->toCharacteristics(I)I
-Ljava/util/stream/StreamOpFlag;->toStreamFlags(I)I
-Ljava/util/stream/StreamOpFlag;->UPSTREAM_TERMINAL_OP_MASK:I
-Ljava/util/stream/StreamOpFlag;->valueOf(Ljava/lang/String;)Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamOpFlag;->values()[Ljava/util/stream/StreamOpFlag;
-Ljava/util/stream/StreamShape;->DOUBLE_VALUE:Ljava/util/stream/StreamShape;
-Ljava/util/stream/StreamShape;->INT_VALUE:Ljava/util/stream/StreamShape;
-Ljava/util/stream/StreamShape;->LONG_VALUE:Ljava/util/stream/StreamShape;
-Ljava/util/stream/StreamShape;->REFERENCE:Ljava/util/stream/StreamShape;
-Ljava/util/stream/StreamShape;->valueOf(Ljava/lang/String;)Ljava/util/stream/StreamShape;
-Ljava/util/stream/StreamShape;->values()[Ljava/util/stream/StreamShape;
-Ljava/util/stream/StreamSupport;-><init>()V
-Ljava/util/stream/TerminalOp;->evaluateParallel(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object;
-Ljava/util/stream/TerminalOp;->evaluateSequential(Ljava/util/stream/PipelineHelper;Ljava/util/Spliterator;)Ljava/lang/Object;
-Ljava/util/stream/TerminalOp;->getOpFlags()I
-Ljava/util/stream/TerminalOp;->inputShape()Ljava/util/stream/StreamShape;
-Ljava/util/StringJoiner;->delimiter:Ljava/lang/String;
-Ljava/util/StringJoiner;->emptyValue:Ljava/lang/String;
-Ljava/util/StringJoiner;->prefix:Ljava/lang/String;
-Ljava/util/StringJoiner;->prepareBuilder()Ljava/lang/StringBuilder;
-Ljava/util/StringJoiner;->suffix:Ljava/lang/String;
-Ljava/util/StringJoiner;->value:Ljava/lang/StringBuilder;
-Ljava/util/StringTokenizer;->currentPosition:I
-Ljava/util/StringTokenizer;->delimiterCodePoints:[I
-Ljava/util/StringTokenizer;->delimiters:Ljava/lang/String;
-Ljava/util/StringTokenizer;->delimsChanged:Z
-Ljava/util/StringTokenizer;->hasSurrogates:Z
-Ljava/util/StringTokenizer;->isDelimiter(I)Z
-Ljava/util/StringTokenizer;->maxDelimCodePoint:I
-Ljava/util/StringTokenizer;->maxPosition:I
-Ljava/util/StringTokenizer;->newPosition:I
-Ljava/util/StringTokenizer;->retDelims:Z
-Ljava/util/StringTokenizer;->scanToken(I)I
-Ljava/util/StringTokenizer;->setMaxDelimCodePoint()V
-Ljava/util/StringTokenizer;->skipDelimiters(I)I
-Ljava/util/StringTokenizer;->str:Ljava/lang/String;
-Ljava/util/TaskQueue;-><init>()V
-Ljava/util/TaskQueue;->add(Ljava/util/TimerTask;)V
-Ljava/util/TaskQueue;->clear()V
-Ljava/util/TaskQueue;->fixDown(I)V
-Ljava/util/TaskQueue;->fixUp(I)V
-Ljava/util/TaskQueue;->get(I)Ljava/util/TimerTask;
-Ljava/util/TaskQueue;->getMin()Ljava/util/TimerTask;
-Ljava/util/TaskQueue;->heapify()V
-Ljava/util/TaskQueue;->isEmpty()Z
-Ljava/util/TaskQueue;->queue:[Ljava/util/TimerTask;
-Ljava/util/TaskQueue;->quickRemove(I)V
-Ljava/util/TaskQueue;->removeMin()V
-Ljava/util/TaskQueue;->rescheduleMin(J)V
-Ljava/util/TaskQueue;->size()I
-Ljava/util/TaskQueue;->size:I
-Ljava/util/Timer;->nextSerialNumber:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/Timer;->queue:Ljava/util/TaskQueue;
-Ljava/util/Timer;->sched(Ljava/util/TimerTask;JJ)V
-Ljava/util/Timer;->serialNumber()I
-Ljava/util/Timer;->thread:Ljava/util/TimerThread;
-Ljava/util/Timer;->threadReaper:Ljava/lang/Object;
-Ljava/util/TimerTask;->CANCELLED:I
-Ljava/util/TimerTask;->EXECUTED:I
-Ljava/util/TimerTask;->lock:Ljava/lang/Object;
-Ljava/util/TimerTask;->nextExecutionTime:J
-Ljava/util/TimerTask;->SCHEDULED:I
-Ljava/util/TimerTask;->state:I
-Ljava/util/TimerTask;->VIRGIN:I
-Ljava/util/TimerThread;-><init>(Ljava/util/TaskQueue;)V
-Ljava/util/TimerThread;->mainLoop()V
-Ljava/util/TimerThread;->newTasksMayBeScheduled:Z
-Ljava/util/TimerThread;->queue:Ljava/util/TaskQueue;
-Ljava/util/TimeZone$NoImagePreloadHolder;-><init>()V
-Ljava/util/TimeZone$NoImagePreloadHolder;->CUSTOM_ZONE_ID_PATTERN:Ljava/util/regex/Pattern;
-Ljava/util/TimeZone;->appendNumber(Ljava/lang/StringBuilder;II)V
-Ljava/util/TimeZone;->createGmtOffsetString(ZZI)Ljava/lang/String;
-Ljava/util/TimeZone;->defaultTimeZone:Ljava/util/TimeZone;
-Ljava/util/TimeZone;->getCustomTimeZone(Ljava/lang/String;)Ljava/util/TimeZone;
-Ljava/util/TimeZone;->getDefaultRef()Ljava/util/TimeZone;
-Ljava/util/TimeZone;->getOffsets(J[I)I
-Ljava/util/TimeZone;->getSystemGMTOffsetID()Ljava/lang/String;
-Ljava/util/TimeZone;->getSystemTimeZoneID(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Ljava/util/TimeZone;->GMT:Ljava/util/TimeZone;
-Ljava/util/TimeZone;->ID:Ljava/lang/String;
-Ljava/util/TimeZone;->NO_TIMEZONE:Ljava/util/TimeZone;
-Ljava/util/TimeZone;->UTC:Ljava/util/TimeZone;
-Ljava/util/TreeMap$AscendingSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
-Ljava/util/TreeMap$AscendingSubMap;->descendingKeyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap$AscendingSubMap;->keyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap$AscendingSubMap;->keySpliterator()Ljava/util/Spliterator;
-Ljava/util/TreeMap$AscendingSubMap;->subCeiling(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$AscendingSubMap;->subFloor(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$AscendingSubMap;->subHigher(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$AscendingSubMap;->subHighest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$AscendingSubMap;->subLower(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$AscendingSubMap;->subLowest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$DescendingKeySpliterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;III)V
-Ljava/util/TreeMap$DescendingKeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/TreeMap$DescendingKeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/TreeMap$DescendingSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
-Ljava/util/TreeMap$DescendingSubMap;->descendingKeyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap$DescendingSubMap;->keyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap$DescendingSubMap;->keySpliterator()Ljava/util/Spliterator;
-Ljava/util/TreeMap$DescendingSubMap;->reverseComparator:Ljava/util/Comparator;
-Ljava/util/TreeMap$DescendingSubMap;->subCeiling(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$DescendingSubMap;->subFloor(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$DescendingSubMap;->subHigher(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$DescendingSubMap;->subHighest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$DescendingSubMap;->subLower(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$DescendingSubMap;->subLowest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$EntrySpliterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;III)V
-Ljava/util/TreeMap$EntrySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/TreeMap$EntrySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/TreeMap$KeySet;-><init>(Ljava/util/NavigableMap;)V
-Ljava/util/TreeMap$KeySet;->m:Ljava/util/NavigableMap;
-Ljava/util/TreeMap$KeySpliterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;III)V
-Ljava/util/TreeMap$KeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/TreeMap$KeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/TreeMap$NavigableSubMap$EntrySetView;->size:I
-Ljava/util/TreeMap$NavigableSubMap$EntrySetView;->sizeModCount:I
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->expectedModCount:I
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->fenceKey:Ljava/lang/Object;
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->lastReturned:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->next:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->nextEntry()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->prevEntry()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->removeAscending()V
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;->removeDescending()V
-Ljava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/TreeMap$NavigableSubMap;-><init>(Ljava/util/TreeMap;ZLjava/lang/Object;ZZLjava/lang/Object;Z)V
-Ljava/util/TreeMap$NavigableSubMap;->absCeiling(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->absFloor(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->absHigher(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->absHighest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->absHighFence()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->absLower(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->absLowest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->absLowFence()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->descendingKeyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap$NavigableSubMap;->descendingMapView:Ljava/util/NavigableMap;
-Ljava/util/TreeMap$NavigableSubMap;->entrySetView:Ljava/util/TreeMap$NavigableSubMap$EntrySetView;
-Ljava/util/TreeMap$NavigableSubMap;->fromStart:Z
-Ljava/util/TreeMap$NavigableSubMap;->hi:Ljava/lang/Object;
-Ljava/util/TreeMap$NavigableSubMap;->hiInclusive:Z
-Ljava/util/TreeMap$NavigableSubMap;->inClosedRange(Ljava/lang/Object;)Z
-Ljava/util/TreeMap$NavigableSubMap;->inRange(Ljava/lang/Object;)Z
-Ljava/util/TreeMap$NavigableSubMap;->inRange(Ljava/lang/Object;Z)Z
-Ljava/util/TreeMap$NavigableSubMap;->keyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap$NavigableSubMap;->keySpliterator()Ljava/util/Spliterator;
-Ljava/util/TreeMap$NavigableSubMap;->lo:Ljava/lang/Object;
-Ljava/util/TreeMap$NavigableSubMap;->loInclusive:Z
-Ljava/util/TreeMap$NavigableSubMap;->m:Ljava/util/TreeMap;
-Ljava/util/TreeMap$NavigableSubMap;->navigableKeySetView:Ljava/util/TreeMap$KeySet;
-Ljava/util/TreeMap$NavigableSubMap;->subCeiling(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->subFloor(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->subHigher(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->subHighest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->subLower(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->subLowest()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$NavigableSubMap;->toEnd:Z
-Ljava/util/TreeMap$NavigableSubMap;->tooHigh(Ljava/lang/Object;)Z
-Ljava/util/TreeMap$NavigableSubMap;->tooLow(Ljava/lang/Object;)Z
-Ljava/util/TreeMap$PrivateEntryIterator;->expectedModCount:I
-Ljava/util/TreeMap$PrivateEntryIterator;->lastReturned:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$PrivateEntryIterator;->next:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$PrivateEntryIterator;->nextEntry()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$PrivateEntryIterator;->prevEntry()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$SubMap;->fromKey:Ljava/lang/Object;
-Ljava/util/TreeMap$SubMap;->fromStart:Z
-Ljava/util/TreeMap$SubMap;->toEnd:Z
-Ljava/util/TreeMap$SubMap;->toKey:Ljava/lang/Object;
-Ljava/util/TreeMap$TreeMapEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/TreeMap$TreeMapEntry;)V
-Ljava/util/TreeMap$TreeMapEntry;->color:Z
-Ljava/util/TreeMap$TreeMapEntry;->key:Ljava/lang/Object;
-Ljava/util/TreeMap$TreeMapEntry;->left:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$TreeMapEntry;->parent:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$TreeMapEntry;->right:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$TreeMapEntry;->value:Ljava/lang/Object;
-Ljava/util/TreeMap$TreeMapSpliterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;III)V
-Ljava/util/TreeMap$TreeMapSpliterator;->current:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$TreeMapSpliterator;->est:I
-Ljava/util/TreeMap$TreeMapSpliterator;->estimateSize()J
-Ljava/util/TreeMap$TreeMapSpliterator;->expectedModCount:I
-Ljava/util/TreeMap$TreeMapSpliterator;->fence:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$TreeMapSpliterator;->getEstimate()I
-Ljava/util/TreeMap$TreeMapSpliterator;->side:I
-Ljava/util/TreeMap$TreeMapSpliterator;->tree:Ljava/util/TreeMap;
-Ljava/util/TreeMap$ValueSpliterator;-><init>(Ljava/util/TreeMap;Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;III)V
-Ljava/util/TreeMap$ValueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/TreeMap$ValueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/TreeMap;->addAllForTreeSet(Ljava/util/SortedSet;Ljava/lang/Object;)V
-Ljava/util/TreeMap;->BLACK:Z
-Ljava/util/TreeMap;->buildFromSorted(IIIILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->buildFromSorted(ILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)V
-Ljava/util/TreeMap;->colorOf(Ljava/util/TreeMap$TreeMapEntry;)Z
-Ljava/util/TreeMap;->comparator:Ljava/util/Comparator;
-Ljava/util/TreeMap;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-Ljava/util/TreeMap;->computeRedLevel(I)I
-Ljava/util/TreeMap;->deleteEntry(Ljava/util/TreeMap$TreeMapEntry;)V
-Ljava/util/TreeMap;->descendingKeyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap;->descendingKeySpliterator()Ljava/util/Spliterator;
-Ljava/util/TreeMap;->descendingMap:Ljava/util/NavigableMap;
-Ljava/util/TreeMap;->entrySet:Ljava/util/TreeMap$EntrySet;
-Ljava/util/TreeMap;->exportEntry(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/Map$Entry;
-Ljava/util/TreeMap;->fixAfterDeletion(Ljava/util/TreeMap$TreeMapEntry;)V
-Ljava/util/TreeMap;->fixAfterInsertion(Ljava/util/TreeMap$TreeMapEntry;)V
-Ljava/util/TreeMap;->getCeilingEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->getEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->getEntryUsingComparator(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->getFirstEntry()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->getFloorEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->getHigherEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->getLastEntry()Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->getLowerEntry(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->key(Ljava/util/TreeMap$TreeMapEntry;)Ljava/lang/Object;
-Ljava/util/TreeMap;->keyIterator()Ljava/util/Iterator;
-Ljava/util/TreeMap;->keyOrNull(Ljava/util/TreeMap$TreeMapEntry;)Ljava/lang/Object;
-Ljava/util/TreeMap;->keySpliterator()Ljava/util/Spliterator;
-Ljava/util/TreeMap;->keySpliteratorFor(Ljava/util/NavigableMap;)Ljava/util/Spliterator;
-Ljava/util/TreeMap;->leftOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->modCount:I
-Ljava/util/TreeMap;->navigableKeySet:Ljava/util/TreeMap$KeySet;
-Ljava/util/TreeMap;->parentOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->predecessor(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->readTreeSet(ILjava/io/ObjectInputStream;Ljava/lang/Object;)V
-Ljava/util/TreeMap;->RED:Z
-Ljava/util/TreeMap;->rightOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->root:Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->rotateLeft(Ljava/util/TreeMap$TreeMapEntry;)V
-Ljava/util/TreeMap;->rotateRight(Ljava/util/TreeMap$TreeMapEntry;)V
-Ljava/util/TreeMap;->setColor(Ljava/util/TreeMap$TreeMapEntry;Z)V
-Ljava/util/TreeMap;->size:I
-Ljava/util/TreeMap;->successor(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap;->UNBOUNDED:Ljava/lang/Object;
-Ljava/util/TreeMap;->valEquals(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/TreeSet;-><init>(Ljava/util/NavigableMap;)V
-Ljava/util/TreeSet;->m:Ljava/util/NavigableMap;
-Ljava/util/TreeSet;->PRESENT:Ljava/lang/Object;
-Ljava/util/UnknownFormatConversionException;->s:Ljava/lang/String;
-Ljava/util/UnknownFormatFlagsException;->flags:Ljava/lang/String;
-Ljava/util/UUID$Holder;-><init>()V
-Ljava/util/UUID$Holder;->numberGenerator:Ljava/security/SecureRandom;
-Ljava/util/UUID;-><init>([B)V
-Ljava/util/UUID;->digits(JI)Ljava/lang/String;
-Ljava/util/Vector$Itr;->checkForComodification()V
-Ljava/util/Vector$Itr;->cursor:I
-Ljava/util/Vector$Itr;->expectedModCount:I
-Ljava/util/Vector$Itr;->lastRet:I
-Ljava/util/Vector$Itr;->limit:I
-Ljava/util/Vector$VectorSpliterator;-><init>(Ljava/util/Vector;[Ljava/lang/Object;III)V
-Ljava/util/Vector$VectorSpliterator;->array:[Ljava/lang/Object;
-Ljava/util/Vector$VectorSpliterator;->expectedModCount:I
-Ljava/util/Vector$VectorSpliterator;->fence:I
-Ljava/util/Vector$VectorSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/Vector$VectorSpliterator;->getFence()I
-Ljava/util/Vector$VectorSpliterator;->index:I
-Ljava/util/Vector$VectorSpliterator;->list:Ljava/util/Vector;
-Ljava/util/Vector$VectorSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/Vector;->ensureCapacityHelper(I)V
-Ljava/util/Vector;->grow(I)V
-Ljava/util/Vector;->hugeCapacity(I)I
-Ljava/util/Vector;->MAX_ARRAY_SIZE:I
-Ljava/util/WeakHashMap$Entry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;ILjava/util/WeakHashMap$Entry;)V
-Ljava/util/WeakHashMap$Entry;->hash:I
-Ljava/util/WeakHashMap$Entry;->next:Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap$Entry;->value:Ljava/lang/Object;
-Ljava/util/WeakHashMap$EntrySet;->deepCopy()Ljava/util/List;
-Ljava/util/WeakHashMap$EntrySpliterator;-><init>(Ljava/util/WeakHashMap;IIII)V
-Ljava/util/WeakHashMap$EntrySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/WeakHashMap$EntrySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/WeakHashMap$HashIterator;->currentKey:Ljava/lang/Object;
-Ljava/util/WeakHashMap$HashIterator;->entry:Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap$HashIterator;->expectedModCount:I
-Ljava/util/WeakHashMap$HashIterator;->index:I
-Ljava/util/WeakHashMap$HashIterator;->lastReturned:Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap$HashIterator;->nextEntry()Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap$HashIterator;->nextKey:Ljava/lang/Object;
-Ljava/util/WeakHashMap$KeySpliterator;-><init>(Ljava/util/WeakHashMap;IIII)V
-Ljava/util/WeakHashMap$KeySpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/WeakHashMap$KeySpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/WeakHashMap$ValueSpliterator;-><init>(Ljava/util/WeakHashMap;IIII)V
-Ljava/util/WeakHashMap$ValueSpliterator;->forEachRemaining(Ljava/util/function/Consumer;)V
-Ljava/util/WeakHashMap$ValueSpliterator;->tryAdvance(Ljava/util/function/Consumer;)Z
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;-><init>(Ljava/util/WeakHashMap;IIII)V
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->current:Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->est:I
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->estimateSize()J
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->expectedModCount:I
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->fence:I
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->getFence()I
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->index:I
-Ljava/util/WeakHashMap$WeakHashMapSpliterator;->map:Ljava/util/WeakHashMap;
-Ljava/util/WeakHashMap;->containsNullValue()Z
-Ljava/util/WeakHashMap;->DEFAULT_INITIAL_CAPACITY:I
-Ljava/util/WeakHashMap;->DEFAULT_LOAD_FACTOR:F
-Ljava/util/WeakHashMap;->entrySet:Ljava/util/Set;
-Ljava/util/WeakHashMap;->eq(Ljava/lang/Object;Ljava/lang/Object;)Z
-Ljava/util/WeakHashMap;->expungeStaleEntries()V
-Ljava/util/WeakHashMap;->getEntry(Ljava/lang/Object;)Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap;->getTable()[Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap;->hash(Ljava/lang/Object;)I
-Ljava/util/WeakHashMap;->indexFor(II)I
-Ljava/util/WeakHashMap;->loadFactor:F
-Ljava/util/WeakHashMap;->maskNull(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/WeakHashMap;->MAXIMUM_CAPACITY:I
-Ljava/util/WeakHashMap;->modCount:I
-Ljava/util/WeakHashMap;->newTable(I)[Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap;->NULL_KEY:Ljava/lang/Object;
-Ljava/util/WeakHashMap;->queue:Ljava/lang/ref/ReferenceQueue;
-Ljava/util/WeakHashMap;->removeMapping(Ljava/lang/Object;)Z
-Ljava/util/WeakHashMap;->resize(I)V
-Ljava/util/WeakHashMap;->size:I
-Ljava/util/WeakHashMap;->table:[Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap;->threshold:I
-Ljava/util/WeakHashMap;->transfer([Ljava/util/WeakHashMap$Entry;[Ljava/util/WeakHashMap$Entry;)V
-Ljava/util/WeakHashMap;->unmaskNull(Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/util/zip/Adler32;->adler:I
-Ljava/util/zip/Adler32;->updateByteBuffer(IJII)I
-Ljava/util/zip/Adler32;->updateBytes(I[BII)I
-Ljava/util/zip/CheckedInputStream;->cksum:Ljava/util/zip/Checksum;
-Ljava/util/zip/CheckedOutputStream;->cksum:Ljava/util/zip/Checksum;
-Ljava/util/zip/CRC32;->crc:I
-Ljava/util/zip/CRC32;->updateByteBuffer(IJII)I
-Ljava/util/zip/CRC32;->updateBytes(I[BII)I
-Ljava/util/zip/Deflater;->bytesRead:J
-Ljava/util/zip/Deflater;->bytesWritten:J
-Ljava/util/zip/Deflater;->deflateBytes(J[BIII)I
-Ljava/util/zip/Deflater;->end(J)V
-Ljava/util/zip/Deflater;->ensureOpen()V
-Ljava/util/zip/Deflater;->getAdler(J)I
-Ljava/util/zip/Deflater;->guard:Ldalvik/system/CloseGuard;
-Ljava/util/zip/Deflater;->init(IIZ)J
-Ljava/util/zip/Deflater;->reset(J)V
-Ljava/util/zip/Deflater;->setDictionary(J[BII)V
-Ljava/util/zip/Deflater;->zsRef:Ljava/util/zip/ZStreamRef;
-Ljava/util/zip/DeflaterInputStream;->ensureOpen()V
-Ljava/util/zip/DeflaterInputStream;->rbuf:[B
-Ljava/util/zip/DeflaterInputStream;->reachEOF:Z
-Ljava/util/zip/DeflaterInputStream;->usesDefaultDeflater:Z
-Ljava/util/zip/DeflaterOutputStream;->closed:Z
-Ljava/util/zip/DeflaterOutputStream;->syncFlush:Z
-Ljava/util/zip/DeflaterOutputStream;->usesDefaultDeflater:Z
-Ljava/util/zip/GZIPInputStream;->closed:Z
-Ljava/util/zip/GZIPInputStream;->ensureOpen()V
-Ljava/util/zip/GZIPInputStream;->FCOMMENT:I
-Ljava/util/zip/GZIPInputStream;->FEXTRA:I
-Ljava/util/zip/GZIPInputStream;->FHCRC:I
-Ljava/util/zip/GZIPInputStream;->FNAME:I
-Ljava/util/zip/GZIPInputStream;->FTEXT:I
-Ljava/util/zip/GZIPInputStream;->readHeader(Ljava/io/InputStream;)I
-Ljava/util/zip/GZIPInputStream;->readTrailer()Z
-Ljava/util/zip/GZIPInputStream;->readUByte(Ljava/io/InputStream;)I
-Ljava/util/zip/GZIPInputStream;->readUInt(Ljava/io/InputStream;)J
-Ljava/util/zip/GZIPInputStream;->readUShort(Ljava/io/InputStream;)I
-Ljava/util/zip/GZIPInputStream;->skipBytes(Ljava/io/InputStream;I)V
-Ljava/util/zip/GZIPInputStream;->tmpbuf:[B
-Ljava/util/zip/GZIPOutputStream;->GZIP_MAGIC:I
-Ljava/util/zip/GZIPOutputStream;->TRAILER_SIZE:I
-Ljava/util/zip/GZIPOutputStream;->writeHeader()V
-Ljava/util/zip/GZIPOutputStream;->writeInt(I[BI)V
-Ljava/util/zip/GZIPOutputStream;->writeShort(I[BI)V
-Ljava/util/zip/GZIPOutputStream;->writeTrailer([BI)V
-Ljava/util/zip/Inflater;->bytesRead:J
-Ljava/util/zip/Inflater;->bytesWritten:J
-Ljava/util/zip/Inflater;->defaultBuf:[B
-Ljava/util/zip/Inflater;->end(J)V
-Ljava/util/zip/Inflater;->ended()Z
-Ljava/util/zip/Inflater;->ensureOpen()V
-Ljava/util/zip/Inflater;->getAdler(J)I
-Ljava/util/zip/Inflater;->guard:Ldalvik/system/CloseGuard;
-Ljava/util/zip/Inflater;->inflateBytes(J[BII)I
-Ljava/util/zip/Inflater;->init(Z)J
-Ljava/util/zip/Inflater;->reset(J)V
-Ljava/util/zip/Inflater;->setDictionary(J[BII)V
-Ljava/util/zip/Inflater;->zsRef:Ljava/util/zip/ZStreamRef;
-Ljava/util/zip/InflaterInputStream;->b:[B
-Ljava/util/zip/InflaterInputStream;->ensureOpen()V
-Ljava/util/zip/InflaterInputStream;->reachEOF:Z
-Ljava/util/zip/InflaterInputStream;->singleByteBuf:[B
-Ljava/util/zip/InflaterOutputStream;->closed:Z
-Ljava/util/zip/InflaterOutputStream;->ensureOpen()V
-Ljava/util/zip/InflaterOutputStream;->usesDefaultInflater:Z
-Ljava/util/zip/InflaterOutputStream;->wbuf:[B
-Ljava/util/zip/ZipCoder;-><init>(Ljava/nio/charset/Charset;)V
-Ljava/util/zip/ZipCoder;->cs:Ljava/nio/charset/Charset;
-Ljava/util/zip/ZipCoder;->dec:Ljava/nio/charset/CharsetDecoder;
-Ljava/util/zip/ZipCoder;->decoder()Ljava/nio/charset/CharsetDecoder;
-Ljava/util/zip/ZipCoder;->enc:Ljava/nio/charset/CharsetEncoder;
-Ljava/util/zip/ZipCoder;->encoder()Ljava/nio/charset/CharsetEncoder;
-Ljava/util/zip/ZipCoder;->get(Ljava/nio/charset/Charset;)Ljava/util/zip/ZipCoder;
-Ljava/util/zip/ZipCoder;->getBytes(Ljava/lang/String;)[B
-Ljava/util/zip/ZipCoder;->getBytesUTF8(Ljava/lang/String;)[B
-Ljava/util/zip/ZipCoder;->isUTF8()Z
-Ljava/util/zip/ZipCoder;->isUTF8:Z
-Ljava/util/zip/ZipCoder;->toString([B)Ljava/lang/String;
-Ljava/util/zip/ZipCoder;->toString([BI)Ljava/lang/String;
-Ljava/util/zip/ZipCoder;->toStringUTF8([BI)Ljava/lang/String;
-Ljava/util/zip/ZipCoder;->utf8:Ljava/util/zip/ZipCoder;
-Ljava/util/zip/ZipEntry;-><init>()V
-Ljava/util/zip/ZipEntry;->atime:Ljava/nio/file/attribute/FileTime;
-Ljava/util/zip/ZipEntry;->comment:Ljava/lang/String;
-Ljava/util/zip/ZipEntry;->crc:J
-Ljava/util/zip/ZipEntry;->csize:J
-Ljava/util/zip/ZipEntry;->ctime:Ljava/nio/file/attribute/FileTime;
-Ljava/util/zip/ZipEntry;->dataOffset:J
-Ljava/util/zip/ZipEntry;->DOSTIME_BEFORE_1980:J
-Ljava/util/zip/ZipEntry;->extra:[B
-Ljava/util/zip/ZipEntry;->flag:I
-Ljava/util/zip/ZipEntry;->getDataOffset()J
-Ljava/util/zip/ZipEntry;->mtime:Ljava/nio/file/attribute/FileTime;
-Ljava/util/zip/ZipEntry;->name:Ljava/lang/String;
-Ljava/util/zip/ZipEntry;->setExtra0([BZ)V
-Ljava/util/zip/ZipEntry;->size:J
-Ljava/util/zip/ZipEntry;->UPPER_DOSTIME_BOUND:J
-Ljava/util/zip/ZipEntry;->xdostime:J
-Ljava/util/zip/ZipFile$ZipEntryIterator;->i:I
-Ljava/util/zip/ZipFile$ZipFileInflaterInputStream;->closeRequested:Z
-Ljava/util/zip/ZipFile$ZipFileInflaterInputStream;->eof:Z
-Ljava/util/zip/ZipFile$ZipFileInflaterInputStream;->zfin:Ljava/util/zip/ZipFile$ZipFileInputStream;
-Ljava/util/zip/ZipFile$ZipFileInputStream;->jzentry:J
-Ljava/util/zip/ZipFile$ZipFileInputStream;->pos:J
-Ljava/util/zip/ZipFile$ZipFileInputStream;->rem:J
-Ljava/util/zip/ZipFile$ZipFileInputStream;->size()J
-Ljava/util/zip/ZipFile$ZipFileInputStream;->size:J
-Ljava/util/zip/ZipFile$ZipFileInputStream;->zfisCloseRequested:Z
-Ljava/util/zip/ZipFile;->closeRequested:Z
-Ljava/util/zip/ZipFile;->DEFLATED:I
-Ljava/util/zip/ZipFile;->ensureOpen()V
-Ljava/util/zip/ZipFile;->ensureOpenOrZipException()V
-Ljava/util/zip/ZipFile;->fileToRemoveOnClose:Ljava/io/File;
-Ljava/util/zip/ZipFile;->freeEntry(JJ)V
-Ljava/util/zip/ZipFile;->getCommentBytes(J)[B
-Ljava/util/zip/ZipFile;->getEntryBytes(JI)[B
-Ljava/util/zip/ZipFile;->getEntryCrc(J)J
-Ljava/util/zip/ZipFile;->getEntryCSize(J)J
-Ljava/util/zip/ZipFile;->getEntryFlag(J)I
-Ljava/util/zip/ZipFile;->getEntryMethod(J)I
-Ljava/util/zip/ZipFile;->getEntrySize(J)J
-Ljava/util/zip/ZipFile;->getEntryTime(J)J
-Ljava/util/zip/ZipFile;->getFileDescriptor()I
-Ljava/util/zip/ZipFile;->getFileDescriptor(J)I
-Ljava/util/zip/ZipFile;->getInflater()Ljava/util/zip/Inflater;
-Ljava/util/zip/ZipFile;->getNextEntry(JI)J
-Ljava/util/zip/ZipFile;->getTotal(J)I
-Ljava/util/zip/ZipFile;->getZipEntry(Ljava/lang/String;J)Ljava/util/zip/ZipEntry;
-Ljava/util/zip/ZipFile;->getZipMessage(J)Ljava/lang/String;
-Ljava/util/zip/ZipFile;->guard:Ldalvik/system/CloseGuard;
-Ljava/util/zip/ZipFile;->inflaterCache:Ljava/util/Deque;
-Ljava/util/zip/ZipFile;->JZENTRY_COMMENT:I
-Ljava/util/zip/ZipFile;->JZENTRY_EXTRA:I
-Ljava/util/zip/ZipFile;->JZENTRY_NAME:I
-Ljava/util/zip/ZipFile;->locsig:Z
-Ljava/util/zip/ZipFile;->name:Ljava/lang/String;
-Ljava/util/zip/ZipFile;->open(Ljava/lang/String;IJZ)J
-Ljava/util/zip/ZipFile;->read(JJJ[BII)I
-Ljava/util/zip/ZipFile;->releaseInflater(Ljava/util/zip/Inflater;)V
-Ljava/util/zip/ZipFile;->startsWithLOC(J)Z
-Ljava/util/zip/ZipFile;->startsWithLocHeader()Z
-Ljava/util/zip/ZipFile;->STORED:I
-Ljava/util/zip/ZipFile;->streams:Ljava/util/Map;
-Ljava/util/zip/ZipFile;->total:I
-Ljava/util/zip/ZipFile;->usemmap:Z
-Ljava/util/zip/ZipFile;->zc:Ljava/util/zip/ZipCoder;
-Ljava/util/zip/ZipInputStream;->b:[B
-Ljava/util/zip/ZipInputStream;->closed:Z
-Ljava/util/zip/ZipInputStream;->crc:Ljava/util/zip/CRC32;
-Ljava/util/zip/ZipInputStream;->DEFLATED:I
-Ljava/util/zip/ZipInputStream;->ensureOpen()V
-Ljava/util/zip/ZipInputStream;->entry:Ljava/util/zip/ZipEntry;
-Ljava/util/zip/ZipInputStream;->entryEOF:Z
-Ljava/util/zip/ZipInputStream;->readEnd(Ljava/util/zip/ZipEntry;)V
-Ljava/util/zip/ZipInputStream;->readFully([BII)V
-Ljava/util/zip/ZipInputStream;->readLOC()Ljava/util/zip/ZipEntry;
-Ljava/util/zip/ZipInputStream;->remaining:J
-Ljava/util/zip/ZipInputStream;->STORED:I
-Ljava/util/zip/ZipInputStream;->zc:Ljava/util/zip/ZipCoder;
-Ljava/util/zip/ZipOutputStream$XEntry;-><init>(Ljava/util/zip/ZipEntry;J)V
-Ljava/util/zip/ZipOutputStream$XEntry;->entry:Ljava/util/zip/ZipEntry;
-Ljava/util/zip/ZipOutputStream$XEntry;->offset:J
-Ljava/util/zip/ZipOutputStream;->closed:Z
-Ljava/util/zip/ZipOutputStream;->comment:[B
-Ljava/util/zip/ZipOutputStream;->crc:Ljava/util/zip/CRC32;
-Ljava/util/zip/ZipOutputStream;->current:Ljava/util/zip/ZipOutputStream$XEntry;
-Ljava/util/zip/ZipOutputStream;->ensureOpen()V
-Ljava/util/zip/ZipOutputStream;->finished:Z
-Ljava/util/zip/ZipOutputStream;->getExtraLen([B)I
-Ljava/util/zip/ZipOutputStream;->inhibitZip64:Z
-Ljava/util/zip/ZipOutputStream;->locoff:J
-Ljava/util/zip/ZipOutputStream;->version(Ljava/util/zip/ZipEntry;)I
-Ljava/util/zip/ZipOutputStream;->writeByte(I)V
-Ljava/util/zip/ZipOutputStream;->writeBytes([BII)V
-Ljava/util/zip/ZipOutputStream;->writeCEN(Ljava/util/zip/ZipOutputStream$XEntry;)V
-Ljava/util/zip/ZipOutputStream;->writeEND(JJ)V
-Ljava/util/zip/ZipOutputStream;->writeEXT(Ljava/util/zip/ZipEntry;)V
-Ljava/util/zip/ZipOutputStream;->writeExtra([B)V
-Ljava/util/zip/ZipOutputStream;->writeInt(J)V
-Ljava/util/zip/ZipOutputStream;->writeLOC(Ljava/util/zip/ZipOutputStream$XEntry;)V
-Ljava/util/zip/ZipOutputStream;->writeLong(J)V
-Ljava/util/zip/ZipOutputStream;->writeShort(I)V
-Ljava/util/zip/ZipOutputStream;->xentries:Ljava/util/Vector;
-Ljava/util/zip/ZipOutputStream;->zc:Ljava/util/zip/ZipCoder;
-Ljava/util/zip/ZStreamRef;-><init>(J)V
-Ljava/util/zip/ZStreamRef;->address()J
-Ljava/util/zip/ZStreamRef;->address:J
-Ljava/util/zip/ZStreamRef;->clear()V
-Ljavax/crypto/Cipher$CipherSpiAndProvider;-><init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;)V
-Ljavax/crypto/Cipher$CipherSpiAndProvider;->cipherSpi:Ljavax/crypto/CipherSpi;
-Ljavax/crypto/Cipher$CipherSpiAndProvider;->provider:Ljava/security/Provider;
-Ljavax/crypto/Cipher$InitParams;-><init>(Ljavax/crypto/Cipher$InitType;ILjava/security/Key;Ljava/security/SecureRandom;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/AlgorithmParameters;)V
-Ljavax/crypto/Cipher$InitParams;->initType:Ljavax/crypto/Cipher$InitType;
-Ljavax/crypto/Cipher$InitParams;->key:Ljava/security/Key;
-Ljavax/crypto/Cipher$InitParams;->opmode:I
-Ljavax/crypto/Cipher$InitParams;->params:Ljava/security/AlgorithmParameters;
-Ljavax/crypto/Cipher$InitParams;->random:Ljava/security/SecureRandom;
-Ljavax/crypto/Cipher$InitParams;->spec:Ljava/security/spec/AlgorithmParameterSpec;
-Ljavax/crypto/Cipher$InitType;->ALGORITHM_PARAMS:Ljavax/crypto/Cipher$InitType;
-Ljavax/crypto/Cipher$InitType;->ALGORITHM_PARAM_SPEC:Ljavax/crypto/Cipher$InitType;
-Ljavax/crypto/Cipher$InitType;->KEY:Ljavax/crypto/Cipher$InitType;
-Ljavax/crypto/Cipher$InitType;->valueOf(Ljava/lang/String;)Ljavax/crypto/Cipher$InitType;
-Ljavax/crypto/Cipher$InitType;->values()[Ljavax/crypto/Cipher$InitType;
-Ljavax/crypto/Cipher$NeedToSet;->BOTH:Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher$NeedToSet;->MODE:Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher$NeedToSet;->NONE:Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher$NeedToSet;->PADDING:Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher$NeedToSet;->valueOf(Ljava/lang/String;)Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher$NeedToSet;->values()[Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;->getCurrentSpi(Ljavax/crypto/CipherSpi;)Ljavax/crypto/CipherSpi;
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;->initSpiLock:Ljava/lang/Object;
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;->setCipherSpiImplAndProvider(Ljavax/crypto/CipherSpi;Ljava/security/Provider;)V
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;->specifiedProvider:Ljava/security/Provider;
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;->specifiedSpi:Ljavax/crypto/CipherSpi;
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;->updateAndGetSpiAndProvider(Ljavax/crypto/Cipher$InitParams;Ljavax/crypto/CipherSpi;Ljava/security/Provider;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
-Ljavax/crypto/Cipher$SpiAndProviderUpdater;->updateAndGetSpiAndProvider(Ljavax/crypto/CipherSpi;Ljava/security/Provider;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
-Ljavax/crypto/Cipher$Transform;-><init>(Ljava/lang/String;Ljavax/crypto/Cipher$NeedToSet;)V
-Ljavax/crypto/Cipher$Transform;->name:Ljava/lang/String;
-Ljavax/crypto/Cipher$Transform;->needToSet:Ljavax/crypto/Cipher$NeedToSet;
-Ljavax/crypto/Cipher;-><init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;Ljava/lang/String;[Ljava/lang/String;)V
-Ljavax/crypto/Cipher;->ATTRIBUTE_MODES:Ljava/lang/String;
-Ljavax/crypto/Cipher;->ATTRIBUTE_PADDINGS:Ljava/lang/String;
-Ljavax/crypto/Cipher;->checkCipherState()V
-Ljavax/crypto/Cipher;->checkOpmode(I)V
-Ljavax/crypto/Cipher;->chooseProvider(Ljavax/crypto/Cipher$InitType;ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V
-Ljavax/crypto/Cipher;->createCipher(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;
-Ljavax/crypto/Cipher;->exmech:Ljavax/crypto/ExemptionMechanism;
-Ljavax/crypto/Cipher;->getAlgorithmParameterSpec(Ljava/security/AlgorithmParameters;)Ljava/security/spec/AlgorithmParameterSpec;
-Ljavax/crypto/Cipher;->getCurrentSpi()Ljavax/crypto/CipherSpi;
-Ljavax/crypto/Cipher;->getOpmodeString(I)Ljava/lang/String;
-Ljavax/crypto/Cipher;->initialized:Z
-Ljavax/crypto/Cipher;->KEY_USAGE_EXTENSION_OID:Ljava/lang/String;
-Ljavax/crypto/Cipher;->matchAttribute(Ljava/security/Provider$Service;Ljava/lang/String;Ljava/lang/String;)Z
-Ljavax/crypto/Cipher;->opmode:I
-Ljavax/crypto/Cipher;->provider:Ljava/security/Provider;
-Ljavax/crypto/Cipher;->spi:Ljavax/crypto/CipherSpi;
-Ljavax/crypto/Cipher;->spiAndProviderUpdater:Ljavax/crypto/Cipher$SpiAndProviderUpdater;
-Ljavax/crypto/Cipher;->tokenizedTransformation:[Ljava/lang/String;
-Ljavax/crypto/Cipher;->tokenizeTransformation(Ljava/lang/String;)[Ljava/lang/String;
-Ljavax/crypto/Cipher;->transformation:Ljava/lang/String;
-Ljavax/crypto/Cipher;->tryCombinations(Ljavax/crypto/Cipher$InitParams;Ljava/security/Provider;[Ljava/lang/String;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
-Ljavax/crypto/Cipher;->tryTransformWithProvider(Ljavax/crypto/Cipher$InitParams;[Ljava/lang/String;Ljavax/crypto/Cipher$NeedToSet;Ljava/security/Provider$Service;)Ljavax/crypto/Cipher$CipherSpiAndProvider;
-Ljavax/crypto/Cipher;->updateProviderIfNeeded()V
-Ljavax/crypto/CipherInputStream;->cipher:Ljavax/crypto/Cipher;
-Ljavax/crypto/CipherInputStream;->closed:Z
-Ljavax/crypto/CipherInputStream;->done:Z
-Ljavax/crypto/CipherInputStream;->getMoreData()I
-Ljavax/crypto/CipherInputStream;->ibuffer:[B
-Ljavax/crypto/CipherInputStream;->input:Ljava/io/InputStream;
-Ljavax/crypto/CipherInputStream;->obuffer:[B
-Ljavax/crypto/CipherInputStream;->ofinish:I
-Ljavax/crypto/CipherInputStream;->ostart:I
-Ljavax/crypto/CipherOutputStream;->cipher:Ljavax/crypto/Cipher;
-Ljavax/crypto/CipherOutputStream;->closed:Z
-Ljavax/crypto/CipherOutputStream;->ibuffer:[B
-Ljavax/crypto/CipherOutputStream;->obuffer:[B
-Ljavax/crypto/CipherOutputStream;->output:Ljava/io/OutputStream;
-Ljavax/crypto/CipherSpi;->bufferCrypt(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;Z)I
-Ljavax/crypto/CipherSpi;->getTempArraySize(I)I
-Ljavax/crypto/EncryptedPrivateKeyInfo;->algid:Lsun/security/x509/AlgorithmId;
-Ljavax/crypto/EncryptedPrivateKeyInfo;->checkPKCS8Encoding([B)V
-Ljavax/crypto/EncryptedPrivateKeyInfo;->checkTag(Lsun/security/util/DerValue;BLjava/lang/String;)V
-Ljavax/crypto/EncryptedPrivateKeyInfo;->encoded:[B
-Ljavax/crypto/EncryptedPrivateKeyInfo;->encryptedData:[B
-Ljavax/crypto/EncryptedPrivateKeyInfo;->getKeySpecImpl(Ljava/security/Key;Ljava/security/Provider;)Ljava/security/spec/PKCS8EncodedKeySpec;
-Ljavax/crypto/ExemptionMechanism;->done:Z
-Ljavax/crypto/ExemptionMechanism;->exmechSpi:Ljavax/crypto/ExemptionMechanismSpi;
-Ljavax/crypto/ExemptionMechanism;->initialized:Z
-Ljavax/crypto/ExemptionMechanism;->keyStored:Ljava/security/Key;
-Ljavax/crypto/ExemptionMechanism;->mechanism:Ljava/lang/String;
-Ljavax/crypto/ExemptionMechanism;->provider:Ljava/security/Provider;
-Ljavax/crypto/KeyAgreement;-><init>(Ljava/lang/String;)V
-Ljavax/crypto/KeyAgreement;->algorithm:Ljava/lang/String;
-Ljavax/crypto/KeyAgreement;->chooseFirstProvider()V
-Ljavax/crypto/KeyAgreement;->chooseProvider(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-Ljavax/crypto/KeyAgreement;->implInit(Ljavax/crypto/KeyAgreementSpi;ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-Ljavax/crypto/KeyAgreement;->I_NO_PARAMS:I
-Ljavax/crypto/KeyAgreement;->I_PARAMS:I
-Ljavax/crypto/KeyAgreement;->lock:Ljava/lang/Object;
-Ljavax/crypto/KeyAgreement;->provider:Ljava/security/Provider;
-Ljavax/crypto/KeyAgreement;->spi:Ljavax/crypto/KeyAgreementSpi;
-Ljavax/crypto/KeyAgreement;->warnCount:I
-Ljavax/crypto/KeyGenerator;-><init>(Ljava/lang/String;)V
-Ljavax/crypto/KeyGenerator;->algorithm:Ljava/lang/String;
-Ljavax/crypto/KeyGenerator;->disableFailover()V
-Ljavax/crypto/KeyGenerator;->initKeySize:I
-Ljavax/crypto/KeyGenerator;->initParams:Ljava/security/spec/AlgorithmParameterSpec;
-Ljavax/crypto/KeyGenerator;->initRandom:Ljava/security/SecureRandom;
-Ljavax/crypto/KeyGenerator;->initType:I
-Ljavax/crypto/KeyGenerator;->I_NONE:I
-Ljavax/crypto/KeyGenerator;->I_PARAMS:I
-Ljavax/crypto/KeyGenerator;->I_RANDOM:I
-Ljavax/crypto/KeyGenerator;->I_SIZE:I
-Ljavax/crypto/KeyGenerator;->lock:Ljava/lang/Object;
-Ljavax/crypto/KeyGenerator;->nextSpi(Ljavax/crypto/KeyGeneratorSpi;Z)Ljavax/crypto/KeyGeneratorSpi;
-Ljavax/crypto/KeyGenerator;->provider:Ljava/security/Provider;
-Ljavax/crypto/KeyGenerator;->serviceIterator:Ljava/util/Iterator;
-Ljavax/crypto/KeyGenerator;->spi:Ljavax/crypto/KeyGeneratorSpi;
-Ljavax/crypto/Mac;-><init>(Ljava/lang/String;)V
-Ljavax/crypto/Mac;->algorithm:Ljava/lang/String;
-Ljavax/crypto/Mac;->chooseFirstProvider()V
-Ljavax/crypto/Mac;->chooseProvider(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V
-Ljavax/crypto/Mac;->getCurrentSpi()Ljavax/crypto/MacSpi;
-Ljavax/crypto/Mac;->initialized:Z
-Ljavax/crypto/Mac;->lock:Ljava/lang/Object;
-Ljavax/crypto/Mac;->provider:Ljava/security/Provider;
-Ljavax/crypto/Mac;->spi:Ljavax/crypto/MacSpi;
-Ljavax/crypto/Mac;->warnCount:I
-Ljavax/crypto/SealedObject;->encryptedContent:[B
-Ljavax/crypto/SealedObject;->paramsAlg:Ljava/lang/String;
-Ljavax/crypto/SealedObject;->sealAlg:Ljava/lang/String;
-Ljavax/crypto/SealedObject;->unseal(Ljava/security/Key;Ljava/lang/String;)Ljava/lang/Object;
-Ljavax/crypto/SecretKeyFactory;-><init>(Ljava/lang/String;)V
-Ljavax/crypto/SecretKeyFactory;->algorithm:Ljava/lang/String;
-Ljavax/crypto/SecretKeyFactory;->lock:Ljava/lang/Object;
-Ljavax/crypto/SecretKeyFactory;->nextSpi(Ljavax/crypto/SecretKeyFactorySpi;)Ljavax/crypto/SecretKeyFactorySpi;
-Ljavax/crypto/SecretKeyFactory;->provider:Ljava/security/Provider;
-Ljavax/crypto/SecretKeyFactory;->serviceIterator:Ljava/util/Iterator;
-Ljavax/crypto/SecretKeyFactory;->spi:Ljavax/crypto/SecretKeyFactorySpi;
-Ljavax/crypto/spec/DESedeKeySpec;->key:[B
-Ljavax/crypto/spec/DESKeySpec;->key:[B
-Ljavax/crypto/spec/DESKeySpec;->WEAK_KEYS:[[B
-Ljavax/crypto/spec/DHGenParameterSpec;->exponentSize:I
-Ljavax/crypto/spec/DHGenParameterSpec;->primeSize:I
-Ljavax/crypto/spec/DHParameterSpec;->g:Ljava/math/BigInteger;
-Ljavax/crypto/spec/DHParameterSpec;->l:I
-Ljavax/crypto/spec/DHParameterSpec;->p:Ljava/math/BigInteger;
-Ljavax/crypto/spec/DHPrivateKeySpec;->g:Ljava/math/BigInteger;
-Ljavax/crypto/spec/DHPrivateKeySpec;->p:Ljava/math/BigInteger;
-Ljavax/crypto/spec/DHPrivateKeySpec;->x:Ljava/math/BigInteger;
-Ljavax/crypto/spec/DHPublicKeySpec;->g:Ljava/math/BigInteger;
-Ljavax/crypto/spec/DHPublicKeySpec;->p:Ljava/math/BigInteger;
-Ljavax/crypto/spec/DHPublicKeySpec;->y:Ljava/math/BigInteger;
-Ljavax/crypto/spec/GCMParameterSpec;->init(I[BII)V
-Ljavax/crypto/spec/GCMParameterSpec;->iv:[B
-Ljavax/crypto/spec/GCMParameterSpec;->tLen:I
-Ljavax/crypto/spec/IvParameterSpec;->iv:[B
-Ljavax/crypto/spec/OAEPParameterSpec;-><init>()V
-Ljavax/crypto/spec/OAEPParameterSpec;->mdName:Ljava/lang/String;
-Ljavax/crypto/spec/OAEPParameterSpec;->mgfName:Ljava/lang/String;
-Ljavax/crypto/spec/OAEPParameterSpec;->mgfSpec:Ljava/security/spec/AlgorithmParameterSpec;
-Ljavax/crypto/spec/OAEPParameterSpec;->pSrc:Ljavax/crypto/spec/PSource;
-Ljavax/crypto/spec/PBEKeySpec;->iterationCount:I
-Ljavax/crypto/spec/PBEKeySpec;->keyLength:I
-Ljavax/crypto/spec/PBEKeySpec;->password:[C
-Ljavax/crypto/spec/PBEKeySpec;->salt:[B
-Ljavax/crypto/spec/PBEParameterSpec;->iterationCount:I
-Ljavax/crypto/spec/PBEParameterSpec;->paramSpec:Ljava/security/spec/AlgorithmParameterSpec;
-Ljavax/crypto/spec/PBEParameterSpec;->salt:[B
-Ljavax/crypto/spec/PSource$PSpecified;->p:[B
-Ljavax/crypto/spec/PSource;->pSrcName:Ljava/lang/String;
-Ljavax/crypto/spec/RC2ParameterSpec;->effectiveKeyBits:I
-Ljavax/crypto/spec/RC2ParameterSpec;->iv:[B
-Ljavax/crypto/spec/RC5ParameterSpec;->iv:[B
-Ljavax/crypto/spec/RC5ParameterSpec;->rounds:I
-Ljavax/crypto/spec/RC5ParameterSpec;->version:I
-Ljavax/crypto/spec/RC5ParameterSpec;->wordSize:I
-Ljavax/crypto/spec/SecretKeySpec;->algorithm:Ljava/lang/String;
-Ljavax/crypto/spec/SecretKeySpec;->key:[B
-Ljavax/microedition/khronos/egl/EGLContext;->EGL_INSTANCE:Ljavax/microedition/khronos/egl/EGL;
-Ljavax/net/ServerSocketFactory;->theFactory:Ljavax/net/ServerSocketFactory;
-Ljavax/net/SocketFactory;->setDefault(Ljavax/net/SocketFactory;)V
-Ljavax/net/SocketFactory;->theFactory:Ljavax/net/SocketFactory;
-Ljavax/net/ssl/CertPathTrustManagerParameters;->parameters:Ljava/security/cert/CertPathParameters;
-Ljavax/net/ssl/HandshakeCompletedEvent;->session:Ljavax/net/ssl/SSLSession;
-Ljavax/net/ssl/HttpsURLConnection$NoPreloadHolder;-><init>()V
-Ljavax/net/ssl/HttpsURLConnection$NoPreloadHolder;->defaultHostnameVerifier:Ljavax/net/ssl/HostnameVerifier;
-Ljavax/net/ssl/HttpsURLConnection$NoPreloadHolder;->originalDefaultHostnameVerifierClass:Ljava/lang/Class;
-Ljavax/net/ssl/HttpsURLConnection;->defaultSSLSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
-Ljavax/net/ssl/HttpsURLConnection;->sslSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
-Ljavax/net/ssl/KeyManagerFactory;->algorithm:Ljava/lang/String;
-Ljavax/net/ssl/KeyManagerFactory;->factorySpi:Ljavax/net/ssl/KeyManagerFactorySpi;
-Ljavax/net/ssl/KeyManagerFactory;->provider:Ljava/security/Provider;
-Ljavax/net/ssl/KeyStoreBuilderParameters;->parameters:Ljava/util/List;
-Ljavax/net/ssl/SNIHostName$SNIHostNameMatcher;-><init>(Ljava/lang/String;)V
-Ljavax/net/ssl/SNIHostName$SNIHostNameMatcher;->pattern:Ljava/util/regex/Pattern;
-Ljavax/net/ssl/SNIHostName;->checkHostName()V
-Ljavax/net/ssl/SNIHostName;->hostname:Ljava/lang/String;
-Ljavax/net/ssl/SNIMatcher;->type:I
-Ljavax/net/ssl/SNIServerName;->encoded:[B
-Ljavax/net/ssl/SNIServerName;->HEXES:[C
-Ljavax/net/ssl/SNIServerName;->toHexString([B)Ljava/lang/String;
-Ljavax/net/ssl/SNIServerName;->type:I
-Ljavax/net/ssl/SSLContext;->contextSpi:Ljavax/net/ssl/SSLContextSpi;
-Ljavax/net/ssl/SSLContext;->defaultContext:Ljavax/net/ssl/SSLContext;
-Ljavax/net/ssl/SSLContext;->protocol:Ljava/lang/String;
-Ljavax/net/ssl/SSLContext;->provider:Ljava/security/Provider;
-Ljavax/net/ssl/SSLContextSpi;->getDefaultSocket()Ljavax/net/ssl/SSLSocket;
-Ljavax/net/ssl/SSLEngine;->peerHost:Ljava/lang/String;
-Ljavax/net/ssl/SSLEngine;->peerPort:I
-Ljavax/net/ssl/SSLEngineResult;->bytesConsumed:I
-Ljavax/net/ssl/SSLEngineResult;->bytesProduced:I
-Ljavax/net/ssl/SSLEngineResult;->handshakeStatus:Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;
-Ljavax/net/ssl/SSLEngineResult;->status:Ljavax/net/ssl/SSLEngineResult$Status;
-Ljavax/net/ssl/SSLParameters;->algorithmConstraints:Ljava/security/AlgorithmConstraints;
-Ljavax/net/ssl/SSLParameters;->cipherSuites:[Ljava/lang/String;
-Ljavax/net/ssl/SSLParameters;->clone([Ljava/lang/String;)[Ljava/lang/String;
-Ljavax/net/ssl/SSLParameters;->identificationAlgorithm:Ljava/lang/String;
-Ljavax/net/ssl/SSLParameters;->needClientAuth:Z
-Ljavax/net/ssl/SSLParameters;->preferLocalCipherSuites:Z
-Ljavax/net/ssl/SSLParameters;->protocols:[Ljava/lang/String;
-Ljavax/net/ssl/SSLParameters;->sniMatchers:Ljava/util/Map;
-Ljavax/net/ssl/SSLParameters;->sniNames:Ljava/util/Map;
-Ljavax/net/ssl/SSLParameters;->wantClientAuth:Z
-Ljavax/net/ssl/SSLServerSocketFactory;->lastVersion:I
-Ljavax/net/ssl/SSLServerSocketFactory;->log(Ljava/lang/String;)V
-Ljavax/net/ssl/SSLSessionBindingEvent;->name:Ljava/lang/String;
-Ljavax/net/ssl/SSLSocketFactory;->DEBUG:Z
-Ljavax/net/ssl/SSLSocketFactory;->getSecurityProperty(Ljava/lang/String;)Ljava/lang/String;
-Ljavax/net/ssl/SSLSocketFactory;->lastVersion:I
-Ljavax/net/ssl/SSLSocketFactory;->log(Ljava/lang/String;)V
-Ljavax/net/ssl/StandardConstants;-><init>()V
-Ljavax/net/ssl/TrustManagerFactory;->algorithm:Ljava/lang/String;
-Ljavax/net/ssl/TrustManagerFactory;->factorySpi:Ljavax/net/ssl/TrustManagerFactorySpi;
-Ljavax/net/ssl/TrustManagerFactory;->provider:Ljava/security/Provider;
-Ljavax/security/auth/callback/PasswordCallback;->echoOn:Z
-Ljavax/security/auth/callback/PasswordCallback;->inputPassword:[C
-Ljavax/security/auth/callback/PasswordCallback;->prompt:Ljava/lang/String;
-Ljavax/security/auth/callback/UnsupportedCallbackException;->callback:Ljavax/security/auth/callback/Callback;
-Ljavax/security/auth/PrivateCredentialPermission;-><init>(Ljava/lang/String;Ljava/util/Set;)V
-Ljavax/security/auth/Subject$AuthPermissionHolder;-><init>()V
-Ljavax/security/auth/Subject$AuthPermissionHolder;->DO_AS_PERMISSION:Ljavax/security/auth/AuthPermission;
-Ljavax/security/auth/Subject$AuthPermissionHolder;->DO_AS_PRIVILEGED_PERMISSION:Ljavax/security/auth/AuthPermission;
-Ljavax/security/auth/Subject$AuthPermissionHolder;->GET_SUBJECT_PERMISSION:Ljavax/security/auth/AuthPermission;
-Ljavax/security/auth/Subject$AuthPermissionHolder;->MODIFY_PRINCIPALS_PERMISSION:Ljavax/security/auth/AuthPermission;
-Ljavax/security/auth/Subject$AuthPermissionHolder;->MODIFY_PRIVATE_CREDENTIALS_PERMISSION:Ljavax/security/auth/AuthPermission;
-Ljavax/security/auth/Subject$AuthPermissionHolder;->MODIFY_PUBLIC_CREDENTIALS_PERMISSION:Ljavax/security/auth/AuthPermission;
-Ljavax/security/auth/Subject$AuthPermissionHolder;->SET_READ_ONLY_PERMISSION:Ljavax/security/auth/AuthPermission;
-Ljavax/security/auth/Subject$ClassSet;->add(Ljava/lang/Object;)Z
-Ljavax/security/auth/Subject$ClassSet;->c:Ljava/lang/Class;
-Ljavax/security/auth/Subject$ClassSet;->populateSet()V
-Ljavax/security/auth/Subject$ClassSet;->set:Ljava/util/Set;
-Ljavax/security/auth/Subject$ClassSet;->which:I
-Ljavax/security/auth/Subject$SecureSet;-><init>(Ljavax/security/auth/Subject;I)V
-Ljavax/security/auth/Subject$SecureSet;-><init>(Ljavax/security/auth/Subject;ILjava/util/Set;)V
-Ljavax/security/auth/Subject$SecureSet;->elements:Ljava/util/LinkedList;
-Ljavax/security/auth/Subject$SecureSet;->subject:Ljavax/security/auth/Subject;
-Ljavax/security/auth/Subject$SecureSet;->which:I
-Ljavax/security/auth/Subject;->createContext(Ljavax/security/auth/Subject;Ljava/security/AccessControlContext;)Ljava/security/AccessControlContext;
-Ljavax/security/auth/Subject;->getCredHashCode(Ljava/lang/Object;)I
-Ljavax/security/auth/Subject;->NULL_PD_ARRAY:[Ljava/security/ProtectionDomain;
-Ljavax/security/auth/Subject;->principals:Ljava/util/Set;
-Ljavax/security/auth/Subject;->PRINCIPAL_SET:I
-Ljavax/security/auth/Subject;->privCredentials:Ljava/util/Set;
-Ljavax/security/auth/Subject;->PRIV_CREDENTIAL_SET:I
-Ljavax/security/auth/Subject;->pubCredentials:Ljava/util/Set;
-Ljavax/security/auth/Subject;->PUB_CREDENTIAL_SET:I
-Ljavax/security/auth/Subject;->readOnly:Z
-Ljavax/security/auth/Subject;->toString(Z)Ljava/lang/String;
-Ljavax/security/auth/x500/X500Principal;-><init>(Lsun/security/x509/X500Name;)V
-Ljavax/security/auth/x500/X500Principal;->thisX500Name:Lsun/security/x509/X500Name;
-Ljavax/security/cert/X509Certificate;->DEFAULT_X509_CERT_CLASS:Ljava/lang/String;
-Ljavax/security/cert/X509Certificate;->getInst(Ljava/lang/Object;)Ljavax/security/cert/X509Certificate;
-Ljavax/security/cert/X509Certificate;->X509Provider:Ljava/lang/String;
-Ljavax/security/cert/X509Certificate;->X509_PROVIDER:Ljava/lang/String;
-Ljavax/sql/ConnectionEvent;->ex:Ljava/sql/SQLException;
-Ljavax/sql/StatementEvent;->exception:Ljava/sql/SQLException;
-Ljavax/sql/StatementEvent;->statement:Ljava/sql/PreparedStatement;
-Ljavax/xml/datatype/DatatypeConfigurationException;->causeOnJDK13OrBelow:Ljava/lang/Throwable;
-Ljavax/xml/datatype/DatatypeConfigurationException;->initCauseByReflection(Ljava/lang/Throwable;)V
-Ljavax/xml/datatype/DatatypeConfigurationException;->isJDK14OrAbove:Z
-Ljavax/xml/datatype/DatatypeConfigurationException;->printStackTrace0(Ljava/io/PrintWriter;)V
-Ljavax/xml/datatype/DatatypeConstants$Field;-><init>(Ljava/lang/String;I)V
-Ljavax/xml/datatype/DatatypeConstants$Field;->id:I
-Ljavax/xml/datatype/DatatypeConstants$Field;->str:Ljava/lang/String;
-Ljavax/xml/datatype/DatatypeConstants;-><init>()V
-Ljavax/xml/datatype/Duration;->getCalendarTimeInMillis(Ljava/util/Calendar;)J
-Ljavax/xml/datatype/Duration;->getFieldValueAsInt(Ljavax/xml/datatype/DatatypeConstants$Field;)I
-Ljavax/xml/datatype/Duration;->toString(Ljava/math/BigDecimal;)Ljava/lang/String;
-Ljavax/xml/namespace/QName;->compatibilitySerialVersionUID:J
-Ljavax/xml/namespace/QName;->defaultSerialVersionUID:J
-Ljavax/xml/namespace/QName;->localPart:Ljava/lang/String;
-Ljavax/xml/namespace/QName;->namespaceURI:Ljava/lang/String;
-Ljavax/xml/namespace/QName;->prefix:Ljava/lang/String;
-Ljavax/xml/namespace/QName;->qNameAsString:Ljava/lang/String;
-Ljavax/xml/parsers/DocumentBuilder;->DEBUG:Z
-Ljavax/xml/parsers/DocumentBuilderFactory;->coalescing:Z
-Ljavax/xml/parsers/DocumentBuilderFactory;->expandEntityRef:Z
-Ljavax/xml/parsers/DocumentBuilderFactory;->ignoreComments:Z
-Ljavax/xml/parsers/DocumentBuilderFactory;->namespaceAware:Z
-Ljavax/xml/parsers/DocumentBuilderFactory;->validating:Z
-Ljavax/xml/parsers/DocumentBuilderFactory;->whitespace:Z
-Ljavax/xml/parsers/FactoryConfigurationError;->exception:Ljava/lang/Exception;
-Ljavax/xml/parsers/SAXParser;->DEBUG:Z
-Ljavax/xml/parsers/SAXParserFactory;->namespaceAware:Z
-Ljavax/xml/parsers/SAXParserFactory;->validating:Z
-Ljavax/xml/transform/dom/DOMResult;->nextSibling:Lorg/w3c/dom/Node;
-Ljavax/xml/transform/dom/DOMResult;->node:Lorg/w3c/dom/Node;
-Ljavax/xml/transform/dom/DOMResult;->systemId:Ljava/lang/String;
-Ljavax/xml/transform/dom/DOMSource;->node:Lorg/w3c/dom/Node;
-Ljavax/xml/transform/dom/DOMSource;->systemID:Ljava/lang/String;
-Ljavax/xml/transform/OutputKeys;-><init>()V
-Ljavax/xml/transform/sax/SAXResult;->handler:Lorg/xml/sax/ContentHandler;
-Ljavax/xml/transform/sax/SAXResult;->lexhandler:Lorg/xml/sax/ext/LexicalHandler;
-Ljavax/xml/transform/sax/SAXResult;->systemId:Ljava/lang/String;
-Ljavax/xml/transform/sax/SAXSource;->inputSource:Lorg/xml/sax/InputSource;
-Ljavax/xml/transform/sax/SAXSource;->reader:Lorg/xml/sax/XMLReader;
-Ljavax/xml/transform/stream/StreamResult;->outputStream:Ljava/io/OutputStream;
-Ljavax/xml/transform/stream/StreamResult;->systemId:Ljava/lang/String;
-Ljavax/xml/transform/stream/StreamResult;->writer:Ljava/io/Writer;
-Ljavax/xml/transform/stream/StreamSource;->inputStream:Ljava/io/InputStream;
-Ljavax/xml/transform/stream/StreamSource;->publicId:Ljava/lang/String;
-Ljavax/xml/transform/stream/StreamSource;->reader:Ljava/io/Reader;
-Ljavax/xml/transform/stream/StreamSource;->systemId:Ljava/lang/String;
-Ljavax/xml/transform/TransformerException;->containedException:Ljava/lang/Throwable;
-Ljavax/xml/transform/TransformerException;->locator:Ljavax/xml/transform/SourceLocator;
-Ljavax/xml/transform/TransformerFactoryConfigurationError;->exception:Ljava/lang/Exception;
-Ljavax/xml/XMLConstants;-><init>()V
-Ljavax/xml/xpath/XPathConstants;-><init>()V
-Ljavax/xml/xpath/XPathException;->cause:Ljava/lang/Throwable;
-Llibcore/util/BasicLruCache;->maxSize:I
-Llibcore/util/BasicLruCache;->trimToSize(I)V
-Llibcore/util/NativeAllocationRegistry$CleanerRunner;-><init>(Lsun/misc/Cleaner;)V
-Llibcore/util/NativeAllocationRegistry$CleanerRunner;->cleaner:Lsun/misc/Cleaner;
-Llibcore/util/NativeAllocationRegistry$CleanerThunk;->nativePtr:J
-Llibcore/util/NativeAllocationRegistry$CleanerThunk;->setNativePtr(J)V
-Llibcore/util/NativeAllocationRegistry;->classLoader:Ljava/lang/ClassLoader;
-Llibcore/util/NativeAllocationRegistry;->freeFunction:J
-Llibcore/util/NativeAllocationRegistry;->registerNativeAllocation(J)V
-Llibcore/util/NativeAllocationRegistry;->registerNativeFree(J)V
-Llibcore/util/NativeAllocationRegistry;->size:J
-Llibcore/util/ZoneInfo$CheckedArithmeticException;-><init>()V
-Llibcore/util/ZoneInfo$OffsetInterval;-><init>(IIII)V
-Llibcore/util/ZoneInfo$OffsetInterval;->containsWallTime(J)Z
-Llibcore/util/ZoneInfo$OffsetInterval;->create(Llibcore/util/ZoneInfo;I)Llibcore/util/ZoneInfo$OffsetInterval;
-Llibcore/util/ZoneInfo$OffsetInterval;->endWallTimeSeconds:I
-Llibcore/util/ZoneInfo$OffsetInterval;->getEndWallTimeSeconds()J
-Llibcore/util/ZoneInfo$OffsetInterval;->getIsDst()I
-Llibcore/util/ZoneInfo$OffsetInterval;->getStartWallTimeSeconds()J
-Llibcore/util/ZoneInfo$OffsetInterval;->getTotalOffsetSeconds()I
-Llibcore/util/ZoneInfo$OffsetInterval;->isDst:I
-Llibcore/util/ZoneInfo$OffsetInterval;->startWallTimeSeconds:I
-Llibcore/util/ZoneInfo$OffsetInterval;->totalOffsetSeconds:I
-Llibcore/util/ZoneInfo$WallTime;->calendar:Ljava/util/GregorianCalendar;
-Llibcore/util/ZoneInfo$WallTime;->copyFieldsFromCalendar()V
-Llibcore/util/ZoneInfo$WallTime;->copyFieldsToCalendar()V
-Llibcore/util/ZoneInfo$WallTime;->doWallTimeSearch(Llibcore/util/ZoneInfo;IIZ)Ljava/lang/Integer;
-Llibcore/util/ZoneInfo$WallTime;->getOffsetsOfType(Llibcore/util/ZoneInfo;II)[I
-Llibcore/util/ZoneInfo$WallTime;->gmtOffsetSeconds:I
-Llibcore/util/ZoneInfo$WallTime;->hour:I
-Llibcore/util/ZoneInfo$WallTime;->isDst:I
-Llibcore/util/ZoneInfo$WallTime;->minute:I
-Llibcore/util/ZoneInfo$WallTime;->month:I
-Llibcore/util/ZoneInfo$WallTime;->monthDay:I
-Llibcore/util/ZoneInfo$WallTime;->second:I
-Llibcore/util/ZoneInfo$WallTime;->tryOffsetAdjustments(Llibcore/util/ZoneInfo;ILlibcore/util/ZoneInfo$OffsetInterval;II)Ljava/lang/Integer;
-Llibcore/util/ZoneInfo$WallTime;->weekDay:I
-Llibcore/util/ZoneInfo$WallTime;->year:I
-Llibcore/util/ZoneInfo$WallTime;->yearDay:I
-Llibcore/util/ZoneInfo;-><init>(Ljava/lang/String;[J[B[I[BJ)V
-Llibcore/util/ZoneInfo;->checkedAdd(JI)I
-Llibcore/util/ZoneInfo;->checkedSubtract(II)I
-Llibcore/util/ZoneInfo;->findOffsetIndexForTimeInMilliseconds(J)I
-Llibcore/util/ZoneInfo;->findOffsetIndexForTimeInSeconds(J)I
-Llibcore/util/ZoneInfo;->LEAP:[I
-Llibcore/util/ZoneInfo;->mDstSavings:I
-Llibcore/util/ZoneInfo;->mEarliestRawOffset:I
-Llibcore/util/ZoneInfo;->MILLISECONDS_PER_400_YEARS:J
-Llibcore/util/ZoneInfo;->MILLISECONDS_PER_DAY:J
-Llibcore/util/ZoneInfo;->mIsDsts:[B
-Llibcore/util/ZoneInfo;->mOffsets:[I
-Llibcore/util/ZoneInfo;->mRawOffset:I
-Llibcore/util/ZoneInfo;->mTypes:[B
-Llibcore/util/ZoneInfo;->mUseDst:Z
-Llibcore/util/ZoneInfo;->NORMAL:[I
-Llibcore/util/ZoneInfo;->roundDownMillisToSeconds(J)J
-Llibcore/util/ZoneInfo;->roundUpMillisToSeconds(J)J
-Llibcore/util/ZoneInfo;->UNIX_OFFSET:J
 Lorg/apache/http/conn/ssl/AbstractVerifier;->IPV4_PATTERN:Ljava/util/regex/Pattern;
 Lorg/apache/http/conn/ssl/AbstractVerifier;->isIPv4Address(Ljava/lang/String;)Z
 Lorg/apache/http/conn/ssl/SSLSocketFactory$NoPreloadHolder;-><init>()V
@@ -112510,629 +94147,3 @@
 Lorg/apache/http/params/HttpConnectionParams;-><init>()V
 Lorg/ccil/cowan/tagsoup/AttributesImpl;->badIndex(I)V
 Lorg/ccil/cowan/tagsoup/AttributesImpl;->ensureCapacity(I)V
-Lorg/json/JSONArray;->checkedPut(Ljava/lang/Object;)V
-Lorg/json/JSONStringer$Scope;->DANGLING_KEY:Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer$Scope;->EMPTY_ARRAY:Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer$Scope;->EMPTY_OBJECT:Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer$Scope;->NONEMPTY_ARRAY:Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer$Scope;->NONEMPTY_OBJECT:Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer$Scope;->NULL:Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer$Scope;->valueOf(Ljava/lang/String;)Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONStringer$Scope;->values()[Lorg/json/JSONStringer$Scope;
-Lorg/w3c/dom/ls/LSSerializer;->getFilter()Lorg/w3c/dom/ls/LSSerializerFilter;
-Lorg/w3c/dom/ls/LSSerializer;->setFilter(Lorg/w3c/dom/ls/LSSerializerFilter;)V
-Lorg/w3c/dom/traversal/NodeFilter;->FILTER_ACCEPT:S
-Lorg/w3c/dom/traversal/NodeFilter;->FILTER_REJECT:S
-Lorg/w3c/dom/traversal/NodeFilter;->FILTER_SKIP:S
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_ALL:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_ATTRIBUTE:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_CDATA_SECTION:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_COMMENT:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_DOCUMENT:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_DOCUMENT_FRAGMENT:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_DOCUMENT_TYPE:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_ELEMENT:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_ENTITY:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_ENTITY_REFERENCE:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_NOTATION:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_PROCESSING_INSTRUCTION:I
-Lorg/w3c/dom/traversal/NodeFilter;->SHOW_TEXT:I
-Lorg/w3c/dom/traversal/NodeIterator;->getExpandEntityReferences()Z
-Lorg/w3c/dom/traversal/NodeIterator;->getFilter()Lorg/w3c/dom/traversal/NodeFilter;
-Lorg/w3c/dom/traversal/NodeIterator;->getRoot()Lorg/w3c/dom/Node;
-Lorg/w3c/dom/traversal/NodeIterator;->getWhatToShow()I
-Lorg/w3c/dom/traversal/NodeIterator;->previousNode()Lorg/w3c/dom/Node;
-Lorg/xml/sax/helpers/AttributeListImpl;->names:Ljava/util/ArrayList;
-Lorg/xml/sax/helpers/AttributeListImpl;->types:Ljava/util/ArrayList;
-Lorg/xml/sax/helpers/AttributeListImpl;->values:Ljava/util/ArrayList;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->attributeNameTable:Ljava/util/Hashtable;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->clear()V
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->copyTables()V
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->declarations:Ljava/util/ArrayList;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->declarePrefix(Ljava/lang/String;Ljava/lang/String;)V
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->declSeen:Z
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->declsOK:Z
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->defaultNS:Ljava/lang/String;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->elementNameTable:Ljava/util/Hashtable;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->getDeclaredPrefixes()Ljava/util/Enumeration;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->getPrefix(Ljava/lang/String;)Ljava/lang/String;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->getPrefixes()Ljava/util/Enumeration;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->getURI(Ljava/lang/String;)Ljava/lang/String;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->parent:Lorg/xml/sax/helpers/NamespaceSupport$Context;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->prefixTable:Ljava/util/Hashtable;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->processName(Ljava/lang/String;Z)[Ljava/lang/String;
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->setParent(Lorg/xml/sax/helpers/NamespaceSupport$Context;)V
-Lorg/xml/sax/helpers/NamespaceSupport$Context;->uriTable:Ljava/util/Hashtable;
-Lorg/xml/sax/helpers/ParserAdapter$AttributeListAdapter;->qAtts:Lorg/xml/sax/AttributeList;
-Lorg/xml/sax/helpers/ParserAdapter$AttributeListAdapter;->setAttributeList(Lorg/xml/sax/AttributeList;)V
-Lorg/xml/sax/helpers/ParserAdapter;->FEATURES:Ljava/lang/String;
-Lorg/xml/sax/helpers/ParserAdapter;->NAMESPACES:Ljava/lang/String;
-Lorg/xml/sax/helpers/ParserAdapter;->NAMESPACE_PREFIXES:Ljava/lang/String;
-Lorg/xml/sax/helpers/ParserAdapter;->XMLNS_URIs:Ljava/lang/String;
-Lorg/xml/sax/helpers/ParserFactory;-><init>()V
-Lorg/xml/sax/helpers/XMLReaderAdapter$AttributesAdapter;-><init>()V
-Lorg/xml/sax/helpers/XMLReaderAdapter$AttributesAdapter;->attributes:Lorg/xml/sax/Attributes;
-Lorg/xml/sax/helpers/XMLReaderAdapter$AttributesAdapter;->setAttributes(Lorg/xml/sax/Attributes;)V
-Lorg/xml/sax/helpers/XMLReaderFactory;-><init>()V
-Lorg/xml/sax/helpers/XMLReaderFactory;->property:Ljava/lang/String;
-Lorg/xmlpull/v1/XmlPullParserFactory;->getParserInstance()Lorg/xmlpull/v1/XmlPullParser;
-Lorg/xmlpull/v1/XmlPullParserFactory;->getSerializerInstance()Lorg/xmlpull/v1/XmlSerializer;
-Lorg/xmlpull/v1/XmlPullParserFactory;->newInstantiationException(Ljava/lang/String;Ljava/util/ArrayList;)Lorg/xmlpull/v1/XmlPullParserException;
-Lsun/misc/Cleaner;-><init>(Ljava/lang/Object;Ljava/lang/Runnable;)V
-Lsun/misc/Cleaner;->add(Lsun/misc/Cleaner;)Lsun/misc/Cleaner;
-Lsun/misc/Cleaner;->dummyQueue:Ljava/lang/ref/ReferenceQueue;
-Lsun/misc/Cleaner;->first:Lsun/misc/Cleaner;
-Lsun/misc/Cleaner;->next:Lsun/misc/Cleaner;
-Lsun/misc/Cleaner;->prev:Lsun/misc/Cleaner;
-Lsun/misc/Cleaner;->remove(Lsun/misc/Cleaner;)Z
-Lsun/misc/Cleaner;->thunk:Ljava/lang/Runnable;
-Lsun/misc/JarIndex;->addMapping(Ljava/lang/String;Ljava/lang/String;)V
-Lsun/misc/JarIndex;->addToList(Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)V
-Lsun/misc/JarIndex;->indexMap:Ljava/util/HashMap;
-Lsun/misc/JarIndex;->jarFiles:[Ljava/lang/String;
-Lsun/misc/JarIndex;->jarMap:Ljava/util/HashMap;
-Lsun/misc/JarIndex;->metaInfFilenames:Z
-Lsun/misc/JarIndex;->parseJars([Ljava/lang/String;)V
-Lsun/misc/LRUCache;->oa:[Ljava/lang/Object;
-Lsun/misc/LRUCache;->size:I
-Lsun/misc/MetaIndex;-><init>(Ljava/util/List;Z)V
-Lsun/misc/MetaIndex;->contents:[Ljava/lang/String;
-Lsun/misc/MetaIndex;->getJarMap()Ljava/util/Map;
-Lsun/misc/MetaIndex;->isClassOnlyJar:Z
-Lsun/misc/MetaIndex;->jarMap:Ljava/util/Map;
-Lsun/misc/Resource;->cachedInputStream()Ljava/io/InputStream;
-Lsun/misc/Resource;->cis:Ljava/io/InputStream;
-Lsun/misc/Unsafe;-><init>()V
-Lsun/misc/Unsafe;->getArrayBaseOffsetForComponentType(Ljava/lang/Class;)I
-Lsun/misc/Unsafe;->getArrayIndexScaleForComponentType(Ljava/lang/Class;)I
-Lsun/misc/URLClassPath$FileLoader;-><init>(Ljava/net/URL;)V
-Lsun/misc/URLClassPath$FileLoader;->dir:Ljava/io/File;
-Lsun/misc/URLClassPath$FileLoader;->findResource(Ljava/lang/String;Z)Ljava/net/URL;
-Lsun/misc/URLClassPath$FileLoader;->getResource(Ljava/lang/String;Z)Lsun/misc/Resource;
-Lsun/misc/URLClassPath$JarLoader;-><init>(Ljava/net/URL;Ljava/net/URLStreamHandler;Ljava/util/HashMap;Ljava/security/AccessControlContext;)V
-Lsun/misc/URLClassPath$JarLoader;->acc:Ljava/security/AccessControlContext;
-Lsun/misc/URLClassPath$JarLoader;->checkJar(Ljava/util/jar/JarFile;)Ljava/util/jar/JarFile;
-Lsun/misc/URLClassPath$JarLoader;->checkResource(Ljava/lang/String;ZLjava/util/jar/JarEntry;)Lsun/misc/Resource;
-Lsun/misc/URLClassPath$JarLoader;->closed:Z
-Lsun/misc/URLClassPath$JarLoader;->csu:Ljava/net/URL;
-Lsun/misc/URLClassPath$JarLoader;->ensureOpen()V
-Lsun/misc/URLClassPath$JarLoader;->findResource(Ljava/lang/String;Z)Ljava/net/URL;
-Lsun/misc/URLClassPath$JarLoader;->getClassPath()[Ljava/net/URL;
-Lsun/misc/URLClassPath$JarLoader;->getIndex()Lsun/misc/JarIndex;
-Lsun/misc/URLClassPath$JarLoader;->getJarFile(Ljava/net/URL;)Ljava/util/jar/JarFile;
-Lsun/misc/URLClassPath$JarLoader;->getResource(Ljava/lang/String;Z)Lsun/misc/Resource;
-Lsun/misc/URLClassPath$JarLoader;->getResource(Ljava/lang/String;ZLjava/util/Set;)Lsun/misc/Resource;
-Lsun/misc/URLClassPath$JarLoader;->handler:Ljava/net/URLStreamHandler;
-Lsun/misc/URLClassPath$JarLoader;->index:Lsun/misc/JarIndex;
-Lsun/misc/URLClassPath$JarLoader;->isOptimizable(Ljava/net/URL;)Z
-Lsun/misc/URLClassPath$JarLoader;->jar:Ljava/util/jar/JarFile;
-Lsun/misc/URLClassPath$JarLoader;->lmap:Ljava/util/HashMap;
-Lsun/misc/URLClassPath$JarLoader;->metaIndex:Lsun/misc/MetaIndex;
-Lsun/misc/URLClassPath$JarLoader;->parseClassPath(Ljava/net/URL;Ljava/lang/String;)[Ljava/net/URL;
-Lsun/misc/URLClassPath$JarLoader;->parseExtensionsDependencies()V
-Lsun/misc/URLClassPath$JarLoader;->validIndex(Ljava/lang/String;)Z
-Lsun/misc/URLClassPath$Loader;-><init>(Ljava/net/URL;)V
-Lsun/misc/URLClassPath$Loader;->base:Ljava/net/URL;
-Lsun/misc/URLClassPath$Loader;->findResource(Ljava/lang/String;Z)Ljava/net/URL;
-Lsun/misc/URLClassPath$Loader;->getBaseURL()Ljava/net/URL;
-Lsun/misc/URLClassPath$Loader;->getClassPath()[Ljava/net/URL;
-Lsun/misc/URLClassPath$Loader;->getResource(Ljava/lang/String;)Lsun/misc/Resource;
-Lsun/misc/URLClassPath$Loader;->getResource(Ljava/lang/String;Z)Lsun/misc/Resource;
-Lsun/misc/URLClassPath$Loader;->jarfile:Ljava/util/jar/JarFile;
-Lsun/misc/URLClassPath;->acc:Ljava/security/AccessControlContext;
-Lsun/misc/URLClassPath;->check(Ljava/net/URL;)V
-Lsun/misc/URLClassPath;->closed:Z
-Lsun/misc/URLClassPath;->DEBUG:Z
-Lsun/misc/URLClassPath;->DEBUG_LOOKUP_CACHE:Z
-Lsun/misc/URLClassPath;->disableAllLookupCaches()V
-Lsun/misc/URLClassPath;->DISABLE_ACC_CHECKING:Z
-Lsun/misc/URLClassPath;->DISABLE_JAR_CHECKING:Z
-Lsun/misc/URLClassPath;->ensureLoaderOpened(I)Z
-Lsun/misc/URLClassPath;->getLoader(I)Lsun/misc/URLClassPath$Loader;
-Lsun/misc/URLClassPath;->getLoader(Ljava/net/URL;)Lsun/misc/URLClassPath$Loader;
-Lsun/misc/URLClassPath;->getLookupCache(Ljava/lang/String;)[I
-Lsun/misc/URLClassPath;->getLookupCacheForClassLoader(Ljava/lang/ClassLoader;Ljava/lang/String;)[I
-Lsun/misc/URLClassPath;->getLookupCacheURLs(Ljava/lang/ClassLoader;)[Ljava/net/URL;
-Lsun/misc/URLClassPath;->getNextLoader([II)Lsun/misc/URLClassPath$Loader;
-Lsun/misc/URLClassPath;->initLookupCache(Ljava/lang/ClassLoader;)V
-Lsun/misc/URLClassPath;->jarHandler:Ljava/net/URLStreamHandler;
-Lsun/misc/URLClassPath;->JAVA_VERSION:Ljava/lang/String;
-Lsun/misc/URLClassPath;->knownToNotExist(Ljava/lang/String;)Z
-Lsun/misc/URLClassPath;->knownToNotExist0(Ljava/lang/ClassLoader;Ljava/lang/String;)Z
-Lsun/misc/URLClassPath;->lookupCacheEnabled:Z
-Lsun/misc/URLClassPath;->lookupCacheLoader:Ljava/lang/ClassLoader;
-Lsun/misc/URLClassPath;->lookupCacheURLs:[Ljava/net/URL;
-Lsun/misc/URLClassPath;->path:Ljava/util/ArrayList;
-Lsun/misc/URLClassPath;->push([Ljava/net/URL;)V
-Lsun/misc/URLClassPath;->USER_AGENT_JAVA_VERSION:Ljava/lang/String;
-Lsun/misc/URLClassPath;->validateLookupCache(ILjava/lang/String;)V
-Lsun/security/pkcs/ContentInfo;->content:Lsun/security/util/DerValue;
-Lsun/security/pkcs/ContentInfo;->contentType:Lsun/security/util/ObjectIdentifier;
-Lsun/security/pkcs/ContentInfo;->crdata:[I
-Lsun/security/pkcs/ContentInfo;->data:[I
-Lsun/security/pkcs/ContentInfo;->ddata:[I
-Lsun/security/pkcs/ContentInfo;->edata:[I
-Lsun/security/pkcs/ContentInfo;->nsdata:[I
-Lsun/security/pkcs/ContentInfo;->OLD_DATA:[I
-Lsun/security/pkcs/ContentInfo;->OLD_SDATA:[I
-Lsun/security/pkcs/ContentInfo;->pkcs7:[I
-Lsun/security/pkcs/ContentInfo;->sdata:[I
-Lsun/security/pkcs/ContentInfo;->sedata:[I
-Lsun/security/pkcs/ContentInfo;->tstInfo:[I
-Lsun/security/pkcs/PKCS7$VerbatimX509Certificate;-><init>(Ljava/security/cert/X509Certificate;[B)V
-Lsun/security/pkcs/PKCS7$VerbatimX509Certificate;->encodedVerbatim:[B
-Lsun/security/pkcs/PKCS7$WrappedX509Certificate;-><init>(Ljava/security/cert/X509Certificate;)V
-Lsun/security/pkcs/PKCS7$WrappedX509Certificate;->wrapped:Ljava/security/cert/X509Certificate;
-Lsun/security/pkcs/PKCS7;->certificates:[Ljava/security/cert/X509Certificate;
-Lsun/security/pkcs/PKCS7;->certIssuerNames:[Ljava/security/Principal;
-Lsun/security/pkcs/PKCS7;->contentInfo:Lsun/security/pkcs/ContentInfo;
-Lsun/security/pkcs/PKCS7;->contentType:Lsun/security/util/ObjectIdentifier;
-Lsun/security/pkcs/PKCS7;->crls:[Ljava/security/cert/X509CRL;
-Lsun/security/pkcs/PKCS7;->digestAlgorithmIds:[Lsun/security/x509/AlgorithmId;
-Lsun/security/pkcs/PKCS7;->oldStyle:Z
-Lsun/security/pkcs/PKCS7;->parse(Lsun/security/util/DerInputStream;)V
-Lsun/security/pkcs/PKCS7;->parse(Lsun/security/util/DerInputStream;Z)V
-Lsun/security/pkcs/PKCS7;->parseNetscapeCertChain(Lsun/security/util/DerValue;)V
-Lsun/security/pkcs/PKCS7;->parseOldSignedData(Lsun/security/util/DerValue;)V
-Lsun/security/pkcs/PKCS7;->parseSignedData(Lsun/security/util/DerValue;)V
-Lsun/security/pkcs/PKCS7;->populateCertIssuerNames()V
-Lsun/security/pkcs/PKCS7;->signerInfos:[Lsun/security/pkcs/SignerInfo;
-Lsun/security/pkcs/PKCS7;->version:Ljava/math/BigInteger;
-Lsun/security/pkcs/PKCS9Attribute;->BYTE_ARRAY_CLASS:Ljava/lang/Class;
-Lsun/security/pkcs/PKCS9Attribute;->debug:Lsun/security/util/Debug;
-Lsun/security/pkcs/PKCS9Attribute;->index:I
-Lsun/security/pkcs/PKCS9Attribute;->indexOf(Ljava/lang/Object;[Ljava/lang/Object;I)I
-Lsun/security/pkcs/PKCS9Attribute;->init(Lsun/security/util/ObjectIdentifier;Ljava/lang/Object;)V
-Lsun/security/pkcs/PKCS9Attribute;->NAME_OID_TABLE:Ljava/util/Hashtable;
-Lsun/security/pkcs/PKCS9Attribute;->oid:Lsun/security/util/ObjectIdentifier;
-Lsun/security/pkcs/PKCS9Attribute;->OID_NAME_TABLE:Ljava/util/Hashtable;
-Lsun/security/pkcs/PKCS9Attribute;->PKCS9_OIDS:[Lsun/security/util/ObjectIdentifier;
-Lsun/security/pkcs/PKCS9Attribute;->PKCS9_VALUE_TAGS:[[Ljava/lang/Byte;
-Lsun/security/pkcs/PKCS9Attribute;->RSA_PROPRIETARY_STR:Ljava/lang/String;
-Lsun/security/pkcs/PKCS9Attribute;->SINGLE_VALUED:[Z
-Lsun/security/pkcs/PKCS9Attribute;->SMIME_SIGNING_DESC_STR:Ljava/lang/String;
-Lsun/security/pkcs/PKCS9Attribute;->throwSingleValuedException()V
-Lsun/security/pkcs/PKCS9Attribute;->throwTagException(Ljava/lang/Byte;)V
-Lsun/security/pkcs/PKCS9Attribute;->value:Ljava/lang/Object;
-Lsun/security/pkcs/PKCS9Attribute;->VALUE_CLASSES:[Ljava/lang/Class;
-Lsun/security/pkcs/PKCS9Attributes;->attributes:Ljava/util/Hashtable;
-Lsun/security/pkcs/PKCS9Attributes;->castToDerEncoder([Ljava/lang/Object;)[Lsun/security/util/DerEncoder;
-Lsun/security/pkcs/PKCS9Attributes;->decode(Lsun/security/util/DerInputStream;)[B
-Lsun/security/pkcs/PKCS9Attributes;->derEncoding:[B
-Lsun/security/pkcs/PKCS9Attributes;->generateDerEncoding()[B
-Lsun/security/pkcs/PKCS9Attributes;->ignoreUnsupportedAttributes:Z
-Lsun/security/pkcs/PKCS9Attributes;->permittedAttributes:Ljava/util/Hashtable;
-Lsun/security/pkcs/SignerInfo;->authenticatedAttributes:Lsun/security/pkcs/PKCS9Attributes;
-Lsun/security/pkcs/SignerInfo;->certificateSerialNumber:Ljava/math/BigInteger;
-Lsun/security/pkcs/SignerInfo;->digestAlgorithmId:Lsun/security/x509/AlgorithmId;
-Lsun/security/pkcs/SignerInfo;->digestEncryptionAlgorithmId:Lsun/security/x509/AlgorithmId;
-Lsun/security/pkcs/SignerInfo;->DIGEST_PRIMITIVE_SET:Ljava/util/Set;
-Lsun/security/pkcs/SignerInfo;->encryptedDigest:[B
-Lsun/security/pkcs/SignerInfo;->hasTimestamp:Z
-Lsun/security/pkcs/SignerInfo;->issuerName:Lsun/security/x509/X500Name;
-Lsun/security/pkcs/SignerInfo;->JAR_DISABLED_CHECK:Lsun/security/util/DisabledAlgorithmConstraints;
-Lsun/security/pkcs/SignerInfo;->SIG_PRIMITIVE_SET:Ljava/util/Set;
-Lsun/security/pkcs/SignerInfo;->timestamp:Ljava/security/Timestamp;
-Lsun/security/pkcs/SignerInfo;->unauthenticatedAttributes:Lsun/security/pkcs/PKCS9Attributes;
-Lsun/security/pkcs/SignerInfo;->verify(Lsun/security/pkcs/PKCS7;)Lsun/security/pkcs/SignerInfo;
-Lsun/security/pkcs/SignerInfo;->verify(Lsun/security/pkcs/PKCS7;Ljava/io/InputStream;)Lsun/security/pkcs/SignerInfo;
-Lsun/security/pkcs/SignerInfo;->verify(Lsun/security/pkcs/PKCS7;[B)Lsun/security/pkcs/SignerInfo;
-Lsun/security/pkcs/SignerInfo;->verifyTimestamp(Lsun/security/timestamp/TimestampToken;)V
-Lsun/security/pkcs/SignerInfo;->version:Ljava/math/BigInteger;
-Lsun/security/util/AbstractAlgorithmConstraints;->checkAlgorithm([Ljava/lang/String;Ljava/lang/String;Lsun/security/util/AlgorithmDecomposer;)Z
-Lsun/security/util/AbstractAlgorithmConstraints;->getAlgorithms(Ljava/lang/String;)[Ljava/lang/String;
-Lsun/security/util/AlgorithmDecomposer;->decomposeImpl(Ljava/lang/String;)Ljava/util/Set;
-Lsun/security/util/AlgorithmDecomposer;->hasLoop(Ljava/util/Set;Ljava/lang/String;Ljava/lang/String;)V
-Lsun/security/util/AlgorithmDecomposer;->pattern:Ljava/util/regex/Pattern;
-Lsun/security/util/AlgorithmDecomposer;->transPattern:Ljava/util/regex/Pattern;
-Lsun/security/util/BitArray;-><init>(Lsun/security/util/BitArray;)V
-Lsun/security/util/BitArray;->BITS_PER_UNIT:I
-Lsun/security/util/BitArray;->BYTES_PER_LINE:I
-Lsun/security/util/BitArray;->length:I
-Lsun/security/util/BitArray;->NYBBLE:[[B
-Lsun/security/util/BitArray;->position(I)I
-Lsun/security/util/BitArray;->repn:[B
-Lsun/security/util/BitArray;->subscript(I)I
-Lsun/security/util/CertConstraintParameters;->cert:Ljava/security/cert/X509Certificate;
-Lsun/security/util/CertConstraintParameters;->trustedMatch:Z
-Lsun/security/util/Debug;->args:Ljava/lang/String;
-Lsun/security/util/Debug;->hexDigits:[C
-Lsun/security/util/Debug;->marshal(Ljava/lang/String;)Ljava/lang/String;
-Lsun/security/util/Debug;->prefix:Ljava/lang/String;
-Lsun/security/util/DerInputBuffer;-><init>([B)V
-Lsun/security/util/DerInputBuffer;-><init>([BII)V
-Lsun/security/util/DerInputBuffer;->dup()Lsun/security/util/DerInputBuffer;
-Lsun/security/util/DerInputBuffer;->equals(Lsun/security/util/DerInputBuffer;)Z
-Lsun/security/util/DerInputBuffer;->getBigInteger(IZ)Ljava/math/BigInteger;
-Lsun/security/util/DerInputBuffer;->getBitString()[B
-Lsun/security/util/DerInputBuffer;->getBitString(I)[B
-Lsun/security/util/DerInputBuffer;->getGeneralizedTime(I)Ljava/util/Date;
-Lsun/security/util/DerInputBuffer;->getInteger(I)I
-Lsun/security/util/DerInputBuffer;->getPos()I
-Lsun/security/util/DerInputBuffer;->getSlice(II)[B
-Lsun/security/util/DerInputBuffer;->getTime(IZ)Ljava/util/Date;
-Lsun/security/util/DerInputBuffer;->getUnalignedBitString()Lsun/security/util/BitArray;
-Lsun/security/util/DerInputBuffer;->getUTCTime(I)Ljava/util/Date;
-Lsun/security/util/DerInputBuffer;->peek()I
-Lsun/security/util/DerInputBuffer;->toByteArray()[B
-Lsun/security/util/DerInputBuffer;->truncate(I)V
-Lsun/security/util/DerInputStream;-><init>(Lsun/security/util/DerInputBuffer;)V
-Lsun/security/util/DerInputStream;->buffer:Lsun/security/util/DerInputBuffer;
-Lsun/security/util/DerInputStream;->getByte()I
-Lsun/security/util/DerInputStream;->getLength()I
-Lsun/security/util/DerInputStream;->getLength(ILjava/io/InputStream;)I
-Lsun/security/util/DerInputStream;->getLength(Ljava/io/InputStream;)I
-Lsun/security/util/DerInputStream;->init([BIIZ)V
-Lsun/security/util/DerInputStream;->readString(BLjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Lsun/security/util/DerOutputStream;->lexOrder:Lsun/security/util/ByteArrayLexOrder;
-Lsun/security/util/DerOutputStream;->putIntegerContents(I)V
-Lsun/security/util/DerOutputStream;->putOrderedSet(B[Lsun/security/util/DerEncoder;Ljava/util/Comparator;)V
-Lsun/security/util/DerOutputStream;->putTime(Ljava/util/Date;B)V
-Lsun/security/util/DerOutputStream;->tagOrder:Lsun/security/util/ByteArrayTagOrder;
-Lsun/security/util/DerOutputStream;->writeString(Ljava/lang/String;BLjava/lang/String;)V
-Lsun/security/util/DerValue;-><init>(Lsun/security/util/DerInputBuffer;Z)V
-Lsun/security/util/DerValue;->append([B[B)[B
-Lsun/security/util/DerValue;->doEquals(Lsun/security/util/DerValue;Lsun/security/util/DerValue;)Z
-Lsun/security/util/DerValue;->init(BLjava/lang/String;)Lsun/security/util/DerInputStream;
-Lsun/security/util/DerValue;->init(ZLjava/io/InputStream;)Lsun/security/util/DerInputStream;
-Lsun/security/util/DerValue;->isPrivate()Z
-Lsun/security/util/DerValue;->length:I
-Lsun/security/util/DerValue;->originalEncodedForm:[B
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->EQ:Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->GE:Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->GT:Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->LE:Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->LT:Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->NE:Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->of(Ljava/lang/String;)Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->valueOf(Ljava/lang/String;)Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;->values()[Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint;-><init>()V
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint;->algorithm:Ljava/lang/String;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint;->nextConstraint:Lsun/security/util/DisabledAlgorithmConstraints$Constraint;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint;->permits(Ljava/security/Key;)Z
-Lsun/security/util/DisabledAlgorithmConstraints$Constraint;->permits(Lsun/security/util/CertConstraintParameters;)V
-Lsun/security/util/DisabledAlgorithmConstraints$Constraints;-><init>([Ljava/lang/String;)V
-Lsun/security/util/DisabledAlgorithmConstraints$Constraints;->constraintsMap:Ljava/util/Map;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraints;->getConstraints(Ljava/lang/String;)Ljava/util/Set;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraints;->keySizePattern:Ljava/util/regex/Pattern;
-Lsun/security/util/DisabledAlgorithmConstraints$Constraints;->permits(Ljava/security/Key;)Z
-Lsun/security/util/DisabledAlgorithmConstraints$Constraints;->permits(Lsun/security/util/CertConstraintParameters;)V
-Lsun/security/util/DisabledAlgorithmConstraints$jdkCAConstraint;-><init>(Ljava/lang/String;)V
-Lsun/security/util/DisabledAlgorithmConstraints$jdkCAConstraint;->permits(Lsun/security/util/CertConstraintParameters;)V
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;-><init>(Ljava/lang/String;Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;I)V
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->maxSize:I
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->minSize:I
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->permits(Ljava/security/Key;)Z
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->permits(Lsun/security/util/CertConstraintParameters;)V
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->permitsImpl(Ljava/security/Key;)Z
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;->prohibitedSize:I
-Lsun/security/util/DisabledAlgorithmConstraints;->algorithmConstraints:Lsun/security/util/DisabledAlgorithmConstraints$Constraints;
-Lsun/security/util/DisabledAlgorithmConstraints;->checkConstraints(Ljava/util/Set;Ljava/lang/String;Ljava/security/Key;Ljava/security/AlgorithmParameters;)Z
-Lsun/security/util/DisabledAlgorithmConstraints;->checkConstraints(Ljava/util/Set;Lsun/security/util/CertConstraintParameters;)V
-Lsun/security/util/DisabledAlgorithmConstraints;->debug:Lsun/security/util/Debug;
-Lsun/security/util/DisabledAlgorithmConstraints;->disabledAlgorithms:[Ljava/lang/String;
-Lsun/security/util/ManifestDigester$Entry;->doOldStyle(Ljava/security/MessageDigest;[BII)V
-Lsun/security/util/ManifestDigester$Entry;->length:I
-Lsun/security/util/ManifestDigester$Entry;->lengthWithBlankLine:I
-Lsun/security/util/ManifestDigester$Entry;->offset:I
-Lsun/security/util/ManifestDigester$Entry;->oldStyle:Z
-Lsun/security/util/ManifestDigester$Entry;->rawBytes:[B
-Lsun/security/util/ManifestDigester$Position;-><init>()V
-Lsun/security/util/ManifestDigester$Position;->endOfFirstLine:I
-Lsun/security/util/ManifestDigester$Position;->endOfSection:I
-Lsun/security/util/ManifestDigester$Position;->startOfNext:I
-Lsun/security/util/ManifestDigester;->entries:Ljava/util/HashMap;
-Lsun/security/util/ManifestDigester;->findSection(ILsun/security/util/ManifestDigester$Position;)Z
-Lsun/security/util/ManifestDigester;->isNameAttr([BI)Z
-Lsun/security/util/ManifestDigester;->rawBytes:[B
-Lsun/security/util/ManifestEntryVerifier$SunProviderHolder;-><init>()V
-Lsun/security/util/ManifestEntryVerifier$SunProviderHolder;->instance:Ljava/security/Provider;
-Lsun/security/util/ManifestEntryVerifier;->createdDigests:Ljava/util/HashMap;
-Lsun/security/util/ManifestEntryVerifier;->debug:Lsun/security/util/Debug;
-Lsun/security/util/ManifestEntryVerifier;->digests:Ljava/util/ArrayList;
-Lsun/security/util/ManifestEntryVerifier;->entry:Ljava/util/jar/JarEntry;
-Lsun/security/util/ManifestEntryVerifier;->hexc:[C
-Lsun/security/util/ManifestEntryVerifier;->man:Ljava/util/jar/Manifest;
-Lsun/security/util/ManifestEntryVerifier;->manifestHashes:Ljava/util/ArrayList;
-Lsun/security/util/ManifestEntryVerifier;->name:Ljava/lang/String;
-Lsun/security/util/ManifestEntryVerifier;->signers:[Ljava/security/CodeSigner;
-Lsun/security/util/ManifestEntryVerifier;->skip:Z
-Lsun/security/util/ManifestEntryVerifier;->toHex([B)Ljava/lang/String;
-Lsun/security/util/ObjectIdentifier$HugeOidNotSupportedByOldJDK;-><init>()V
-Lsun/security/util/ObjectIdentifier$HugeOidNotSupportedByOldJDK;->theOne:Lsun/security/util/ObjectIdentifier$HugeOidNotSupportedByOldJDK;
-Lsun/security/util/ObjectIdentifier;-><init>(Lsun/security/util/DerInputBuffer;)V
-Lsun/security/util/ObjectIdentifier;->check([B)V
-Lsun/security/util/ObjectIdentifier;->checkCount(I)V
-Lsun/security/util/ObjectIdentifier;->checkFirstComponent(I)V
-Lsun/security/util/ObjectIdentifier;->checkFirstComponent(Ljava/math/BigInteger;)V
-Lsun/security/util/ObjectIdentifier;->checkOtherComponent(II)V
-Lsun/security/util/ObjectIdentifier;->checkOtherComponent(ILjava/math/BigInteger;)V
-Lsun/security/util/ObjectIdentifier;->checkSecondComponent(II)V
-Lsun/security/util/ObjectIdentifier;->checkSecondComponent(ILjava/math/BigInteger;)V
-Lsun/security/util/ObjectIdentifier;->componentLen:I
-Lsun/security/util/ObjectIdentifier;->components:Ljava/lang/Object;
-Lsun/security/util/ObjectIdentifier;->componentsCalculated:Z
-Lsun/security/util/ObjectIdentifier;->encode(Lsun/security/util/DerOutputStream;)V
-Lsun/security/util/ObjectIdentifier;->encoding:[B
-Lsun/security/util/ObjectIdentifier;->init([II)V
-Lsun/security/util/ObjectIdentifier;->pack([BIIII)[B
-Lsun/security/util/ObjectIdentifier;->pack7Oid(I[BI)I
-Lsun/security/util/ObjectIdentifier;->pack7Oid(Ljava/math/BigInteger;[BI)I
-Lsun/security/util/ObjectIdentifier;->pack7Oid([BII[BI)I
-Lsun/security/util/ObjectIdentifier;->pack8([BII[BI)I
-Lsun/security/util/ObjectIdentifier;->stringForm:Ljava/lang/String;
-Lsun/security/util/SignatureFileVerifier;->ATTR_DIGEST:Ljava/lang/String;
-Lsun/security/util/SignatureFileVerifier;->block:Lsun/security/pkcs/PKCS7;
-Lsun/security/util/SignatureFileVerifier;->certificateFactory:Ljava/security/cert/CertificateFactory;
-Lsun/security/util/SignatureFileVerifier;->contains([Ljava/security/CodeSigner;Ljava/security/CodeSigner;)Z
-Lsun/security/util/SignatureFileVerifier;->createdDigests:Ljava/util/HashMap;
-Lsun/security/util/SignatureFileVerifier;->debug:Lsun/security/util/Debug;
-Lsun/security/util/SignatureFileVerifier;->DIGEST_PRIMITIVE_SET:Ljava/util/Set;
-Lsun/security/util/SignatureFileVerifier;->getDigest(Ljava/lang/String;)Ljava/security/MessageDigest;
-Lsun/security/util/SignatureFileVerifier;->getSigners([Lsun/security/pkcs/SignerInfo;Lsun/security/pkcs/PKCS7;)[Ljava/security/CodeSigner;
-Lsun/security/util/SignatureFileVerifier;->hexc:[C
-Lsun/security/util/SignatureFileVerifier;->isSubSet([Ljava/security/CodeSigner;[Ljava/security/CodeSigner;)Z
-Lsun/security/util/SignatureFileVerifier;->JAR_DISABLED_CHECK:Lsun/security/util/DisabledAlgorithmConstraints;
-Lsun/security/util/SignatureFileVerifier;->matches([Ljava/security/CodeSigner;[Ljava/security/CodeSigner;[Ljava/security/CodeSigner;)Z
-Lsun/security/util/SignatureFileVerifier;->md:Lsun/security/util/ManifestDigester;
-Lsun/security/util/SignatureFileVerifier;->name:Ljava/lang/String;
-Lsun/security/util/SignatureFileVerifier;->processImpl(Ljava/util/Hashtable;Ljava/util/List;)V
-Lsun/security/util/SignatureFileVerifier;->sfBytes:[B
-Lsun/security/util/SignatureFileVerifier;->signerCache:Ljava/util/ArrayList;
-Lsun/security/util/SignatureFileVerifier;->toHex([B)Ljava/lang/String;
-Lsun/security/util/SignatureFileVerifier;->updateSigners([Ljava/security/CodeSigner;Ljava/util/Hashtable;Ljava/lang/String;)V
-Lsun/security/util/SignatureFileVerifier;->verifyManifestHash(Ljava/util/jar/Manifest;Lsun/security/util/ManifestDigester;Ljava/util/List;)Z
-Lsun/security/util/SignatureFileVerifier;->verifyManifestMainAttrs(Ljava/util/jar/Manifest;Lsun/security/util/ManifestDigester;)Z
-Lsun/security/util/SignatureFileVerifier;->verifySection(Ljava/util/jar/Attributes;Ljava/lang/String;Lsun/security/util/ManifestDigester;)Z
-Lsun/security/util/SignatureFileVerifier;->workaround:Z
-Lsun/security/x509/AlgorithmId;-><init>(Lsun/security/util/ObjectIdentifier;Lsun/security/util/DerValue;)V
-Lsun/security/x509/AlgorithmId;->algid:Lsun/security/util/ObjectIdentifier;
-Lsun/security/x509/AlgorithmId;->algOID(Ljava/lang/String;)Lsun/security/util/ObjectIdentifier;
-Lsun/security/x509/AlgorithmId;->algParams:Ljava/security/AlgorithmParameters;
-Lsun/security/x509/AlgorithmId;->constructedFromDer:Z
-Lsun/security/x509/AlgorithmId;->DH_data:[I
-Lsun/security/x509/AlgorithmId;->DH_PKIX_data:[I
-Lsun/security/x509/AlgorithmId;->dsaWithSHA1_PKIX_data:[I
-Lsun/security/x509/AlgorithmId;->DSA_OIW_data:[I
-Lsun/security/x509/AlgorithmId;->DSA_PKIX_data:[I
-Lsun/security/x509/AlgorithmId;->initOidTableVersion:I
-Lsun/security/x509/AlgorithmId;->md2WithRSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->md5WithRSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->nameTable:Ljava/util/Map;
-Lsun/security/x509/AlgorithmId;->oidTable:Ljava/util/Map;
-Lsun/security/x509/AlgorithmId;->reinitializeMappingTableLocked()V
-Lsun/security/x509/AlgorithmId;->RSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->RSA_data:[I
-Lsun/security/x509/AlgorithmId;->sha1WithDSA_OIW_data:[I
-Lsun/security/x509/AlgorithmId;->sha1WithRSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->sha1WithRSAEncryption_OIW_data:[I
-Lsun/security/x509/AlgorithmId;->sha224WithRSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->sha256WithRSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->sha384WithRSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->sha512WithRSAEncryption_data:[I
-Lsun/security/x509/AlgorithmId;->shaWithDSA_OIW_data:[I
-Lsun/security/x509/AVA;-><init>(Ljava/io/Reader;)V
-Lsun/security/x509/AVA;-><init>(Ljava/io/Reader;I)V
-Lsun/security/x509/AVA;-><init>(Ljava/io/Reader;ILjava/util/Map;)V
-Lsun/security/x509/AVA;-><init>(Ljava/io/Reader;Ljava/util/Map;)V
-Lsun/security/x509/AVA;-><init>(Lsun/security/util/DerInputStream;)V
-Lsun/security/x509/AVA;-><init>(Lsun/security/util/DerValue;)V
-Lsun/security/x509/AVA;->debug:Lsun/security/util/Debug;
-Lsun/security/x509/AVA;->DEFAULT:I
-Lsun/security/x509/AVA;->escapedDefault:Ljava/lang/String;
-Lsun/security/x509/AVA;->getEmbeddedHexPair(ILjava/io/Reader;)Ljava/lang/Byte;
-Lsun/security/x509/AVA;->getEmbeddedHexString(Ljava/util/List;)Ljava/lang/String;
-Lsun/security/x509/AVA;->hexDigits:Ljava/lang/String;
-Lsun/security/x509/AVA;->isDerString(Lsun/security/util/DerValue;Z)Z
-Lsun/security/x509/AVA;->isTerminator(II)Z
-Lsun/security/x509/AVA;->oid:Lsun/security/util/ObjectIdentifier;
-Lsun/security/x509/AVA;->parseHexString(Ljava/io/Reader;I)Lsun/security/util/DerValue;
-Lsun/security/x509/AVA;->parseQuotedString(Ljava/io/Reader;Ljava/lang/StringBuilder;)Lsun/security/util/DerValue;
-Lsun/security/x509/AVA;->parseString(Ljava/io/Reader;IILjava/lang/StringBuilder;)Lsun/security/util/DerValue;
-Lsun/security/x509/AVA;->PRESERVE_OLD_DC_ENCODING:Z
-Lsun/security/x509/AVA;->readChar(Ljava/io/Reader;Ljava/lang/String;)I
-Lsun/security/x509/AVA;->RFC1779:I
-Lsun/security/x509/AVA;->RFC2253:I
-Lsun/security/x509/AVA;->specialChars1779:Ljava/lang/String;
-Lsun/security/x509/AVA;->specialChars2253:Ljava/lang/String;
-Lsun/security/x509/AVA;->specialCharsDefault:Ljava/lang/String;
-Lsun/security/x509/AVA;->toKeyword(ILjava/util/Map;)Ljava/lang/String;
-Lsun/security/x509/AVA;->toKeywordValueString(Ljava/lang/String;)Ljava/lang/String;
-Lsun/security/x509/AVA;->trailingSpace(Ljava/io/Reader;)Z
-Lsun/security/x509/AVA;->value:Lsun/security/util/DerValue;
-Lsun/security/x509/CertificatePolicyId;->id:Lsun/security/util/ObjectIdentifier;
-Lsun/security/x509/CertificatePolicySet;->ids:Ljava/util/Vector;
-Lsun/security/x509/Extension;->hashMagic:I
-Lsun/security/x509/GeneralName;->name:Lsun/security/x509/GeneralNameInterface;
-Lsun/security/x509/GeneralSubtree;->maximum:I
-Lsun/security/x509/GeneralSubtree;->minimum:I
-Lsun/security/x509/GeneralSubtree;->MIN_DEFAULT:I
-Lsun/security/x509/GeneralSubtree;->myhash:I
-Lsun/security/x509/GeneralSubtree;->name:Lsun/security/x509/GeneralName;
-Lsun/security/x509/GeneralSubtree;->TAG_MAX:B
-Lsun/security/x509/GeneralSubtree;->TAG_MIN:B
-Lsun/security/x509/GeneralSubtrees;-><init>(Lsun/security/x509/GeneralSubtrees;)V
-Lsun/security/x509/GeneralSubtrees;->createWidestSubtree(Lsun/security/x509/GeneralNameInterface;)Lsun/security/x509/GeneralSubtree;
-Lsun/security/x509/GeneralSubtrees;->getGeneralNameInterface(I)Lsun/security/x509/GeneralNameInterface;
-Lsun/security/x509/GeneralSubtrees;->getGeneralNameInterface(Lsun/security/x509/GeneralSubtree;)Lsun/security/x509/GeneralNameInterface;
-Lsun/security/x509/GeneralSubtrees;->minimize()V
-Lsun/security/x509/GeneralSubtrees;->NAME_DIFF_TYPE:I
-Lsun/security/x509/GeneralSubtrees;->NAME_MATCH:I
-Lsun/security/x509/GeneralSubtrees;->NAME_NARROWS:I
-Lsun/security/x509/GeneralSubtrees;->NAME_SAME_TYPE:I
-Lsun/security/x509/GeneralSubtrees;->NAME_WIDENS:I
-Lsun/security/x509/GeneralSubtrees;->trees:Ljava/util/List;
-Lsun/security/x509/NameConstraintsExtension;->calcMinMax()V
-Lsun/security/x509/NameConstraintsExtension;->encodeThis()V
-Lsun/security/x509/NameConstraintsExtension;->excluded:Lsun/security/x509/GeneralSubtrees;
-Lsun/security/x509/NameConstraintsExtension;->hasMax:Z
-Lsun/security/x509/NameConstraintsExtension;->hasMin:Z
-Lsun/security/x509/NameConstraintsExtension;->minMaxValid:Z
-Lsun/security/x509/NameConstraintsExtension;->permitted:Lsun/security/x509/GeneralSubtrees;
-Lsun/security/x509/NameConstraintsExtension;->TAG_EXCLUDED:B
-Lsun/security/x509/NameConstraintsExtension;->TAG_PERMITTED:B
-Lsun/security/x509/RDN;-><init>(I)V
-Lsun/security/x509/RDN;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Lsun/security/x509/RDN;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
-Lsun/security/x509/RDN;-><init>(Lsun/security/util/DerValue;)V
-Lsun/security/x509/RDN;->assertion:[Lsun/security/x509/AVA;
-Lsun/security/x509/RDN;->avaList:Ljava/util/List;
-Lsun/security/x509/RDN;->canonicalString:Ljava/lang/String;
-Lsun/security/x509/RDN;->encode(Lsun/security/util/DerOutputStream;)V
-Lsun/security/x509/RDN;->findAttribute(Lsun/security/util/ObjectIdentifier;)Lsun/security/util/DerValue;
-Lsun/security/x509/RDN;->toRFC2253StringInternal(ZLjava/util/Map;)Ljava/lang/String;
-Lsun/security/x509/X500Name;->allAvaList:Ljava/util/List;
-Lsun/security/x509/X500Name;->canonicalDn:Ljava/lang/String;
-Lsun/security/x509/X500Name;->checkNoNewLinesNorTabsAtBeginningOfDN(Ljava/lang/String;)V
-Lsun/security/x509/X500Name;->commonName_data:[I
-Lsun/security/x509/X500Name;->countQuotes(Ljava/lang/String;II)I
-Lsun/security/x509/X500Name;->countryName_data:[I
-Lsun/security/x509/X500Name;->dn:Ljava/lang/String;
-Lsun/security/x509/X500Name;->DNQUALIFIER_DATA:[I
-Lsun/security/x509/X500Name;->DOMAIN_COMPONENT_DATA:[I
-Lsun/security/x509/X500Name;->encoded:[B
-Lsun/security/x509/X500Name;->escaped(IILjava/lang/String;)Z
-Lsun/security/x509/X500Name;->findAttribute(Lsun/security/util/ObjectIdentifier;)Lsun/security/util/DerValue;
-Lsun/security/x509/X500Name;->generateDN()V
-Lsun/security/x509/X500Name;->generateRFC1779DN(Ljava/util/Map;)Ljava/lang/String;
-Lsun/security/x509/X500Name;->generateRFC2253DN(Ljava/util/Map;)Ljava/lang/String;
-Lsun/security/x509/X500Name;->GENERATIONQUALIFIER_DATA:[I
-Lsun/security/x509/X500Name;->getString(Lsun/security/util/DerValue;)Ljava/lang/String;
-Lsun/security/x509/X500Name;->GIVENNAME_DATA:[I
-Lsun/security/x509/X500Name;->INITIALS_DATA:[I
-Lsun/security/x509/X500Name;->intern(Lsun/security/util/ObjectIdentifier;)Lsun/security/util/ObjectIdentifier;
-Lsun/security/x509/X500Name;->internedOIDs:Ljava/util/Map;
-Lsun/security/x509/X500Name;->ipAddress_data:[I
-Lsun/security/x509/X500Name;->isWithinSubtree(Lsun/security/x509/X500Name;)Z
-Lsun/security/x509/X500Name;->localityName_data:[I
-Lsun/security/x509/X500Name;->names:[Lsun/security/x509/RDN;
-Lsun/security/x509/X500Name;->orgName_data:[I
-Lsun/security/x509/X500Name;->orgUnitName_data:[I
-Lsun/security/x509/X500Name;->parseDER(Lsun/security/util/DerInputStream;)V
-Lsun/security/x509/X500Name;->parseDN(Ljava/lang/String;Ljava/util/Map;)V
-Lsun/security/x509/X500Name;->parseRFC2253DN(Ljava/lang/String;)V
-Lsun/security/x509/X500Name;->principalConstructor:Ljava/lang/reflect/Constructor;
-Lsun/security/x509/X500Name;->principalField:Ljava/lang/reflect/Field;
-Lsun/security/x509/X500Name;->rdnList:Ljava/util/List;
-Lsun/security/x509/X500Name;->rfc1779Dn:Ljava/lang/String;
-Lsun/security/x509/X500Name;->rfc2253Dn:Ljava/lang/String;
-Lsun/security/x509/X500Name;->SERIALNUMBER_DATA:[I
-Lsun/security/x509/X500Name;->stateName_data:[I
-Lsun/security/x509/X500Name;->streetAddress_data:[I
-Lsun/security/x509/X500Name;->SURNAME_DATA:[I
-Lsun/security/x509/X500Name;->title_data:[I
-Lsun/security/x509/X500Name;->userid_data:[I
-Lsun/security/x509/X500Name;->x500Principal:Ljavax/security/auth/x500/X500Principal;
-Lsun/util/locale/BaseLocale$Cache;-><init>()V
-Lsun/util/locale/BaseLocale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
-Lsun/util/locale/BaseLocale$Cache;->createObject(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale;
-Lsun/util/locale/BaseLocale$Cache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
-Lsun/util/locale/BaseLocale$Cache;->normalizeKey(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale$Key;
-Lsun/util/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Lsun/util/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Lsun/util/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
-Lsun/util/locale/BaseLocale$Key;->hash:I
-Lsun/util/locale/BaseLocale$Key;->lang:Ljava/lang/ref/SoftReference;
-Lsun/util/locale/BaseLocale$Key;->normalize(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale$Key;
-Lsun/util/locale/BaseLocale$Key;->normalized:Z
-Lsun/util/locale/BaseLocale$Key;->regn:Ljava/lang/ref/SoftReference;
-Lsun/util/locale/BaseLocale$Key;->scrt:Ljava/lang/ref/SoftReference;
-Lsun/util/locale/BaseLocale$Key;->vart:Ljava/lang/ref/SoftReference;
-Lsun/util/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-Lsun/util/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Lsun/util/locale/BaseLocale;->CACHE:Lsun/util/locale/BaseLocale$Cache;
-Lsun/util/locale/BaseLocale;->hash:I
-Lsun/util/locale/BaseLocale;->language:Ljava/lang/String;
-Lsun/util/locale/BaseLocale;->region:Ljava/lang/String;
-Lsun/util/locale/BaseLocale;->script:Ljava/lang/String;
-Lsun/util/locale/BaseLocale;->variant:Ljava/lang/String;
-Lsun/util/locale/Extension;-><init>(C)V
-Lsun/util/locale/Extension;-><init>(CLjava/lang/String;)V
-Lsun/util/locale/Extension;->getID()Ljava/lang/String;
-Lsun/util/locale/Extension;->getKey()C
-Lsun/util/locale/Extension;->getValue()Ljava/lang/String;
-Lsun/util/locale/Extension;->id:Ljava/lang/String;
-Lsun/util/locale/Extension;->key:C
-Lsun/util/locale/Extension;->setValue(Ljava/lang/String;)V
-Lsun/util/locale/Extension;->value:Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;-><init>(C)V
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;-><init>(Ljava/lang/String;)V
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;->ch:C
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;->lowerCh:C
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;->value()C
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveString;-><init>(Ljava/lang/String;)V
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveString;->lowerStr:Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveString;->str:Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveString;->value()Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder;->checkVariants(Ljava/lang/String;Ljava/lang/String;)I
-Lsun/util/locale/InternalLocaleBuilder;->extensions:Ljava/util/Map;
-Lsun/util/locale/InternalLocaleBuilder;->language:Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder;->PRIVATEUSE_KEY:Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;
-Lsun/util/locale/InternalLocaleBuilder;->region:Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder;->removePrivateuseVariant(Ljava/lang/String;)Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder;->script:Ljava/lang/String;
-Lsun/util/locale/InternalLocaleBuilder;->setExtensions(Ljava/util/List;Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-Lsun/util/locale/InternalLocaleBuilder;->setUnicodeLocaleExtension(Ljava/lang/String;)V
-Lsun/util/locale/InternalLocaleBuilder;->uattributes:Ljava/util/Set;
-Lsun/util/locale/InternalLocaleBuilder;->ukeywords:Ljava/util/Map;
-Lsun/util/locale/InternalLocaleBuilder;->variant:Ljava/lang/String;
-Lsun/util/locale/LanguageTag;-><init>()V
-Lsun/util/locale/LanguageTag;->extensions:Ljava/util/List;
-Lsun/util/locale/LanguageTag;->extlangs:Ljava/util/List;
-Lsun/util/locale/LanguageTag;->GRANDFATHERED:Ljava/util/Map;
-Lsun/util/locale/LanguageTag;->language:Ljava/lang/String;
-Lsun/util/locale/LanguageTag;->parseExtensions(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-Lsun/util/locale/LanguageTag;->parseExtlangs(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-Lsun/util/locale/LanguageTag;->parseLanguage(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-Lsun/util/locale/LanguageTag;->parsePrivateuse(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-Lsun/util/locale/LanguageTag;->parseRegion(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-Lsun/util/locale/LanguageTag;->parseScript(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-Lsun/util/locale/LanguageTag;->parseVariants(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
-Lsun/util/locale/LanguageTag;->privateuse:Ljava/lang/String;
-Lsun/util/locale/LanguageTag;->region:Ljava/lang/String;
-Lsun/util/locale/LanguageTag;->script:Ljava/lang/String;
-Lsun/util/locale/LanguageTag;->variants:Ljava/util/List;
-Lsun/util/locale/LocaleExtensions;-><init>(Ljava/lang/String;Ljava/lang/Character;Lsun/util/locale/Extension;)V
-Lsun/util/locale/LocaleExtensions;-><init>(Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V
-Lsun/util/locale/LocaleExtensions;->extensionMap:Ljava/util/Map;
-Lsun/util/locale/LocaleExtensions;->id:Ljava/lang/String;
-Lsun/util/locale/LocaleExtensions;->toID(Ljava/util/SortedMap;)Ljava/lang/String;
-Lsun/util/locale/LocaleObjectCache$CacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
-Lsun/util/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object;
-Lsun/util/locale/LocaleObjectCache$CacheEntry;->key:Ljava/lang/Object;
-Lsun/util/locale/LocaleObjectCache;->cleanStaleEntries()V
-Lsun/util/locale/LocaleObjectCache;->map:Ljava/util/concurrent/ConcurrentMap;
-Lsun/util/locale/LocaleObjectCache;->queue:Ljava/lang/ref/ReferenceQueue;
-Lsun/util/locale/LocaleSyntaxException;->index:I
-Lsun/util/locale/ParseStatus;->errorIndex:I
-Lsun/util/locale/ParseStatus;->errorMsg:Ljava/lang/String;
-Lsun/util/locale/ParseStatus;->parseLength:I
-Lsun/util/locale/StringTokenIterator;->delimiterChar:C
-Lsun/util/locale/StringTokenIterator;->dlms:Ljava/lang/String;
-Lsun/util/locale/StringTokenIterator;->done:Z
-Lsun/util/locale/StringTokenIterator;->end:I
-Lsun/util/locale/StringTokenIterator;->nextDelimiter(I)I
-Lsun/util/locale/StringTokenIterator;->start:I
-Lsun/util/locale/StringTokenIterator;->text:Ljava/lang/String;
-Lsun/util/locale/StringTokenIterator;->token:Ljava/lang/String;
diff --git a/boot/hiddenapi/hiddenapi-unsupported-packages.txt b/boot/hiddenapi/hiddenapi-unsupported-packages.txt
index 986d259..145f0c22 100644
--- a/boot/hiddenapi/hiddenapi-unsupported-packages.txt
+++ b/boot/hiddenapi/hiddenapi-unsupported-packages.txt
@@ -11,33 +11,5 @@
 gov.nist.javax.sip.parser.extensions
 gov.nist.javax.sip.parser.ims
 gov.nist.javax.sip.stack
-org.apache.xalan
-org.apache.xalan.extensions
-org.apache.xalan.processor
-org.apache.xalan.res
-org.apache.xalan.serialize
-org.apache.xalan.templates
-org.apache.xalan.transformer
-org.apache.xalan.xslt
-org.apache.xml.dtm
-org.apache.xml.dtm.ref
-org.apache.xml.dtm.ref.dom2dtm
-org.apache.xml.dtm.ref.sax2dtm
-org.apache.xml.res
-org.apache.xml.serializer
-org.apache.xml.serializer.dom3
-org.apache.xml.serializer.utils
-org.apache.xml.utils
-org.apache.xml.utils.res
-org.apache.xpath
-org.apache.xpath.axes
-org.apache.xpath.compiler
-org.apache.xpath.domapi
-org.apache.xpath.functions
-org.apache.xpath.jaxp
-org.apache.xpath.objects
-org.apache.xpath.operations
-org.apache.xpath.patterns
-org.apache.xpath.res
 org.ccil.cowan.tagsoup
 org.ccil.cowan.tagsoup.jaxp
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index be82b22..3109c5c 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -1210,9 +1210,12 @@
     return false;
 }
 
-bool BootAnimation::shouldStopPlayingPart(const Animation::Part& part, const int fadedFramesCount) {
+bool BootAnimation::shouldStopPlayingPart(const Animation::Part& part,
+                                          const int fadedFramesCount,
+                                          const int lastDisplayedProgress) {
     // stop playing only if it is time to exit and it's a partial part which has been faded out
-    return exitPending() && !part.playUntilComplete && fadedFramesCount >= part.framesToFadeCount;
+    return exitPending() && !part.playUntilComplete && fadedFramesCount >= part.framesToFadeCount &&
+        (lastDisplayedProgress == 0 || lastDisplayedProgress == 100);
 }
 
 bool BootAnimation::playAnimation(const Animation& animation) {
@@ -1239,7 +1242,7 @@
 
         // process the part not only while the count allows but also if already fading
         for (int r=0 ; !part.count || r<part.count || fadedFramesCount > 0 ; r++) {
-            if (shouldStopPlayingPart(part, fadedFramesCount)) break;
+            if (shouldStopPlayingPart(part, fadedFramesCount, lastDisplayedProgress)) break;
 
             mCallbacks->playPart(i, part, r);
 
@@ -1256,7 +1259,7 @@
                 (i == (pcount -1)) && currentProgress != 0;
 
             for (size_t j=0 ; j<fcount ; j++) {
-                if (shouldStopPlayingPart(part, fadedFramesCount)) break;
+                if (shouldStopPlayingPart(part, fadedFramesCount, lastDisplayedProgress)) break;
 
                 processDisplayEvents();
 
@@ -1355,6 +1358,10 @@
 
             if (exitPending() && !part.count && mCurrentInset >= mTargetInset &&
                 !part.hasFadingPhase()) {
+                if (lastDisplayedProgress != 0 && lastDisplayedProgress != 100) {
+                    android::base::SetProperty(PROGRESS_PROP_NAME, "100");
+                    continue;
+                }
                 break; // exit the infinite non-fading part when it has been played at least once
             }
         }
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 07432a2..f8a31c6 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -187,7 +187,8 @@
     void resizeSurface(int newWidth, int newHeight);
     void projectSceneToWindow();
 
-    bool shouldStopPlayingPart(const Animation::Part& part, int fadedFramesCount);
+    bool shouldStopPlayingPart(const Animation::Part& part, int fadedFramesCount,
+                               int lastDisplayedProgress);
     void checkExit();
 
     void handleViewport(nsecs_t timestep);
diff --git a/cmds/bootanimation/BootAnimationUtil.cpp b/cmds/bootanimation/BootAnimationUtil.cpp
index 1e417e9..4f56e5a 100644
--- a/cmds/bootanimation/BootAnimationUtil.cpp
+++ b/cmds/bootanimation/BootAnimationUtil.cpp
@@ -49,7 +49,14 @@
     }
 
     property_get("ro.boot.quiescent", value, "0");
-    return atoi(value) > 0;
+    if (atoi(value) > 0) {
+        // Only show the bootanimation for quiescent boots if this system property is set to enabled
+        if (!property_get_bool("ro.bootanim.quiescent.enabled", false)) {
+            return true;
+        }
+    }
+
+    return false;
 }
 
 void waitForSurfaceFlinger() {
diff --git a/cmds/dpm/Android.bp b/cmds/dpm/Android.bp
index 665abcd..6819d09 100644
--- a/cmds/dpm/Android.bp
+++ b/cmds/dpm/Android.bp
@@ -18,8 +18,7 @@
     ],
 }
 
-java_binary {
+sh_binary {
     name: "dpm",
-    wrapper: "dpm",
-    srcs: ["**/*.java"],
+    src: "dpm",
 }
diff --git a/cmds/dpm/dpm b/cmds/dpm/dpm
index e0efdc1..784db5b 100755
--- a/cmds/dpm/dpm
+++ b/cmds/dpm/dpm
@@ -1,7 +1,5 @@
 #!/system/bin/sh
 # Script to start "dpm" on the device
 #
-base=/system
-export CLASSPATH=$base/framework/dpm.jar
-exec app_process $base/bin com.android.commands.dpm.Dpm "$@"
+cmd device_policy "$@"
 
diff --git a/cmds/dpm/src/com/android/commands/dpm/Dpm.java b/cmds/dpm/src/com/android/commands/dpm/Dpm.java
deleted file mode 100644
index d0c2a24..0000000
--- a/cmds/dpm/src/com/android/commands/dpm/Dpm.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.commands.dpm;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.admin.DevicePolicyManager;
-import android.app.admin.IDevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-
-import com.android.internal.os.BaseCommand;
-
-import java.io.PrintStream;
-
-public final class Dpm extends BaseCommand {
-
-    /**
-     * Command-line entry point.
-     *
-     * @param args The command-line arguments
-     */
-    public static void main(String[] args) {
-      (new Dpm()).run(args);
-    }
-
-    private static final String COMMAND_SET_ACTIVE_ADMIN = "set-active-admin";
-    private static final String COMMAND_SET_DEVICE_OWNER = "set-device-owner";
-    private static final String COMMAND_SET_PROFILE_OWNER = "set-profile-owner";
-    private static final String COMMAND_REMOVE_ACTIVE_ADMIN = "remove-active-admin";
-    private static final String COMMAND_CLEAR_FREEZE_PERIOD_RECORD = "clear-freeze-period-record";
-    private static final String COMMAND_FORCE_NETWORK_LOGS = "force-network-logs";
-    private static final String COMMAND_FORCE_SECURITY_LOGS = "force-security-logs";
-    private static final String COMMAND_MARK_PO_ON_ORG_OWNED_DEVICE =
-            "mark-profile-owner-on-organization-owned-device";
-
-    private IDevicePolicyManager mDevicePolicyManager;
-    private int mUserId = UserHandle.USER_SYSTEM;
-    private String mName = "";
-    private ComponentName mComponent = null;
-
-    @Override
-    public void onShowUsage(PrintStream out) {
-        out.println(
-                "usage: dpm [subcommand] [options]\n" +
-                "usage: dpm set-active-admin [ --user <USER_ID> | current ] <COMPONENT>\n" +
-                // STOPSHIP Finalize it
-                "usage: dpm set-device-owner [ --user <USER_ID> | current *EXPERIMENTAL* ] " +
-                "[ --name <NAME> ] <COMPONENT>\n" +
-                "usage: dpm set-profile-owner [ --user <USER_ID> | current ] [ --name <NAME> ] " +
-                "<COMPONENT>\n" +
-                "usage: dpm remove-active-admin [ --user <USER_ID> | current ] [ --name <NAME> ] " +
-                "<COMPONENT>\n" +
-                "\n" +
-                "dpm set-active-admin: Sets the given component as active admin" +
-                " for an existing user.\n" +
-                "\n" +
-                "dpm set-device-owner: Sets the given component as active admin, and its" +
-                " package as device owner.\n" +
-                "\n" +
-                "dpm set-profile-owner: Sets the given component as active admin and profile" +
-                " owner for an existing user.\n" +
-                "\n" +
-                "dpm remove-active-admin: Disables an active admin, the admin must have declared" +
-                " android:testOnly in the application in its manifest. This will also remove" +
-                " device and profile owners.\n" +
-                "\n" +
-                "dpm " + COMMAND_CLEAR_FREEZE_PERIOD_RECORD + ": clears framework-maintained " +
-                "record of past freeze periods that the device went through. For use during " +
-                "feature development to prevent triggering restriction on setting freeze " +
-                "periods.\n" +
-                "\n" +
-                "dpm " + COMMAND_FORCE_NETWORK_LOGS + ": makes all network logs available to " +
-                "the DPC and triggers DeviceAdminReceiver.onNetworkLogsAvailable() if needed.\n" +
-                "\n" +
-                "dpm " + COMMAND_FORCE_SECURITY_LOGS + ": makes all security logs available to " +
-                "the DPC and triggers DeviceAdminReceiver.onSecurityLogsAvailable() if needed."
-                + "\n"
-                + "usage: dpm " + COMMAND_MARK_PO_ON_ORG_OWNED_DEVICE + ": "
-                + "[ --user <USER_ID> | current ] <COMPONENT>\n");
-    }
-
-    @Override
-    public void onRun() throws Exception {
-        mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface(
-                ServiceManager.getService(Context.DEVICE_POLICY_SERVICE));
-        if (mDevicePolicyManager == null) {
-            showError("Error: Could not access the Device Policy Manager. Is the system running?");
-            return;
-        }
-
-        String command = nextArgRequired();
-        switch (command) {
-            case COMMAND_SET_ACTIVE_ADMIN:
-                runSetActiveAdmin();
-                break;
-            case COMMAND_SET_DEVICE_OWNER:
-                runSetDeviceOwner();
-                break;
-            case COMMAND_SET_PROFILE_OWNER:
-                runSetProfileOwner();
-                break;
-            case COMMAND_REMOVE_ACTIVE_ADMIN:
-                runRemoveActiveAdmin();
-                break;
-            case COMMAND_CLEAR_FREEZE_PERIOD_RECORD:
-                runClearFreezePeriodRecord();
-                break;
-            case COMMAND_FORCE_NETWORK_LOGS:
-                runForceNetworkLogs();
-                break;
-            case COMMAND_FORCE_SECURITY_LOGS:
-                runForceSecurityLogs();
-                break;
-            case COMMAND_MARK_PO_ON_ORG_OWNED_DEVICE:
-                runMarkProfileOwnerOnOrganizationOwnedDevice();
-                break;
-            default:
-                throw new IllegalArgumentException ("unknown command '" + command + "'");
-        }
-    }
-
-    private void runForceNetworkLogs() throws RemoteException, InterruptedException {
-        while (true) {
-            final long toWait = mDevicePolicyManager.forceNetworkLogs();
-            if (toWait == 0) {
-                break;
-            }
-            System.out.println("We have to wait for " + toWait + " milliseconds...");
-            Thread.sleep(toWait);
-        }
-        System.out.println("Success");
-    }
-
-    private void runForceSecurityLogs() throws RemoteException, InterruptedException {
-        while (true) {
-            final long toWait = mDevicePolicyManager.forceSecurityLogs();
-            if (toWait == 0) {
-                break;
-            }
-            System.out.println("We have to wait for " + toWait + " milliseconds...");
-            Thread.sleep(toWait);
-        }
-        System.out.println("Success");
-    }
-
-    private void parseArgs(boolean canHaveName) {
-        String opt;
-        while ((opt = nextOption()) != null) {
-            if ("--user".equals(opt)) {
-                String arg = nextArgRequired();
-                if ("current".equals(arg) || "cur".equals(arg)) {
-                    mUserId = UserHandle.USER_CURRENT;
-                } else {
-                    mUserId = parseInt(arg);
-                }
-                if (mUserId == UserHandle.USER_CURRENT) {
-                    IActivityManager activityManager = ActivityManager.getService();
-                    try {
-                        mUserId = activityManager.getCurrentUser().id;
-                    } catch (RemoteException e) {
-                        e.rethrowAsRuntimeException();
-                    }
-                }
-            } else if (canHaveName && "--name".equals(opt)) {
-                mName = nextArgRequired();
-            } else {
-                throw new IllegalArgumentException("Unknown option: " + opt);
-            }
-        }
-        mComponent = parseComponentName(nextArgRequired());
-    }
-
-    private void runSetActiveAdmin() throws RemoteException {
-        parseArgs(/*canHaveName=*/ false);
-        mDevicePolicyManager.setActiveAdmin(mComponent, true /*refreshing*/, mUserId);
-
-        System.out.println("Success: Active admin set to component " + mComponent.toShortString());
-    }
-
-    private void runSetDeviceOwner() throws RemoteException {
-        parseArgs(/*canHaveName=*/ true);
-        mDevicePolicyManager.setActiveAdmin(mComponent, true /*refreshing*/, mUserId);
-
-        try {
-            if (!mDevicePolicyManager.setDeviceOwner(mComponent, mName, mUserId)) {
-                throw new RuntimeException(
-                        "Can't set package " + mComponent + " as device owner.");
-            }
-        } catch (Exception e) {
-            // Need to remove the admin that we just added.
-            mDevicePolicyManager.removeActiveAdmin(mComponent, UserHandle.USER_SYSTEM);
-            throw e;
-        }
-
-        mDevicePolicyManager.setUserProvisioningState(
-                DevicePolicyManager.STATE_USER_SETUP_FINALIZED, mUserId);
-
-        System.out.println("Success: Device owner set to package " + mComponent);
-        System.out.println("Active admin set to component " + mComponent.toShortString());
-    }
-
-    private void runRemoveActiveAdmin() throws RemoteException {
-        parseArgs(/*canHaveName=*/ false);
-        mDevicePolicyManager.forceRemoveActiveAdmin(mComponent, mUserId);
-        System.out.println("Success: Admin removed " + mComponent);
-    }
-
-    private void runSetProfileOwner() throws RemoteException {
-        parseArgs(/*canHaveName=*/ true);
-        mDevicePolicyManager.setActiveAdmin(mComponent, true /*refreshing*/, mUserId);
-
-        try {
-            if (!mDevicePolicyManager.setProfileOwner(mComponent, mName, mUserId)) {
-                throw new RuntimeException("Can't set component " + mComponent.toShortString() +
-                        " as profile owner for user " + mUserId);
-            }
-        } catch (Exception e) {
-            // Need to remove the admin that we just added.
-            mDevicePolicyManager.removeActiveAdmin(mComponent, mUserId);
-            throw e;
-        }
-
-        mDevicePolicyManager.setUserProvisioningState(
-                DevicePolicyManager.STATE_USER_SETUP_FINALIZED, mUserId);
-
-        System.out.println("Success: Active admin and profile owner set to "
-                + mComponent.toShortString() + " for user " + mUserId);
-    }
-
-    private void runClearFreezePeriodRecord() throws RemoteException {
-        mDevicePolicyManager.clearSystemUpdatePolicyFreezePeriodRecord();
-        System.out.println("Success");
-    }
-
-
-    private void runMarkProfileOwnerOnOrganizationOwnedDevice() throws RemoteException {
-        parseArgs(/*canHaveName=*/ false);
-        mDevicePolicyManager.markProfileOwnerOnOrganizationOwnedDevice(mComponent, mUserId);
-        System.out.println("Success");
-    }
-
-    private ComponentName parseComponentName(String component) {
-        ComponentName cn = ComponentName.unflattenFromString(component);
-        if (cn == null) {
-            throw new IllegalArgumentException ("Invalid component " + component);
-        }
-        return cn;
-    }
-
-    private int parseInt(String argument) {
-        try {
-            return Integer.parseInt(argument);
-        } catch (NumberFormatException e) {
-            throw new IllegalArgumentException ("Invalid integer argument '" + argument + "'", e);
-        }
-    }
-}
diff --git a/cmds/idmap2/idmap2d/aidl/services/android/os/OverlayablePolicy.aidl b/cmds/idmap2/idmap2d/aidl/services/android/os/OverlayablePolicy.aidl
index 403d8c5..a47b8416 100644
--- a/cmds/idmap2/idmap2d/aidl/services/android/os/OverlayablePolicy.aidl
+++ b/cmds/idmap2/idmap2d/aidl/services/android/os/OverlayablePolicy.aidl
@@ -20,14 +20,16 @@
  * @see ResourcesTypes.h ResTable_overlayable_policy_header::PolicyFlags
  * @hide
  */
-interface OverlayablePolicy {
-  const int PUBLIC = 0x00000001;
-  const int SYSTEM_PARTITION = 0x00000002;
-  const int VENDOR_PARTITION = 0x00000004;
-  const int PRODUCT_PARTITION = 0x00000008;
-  const int SIGNATURE = 0x00000010;
-  const int ODM_PARTITION = 0x00000020;
-  const int OEM_PARTITION = 0x00000040;
-  const int ACTOR_SIGNATURE = 0x00000080;
-  const int CONFIG_SIGNATURE = 0x0000100;
+@Backing(type="int")
+enum OverlayablePolicy {
+  NONE = 0x00000000,
+  PUBLIC = 0x00000001,
+  SYSTEM_PARTITION = 0x00000002,
+  VENDOR_PARTITION = 0x00000004,
+  PRODUCT_PARTITION = 0x00000008,
+  SIGNATURE = 0x00000010,
+  ODM_PARTITION = 0x00000020,
+  OEM_PARTITION = 0x00000040,
+  ACTOR_SIGNATURE = 0x00000080,
+  CONFIG_SIGNATURE = 0x0000100,
 }
diff --git a/cmds/locksettings/TEST_MAPPING b/cmds/locksettings/TEST_MAPPING
index c1cba5f..7a449ef 100644
--- a/cmds/locksettings/TEST_MAPPING
+++ b/cmds/locksettings/TEST_MAPPING
@@ -1,5 +1,5 @@
 {
-    "presubmit": [
+    "presubmit-large": [
         {
             "name": "CtsDevicePolicyManagerTestCases",
             "options": [
diff --git a/cmds/uiautomator/library/Android.bp b/cmds/uiautomator/library/Android.bp
index 469b452..cffc078 100644
--- a/cmds/uiautomator/library/Android.bp
+++ b/cmds/uiautomator/library/Android.bp
@@ -59,8 +59,8 @@
         "android.test.runner",
         "junit",
         "android.test.base",
-        "unsupportedappusage",
     ],
+    sdk_version: "current",
     installable: false,
     custom_template: "droiddoc-templates-sdk",
 }
diff --git a/core/api/current.txt b/core/api/current.txt
index 6889855..9806748 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -9,6 +9,7 @@
     ctor public Manifest.permission();
     field public static final String ACCEPT_HANDOVER = "android.permission.ACCEPT_HANDOVER";
     field public static final String ACCESS_BACKGROUND_LOCATION = "android.permission.ACCESS_BACKGROUND_LOCATION";
+    field public static final String ACCESS_BLOBS_ACROSS_USERS = "android.permission.ACCESS_BLOBS_ACROSS_USERS";
     field public static final String ACCESS_CHECKIN_PROPERTIES = "android.permission.ACCESS_CHECKIN_PROPERTIES";
     field public static final String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
     field public static final String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
@@ -4023,6 +4024,7 @@
     method public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
     method @Deprecated public void onPictureInPictureModeChanged(boolean);
     method public boolean onPictureInPictureRequested();
+    method public void onPictureInPictureUiStateChanged(@NonNull android.app.PictureInPictureUiState);
     method @CallSuper protected void onPostCreate(@Nullable android.os.Bundle);
     method public void onPostCreate(@Nullable android.os.Bundle, @Nullable android.os.PersistableBundle);
     method @CallSuper protected void onPostResume();
@@ -6415,6 +6417,13 @@
     method public android.app.PictureInPictureParams.Builder setSourceRectHint(android.graphics.Rect);
   }
 
+  public final class PictureInPictureUiState implements android.os.Parcelable {
+    method public int describeContents();
+    method public boolean isStashed();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.app.PictureInPictureUiState> CREATOR;
+  }
+
   public class Presentation extends android.app.Dialog {
     ctor public Presentation(android.content.Context, android.view.Display);
     ctor public Presentation(android.content.Context, android.view.Display, int);
@@ -8005,7 +8014,6 @@
     method @Nullable public String[] getTriggeredContentAuthorities();
     method @Nullable public android.net.Uri[] getTriggeredContentUris();
     method public boolean isExpeditedJob();
-    method @Deprecated public boolean isForegroundJob();
     method public boolean isOverrideDeadlineExpired();
     method public void writeToParcel(android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.app.job.JobParameters> CREATOR;
@@ -8625,7 +8633,7 @@
     method public android.bluetooth.le.BluetoothLeAdvertiser getBluetoothLeAdvertiser();
     method public android.bluetooth.le.BluetoothLeScanner getBluetoothLeScanner();
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public java.util.Set<android.bluetooth.BluetoothDevice> getBondedDevices();
-    method public static android.bluetooth.BluetoothAdapter getDefaultAdapter();
+    method @Deprecated public static android.bluetooth.BluetoothAdapter getDefaultAdapter();
     method public int getLeMaximumAdvertisingDataLength();
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public String getName();
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public int getProfileConnectionState(int);
@@ -9038,8 +9046,8 @@
     field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_CLASS_CHANGED = "android.bluetooth.device.action.CLASS_CHANGED";
     field @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN) public static final String ACTION_FOUND = "android.bluetooth.device.action.FOUND";
     field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_NAME_CHANGED = "android.bluetooth.device.action.NAME_CHANGED";
-    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN) public static final String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST";
-    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN) public static final String ACTION_UUID = "android.bluetooth.device.action.UUID";
+    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST";
+    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_UUID = "android.bluetooth.device.action.UUID";
     field public static final int ADDRESS_TYPE_PUBLIC = 0; // 0x0
     field public static final int ADDRESS_TYPE_RANDOM = 1; // 0x1
     field public static final int BOND_BONDED = 12; // 0xc
@@ -11263,7 +11271,6 @@
     field public static final String EXTRA_TIMEZONE = "time-zone";
     field public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
     field public static final String EXTRA_UID = "android.intent.extra.UID";
-    field public static final String EXTRA_UNSTARTABLE_REASON = "android.intent.extra.UNSTARTABLE_REASON";
     field public static final String EXTRA_USER = "android.intent.extra.USER";
     field public static final String EXTRA_USER_INITIATED = "android.intent.extra.USER_INITIATED";
     field public static final int FILL_IN_ACTION = 1; // 0x1
@@ -11863,6 +11870,7 @@
     field public static final int SCREEN_ORIENTATION_USER_LANDSCAPE = 11; // 0xb
     field public static final int SCREEN_ORIENTATION_USER_PORTRAIT = 12; // 0xc
     field public static final int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW = 1; // 0x1
+    field public String[] attributionTags;
     field public int colorMode;
     field public int configChanges;
     field public int documentLaunchMode;
@@ -12407,9 +12415,6 @@
     field public static final int STAGED_SESSION_NO_ERROR = 0; // 0x0
     field public static final int STAGED_SESSION_UNKNOWN = 3; // 0x3
     field public static final int STAGED_SESSION_VERIFICATION_FAILED = 1; // 0x1
-    field public static final int USER_ACTION_NOT_REQUIRED = 2; // 0x2
-    field public static final int USER_ACTION_REQUIRED = 1; // 0x1
-    field public static final int USER_ACTION_UNSPECIFIED = 0; // 0x0
   }
 
   public static class PackageInstaller.SessionParams implements android.os.Parcelable {
@@ -12426,7 +12431,7 @@
     method public void setOriginatingUid(int);
     method public void setOriginatingUri(@Nullable android.net.Uri);
     method public void setReferrerUri(@Nullable android.net.Uri);
-    method public void setRequireUserAction(boolean);
+    method public void setRequireUserAction(int);
     method public void setSize(long);
     method public void setWhitelistedRestrictedPermissions(@Nullable java.util.Set<java.lang.String>);
     method public void writeToParcel(android.os.Parcel, int);
@@ -12434,6 +12439,9 @@
     field public static final int MODE_FULL_INSTALL = 1; // 0x1
     field public static final int MODE_INHERIT_EXISTING = 2; // 0x2
     field @NonNull public static final java.util.Set<java.lang.String> RESTRICTED_PERMISSIONS_ALL;
+    field public static final int USER_ACTION_NOT_REQUIRED = 2; // 0x2
+    field public static final int USER_ACTION_REQUIRED = 1; // 0x1
+    field public static final int USER_ACTION_UNSPECIFIED = 0; // 0x0
   }
 
   public class PackageItemInfo {
@@ -17697,6 +17705,15 @@
     method public void onDynamicSensorDisconnected(android.hardware.Sensor);
   }
 
+  public final class SensorPrivacyManager {
+    method public boolean supportsSensorToggle(int);
+  }
+
+  public static class SensorPrivacyManager.Sensors {
+    field public static final int CAMERA = 2; // 0x2
+    field public static final int MICROPHONE = 1; // 0x1
+  }
+
   public final class TriggerEvent {
     field public android.hardware.Sensor sensor;
     field public long timestamp;
@@ -17715,9 +17732,7 @@
   public class BiometricManager {
     method @Deprecated @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public int canAuthenticate();
     method @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public int canAuthenticate(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public CharSequence getButtonLabel(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public CharSequence getPromptMessage(int);
-    method @Nullable @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public CharSequence getSettingName(int);
+    method @NonNull @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public android.hardware.biometrics.BiometricManager.Strings getStrings(int);
     field public static final int BIOMETRIC_ERROR_HW_UNAVAILABLE = 1; // 0x1
     field public static final int BIOMETRIC_ERROR_NONE_ENROLLED = 11; // 0xb
     field public static final int BIOMETRIC_ERROR_NO_HARDWARE = 12; // 0xc
@@ -17731,6 +17746,12 @@
     field public static final int DEVICE_CREDENTIAL = 32768; // 0x8000
   }
 
+  public static class BiometricManager.Strings {
+    method @Nullable @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public CharSequence getButtonLabel();
+    method @Nullable @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public CharSequence getPromptMessage();
+    method @Nullable @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public CharSequence getSettingName();
+  }
+
   public class BiometricPrompt {
     method @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public void authenticate(@NonNull android.hardware.biometrics.BiometricPrompt.CryptoObject, @NonNull android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
     method @RequiresPermission(android.Manifest.permission.USE_BIOMETRIC) public void authenticate(@NonNull android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
@@ -18025,6 +18046,7 @@
   }
 
   public final class CameraExtensionCharacteristics {
+    method @Nullable public android.util.Range<java.lang.Long> getEstimatedCaptureLatencyRangeMillis(int, @NonNull android.util.Size, int);
     method @NonNull public <T> java.util.List<android.util.Size> getExtensionSupportedSizes(int, @NonNull Class<T>);
     method @NonNull public java.util.List<android.util.Size> getExtensionSupportedSizes(int, int);
     method @NonNull public java.util.List<java.lang.Integer> getSupportedExtensions();
@@ -18941,22 +18963,27 @@
     method public int getType();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.Light> CREATOR;
-    field public static final int LIGHT_TYPE_INPUT_PLAYER_ID = 10; // 0xa
-    field public static final int LIGHT_TYPE_INPUT_RGB = 11; // 0xb
-    field public static final int LIGHT_TYPE_INPUT_SINGLE = 9; // 0x9
+    field public static final int LIGHT_TYPE_INPUT_PLAYER_ID = 10002; // 0x2712
+    field public static final int LIGHT_TYPE_INPUT_RGB = 10003; // 0x2713
+    field public static final int LIGHT_TYPE_INPUT_SINGLE = 10001; // 0x2711
     field public static final int LIGHT_TYPE_MICROPHONE = 8; // 0x8
   }
 
   public final class LightState implements android.os.Parcelable {
     method public int describeContents();
-    method @NonNull public static android.hardware.lights.LightState forColor(@ColorInt int);
-    method @NonNull public static android.hardware.lights.LightState forPlayerId(int);
     method @ColorInt public int getColor();
     method public int getPlayerId();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.LightState> CREATOR;
   }
 
+  public static final class LightState.Builder {
+    ctor public LightState.Builder();
+    method @NonNull public android.hardware.lights.LightState build();
+    method @NonNull public android.hardware.lights.LightState.Builder setColor(@ColorInt int);
+    method @NonNull public android.hardware.lights.LightState.Builder setPlayerId(int);
+  }
+
   public abstract class LightsManager {
     method @NonNull public abstract android.hardware.lights.LightState getLightState(@NonNull android.hardware.lights.Light);
     method @NonNull public abstract java.util.List<android.hardware.lights.Light> getLights();
@@ -18972,6 +18999,7 @@
   public final class LightsRequest {
     method @NonNull public java.util.List<android.hardware.lights.LightState> getLightStates();
     method @NonNull public java.util.List<java.lang.Integer> getLights();
+    method @NonNull public java.util.Map<java.lang.Integer,android.hardware.lights.LightState> getLightsAndStates();
   }
 
   public static final class LightsRequest.Builder {
@@ -19292,7 +19320,7 @@
     method public void appPrivateCommand(String, android.os.Bundle);
     method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
     method public void finishInput();
-    method public void toggleSoftInput(int, int);
+    method @Deprecated public void toggleSoftInput(int, int);
     method public void updateCursor(android.graphics.Rect);
     method public void updateCursorAnchorInfo(android.view.inputmethod.CursorAnchorInfo);
     method public void updateExtractedText(int, android.view.inputmethod.ExtractedText);
@@ -20309,6 +20337,7 @@
     field public static final int ENCODING_DEFAULT = 1; // 0x1
     field public static final int ENCODING_DOLBY_MAT = 19; // 0x13
     field public static final int ENCODING_DOLBY_TRUEHD = 14; // 0xe
+    field public static final int ENCODING_DRA = 28; // 0x1c
     field public static final int ENCODING_DTS = 7; // 0x7
     field public static final int ENCODING_DTS_HD = 8; // 0x8
     field public static final int ENCODING_DTS_UHD = 27; // 0x1b
@@ -20344,6 +20373,7 @@
     method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
     method public int abandonAudioFocusRequest(@NonNull android.media.AudioFocusRequest);
     method public void addOnCommunicationDeviceChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnCommunicationDeviceChangedListener);
+    method public void addOnModeChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnModeChangedListener);
     method public void adjustStreamVolume(int, int, int);
     method public void adjustSuggestedStreamVolume(int, int, int);
     method public void adjustVolume(int, int);
@@ -20394,6 +20424,7 @@
     method @Deprecated public void registerRemoteControlClient(android.media.RemoteControlClient);
     method @Deprecated public boolean registerRemoteController(android.media.RemoteController);
     method public void removeOnCommunicationDeviceChangedListener(@NonNull android.media.AudioManager.OnCommunicationDeviceChangedListener);
+    method public void removeOnModeChangedListener(@NonNull android.media.AudioManager.OnModeChangedListener);
     method @Deprecated public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
     method public int requestAudioFocus(@NonNull android.media.AudioFocusRequest);
     method public void setAllowedCapturePolicy(int);
@@ -20549,6 +20580,10 @@
     method public void onCommunicationDeviceChanged(@Nullable android.media.AudioDeviceInfo);
   }
 
+  public static interface AudioManager.OnModeChangedListener {
+    method public void onModeChanged(int);
+  }
+
   public final class AudioMetadata {
     method @NonNull public static android.media.AudioMetadataMap createMap();
   }
@@ -20944,8 +20979,8 @@
   }
 
   public class CamcorderProfile {
-    method public static android.media.CamcorderProfile get(int);
-    method public static android.media.CamcorderProfile get(int, int);
+    method @Deprecated public static android.media.CamcorderProfile get(int);
+    method @Deprecated public static android.media.CamcorderProfile get(int, int);
     method @Nullable public static android.media.EncoderProfiles getAll(@NonNull String, int);
     method public static boolean hasProfile(int);
     method public static boolean hasProfile(int, int);
@@ -21027,14 +21062,14 @@
     field @NonNull public final java.util.UUID uuid;
   }
 
-  public class EncoderProfiles {
+  public final class EncoderProfiles {
     method @NonNull public java.util.List<android.media.EncoderProfiles.AudioProfile> getAudioProfiles();
-    method public int getDurationSeconds();
-    method public int getFileFormat();
+    method public int getDefaultDurationSeconds();
+    method public int getRecommendedFileFormat();
     method @NonNull public java.util.List<android.media.EncoderProfiles.VideoProfile> getVideoProfiles();
   }
 
-  public static class EncoderProfiles.AudioProfile {
+  public static final class EncoderProfiles.AudioProfile {
     method public int getBitrate();
     method public int getChannels();
     method public int getCodec();
@@ -21043,7 +21078,7 @@
     method public int getSampleRate();
   }
 
-  public static class EncoderProfiles.VideoProfile {
+  public static final class EncoderProfiles.VideoProfile {
     method public int getBitrate();
     method public int getCodec();
     method public int getFrameRate();
@@ -22480,6 +22515,9 @@
     field public static final String KEY_MAX_PTS_GAP_TO_ENCODER = "max-pts-gap-to-encoder";
     field public static final String KEY_MAX_WIDTH = "max-width";
     field public static final String KEY_MIME = "mime";
+    field public static final String KEY_MPEGH_COMPATIBLE_SETS = "mpegh-compatible-sets";
+    field public static final String KEY_MPEGH_PROFILE_LEVEL_INDICATION = "mpegh-profile-level-indication";
+    field public static final String KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT = "mpegh-reference-channel-layout";
     field public static final String KEY_OPERATING_RATE = "operating-rate";
     field public static final String KEY_OUTPUT_REORDER_DEPTH = "output-reorder-depth";
     field public static final String KEY_PCM_ENCODING = "pcm-encoding";
@@ -23300,6 +23338,7 @@
   }
 
   public final class MediaRouter2 {
+    method @Nullable public android.media.MediaRouter2.RoutingController getController(@NonNull String);
     method @NonNull public java.util.List<android.media.MediaRouter2.RoutingController> getControllers();
     method @NonNull public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context);
     method @NonNull public java.util.List<android.media.MediaRoute2Info> getRoutes();
@@ -23402,11 +23441,14 @@
     method public void onError(@NonNull android.media.MediaSync, int, int);
   }
 
-  public class MediaSyncEvent {
+  public class MediaSyncEvent implements android.os.Parcelable {
     method public static android.media.MediaSyncEvent createEvent(int) throws java.lang.IllegalArgumentException;
+    method public int describeContents();
     method public int getAudioSessionId();
     method public int getType();
     method public android.media.MediaSyncEvent setAudioSessionId(int) throws java.lang.IllegalArgumentException;
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.media.MediaSyncEvent> CREATOR;
     field public static final int SYNC_EVENT_NONE = 0; // 0x0
     field public static final int SYNC_EVENT_PRESENTATION_COMPLETE = 1; // 0x1
   }
@@ -25194,6 +25236,7 @@
     method public float getPlaybackSpeed();
     method public long getPosition();
     method public int getState();
+    method public boolean isActive();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
     field public static final long ACTION_PAUSE = 2L; // 0x2L
@@ -26418,7 +26461,6 @@
     method @Deprecated public static int getDefaultPort();
     method @Deprecated public static String getHost(android.content.Context);
     method @Deprecated public static int getPort(android.content.Context);
-    field @Deprecated public static final String EXTRA_PROXY_INFO = "android.intent.extra.PROXY_INFO";
     field public static final String PROXY_CHANGE_ACTION = "android.intent.action.PROXY_CHANGE";
   }
 
@@ -27064,33 +27106,25 @@
     method @NonNull public android.net.vcn.VcnConfig build();
   }
 
-  public abstract class VcnControlPlaneConfig {
-  }
-
-  public final class VcnControlPlaneIkeConfig extends android.net.vcn.VcnControlPlaneConfig {
-    ctor public VcnControlPlaneIkeConfig(@NonNull android.net.ipsec.ike.IkeSessionParams, @NonNull android.net.ipsec.ike.TunnelModeChildSessionParams);
-    method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams getChildSessionParams();
-    method @NonNull public android.net.ipsec.ike.IkeSessionParams getIkeSessionParams();
-  }
-
   public final class VcnGatewayConnectionConfig {
     method @NonNull public int[] getExposedCapabilities();
     method @NonNull public String getGatewayConnectionName();
     method @IntRange(from=android.net.vcn.VcnGatewayConnectionConfig.MIN_MTU_V6) public int getMaxMtu();
-    method @NonNull public long[] getRetryInterval();
+    method @NonNull public long[] getRetryIntervalsMs();
   }
 
   public static final class VcnGatewayConnectionConfig.Builder {
-    ctor public VcnGatewayConnectionConfig.Builder(@NonNull String, @NonNull android.net.vcn.VcnControlPlaneConfig);
+    ctor public VcnGatewayConnectionConfig.Builder(@NonNull String, @NonNull android.net.ipsec.ike.IkeTunnelConnectionParams);
     method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder addExposedCapability(int);
     method @NonNull public android.net.vcn.VcnGatewayConnectionConfig build();
     method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeExposedCapability(int);
     method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setMaxMtu(@IntRange(from=android.net.vcn.VcnGatewayConnectionConfig.MIN_MTU_V6) int);
-    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setRetryInterval(@NonNull long[]);
+    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setRetryIntervalsMs(@NonNull long[]);
   }
 
   public class VcnManager {
     method @RequiresPermission("carrier privileges") public void clearVcnConfig(@NonNull android.os.ParcelUuid) throws java.io.IOException;
+    method @NonNull public java.util.List<android.os.ParcelUuid> getConfiguredSubscriptionGroups();
     method public void registerVcnStatusCallback(@NonNull android.os.ParcelUuid, @NonNull java.util.concurrent.Executor, @NonNull android.net.vcn.VcnManager.VcnStatusCallback);
     method @RequiresPermission("carrier privileges") public void setVcnConfig(@NonNull android.os.ParcelUuid, @NonNull android.net.vcn.VcnConfig) throws java.io.IOException;
     method public void unregisterVcnStatusCallback(@NonNull android.net.vcn.VcnManager.VcnStatusCallback);
@@ -32046,6 +32080,8 @@
     field public static final int PRIMITIVE_QUICK_FALL = 6; // 0x6
     field public static final int PRIMITIVE_QUICK_RISE = 4; // 0x4
     field public static final int PRIMITIVE_SLOW_RISE = 5; // 0x5
+    field public static final int PRIMITIVE_SPIN = 3; // 0x3
+    field public static final int PRIMITIVE_THUD = 2; // 0x2
     field public static final int PRIMITIVE_TICK = 7; // 0x7
   }
 
@@ -32056,6 +32092,7 @@
     method @NonNull public boolean[] arePrimitivesSupported(@NonNull int...);
     method @RequiresPermission(android.Manifest.permission.VIBRATE) public abstract void cancel();
     method public int getId();
+    method @NonNull public int[] getPrimitiveDurations(@NonNull int...);
     method public abstract boolean hasAmplitudeControl();
     method public abstract boolean hasVibrator();
     method @Deprecated @RequiresPermission(android.Manifest.permission.VIBRATE) public void vibrate(long);
@@ -32849,6 +32886,10 @@
     method @NonNull public String getLabel(@NonNull android.content.pm.PackageManager);
     method @IntRange(from=1) public int getWidthMils();
     method public boolean isPortrait();
+    field @NonNull public static final android.print.PrintAttributes.MediaSize ANSI_C;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize ANSI_D;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize ANSI_E;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize ANSI_F;
     field public static final android.print.PrintAttributes.MediaSize ISO_A0;
     field public static final android.print.PrintAttributes.MediaSize ISO_A1;
     field public static final android.print.PrintAttributes.MediaSize ISO_A10;
@@ -32902,6 +32943,12 @@
     field public static final android.print.PrintAttributes.MediaSize JPN_KAKU2;
     field public static final android.print.PrintAttributes.MediaSize JPN_OUFUKU;
     field public static final android.print.PrintAttributes.MediaSize JPN_YOU4;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize NA_ARCH_A;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize NA_ARCH_B;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize NA_ARCH_C;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize NA_ARCH_D;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize NA_ARCH_E;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize NA_ARCH_E1;
     field public static final android.print.PrintAttributes.MediaSize NA_FOOLSCAP;
     field public static final android.print.PrintAttributes.MediaSize NA_GOVT_LETTER;
     field public static final android.print.PrintAttributes.MediaSize NA_INDEX_3X5;
@@ -32913,7 +32960,9 @@
     field public static final android.print.PrintAttributes.MediaSize NA_LETTER;
     field public static final android.print.PrintAttributes.MediaSize NA_MONARCH;
     field public static final android.print.PrintAttributes.MediaSize NA_QUARTO;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize NA_SUPER_B;
     field public static final android.print.PrintAttributes.MediaSize NA_TABLOID;
+    field @NonNull public static final android.print.PrintAttributes.MediaSize OE_PHOTO_L;
     field public static final android.print.PrintAttributes.MediaSize OM_DAI_PA_KAI;
     field public static final android.print.PrintAttributes.MediaSize OM_JUURO_KU_KAI;
     field public static final android.print.PrintAttributes.MediaSize OM_PA_KAI;
@@ -35343,7 +35392,7 @@
     field @Deprecated public static final String BLUETOOTH_ON = "bluetooth_on";
     field public static final android.net.Uri CONTENT_URI;
     field @Deprecated public static final String DATA_ROAMING = "data_roaming";
-    field public static final String DATE_FORMAT = "date_format";
+    field @Deprecated public static final String DATE_FORMAT = "date_format";
     field @Deprecated public static final String DEBUG_APP = "debug_app";
     field public static final android.net.Uri DEFAULT_ALARM_ALERT_URI;
     field public static final android.net.Uri DEFAULT_NOTIFICATION_URI;
@@ -37730,16 +37779,16 @@
     method @NonNull public java.util.Map<android.view.autofill.AutofillId,android.service.autofill.FieldClassification> getFieldsClassification();
     method @NonNull public java.util.Set<java.lang.String> getIgnoredDatasetIds();
     method @NonNull public java.util.Map<android.view.autofill.AutofillId,java.util.Set<java.lang.String>> getManuallyEnteredField();
-    method public int getNoSaveReason();
+    method public int getNoSaveUiReason();
     method @NonNull public java.util.Set<java.lang.String> getSelectedDatasetIds();
     method public int getType();
-    field public static final int NO_SAVE_REASON_DATASET_MATCH = 6; // 0x6
-    field public static final int NO_SAVE_REASON_FIELD_VALIDATION_FAILED = 5; // 0x5
-    field public static final int NO_SAVE_REASON_HAS_EMPTY_REQUIRED = 3; // 0x3
-    field public static final int NO_SAVE_REASON_NONE = 0; // 0x0
-    field public static final int NO_SAVE_REASON_NO_SAVE_INFO = 1; // 0x1
-    field public static final int NO_SAVE_REASON_NO_VALUE_CHANGED = 4; // 0x4
-    field public static final int NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG = 2; // 0x2
+    field public static final int NO_SAVE_UI_REASON_DATASET_MATCH = 6; // 0x6
+    field public static final int NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED = 5; // 0x5
+    field public static final int NO_SAVE_UI_REASON_HAS_EMPTY_REQUIRED = 3; // 0x3
+    field public static final int NO_SAVE_UI_REASON_NONE = 0; // 0x0
+    field public static final int NO_SAVE_UI_REASON_NO_SAVE_INFO = 1; // 0x1
+    field public static final int NO_SAVE_UI_REASON_NO_VALUE_CHANGED = 4; // 0x4
+    field public static final int NO_SAVE_UI_REASON_WITH_DELAY_SAVE_FLAG = 2; // 0x2
     field public static final int TYPE_AUTHENTICATION_SELECTED = 2; // 0x2
     field public static final int TYPE_CONTEXT_COMMITTED = 4; // 0x4
     field public static final int TYPE_DATASETS_SHOWN = 5; // 0x5
@@ -39110,6 +39159,7 @@
     field public static final String ACTION_VOICE_SEARCH_HANDS_FREE = "android.speech.action.VOICE_SEARCH_HANDS_FREE";
     field public static final String ACTION_WEB_SEARCH = "android.speech.action.WEB_SEARCH";
     field public static final String DETAILS_META_DATA = "android.speech.DETAILS";
+    field public static final String EXTRA_AUDIO_INJECT_SOURCE = "android.speech.extra.AUDIO_INJECT_SOURCE";
     field public static final String EXTRA_CALLING_PACKAGE = "calling_package";
     field public static final String EXTRA_CONFIDENCE_SCORES = "android.speech.extra.CONFIDENCE_SCORES";
     field public static final String EXTRA_LANGUAGE = "android.speech.extra.LANGUAGE";
@@ -41940,7 +41990,6 @@
     method @IntRange(from=1, to=261) public int getBand();
     method @IntRange(from=1) public int getCellBandwidthDownlinkKhz();
     method @IntRange(from=1) public int getCellBandwidthUplinkKhz();
-    method @Deprecated public int getChannelNumber();
     method public int getConnectionStatus();
     method @IntRange(from=0) public int getDownlinkChannelNumber();
     method @IntRange(from=0) public int getDownlinkFrequencyKhz();
@@ -43066,6 +43115,13 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.TrafficDescriptor> CREATOR;
   }
 
+  public static final class TrafficDescriptor.Builder {
+    ctor public TrafficDescriptor.Builder();
+    method @NonNull public android.telephony.data.TrafficDescriptor build();
+    method @NonNull public android.telephony.data.TrafficDescriptor.Builder setDataNetworkName(@NonNull String);
+    method @NonNull public android.telephony.data.TrafficDescriptor.Builder setOsAppId(@NonNull byte[]);
+  }
+
   public final class UrspRule implements android.os.Parcelable {
     method public int describeContents();
     method @IntRange(from=0x0, to=0xff) public int getPrecedence();
@@ -48318,7 +48374,6 @@
     ctor public SurfaceView(android.content.Context, android.util.AttributeSet);
     ctor public SurfaceView(android.content.Context, android.util.AttributeSet, int);
     ctor public SurfaceView(android.content.Context, android.util.AttributeSet, int, int);
-    method public boolean gatherTransparentRegion(android.graphics.Region);
     method public android.view.SurfaceHolder getHolder();
     method @Nullable public android.os.IBinder getHostToken();
     method public android.view.SurfaceControl getSurfaceControl();
@@ -48452,6 +48507,7 @@
     method public boolean checkInputConnectionProxy(android.view.View);
     method public void clearAnimation();
     method public void clearFocus();
+    method public void clearViewTranslationCallback();
     method public static int combineMeasuredStates(int, int);
     method protected int computeHorizontalScrollExtent();
     method protected int computeHorizontalScrollOffset();
@@ -48488,7 +48544,7 @@
     method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     method public void dispatchProvideAutofillStructure(@NonNull android.view.ViewStructure, int);
     method public void dispatchProvideStructure(android.view.ViewStructure);
-    method public void dispatchRequestTranslation(@NonNull java.util.Map<android.view.autofill.AutofillId,long[]>, @NonNull int[], @Nullable android.view.translation.TranslationCapability, @NonNull java.util.List<android.view.translation.ViewTranslationRequest>);
+    method public void dispatchRequestTranslation(@NonNull java.util.Map<android.view.autofill.AutofillId,long[]>, @NonNull int[], @NonNull android.view.translation.TranslationCapability, @NonNull java.util.List<android.view.translation.ViewTranslationRequest>);
     method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
     method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
     method public void dispatchScrollCaptureSearch(@NonNull android.graphics.Rect, @NonNull android.graphics.Point, @NonNull java.util.function.Consumer<android.view.ScrollCaptureTarget>);
@@ -48519,6 +48575,7 @@
     method public android.view.View focusSearch(int);
     method public void forceHasOverlappingRendering(boolean);
     method public void forceLayout();
+    method public boolean gatherTransparentRegion(@Nullable android.graphics.Region);
     method public void generateDisplayHash(@NonNull String, @Nullable android.graphics.Rect, @NonNull java.util.concurrent.Executor, @NonNull android.view.displayhash.DisplayHashResultCallback);
     method public static int generateViewId();
     method public CharSequence getAccessibilityClassName();
@@ -48685,7 +48742,7 @@
     method @Nullable public android.graphics.drawable.Drawable getVerticalScrollbarTrackDrawable();
     method public int getVerticalScrollbarWidth();
     method @Nullable public android.view.ViewRoot getViewRoot();
-    method @Nullable public android.view.translation.ViewTranslationCallback getViewTranslationCallback();
+    method @Nullable public android.view.translation.ViewTranslationResponse getViewTranslationResponse();
     method public android.view.ViewTreeObserver getViewTreeObserver();
     method public int getVisibility();
     method public final int getWidth();
@@ -48785,8 +48842,8 @@
     method protected void onCreateContextMenu(android.view.ContextMenu);
     method protected int[] onCreateDrawableState(int);
     method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
-    method @Nullable public android.view.translation.ViewTranslationRequest onCreateTranslationRequest(@NonNull int[]);
-    method public void onCreateTranslationRequests(@NonNull long[], @NonNull int[], @NonNull java.util.function.Consumer<android.view.translation.ViewTranslationRequest>);
+    method public void onCreateViewTranslationRequest(@NonNull int[], @NonNull java.util.function.Consumer<android.view.translation.ViewTranslationRequest>);
+    method public void onCreateVirtualViewTranslationRequests(@NonNull long[], @NonNull int[], @NonNull java.util.function.Consumer<android.view.translation.ViewTranslationRequest>);
     method @CallSuper protected void onDetachedFromWindow();
     method protected void onDisplayHint(int);
     method public boolean onDragEvent(android.view.DragEvent);
@@ -48831,8 +48888,8 @@
     method public void onStartTemporaryDetach();
     method public boolean onTouchEvent(android.view.MotionEvent);
     method public boolean onTrackballEvent(android.view.MotionEvent);
-    method public void onTranslationResponse(@NonNull android.view.translation.ViewTranslationResponse);
-    method public void onTranslationResponse(@NonNull android.util.LongSparseArray<android.view.translation.ViewTranslationResponse>);
+    method public void onViewTranslationResponse(@NonNull android.view.translation.ViewTranslationResponse);
+    method public void onVirtualViewTranslationResponses(@NonNull android.util.LongSparseArray<android.view.translation.ViewTranslationResponse>);
     method @CallSuper public void onVisibilityAggregated(boolean);
     method protected void onVisibilityChanged(@NonNull android.view.View, int);
     method public void onWindowFocusChanged(boolean);
@@ -49500,7 +49557,6 @@
     method public void endViewTransition(android.view.View);
     method public android.view.View focusSearch(android.view.View, int);
     method public void focusableViewAvailable(android.view.View);
-    method public boolean gatherTransparentRegion(android.graphics.Region);
     method protected android.view.ViewGroup.LayoutParams generateDefaultLayoutParams();
     method public android.view.ViewGroup.LayoutParams generateLayoutParams(android.util.AttributeSet);
     method protected android.view.ViewGroup.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
@@ -51944,8 +52000,8 @@
     method @Deprecated public void showStatusIcon(android.os.IBinder, String, @DrawableRes int);
     method @Deprecated public boolean switchToLastInputMethod(android.os.IBinder);
     method @Deprecated public boolean switchToNextInputMethod(android.os.IBinder, boolean);
-    method public void toggleSoftInput(int, int);
-    method public void toggleSoftInputFromWindow(android.os.IBinder, int, int);
+    method @Deprecated public void toggleSoftInput(int, int);
+    method @Deprecated public void toggleSoftInputFromWindow(android.os.IBinder, int, int);
     method @Deprecated public void updateCursor(android.view.View, int, int, int, int);
     method public void updateCursorAnchorInfo(android.view.View, android.view.inputmethod.CursorAnchorInfo);
     method public void updateExtractedText(android.view.View, int, android.view.inputmethod.ExtractedText);
@@ -51968,7 +52024,7 @@
     method public void dispatchTrackballEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
     method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
     method public void finishInput();
-    method public void toggleSoftInput(int, int);
+    method @Deprecated public void toggleSoftInput(int, int);
     method public void updateCursor(android.graphics.Rect);
     method public void updateCursorAnchorInfo(android.view.inputmethod.CursorAnchorInfo);
     method public void updateExtractedText(int, android.view.inputmethod.ExtractedText);
@@ -52670,6 +52726,22 @@
     method public void onGetSuggestions(android.view.textservice.SuggestionsInfo[]);
   }
 
+  public static class SpellCheckerSession.SpellCheckerSessionParams {
+    method @NonNull public android.os.Bundle getExtras();
+    method @Nullable public java.util.Locale getLocale();
+    method public int getSupportedAttributes();
+    method public boolean shouldReferToSpellCheckerLanguageSettings();
+  }
+
+  public static final class SpellCheckerSession.SpellCheckerSessionParams.Builder {
+    ctor public SpellCheckerSession.SpellCheckerSessionParams.Builder();
+    method @NonNull public android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams build();
+    method @NonNull public android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams.Builder setExtras(@NonNull android.os.Bundle);
+    method @NonNull public android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams.Builder setLocale(@Nullable java.util.Locale);
+    method @NonNull public android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams.Builder setShouldReferToSpellCheckerLanguageSettings(boolean);
+    method @NonNull public android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams.Builder setSupportedAttributes(int);
+  }
+
   public final class SpellCheckerSubtype implements android.os.Parcelable {
     ctor @Deprecated public SpellCheckerSubtype(int, String, String);
     method public boolean containsExtraValueKey(String);
@@ -52723,7 +52795,7 @@
     method @NonNull public java.util.List<android.view.textservice.SpellCheckerInfo> getEnabledSpellCheckerInfos();
     method public boolean isSpellCheckerEnabled();
     method @Nullable public android.view.textservice.SpellCheckerSession newSpellCheckerSession(@Nullable android.os.Bundle, @Nullable java.util.Locale, @NonNull android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener, boolean);
-    method @Nullable public android.view.textservice.SpellCheckerSession newSpellCheckerSession(@Nullable java.util.Locale, boolean, int, @Nullable android.os.Bundle, @NonNull java.util.concurrent.Executor, @NonNull android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener);
+    method @Nullable public android.view.textservice.SpellCheckerSession newSpellCheckerSession(@NonNull android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams, @NonNull java.util.concurrent.Executor, @NonNull android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener);
   }
 
 }
@@ -52741,6 +52813,7 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.view.translation.TranslationCapability> CREATOR;
     field public static final int STATE_AVAILABLE_TO_DOWNLOAD = 1; // 0x1
     field public static final int STATE_DOWNLOADING = 2; // 0x2
+    field public static final int STATE_NOT_AVAILABLE = 4; // 0x4
     field public static final int STATE_ON_DEVICE = 3; // 0x3
   }
 
@@ -52763,15 +52836,18 @@
   }
 
   public final class TranslationManager {
-    method public void addOnDeviceTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
+    method public void addOnDeviceTranslationCapabilityUpdateListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.view.translation.TranslationCapability>);
+    method @Deprecated public void addOnDeviceTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
     method @Deprecated public void addTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
-    method @Nullable @WorkerThread public android.view.translation.Translator createOnDeviceTranslator(@NonNull android.view.translation.TranslationContext);
+    method public void createOnDeviceTranslator(@NonNull android.view.translation.TranslationContext, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.view.translation.Translator>);
+    method @Deprecated @Nullable @WorkerThread public android.view.translation.Translator createOnDeviceTranslator(@NonNull android.view.translation.TranslationContext);
     method @Deprecated @Nullable @WorkerThread public android.view.translation.Translator createTranslator(@NonNull android.view.translation.TranslationContext);
     method @NonNull @WorkerThread public java.util.Set<android.view.translation.TranslationCapability> getOnDeviceTranslationCapabilities(int, int);
     method @Nullable public android.app.PendingIntent getOnDeviceTranslationSettingsActivityIntent();
     method @Deprecated @NonNull @WorkerThread public java.util.Set<android.view.translation.TranslationCapability> getTranslationCapabilities(int, int);
     method @Deprecated @Nullable public android.app.PendingIntent getTranslationSettingsActivityIntent();
-    method public void removeOnDeviceTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
+    method public void removeOnDeviceTranslationCapabilityUpdateListener(@NonNull java.util.function.Consumer<android.view.translation.TranslationCapability>);
+    method @Deprecated public void removeOnDeviceTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
     method @Deprecated public void removeTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
   }
 
@@ -52852,10 +52928,12 @@
   }
 
   public final class TranslationSpec implements android.os.Parcelable {
-    ctor public TranslationSpec(@NonNull String, int);
+    ctor @Deprecated public TranslationSpec(@NonNull String, int);
+    ctor public TranslationSpec(@NonNull android.icu.util.ULocale, int);
     method public int describeContents();
     method public int getDataFormat();
-    method @NonNull public String getLanguage();
+    method @Deprecated @NonNull public String getLanguage();
+    method @NonNull public android.icu.util.ULocale getLocale();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.view.translation.TranslationSpec> CREATOR;
     field public static final int DATA_FORMAT_TEXT = 1; // 0x1
@@ -52875,7 +52953,8 @@
   public interface UiTranslationStateCallback {
     method public void onFinished();
     method public void onPaused();
-    method public void onStarted(@NonNull String, @NonNull String);
+    method @Deprecated public void onStarted(@NonNull String, @NonNull String);
+    method public default void onStarted(@NonNull android.icu.util.ULocale, @NonNull android.icu.util.ULocale);
   }
 
   @UiThread public interface ViewTranslationCallback {
@@ -56717,6 +56796,7 @@
   public interface SplashScreen {
     method public void clearOnExitAnimationListener();
     method public void setOnExitAnimationListener(@NonNull android.window.SplashScreen.OnExitAnimationListener);
+    method public void setSplashScreenTheme(@StyleRes int);
   }
 
   public static interface SplashScreen.OnExitAnimationListener {
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index b653410..e48a1da 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -161,10 +161,6 @@
     method public void onVolumeChanged(@NonNull android.media.session.MediaSession.Token, int);
   }
 
-  public final class PlaybackState implements android.os.Parcelable {
-    method public boolean isActiveState();
-  }
-
 }
 
 package android.net {
@@ -182,7 +178,6 @@
   }
 
   public class NetworkPolicyManager {
-    method @NonNull public static String blockedReasonsToString(int);
     method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public int getMultipathPreference(@NonNull android.net.Network);
     method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public int getRestrictBackgroundStatus(int);
     method @RequiresPermission(android.Manifest.permission.OBSERVE_NETWORK_POLICY) public boolean isUidNetworkingBlocked(int, boolean);
@@ -198,13 +193,13 @@
   public final class NetworkStateSnapshot implements android.os.Parcelable {
     ctor public NetworkStateSnapshot(@NonNull android.net.Network, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, @Nullable String, int);
     method public int describeContents();
+    method public int getLegacyType();
+    method @NonNull public android.net.LinkProperties getLinkProperties();
+    method @NonNull public android.net.Network getNetwork();
+    method @NonNull public android.net.NetworkCapabilities getNetworkCapabilities();
+    method @Nullable public String getSubscriberId();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkStateSnapshot> CREATOR;
-    field public final int legacyType;
-    field @NonNull public final android.net.LinkProperties linkProperties;
-    field @NonNull public final android.net.Network network;
-    field @NonNull public final android.net.NetworkCapabilities networkCapabilities;
-    field @Nullable public final String subscriberId;
   }
 
   public class NetworkWatchlistManager {
@@ -228,11 +223,11 @@
   public final class UnderlyingNetworkInfo implements android.os.Parcelable {
     ctor public UnderlyingNetworkInfo(int, @NonNull String, @NonNull java.util.List<java.lang.String>);
     method public int describeContents();
+    method @NonNull public String getInterface();
+    method public int getOwnerUid();
+    method @NonNull public java.util.List<java.lang.String> getUnderlyingInterfaces();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.net.UnderlyingNetworkInfo> CREATOR;
-    field @NonNull public final String iface;
-    field public final int ownerUid;
-    field @NonNull public final java.util.List<java.lang.String> underlyingIfaces;
   }
 
   public class VpnManager {
diff --git a/core/api/removed.txt b/core/api/removed.txt
index a99178d..cdaa5f53 100644
--- a/core/api/removed.txt
+++ b/core/api/removed.txt
@@ -252,6 +252,10 @@
   @IntDef({0x0, 0xa, 0x14, 0x1e}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NetworkBadging.Badging {
   }
 
+  public final class Proxy {
+    field @Deprecated public static final String EXTRA_PROXY_INFO = "android.intent.extra.PROXY_INFO";
+  }
+
   @Deprecated public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
     method @Deprecated public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
   }
@@ -535,6 +539,14 @@
 
 }
 
+package android.view.translation {
+
+  public class Translator {
+    method @Deprecated @Nullable public void translate(@NonNull android.view.translation.TranslationRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.view.translation.TranslationResponse>);
+  }
+
+}
+
 package android.webkit {
 
   public class WebViewClient {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index adbf18f..22af3f7 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3,7 +3,6 @@
 
   public static final class Manifest.permission {
     field public static final String ACCESS_AMBIENT_LIGHT_STATS = "android.permission.ACCESS_AMBIENT_LIGHT_STATS";
-    field public static final String ACCESS_BLOBS_ACROSS_USERS = "android.permission.ACCESS_BLOBS_ACROSS_USERS";
     field public static final String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO";
     field public static final String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM";
     field public static final String ACCESS_CONTEXT_HUB = "android.permission.ACCESS_CONTEXT_HUB";
@@ -19,6 +18,7 @@
     field public static final String ACCESS_SHARED_LIBRARIES = "android.permission.ACCESS_SHARED_LIBRARIES";
     field public static final String ACCESS_SHORTCUTS = "android.permission.ACCESS_SHORTCUTS";
     field public static final String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
+    field public static final String ACCESS_TUNED_INFO = "android.permission.ACCESS_TUNED_INFO";
     field public static final String ACCESS_TV_DESCRAMBLER = "android.permission.ACCESS_TV_DESCRAMBLER";
     field public static final String ACCESS_TV_TUNER = "android.permission.ACCESS_TV_TUNER";
     field public static final String ACCESS_VIBRATOR_STATE = "android.permission.ACCESS_VIBRATOR_STATE";
@@ -106,6 +106,7 @@
     field public static final String GET_APP_OPS_STATS = "android.permission.GET_APP_OPS_STATS";
     field public static final String GET_PROCESS_STATE_AND_OOM_SCORE = "android.permission.GET_PROCESS_STATE_AND_OOM_SCORE";
     field public static final String GET_RUNTIME_PERMISSIONS = "android.permission.GET_RUNTIME_PERMISSIONS";
+    field public static final String GET_RUNTIME_PERMISSION_GROUP_MAPPING = "android.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING";
     field public static final String GET_TOP_ACTIVITY_INFO = "android.permission.GET_TOP_ACTIVITY_INFO";
     field @Deprecated public static final String GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS = "android.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS";
     field public static final String GRANT_RUNTIME_PERMISSIONS = "android.permission.GRANT_RUNTIME_PERMISSIONS";
@@ -380,6 +381,7 @@
     field public static final int config_systemSpeechRecognizer;
     field public static final int config_systemTelevisionNotificationHandler;
     field public static final int config_systemTextIntelligence;
+    field public static final int config_systemUi;
     field public static final int config_systemUiIntelligence;
     field public static final int config_systemVisualIntelligence;
     field public static final int config_systemWellbeing;
@@ -1617,7 +1619,7 @@
     ctor public SmartspaceConfig.Builder(@NonNull android.content.Context, @NonNull String);
     method @NonNull public android.app.smartspace.SmartspaceConfig build();
     method @NonNull public android.app.smartspace.SmartspaceConfig.Builder setExtras(@NonNull android.os.Bundle);
-    method @NonNull public android.app.smartspace.SmartspaceConfig.Builder setSmartspaceTargetCount(int);
+    method @NonNull public android.app.smartspace.SmartspaceConfig.Builder setSmartspaceTargetCount(@IntRange(from=0, to=50) int);
   }
 
   public final class SmartspaceManager {
@@ -1625,23 +1627,22 @@
   }
 
   public final class SmartspaceSession implements java.lang.AutoCloseable {
+    method public void addOnTargetsAvailableListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.smartspace.SmartspaceSession.OnTargetsAvailableListener);
     method public void close();
-    method public void destroy();
     method protected void finalize();
     method public void notifySmartspaceEvent(@NonNull android.app.smartspace.SmartspaceTargetEvent);
-    method public void registerSmartspaceUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.smartspace.SmartspaceSession.Callback);
+    method public void removeOnTargetsAvailableListener(@NonNull android.app.smartspace.SmartspaceSession.OnTargetsAvailableListener);
     method public void requestSmartspaceUpdate();
-    method public void unregisterSmartspaceUpdates(@NonNull android.app.smartspace.SmartspaceSession.Callback);
   }
 
-  public static interface SmartspaceSession.Callback {
+  public static interface SmartspaceSession.OnTargetsAvailableListener {
     method public void onTargetsAvailable(@NonNull java.util.List<android.app.smartspace.SmartspaceTarget>);
   }
 
   public final class SmartspaceSessionId implements android.os.Parcelable {
     method public int describeContents();
     method @Nullable public String getId();
-    method @NonNull public int getUserId();
+    method @NonNull public android.os.UserHandle getUserHandle();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.SmartspaceSessionId> CREATOR;
   }
@@ -1652,19 +1653,19 @@
     method @Nullable public String getAssociatedSmartspaceTargetId();
     method @Nullable public android.app.smartspace.SmartspaceAction getBaseAction();
     method @NonNull public android.content.ComponentName getComponentName();
-    method @NonNull public long getCreationTimeMillis();
-    method @NonNull public long getExpiryTimeMillis();
-    method @NonNull public int getFeatureType();
+    method public long getCreationTimeMillis();
+    method public long getExpiryTimeMillis();
+    method public int getFeatureType();
     method @Nullable public android.app.smartspace.SmartspaceAction getHeaderAction();
     method @NonNull public java.util.List<android.app.smartspace.SmartspaceAction> getIconGrid();
-    method @NonNull public float getScore();
+    method public float getScore();
     method @Nullable public android.net.Uri getSliceUri();
     method @NonNull public String getSmartspaceTargetId();
     method @Nullable public String getSourceNotificationKey();
     method @NonNull public android.os.UserHandle getUserHandle();
-    method @Nullable public android.appwidget.AppWidgetProviderInfo getWidgetId();
-    method @NonNull public boolean isSensitive();
-    method @NonNull public boolean shouldShowExpanded();
+    method @Nullable public android.appwidget.AppWidgetProviderInfo getWidget();
+    method public boolean isSensitive();
+    method public boolean shouldShowExpanded();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.SmartspaceTarget> CREATOR;
     field public static final int FEATURE_ALARM = 7; // 0x7
@@ -1699,17 +1700,17 @@
     method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setActionChips(@NonNull java.util.List<android.app.smartspace.SmartspaceAction>);
     method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setAssociatedSmartspaceTargetId(@NonNull String);
     method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setBaseAction(@NonNull android.app.smartspace.SmartspaceAction);
-    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setCreationTimeMillis(@NonNull long);
-    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setExpiryTimeMillis(@NonNull long);
-    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setFeatureType(@NonNull int);
+    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setCreationTimeMillis(long);
+    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setExpiryTimeMillis(long);
+    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setFeatureType(int);
     method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setHeaderAction(@NonNull android.app.smartspace.SmartspaceAction);
     method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setIconGrid(@NonNull java.util.List<android.app.smartspace.SmartspaceAction>);
-    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setScore(@NonNull float);
-    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setSensitive(@NonNull boolean);
-    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setShouldShowExpanded(@NonNull boolean);
+    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setScore(float);
+    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setSensitive(boolean);
+    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setShouldShowExpanded(boolean);
     method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setSliceUri(@NonNull android.net.Uri);
     method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setSourceNotificationKey(@NonNull String);
-    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setWidgetId(@NonNull android.appwidget.AppWidgetProviderInfo);
+    method @NonNull public android.app.smartspace.SmartspaceTarget.Builder setWidget(@NonNull android.appwidget.AppWidgetProviderInfo);
   }
 
   public final class SmartspaceTargetEvent implements android.os.Parcelable {
@@ -1721,11 +1722,11 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.app.smartspace.SmartspaceTargetEvent> CREATOR;
     field public static final int EVENT_TARGET_BLOCK = 5; // 0x5
     field public static final int EVENT_TARGET_DISMISS = 4; // 0x4
+    field public static final int EVENT_TARGET_HIDDEN = 3; // 0x3
     field public static final int EVENT_TARGET_INTERACTION = 1; // 0x1
-    field public static final int EVENT_TARGET_IN_VIEW = 2; // 0x2
-    field public static final int EVENT_TARGET_OUT_OF_VIEW = 3; // 0x3
-    field public static final int EVENT_UI_SURFACE_IN_VIEW = 6; // 0x6
-    field public static final int EVENT_UI_SURFACE_OUT_OF_VIEW = 7; // 0x7
+    field public static final int EVENT_TARGET_SHOWN = 2; // 0x2
+    field public static final int EVENT_UI_SURFACE_HIDDEN = 7; // 0x7
+    field public static final int EVENT_UI_SURFACE_SHOWN = 6; // 0x6
   }
 
   public static final class SmartspaceTargetEvent.Builder {
@@ -1899,10 +1900,10 @@
 package android.bluetooth {
 
   public final class BluetoothA2dp implements android.bluetooth.BluetoothProfile {
-    method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public android.bluetooth.BufferConstraints getBufferConstraints();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getDynamicBufferSupport();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setBufferLengthMillis(int, int);
+    method @Nullable @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public android.bluetooth.BufferConstraints getBufferConstraints();
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getDynamicBufferSupport();
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setBufferLengthMillis(int, int);
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
     field public static final int DYNAMIC_BUFFER_SUPPORT_A2DP_OFFLOAD = 1; // 0x1
     field public static final int DYNAMIC_BUFFER_SUPPORT_A2DP_SOFTWARE_ENCODING = 2; // 0x2
@@ -1917,10 +1918,10 @@
 
   public final class BluetoothA2dpSink implements android.bluetooth.BluetoothProfile {
     method public void finalize();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isAudioPlaying(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean isAudioPlaying(@NonNull android.bluetooth.BluetoothDevice);
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED";
+    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED";
   }
 
   public final class BluetoothAdapter {
@@ -1972,7 +1973,7 @@
     field public static final int ACCESS_ALLOWED = 1; // 0x1
     field public static final int ACCESS_REJECTED = 2; // 0x2
     field public static final int ACCESS_UNKNOWN = 0; // 0x0
-    field public static final String ACTION_SILENCE_MODE_CHANGED = "android.bluetooth.device.action.SILENCE_MODE_CHANGED";
+    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_SILENCE_MODE_CHANGED = "android.bluetooth.device.action.SILENCE_MODE_CHANGED";
     field public static final String DEVICE_TYPE_DEFAULT = "Default";
     field public static final String DEVICE_TYPE_UNTETHERED_HEADSET = "Untethered Headset";
     field public static final String DEVICE_TYPE_WATCH = "Watch";
@@ -2006,13 +2007,13 @@
   public final class BluetoothHeadset implements android.bluetooth.BluetoothProfile {
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean connect(android.bluetooth.BluetoothDevice);
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public boolean disconnect(android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
   }
 
   public final class BluetoothHearingAid implements android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public long getHiSyncId(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public long getHiSyncId(@NonNull android.bluetooth.BluetoothDevice);
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
   }
 
@@ -2022,9 +2023,9 @@
 
   public final class BluetoothHidHost implements android.bluetooth.BluetoothProfile {
     method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
     field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED";
   }
 
@@ -2034,7 +2035,7 @@
     method @NonNull @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED";
+    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED";
   }
 
   public final class BluetoothMapClient implements android.bluetooth.BluetoothProfile {
@@ -2043,7 +2044,7 @@
 
   public final class BluetoothPan implements android.bluetooth.BluetoothProfile {
     method @NonNull @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public boolean isTetheringOn();
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.TETHER_PRIVILEGED}) public void setBluetoothTethering(boolean);
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
@@ -2061,9 +2062,9 @@
   }
 
   public class BluetoothPbap implements android.bluetooth.BluetoothProfile {
-    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
+    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
     method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
-    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
+    field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
   }
 
   public interface BluetoothProfile {
@@ -2311,6 +2312,7 @@
     field public static final String NETD_SERVICE = "netd";
     field public static final String NETWORK_SCORE_SERVICE = "network_score";
     field public static final String OEM_LOCK_SERVICE = "oem_lock";
+    field public static final String PERMISSION_CONTROLLER_SERVICE = "permission_controller";
     field public static final String PERMISSION_SERVICE = "permission";
     field public static final String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
     field public static final String REBOOT_READINESS_SERVICE = "reboot_readiness";
@@ -2732,10 +2734,8 @@
     field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
     field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
     field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
-    field public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle";
     field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub";
     field public static final String FEATURE_INCREMENTAL_DELIVERY = "android.software.incremental_delivery";
-    field public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle";
     field public static final String FEATURE_REBOOT_ESCROW = "android.hardware.reboot_escrow";
     field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock";
     field public static final String FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION = "android.hardware.telephony.ims.singlereg";
@@ -3116,12 +3116,7 @@
   }
 
   public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener {
-    method public void onSensorPrivacyChanged(boolean);
-  }
-
-  public static class SensorPrivacyManager.Sensors {
-    field public static final int CAMERA = 2; // 0x2
-    field public static final int MICROPHONE = 1; // 0x1
+    method public void onSensorPrivacyChanged(int, boolean);
   }
 
 }
@@ -3315,7 +3310,7 @@
     field public static final int AVR_VOLUME_MUTED = 101; // 0x65
     field public static final String CEC_SETTING_NAME_HDMI_CEC_ENABLED = "hdmi_cec_enabled";
     field public static final String CEC_SETTING_NAME_HDMI_CEC_VERSION = "hdmi_cec_version";
-    field public static final String CEC_SETTING_NAME_POWER_CONTROL_MODE = "send_standby_on_sleep";
+    field public static final String CEC_SETTING_NAME_POWER_CONTROL_MODE = "power_control_mode";
     field public static final String CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST = "power_state_change_on_active_source_lost";
     field public static final String CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING = "system_audio_mode_muting";
     field public static final String CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP = "tv_send_standby_on_sleep";
@@ -5270,11 +5265,15 @@
 
   public class AudioRecord implements android.media.AudioRecordingMonitor android.media.AudioRouting android.media.MicrophoneDirection {
     ctor @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public AudioRecord(android.media.AudioAttributes, android.media.AudioFormat, int, int) throws java.lang.IllegalArgumentException;
+    method public static long getMaxSharedAudioHistoryMillis();
+    method @NonNull @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public android.media.MediaSyncEvent shareAudioHistory(@NonNull String, @IntRange(from=0) long);
   }
 
   public static class AudioRecord.Builder {
     method public android.media.AudioRecord.Builder setAudioAttributes(@NonNull android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
+    method @NonNull @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public android.media.AudioRecord.Builder setMaxSharedAudioHistoryMillis(long) throws java.lang.IllegalArgumentException;
     method public android.media.AudioRecord.Builder setSessionId(int) throws java.lang.IllegalArgumentException;
+    method @NonNull public android.media.AudioRecord.Builder setSharedAudioEvent(@NonNull android.media.MediaSyncEvent) throws java.lang.IllegalArgumentException;
   }
 
   public final class AudioRecordingConfiguration implements android.os.Parcelable {
@@ -5326,18 +5325,21 @@
   public final class MediaRouter2 {
     method @NonNull public java.util.List<android.media.MediaRoute2Info> getAllRoutes();
     method @Nullable public String getClientPackageName();
-    method @Nullable public android.media.MediaRouter2.RoutingController getController(@NonNull String);
-    method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String);
-    method public void setRouteVolume(@NonNull android.media.MediaRoute2Info, int);
-    method public void startScan();
-    method public void stopScan();
-    method public void transfer(@NonNull android.media.MediaRouter2.RoutingController, @NonNull android.media.MediaRoute2Info);
+    method @Nullable @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String);
+    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void setRouteVolume(@NonNull android.media.MediaRoute2Info, int);
+    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void startScan();
+    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void stopScan();
+    method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void transfer(@NonNull android.media.MediaRouter2.RoutingController, @NonNull android.media.MediaRoute2Info);
   }
 
   public abstract static class MediaRouter2.RouteCallback {
     method public void onPreferredFeaturesChanged(@NonNull java.util.List<java.lang.String>);
   }
 
+  public class MediaSyncEvent implements android.os.Parcelable {
+    field public static final int SYNC_EVENT_SHARE_AUDIO_HISTORY = 100; // 0x64
+  }
+
   public class PlayerProxy {
     method public void pause();
     method public void setPan(float);
@@ -5635,8 +5637,9 @@
     method public int getAppType();
     method @Nullable public android.net.Uri getChannelUri();
     method @NonNull public String getInputId();
-    method public boolean isForeground();
+    method public boolean isMainSession();
     method public boolean isRecordingSession();
+    method public boolean isVisible();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field public static final int APP_TAG_SELF = 0; // 0x0
     field public static final int APP_TYPE_NON_SYSTEM = 3; // 0x3
@@ -5760,7 +5763,7 @@
     method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void addBlockedRating(@NonNull android.media.tv.TvContentRating);
     method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean captureFrame(String, android.view.Surface, android.media.tv.TvStreamConfig);
     method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public java.util.List<android.media.tv.TvStreamConfig> getAvailableTvStreamConfigList(String);
-    method @NonNull @RequiresPermission("com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS") public java.util.List<android.media.tv.TunedInfo> getCurrentTunedInfos();
+    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TUNED_INFO) public java.util.List<android.media.tv.TunedInfo> getCurrentTunedInfos();
     method @NonNull @RequiresPermission("android.permission.DVB_DEVICE") public java.util.List<android.media.tv.DvbDeviceInfo> getDvbDeviceList();
     method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public java.util.List<android.media.tv.TvInputHardwareInfo> getHardwareList();
     method @RequiresPermission(android.Manifest.permission.READ_CONTENT_RATING_SYSTEMS) public java.util.List<android.media.tv.TvContentRatingSystemInfo> getTvContentRatingSystemList();
@@ -5787,7 +5790,7 @@
   }
 
   public abstract static class TvInputManager.TvInputCallback {
-    method public void onCurrentTunedInfosUpdated(@NonNull java.util.List<android.media.tv.TunedInfo>);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_TUNED_INFO) public void onCurrentTunedInfosUpdated(@NonNull java.util.List<android.media.tv.TunedInfo>);
   }
 
   public abstract class TvInputService extends android.app.Service {
@@ -8620,6 +8623,7 @@
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isCloneProfile();
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean isGuestUser();
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isManagedProfile(int);
+    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isMediaSharedWithParent();
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean isPrimaryUser();
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isProfile();
     method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isRestrictedProfile();
@@ -8631,7 +8635,6 @@
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean removeUser(@NonNull android.os.UserHandle);
     method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserIcon(@NonNull android.graphics.Bitmap) throws android.os.UserManager.UserOperationException;
     method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserName(@Nullable String);
-    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean sharesMediaWithParent();
     field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
     field @Deprecated public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
     field public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
@@ -8828,8 +8831,8 @@
 
   public final class PermissionControllerManager {
     method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
-    method @Nullable public String getGroupOfPlatformPermission(@NonNull String);
-    method @NonNull public java.util.Set<java.lang.String> getPlatformPermissionsForGroup(@NonNull String);
+    method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING) public void getGroupOfPlatformPermission(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.String>);
+    method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING) public void getPlatformPermissionsForGroup(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<java.lang.String>>);
     method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>);
     method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback);
     method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle);
@@ -10397,17 +10400,19 @@
     ctor public TranslationService();
     method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
     method public void onConnected();
-    method public abstract void onCreateTranslationSession(@NonNull android.view.translation.TranslationContext, int);
+    method public void onCreateTranslationSession(@NonNull android.view.translation.TranslationContext, int, @NonNull java.util.function.Consumer<java.lang.Boolean>);
+    method @Deprecated public abstract void onCreateTranslationSession(@NonNull android.view.translation.TranslationContext, int);
     method public void onDisconnected();
     method public abstract void onFinishTranslationSession(int);
     method public abstract void onTranslationCapabilitiesRequest(int, int, @NonNull java.util.function.Consumer<java.util.Set<android.view.translation.TranslationCapability>>);
     method public abstract void onTranslationRequest(@NonNull android.view.translation.TranslationRequest, int, @Nullable android.os.CancellationSignal, @NonNull android.service.translation.TranslationService.OnTranslationResultCallback);
+    method public final void updateTranslationCapability(@NonNull android.view.translation.TranslationCapability);
     field public static final String SERVICE_INTERFACE = "android.service.translation.TranslationService";
     field public static final String SERVICE_META_DATA = "android.translation_service";
   }
 
   public static interface TranslationService.OnTranslationResultCallback {
-    method public void onError();
+    method @Deprecated public void onError();
     method public void onTranslationSuccess(@NonNull android.view.translation.TranslationResponse);
   }
 
@@ -10483,6 +10488,7 @@
     ctor public AlwaysOnHotwordDetector.Callback();
     method public abstract void onAvailabilityChanged(int);
     method public void onHotwordDetectionServiceInitialized(int);
+    method public void onHotwordDetectionServiceRestarted();
     method public void onRejected(@Nullable android.service.voice.HotwordRejectedResult);
   }
 
@@ -10507,6 +10513,7 @@
     method public static int getMaxBundleSize();
     method public static int getMaxHotwordPhraseId();
     method public static int getMaxScore();
+    method @Nullable public android.media.MediaSyncEvent getMediaSyncEvent();
     method public int getPersonalizedScore();
     method public int getScore();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
@@ -10521,6 +10528,7 @@
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setConfidenceLevel(int);
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setExtras(@NonNull android.os.PersistableBundle);
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setHotwordPhraseId(int);
+    method @NonNull public android.service.voice.HotwordDetectedResult.Builder setMediaSyncEvent(@NonNull android.media.MediaSyncEvent);
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setPersonalizedScore(int);
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setScore(int);
   }
@@ -10528,8 +10536,10 @@
   public abstract class HotwordDetectionService extends android.app.Service {
     ctor public HotwordDetectionService();
     method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
-    method public void onDetect(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, long, @NonNull android.service.voice.HotwordDetectionService.Callback);
-    method public void onDetect(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @NonNull android.service.voice.HotwordDetectionService.Callback);
+    method @Deprecated public void onDetect(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, long, @NonNull android.service.voice.HotwordDetectionService.Callback);
+    method public void onDetect(@NonNull android.service.voice.AlwaysOnHotwordDetector.EventPayload, long, @NonNull android.service.voice.HotwordDetectionService.Callback);
+    method @Deprecated public void onDetect(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @NonNull android.service.voice.HotwordDetectionService.Callback);
+    method public void onDetect(@NonNull android.service.voice.HotwordDetectionService.Callback);
     method public void onDetect(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @Nullable android.os.PersistableBundle, @NonNull android.service.voice.HotwordDetectionService.Callback);
     method public void onUpdateState(@Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, long, @Nullable java.util.function.IntConsumer);
     field public static final int INITIALIZATION_STATUS_CUSTOM_ERROR_1 = 1; // 0x1
@@ -10548,6 +10558,7 @@
     method @RequiresPermission(allOf={android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.CAPTURE_AUDIO_HOTWORD}) public boolean startRecognition();
     method public boolean startRecognition(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @Nullable android.os.PersistableBundle);
     method public boolean stopRecognition();
+    method public void updateState(@Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory);
     field public static final int CONFIDENCE_LEVEL_HIGH = 3; // 0x3
     field public static final int CONFIDENCE_LEVEL_LOW = 1; // 0x1
     field public static final int CONFIDENCE_LEVEL_MEDIUM = 2; // 0x2
@@ -10558,6 +10569,7 @@
     method public void onDetected(@NonNull android.service.voice.AlwaysOnHotwordDetector.EventPayload);
     method public void onError();
     method public void onHotwordDetectionServiceInitialized(int);
+    method public void onHotwordDetectionServiceRestarted();
     method public void onRecognitionPaused();
     method public void onRecognitionResumed();
     method public void onRejected(@Nullable android.service.voice.HotwordRejectedResult);
@@ -10573,7 +10585,8 @@
   public class VoiceInteractionService extends android.app.Service {
     method @NonNull public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(String, java.util.Locale, android.service.voice.AlwaysOnHotwordDetector.Callback);
     method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_HOTWORD_DETECTION) public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(String, java.util.Locale, @Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, android.service.voice.AlwaysOnHotwordDetector.Callback);
-    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_HOTWORD_DETECTION) public final android.service.voice.HotwordDetector createHotwordDetector(@NonNull android.media.AudioFormat, @Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, @NonNull android.service.voice.HotwordDetector.Callback);
+    method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_HOTWORD_DETECTION) public final android.service.voice.HotwordDetector createHotwordDetector(@NonNull android.media.AudioFormat, @Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, @NonNull android.service.voice.HotwordDetector.Callback);
+    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_HOTWORD_DETECTION) public final android.service.voice.HotwordDetector createHotwordDetector(@Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, @NonNull android.service.voice.HotwordDetector.Callback);
     method @NonNull @RequiresPermission("android.permission.MANAGE_VOICE_KEYPHRASES") public final android.media.voice.KeyphraseModelManager createKeyphraseModelManager();
   }
 
@@ -11082,17 +11095,6 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR;
   }
 
-  public final class CarrierBandwidth implements android.os.Parcelable {
-    ctor public CarrierBandwidth(int, int, int, int);
-    method public int describeContents();
-    method public int getPrimaryDownlinkCapacityKbps();
-    method public int getPrimaryUplinkCapacityKbps();
-    method public int getSecondaryDownlinkCapacityKbps();
-    method public int getSecondaryUplinkCapacityKbps();
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CarrierBandwidth> CREATOR;
-    field public static final int INVALID = -1; // 0xffffffff
-  }
-
   public class CarrierConfigManager {
     method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDefaultCarrierServicePackageName();
     method @NonNull public static android.os.PersistableBundle getDefaultConfig();
@@ -11895,8 +11897,8 @@
     method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) @WorkerThread public void bootstrapAuthenticationRequest(int, @NonNull android.net.Uri, @NonNull android.telephony.gba.UaSecurityProtocolIdentifier, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.BootstrapAuthenticationCallback);
     method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String);
     method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult changeIccLockPin(@NonNull String, @NonNull String);
-    method public int checkCarrierPrivilegesForPackage(String);
-    method public int checkCarrierPrivilegesForPackageAnyPhone(String);
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int checkCarrierPrivilegesForPackage(String);
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int checkCarrierPrivilegesForPackageAnyPhone(String);
     method public void dial(String);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean disableDataConnectivity();
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableDataConnectivity();
@@ -11912,7 +11914,7 @@
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getCallWaitingStatus(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int);
     method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
-    method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
+    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCarrierPrivilegeStatus(int);
     method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<java.lang.String> getCarrierPrivilegedPackagesForAllActiveSubscriptions();
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.CarrierRestrictionRules getCarrierRestrictionRules();
@@ -12813,10 +12815,11 @@
   }
 
   public interface DelegateStateCallback {
+    method public void onConfigurationChanged(@NonNull android.telephony.ims.SipDelegateConfiguration);
     method public void onCreated(@NonNull android.telephony.ims.stub.SipDelegate, @Nullable java.util.Set<android.telephony.ims.FeatureTagState>);
     method public void onDestroyed(int);
     method public void onFeatureTagRegistrationChanged(@NonNull android.telephony.ims.DelegateRegistrationState);
-    method public void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration);
+    method @Deprecated public void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration);
   }
 
   public final class FeatureTagState implements android.os.Parcelable {
@@ -13560,6 +13563,76 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtensionType> CREATOR;
   }
 
+  public final class SipDelegateConfiguration implements android.os.Parcelable {
+    method public int describeContents();
+    method @Nullable public String getHomeDomain();
+    method @Nullable public String getImei();
+    method @Nullable public android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration getIpSecConfiguration();
+    method @NonNull public java.net.InetSocketAddress getLocalAddress();
+    method public int getMaxUdpPayloadSizeBytes();
+    method @Nullable public java.net.InetSocketAddress getNatSocketAddress();
+    method @Nullable public String getPrivateUserIdentifier();
+    method @Nullable public android.net.Uri getPublicGruuUri();
+    method @Nullable public String getPublicUserIdentifier();
+    method @Nullable public String getSipAssociatedUriHeader();
+    method @Nullable public String getSipAuthenticationHeader();
+    method @Nullable public String getSipAuthenticationNonce();
+    method @Nullable public String getSipCniHeader();
+    method @Nullable public String getSipContactUserParameter();
+    method @Nullable public String getSipPaniHeader();
+    method @Nullable public String getSipPathHeader();
+    method @Nullable public String getSipPlaniHeader();
+    method @NonNull public java.net.InetSocketAddress getSipServerAddress();
+    method @Nullable public String getSipServiceRouteHeader();
+    method @Nullable public String getSipUserAgentHeader();
+    method public int getTransportType();
+    method @IntRange(from=0) public long getVersion();
+    method public boolean isSipCompactFormEnabled();
+    method public boolean isSipKeepaliveEnabled();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.SipDelegateConfiguration> CREATOR;
+    field public static final int SIP_TRANSPORT_TCP = 1; // 0x1
+    field public static final int SIP_TRANSPORT_UDP = 0; // 0x0
+    field public static final int UDP_PAYLOAD_SIZE_UNDEFINED = -1; // 0xffffffff
+  }
+
+  public static final class SipDelegateConfiguration.Builder {
+    ctor public SipDelegateConfiguration.Builder(@IntRange(from=0) long, int, @NonNull java.net.InetSocketAddress, @NonNull java.net.InetSocketAddress);
+    ctor public SipDelegateConfiguration.Builder(@NonNull android.telephony.ims.SipDelegateConfiguration);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration build();
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setHomeDomain(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setImei(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setIpSecConfiguration(@Nullable android.telephony.ims.SipDelegateConfiguration.IpSecConfiguration);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setMaxUdpPayloadSizeBytes(@IntRange(from=1) int);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setNatSocketAddress(@Nullable java.net.InetSocketAddress);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setPrivateUserIdentifier(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setPublicGruuUri(@Nullable android.net.Uri);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setPublicUserIdentifier(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipAssociatedUriHeader(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipAuthenticationHeader(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipAuthenticationNonce(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipCniHeader(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipCompactFormEnabled(boolean);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipContactUserParameter(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipKeepaliveEnabled(boolean);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipPaniHeader(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipPathHeader(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipPlaniHeader(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipServiceRouteHeader(@Nullable String);
+    method @NonNull public android.telephony.ims.SipDelegateConfiguration.Builder setSipUserAgentHeader(@Nullable String);
+  }
+
+  public static final class SipDelegateConfiguration.IpSecConfiguration {
+    ctor public SipDelegateConfiguration.IpSecConfiguration(int, int, int, int, int, int, @NonNull String);
+    method public int getLastLocalTxPort();
+    method public int getLastRemoteTxPort();
+    method public int getLocalRxPort();
+    method public int getLocalTxPort();
+    method public int getRemoteRxPort();
+    method public int getRemoteTxPort();
+    method @NonNull public String getSipSecurityVerifyHeader();
+  }
+
   public interface SipDelegateConnection {
     method public default void cleanupSession(@NonNull String);
     method @Deprecated public default void closeDialog(@NonNull String);
@@ -13568,65 +13641,65 @@
     method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long);
   }
 
-  public final class SipDelegateImsConfiguration implements android.os.Parcelable {
-    method public boolean containsKey(@NonNull String);
-    method @NonNull public android.os.PersistableBundle copyBundle();
-    method public int describeContents();
-    method public boolean getBoolean(@NonNull String, boolean);
-    method public int getInt(@NonNull String, int);
-    method @Nullable public String getString(@NonNull String);
-    method public long getVersion();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.SipDelegateImsConfiguration> CREATOR;
-    field public static final String IPTYPE_IPV4 = "IPV4";
-    field public static final String IPTYPE_IPV6 = "IPV6";
-    field public static final String KEY_SIP_CONFIG_AUTHENTICATION_HEADER_STRING = "sip_config_auhentication_header_string";
-    field public static final String KEY_SIP_CONFIG_AUTHENTICATION_NONCE_STRING = "sip_config_authentication_nonce_string";
-    field public static final String KEY_SIP_CONFIG_CELLULAR_NETWORK_INFO_HEADER_STRING = "sip_config_cellular_network_info_header_string";
-    field public static final String KEY_SIP_CONFIG_HOME_DOMAIN_STRING = "sip_config_home_domain_string";
-    field public static final String KEY_SIP_CONFIG_IMEI_STRING = "sip_config_imei_string";
-    field public static final String KEY_SIP_CONFIG_IPTYPE_STRING = "sip_config_iptype_string";
-    field public static final String KEY_SIP_CONFIG_IS_COMPACT_FORM_ENABLED_BOOL = "sip_config_is_compact_form_enabled_bool";
-    field public static final String KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL = "sip_config_is_gruu_enabled_bool";
-    field public static final String KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL = "sip_config_is_ipsec_enabled_bool";
-    field public static final String KEY_SIP_CONFIG_IS_KEEPALIVE_ENABLED_BOOL = "sip_config_is_keepalive_enabled_bool";
-    field public static final String KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL = "sip_config_is_nat_enabled_bool";
-    field public static final String KEY_SIP_CONFIG_MAX_PAYLOAD_SIZE_ON_UDP_INT = "sip_config_udp_max_payload_size_int";
-    field public static final String KEY_SIP_CONFIG_PATH_HEADER_STRING = "sip_config_path_header_string";
-    field public static final String KEY_SIP_CONFIG_P_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_access_network_info_header_string";
-    field public static final String KEY_SIP_CONFIG_P_ASSOCIATED_URI_HEADER_STRING = "sip_config_p_associated_uri_header_string";
-    field public static final String KEY_SIP_CONFIG_P_LAST_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_last_access_network_info_header_string";
-    field public static final String KEY_SIP_CONFIG_SECURITY_VERIFY_HEADER_STRING = "sip_config_security_verify_header_string";
-    field public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_IPADDRESS_STRING = "sip_config_server_default_ipaddress_string";
-    field public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_PORT_INT = "sip_config_server_default_port_int";
-    field public static final String KEY_SIP_CONFIG_SERVER_IPSEC_CLIENT_PORT_INT = "sip_config_server_ipsec_client_port_int";
-    field public static final String KEY_SIP_CONFIG_SERVER_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_server_ipsec_old_client_port_int";
-    field public static final String KEY_SIP_CONFIG_SERVER_IPSEC_SERVER_PORT_INT = "sip_config_server_ipsec_server_port_int";
-    field public static final String KEY_SIP_CONFIG_SERVICE_ROUTE_HEADER_STRING = "sip_config_service_route_header_string";
-    field public static final String KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING = "sip_config_protocol_type_string";
-    field public static final String KEY_SIP_CONFIG_UE_DEFAULT_IPADDRESS_STRING = "sip_config_ue_default_ipaddress_string";
-    field public static final String KEY_SIP_CONFIG_UE_DEFAULT_PORT_INT = "sip_config_ue_default_port_int";
-    field public static final String KEY_SIP_CONFIG_UE_IPSEC_CLIENT_PORT_INT = "sip_config_ue_ipsec_client_port_int";
-    field public static final String KEY_SIP_CONFIG_UE_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_ue_ipsec_old_client_port_int";
-    field public static final String KEY_SIP_CONFIG_UE_IPSEC_SERVER_PORT_INT = "sip_config_ue_ipsec_server_port_int";
-    field public static final String KEY_SIP_CONFIG_UE_PRIVATE_USER_ID_STRING = "sip_config_ue_private_user_id_string";
-    field public static final String KEY_SIP_CONFIG_UE_PUBLIC_GRUU_STRING = "sip_config_ue_public_gruu_string";
-    field public static final String KEY_SIP_CONFIG_UE_PUBLIC_IPADDRESS_WITH_NAT_STRING = "sip_config_ue_public_ipaddress_with_nat_string";
-    field public static final String KEY_SIP_CONFIG_UE_PUBLIC_PORT_WITH_NAT_INT = "sip_config_ue_public_port_with_nat_int";
-    field public static final String KEY_SIP_CONFIG_UE_PUBLIC_USER_ID_STRING = "sip_config_ue_public_user_id_string";
-    field public static final String KEY_SIP_CONFIG_URI_USER_PART_STRING = "sip_config_uri_user_part_string";
-    field public static final String KEY_SIP_CONFIG_USER_AGENT_HEADER_STRING = "sip_config_sip_user_agent_header_string";
-    field public static final String SIP_TRANSPORT_TCP = "TCP";
-    field public static final String SIP_TRANSPORT_UDP = "UDP";
+  @Deprecated public final class SipDelegateImsConfiguration implements android.os.Parcelable {
+    method @Deprecated public boolean containsKey(@NonNull String);
+    method @Deprecated @NonNull public android.os.PersistableBundle copyBundle();
+    method @Deprecated public int describeContents();
+    method @Deprecated public boolean getBoolean(@NonNull String, boolean);
+    method @Deprecated public int getInt(@NonNull String, int);
+    method @Deprecated @Nullable public String getString(@NonNull String);
+    method @Deprecated public long getVersion();
+    method @Deprecated public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.SipDelegateImsConfiguration> CREATOR;
+    field @Deprecated public static final String IPTYPE_IPV4 = "IPV4";
+    field @Deprecated public static final String IPTYPE_IPV6 = "IPV6";
+    field @Deprecated public static final String KEY_SIP_CONFIG_AUTHENTICATION_HEADER_STRING = "sip_config_auhentication_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_AUTHENTICATION_NONCE_STRING = "sip_config_authentication_nonce_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_CELLULAR_NETWORK_INFO_HEADER_STRING = "sip_config_cellular_network_info_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_HOME_DOMAIN_STRING = "sip_config_home_domain_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_IMEI_STRING = "sip_config_imei_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_IPTYPE_STRING = "sip_config_iptype_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_IS_COMPACT_FORM_ENABLED_BOOL = "sip_config_is_compact_form_enabled_bool";
+    field @Deprecated public static final String KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL = "sip_config_is_gruu_enabled_bool";
+    field @Deprecated public static final String KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL = "sip_config_is_ipsec_enabled_bool";
+    field @Deprecated public static final String KEY_SIP_CONFIG_IS_KEEPALIVE_ENABLED_BOOL = "sip_config_is_keepalive_enabled_bool";
+    field @Deprecated public static final String KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL = "sip_config_is_nat_enabled_bool";
+    field @Deprecated public static final String KEY_SIP_CONFIG_MAX_PAYLOAD_SIZE_ON_UDP_INT = "sip_config_udp_max_payload_size_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_PATH_HEADER_STRING = "sip_config_path_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_P_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_access_network_info_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_P_ASSOCIATED_URI_HEADER_STRING = "sip_config_p_associated_uri_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_P_LAST_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_last_access_network_info_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_SECURITY_VERIFY_HEADER_STRING = "sip_config_security_verify_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_IPADDRESS_STRING = "sip_config_server_default_ipaddress_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_PORT_INT = "sip_config_server_default_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_IPSEC_CLIENT_PORT_INT = "sip_config_server_ipsec_client_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_server_ipsec_old_client_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_IPSEC_SERVER_PORT_INT = "sip_config_server_ipsec_server_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_SERVICE_ROUTE_HEADER_STRING = "sip_config_service_route_header_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING = "sip_config_protocol_type_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_DEFAULT_IPADDRESS_STRING = "sip_config_ue_default_ipaddress_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_DEFAULT_PORT_INT = "sip_config_ue_default_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_IPSEC_CLIENT_PORT_INT = "sip_config_ue_ipsec_client_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_ue_ipsec_old_client_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_IPSEC_SERVER_PORT_INT = "sip_config_ue_ipsec_server_port_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_PRIVATE_USER_ID_STRING = "sip_config_ue_private_user_id_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_GRUU_STRING = "sip_config_ue_public_gruu_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_IPADDRESS_WITH_NAT_STRING = "sip_config_ue_public_ipaddress_with_nat_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_PORT_WITH_NAT_INT = "sip_config_ue_public_port_with_nat_int";
+    field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_USER_ID_STRING = "sip_config_ue_public_user_id_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_URI_USER_PART_STRING = "sip_config_uri_user_part_string";
+    field @Deprecated public static final String KEY_SIP_CONFIG_USER_AGENT_HEADER_STRING = "sip_config_sip_user_agent_header_string";
+    field @Deprecated public static final String SIP_TRANSPORT_TCP = "TCP";
+    field @Deprecated public static final String SIP_TRANSPORT_UDP = "UDP";
   }
 
-  public static final class SipDelegateImsConfiguration.Builder {
-    ctor public SipDelegateImsConfiguration.Builder(int);
-    ctor public SipDelegateImsConfiguration.Builder(@NonNull android.telephony.ims.SipDelegateImsConfiguration);
-    method @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addBoolean(@NonNull String, boolean);
-    method @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addInt(@NonNull String, int);
-    method @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addString(@NonNull String, @NonNull String);
-    method @NonNull public android.telephony.ims.SipDelegateImsConfiguration build();
+  @Deprecated public static final class SipDelegateImsConfiguration.Builder {
+    ctor @Deprecated public SipDelegateImsConfiguration.Builder(int);
+    ctor @Deprecated public SipDelegateImsConfiguration.Builder(@NonNull android.telephony.ims.SipDelegateImsConfiguration);
+    method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addBoolean(@NonNull String, boolean);
+    method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addInt(@NonNull String, int);
+    method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addString(@NonNull String, @NonNull String);
+    method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration build();
   }
 
   public class SipDelegateManager {
@@ -13796,10 +13869,11 @@
   }
 
   public interface DelegateConnectionStateCallback {
+    method public default void onConfigurationChanged(@NonNull android.telephony.ims.SipDelegateConfiguration);
     method public void onCreated(@NonNull android.telephony.ims.SipDelegateConnection);
     method public void onDestroyed(int);
     method public void onFeatureTagStatusChanged(@NonNull android.telephony.ims.DelegateRegistrationState, @NonNull java.util.Set<android.telephony.ims.FeatureTagState>);
-    method public void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration);
+    method @Deprecated public default void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration);
   }
 
   public class ImsCallSessionImplBase implements java.lang.AutoCloseable {
@@ -13922,6 +13996,7 @@
     field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1
     field public static final int REGISTRATION_TECH_LTE = 0; // 0x0
     field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff
+    field public static final int REGISTRATION_TECH_NR = 3; // 0x3
   }
 
   public class ImsSmsImplBase {
@@ -14320,12 +14395,15 @@
   }
 
   public static interface UwbManager.AdapterStateCallback {
-    method public void onStateChanged(boolean, int);
+    method public void onStateChanged(int, int);
     field public static final int STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED = 1; // 0x1
     field public static final int STATE_CHANGED_REASON_ERROR_UNKNOWN = 4; // 0x4
     field public static final int STATE_CHANGED_REASON_SESSION_STARTED = 0; // 0x0
     field public static final int STATE_CHANGED_REASON_SYSTEM_BOOT = 3; // 0x3
     field public static final int STATE_CHANGED_REASON_SYSTEM_POLICY = 2; // 0x2
+    field public static final int STATE_DISABLED = 0; // 0x0
+    field public static final int STATE_ENABLED_ACTIVE = 2; // 0x2
+    field public static final int STATE_ENABLED_INACTIVE = 1; // 0x1
   }
 
 }
@@ -14446,7 +14524,21 @@
     method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void finishTranslation(@NonNull android.app.assist.ActivityId);
     method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void pauseTranslation(@NonNull android.app.assist.ActivityId);
     method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void resumeTranslation(@NonNull android.app.assist.ActivityId);
-    method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void startTranslation(@NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec, @NonNull java.util.List<android.view.autofill.AutofillId>, @NonNull android.app.assist.ActivityId);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void startTranslation(@NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec, @NonNull java.util.List<android.view.autofill.AutofillId>, @NonNull android.app.assist.ActivityId);
+    method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void startTranslation(@NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec, @NonNull java.util.List<android.view.autofill.AutofillId>, @NonNull android.app.assist.ActivityId, @NonNull android.view.translation.UiTranslationSpec);
+  }
+
+  public final class UiTranslationSpec implements android.os.Parcelable {
+    method public int describeContents();
+    method public boolean shouldPadContentForCompat();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.view.translation.UiTranslationSpec> CREATOR;
+  }
+
+  public static final class UiTranslationSpec.Builder {
+    ctor public UiTranslationSpec.Builder();
+    method @NonNull public android.view.translation.UiTranslationSpec build();
+    method @NonNull public android.view.translation.UiTranslationSpec.Builder setShouldPadContentForCompat(boolean);
   }
 
 }
@@ -14833,7 +14925,7 @@
     method public default boolean onCheckIsTextEditor();
     method public void onConfigurationChanged(android.content.res.Configuration);
     method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
-    method public default void onCreateTranslationRequests(@NonNull long[], @NonNull int[], @NonNull java.util.function.Consumer<android.view.translation.ViewTranslationRequest>);
+    method public default void onCreateVirtualViewTranslationRequests(@NonNull long[], @NonNull int[], @NonNull java.util.function.Consumer<android.view.translation.ViewTranslationRequest>);
     method public void onDetachedFromWindow();
     method public boolean onDragEvent(android.view.DragEvent);
     method public void onDraw(android.graphics.Canvas);
@@ -14858,7 +14950,7 @@
     method public void onStartTemporaryDetach();
     method public boolean onTouchEvent(android.view.MotionEvent);
     method public boolean onTrackballEvent(android.view.MotionEvent);
-    method public default void onTranslationResponse(@NonNull android.util.LongSparseArray<android.view.translation.ViewTranslationResponse>);
+    method public default void onVirtualViewTranslationResponses(@NonNull android.util.LongSparseArray<android.view.translation.ViewTranslationResponse>);
     method public void onVisibilityChanged(android.view.View, int);
     method public void onWindowFocusChanged(boolean);
     method public void onWindowVisibilityChanged(int);
diff --git a/core/api/system-removed.txt b/core/api/system-removed.txt
index bf9f4f1..f366a54 100644
--- a/core/api/system-removed.txt
+++ b/core/api/system-removed.txt
@@ -189,14 +189,3 @@
 
 }
 
-package android.view.translation {
-
-  public final class UiTranslationManager {
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void finishTranslation(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void pauseTranslation(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void resumeTranslation(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void startTranslation(@NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec, @NonNull java.util.List<android.view.autofill.AutofillId>, int);
-  }
-
-}
-
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 3ce2df8..dd97cda1 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -17,6 +17,7 @@
     field public static final String CONTROL_DEVICE_STATE = "android.permission.CONTROL_DEVICE_STATE";
     field public static final String FORCE_DEVICE_POLICY_MANAGER_LOGS = "android.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS";
     field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES";
+    field public static final String INSTALL_TEST_ONLY_PACKAGE = "android.permission.INSTALL_TEST_ONLY_PACKAGE";
     field public static final String KEEP_UNINSTALLED_PACKAGES = "android.permission.KEEP_UNINSTALLED_PACKAGES";
     field @Deprecated public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
     field public static final String MANAGE_ACTIVITY_TASKS = "android.permission.MANAGE_ACTIVITY_TASKS";
@@ -347,6 +348,10 @@
     method public boolean isSeamlessResizeEnabled();
   }
 
+  public final class PictureInPictureUiState implements android.os.Parcelable {
+    ctor public PictureInPictureUiState(boolean);
+  }
+
   public class StatusBarManager {
     method public void clickNotification(@Nullable String, int, int, boolean);
     method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void collapsePanels();
@@ -377,6 +382,7 @@
     method @Deprecated public boolean revokeRuntimePermission(String, String, android.os.UserHandle);
     method public void syncInputTransactions();
     method public void syncInputTransactions(boolean);
+    method @Nullable public android.graphics.Bitmap takeScreenshot(@NonNull android.view.Window);
     field @NonNull public static final java.util.Set<java.lang.String> ALL_PERMISSIONS;
   }
 
@@ -783,8 +789,10 @@
 
   public class ActivityInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable {
     method public static boolean isTranslucentOrFloating(android.content.res.TypedArray);
+    field public static final long ALWAYS_SANDBOX_DISPLAY_APIS = 185004937L; // 0xb06f389L
     field public static final long FORCE_NON_RESIZE_APP = 181136395L; // 0xacbec0bL
     field public static final long FORCE_RESIZE_APP = 174042936L; // 0xa5faf38L
+    field public static final long NEVER_SANDBOX_DISPLAY_APIS = 184838306L; // 0xb0468a2L
     field public static final long OVERRIDE_MIN_ASPECT_RATIO = 174042980L; // 0xa5faf64L
     field public static final long OVERRIDE_MIN_ASPECT_RATIO_LARGE = 180326787L; // 0xabf9183L
     field public static final float OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE = 1.7777778f;
@@ -809,6 +817,7 @@
   }
 
   public static class PackageInstaller.SessionParams implements android.os.Parcelable {
+    method public void setInstallFlagAllowTest();
     method public void setInstallerPackageName(@Nullable String);
   }
 
@@ -827,10 +836,8 @@
     method public void holdLock(android.os.IBinder, int);
     method @RequiresPermission(android.Manifest.permission.KEEP_UNINSTALLED_PACKAGES) public void setKeepUninstalledPackages(@NonNull java.util.List<java.lang.String>);
     field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage";
-    field public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle";
     field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
     field public static final String FEATURE_HDMI_CEC = "android.hardware.hdmi.cec";
-    field public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle";
     field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80
     field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000
     field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
@@ -1055,23 +1062,10 @@
 package android.hardware {
 
   public final class SensorPrivacyManager {
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int);
-    method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener);
     method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacy(int, boolean);
     method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacyForProfileGroup(int, boolean);
   }
 
-  public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener {
-    method public void onSensorPrivacyChanged(boolean);
-  }
-
-  public static class SensorPrivacyManager.Sensors {
-    field public static final int CAMERA = 2; // 0x2
-    field public static final int MICROPHONE = 1; // 0x1
-  }
-
 }
 
 package android.hardware.biometrics {
@@ -1232,6 +1226,14 @@
 
 }
 
+package android.hardware.lights {
+
+  public abstract class LightsManager {
+    method @NonNull public abstract android.hardware.lights.LightsManager.LightsSession openSession(int);
+  }
+
+}
+
 package android.hardware.soundtrigger {
 
   public class KeyphraseEnrollmentInfo {
@@ -2101,6 +2103,7 @@
     field public static final String AUTOMATIC_POWER_SAVE_MODE = "automatic_power_save_mode";
     field public static final String BATTERY_SAVER_CONSTANTS = "battery_saver_constants";
     field public static final String DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW = "enable_non_resizable_multi_window";
+    field public static final String DISABLE_WINDOW_BLURS = "disable_window_blurs";
     field public static final String DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD = "dynamic_power_savings_disable_threshold";
     field public static final String DYNAMIC_POWER_SAVINGS_ENABLED = "dynamic_power_savings_enabled";
     field public static final String HIDDEN_API_BLACKLIST_EXEMPTIONS = "hidden_api_blacklist_exemptions";
@@ -2109,7 +2112,7 @@
     field public static final String LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST = "location_ignore_settings_package_whitelist";
     field public static final String LOW_POWER_MODE = "low_power";
     field public static final String LOW_POWER_MODE_STICKY = "low_power_sticky";
-    field public static final String NOTIFICATION_BUBBLES = "notification_bubbles";
+    field @Deprecated public static final String NOTIFICATION_BUBBLES = "notification_bubbles";
     field public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices";
     field public static final String SHOW_FIRST_CRASH_DIALOG = "show_first_crash_dialog";
     field public static final String USER_DISABLED_HDR_FORMATS = "user_disabled_hdr_formats";
@@ -2133,6 +2136,7 @@
     field public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations";
     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 NOTIFICATION_BUBBLES = "notification_bubbles";
     field public static final String POWER_MENU_LOCKED_SHOW_CONTENT = "power_menu_locked_show_content";
     field public static final String SELECTED_SPELL_CHECKER = "selected_spell_checker";
     field public static final String SELECTED_SPELL_CHECKER_SUBTYPE = "selected_spell_checker_subtype";
@@ -2341,6 +2345,14 @@
 
 }
 
+package android.service.voice {
+
+  public class AlwaysOnHotwordDetector implements android.service.voice.HotwordDetector {
+    method @RequiresPermission(allOf={android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.CAPTURE_AUDIO_HOTWORD}) public void triggerHardwareRecognitionEventForTest(int, int, boolean, int, int, int, boolean, @NonNull android.media.AudioFormat, @Nullable byte[]);
+  }
+
+}
+
 package android.service.watchdog {
 
   public abstract class ExplicitHealthCheckService extends android.app.Service {
@@ -2450,6 +2462,7 @@
   public class TelephonyManager {
     method public int addDevicePolicyOverrideApn(@NonNull android.content.Context, @NonNull android.telephony.data.ApnSetting);
     method public int getCarrierIdListVersion();
+    method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<java.lang.String> getCertsFromCarrierPrivilegeAccessRules();
     method @NonNull public java.util.List<android.telephony.data.ApnSetting> getDevicePolicyOverrideApns(@NonNull android.content.Context);
     method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getLine1AlphaTag();
     method public android.util.Pair<java.lang.Integer,java.lang.Integer> getRadioHalVersion();
@@ -2768,7 +2781,6 @@
     method public default void holdLock(android.os.IBinder, int);
     method public default boolean isTaskSnapshotSupported();
     method public default void setDisplayImePolicy(int, int);
-    method public default void setForceCrossWindowBlurDisabled(boolean);
     method public default void setShouldShowSystemDecors(int, boolean);
     method public default void setShouldShowWithInsecureKeyguard(int, boolean);
     method public default boolean shouldShowSystemDecors(int);
diff --git a/core/java/android/annotation/RequiresNoPermission.java b/core/java/android/annotation/RequiresNoPermission.java
index 6ff4d6e..cdbf36e 100644
--- a/core/java/android/annotation/RequiresNoPermission.java
+++ b/core/java/android/annotation/RequiresNoPermission.java
@@ -27,7 +27,19 @@
 
 /**
  * Denotes that the annotated element requires no permissions.
+ * <p>
+ * This explicit annotation helps distinguish which of three states that an
+ * element may exist in:
+ * <ul>
+ * <li>Annotated with {@link RequiresPermission}, indicating that an element
+ * requires (or may require) one or more permissions.
+ * <li>Annotated with {@link RequiresNoPermission}, indicating that an element
+ * requires no permissions.
+ * <li>Neither annotation, indicating that no explicit declaration about
+ * permissions has been made for that element.
+ * </ul>
  *
+ * @see RequiresPermission
  * @hide
  */
 @Retention(CLASS)
diff --git a/core/java/android/annotation/RequiresPermission.java b/core/java/android/annotation/RequiresPermission.java
index 303ab41..0379d30 100644
--- a/core/java/android/annotation/RequiresPermission.java
+++ b/core/java/android/annotation/RequiresPermission.java
@@ -74,6 +74,7 @@
  *   public static final String ACTION_CALL = "android.intent.action.CALL";
  * }</pre>
  *
+ * @see RequiresNoPermission
  * @hide
  */
 @Retention(CLASS)
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 77f0cf8..198fa65 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2813,6 +2813,29 @@
     }
 
     /**
+     * Called by the system when the activity is in PiP and has state changes.
+     *
+     * Compare to {@link #onPictureInPictureModeChanged(boolean, Configuration)}, which is only
+     * called when PiP mode changes (meaning, enters or exits PiP), this can be called at any time
+     * while the activity is in PiP mode. Therefore, all invocation can only happen after
+     * {@link #onPictureInPictureModeChanged(boolean, Configuration)} is called with true, and
+     * before {@link #onPictureInPictureModeChanged(boolean, Configuration)} is called with false.
+     * You would not need to worry about cases where this is called and the activity is not in
+     * Picture-In-Picture mode. For managing cases where the activity enters/exits
+     * Picture-in-Picture (e.g. resources clean-up on exit), use
+     * {@link #onPictureInPictureModeChanged(boolean, Configuration)}.
+     *
+     * The default state is everything declared in {@link PictureInPictureUiState} is false, such as
+     * {@link PictureInPictureUiState#isStashed()}.
+     *
+     * @param pipState the new Picture-in-Picture state.
+     */
+    public void onPictureInPictureUiStateChanged(@NonNull PictureInPictureUiState pipState) {
+        // Left deliberately empty. There should be no side effects if a direct
+        // subclass of Activity does not call super.
+    }
+
+    /**
      * Called by the system when the activity changes to and from picture-in-picture mode.
      *
      * @see android.R.attr#supportsPictureInPicture
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index a24555f..6d2d023 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -1947,8 +1947,9 @@
             pw.print(((baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0));
             pw.print(" activityType="); pw.print(activityTypeToString(getActivityType()));
             pw.print(" windowingMode="); pw.print(windowingModeToString(getWindowingMode()));
-            pw.print(" supportsSplitScreenMultiWindow=");
-            pw.println(supportsSplitScreenMultiWindow);
+            pw.print(" supportsSplitScreenMultiWindow="); pw.print(supportsSplitScreenMultiWindow);
+            pw.print(" supportsMultiWindow=");
+            pw.println(supportsMultiWindow);
             if (taskDescription != null) {
                 pw.print("   ");
                 final ActivityManager.TaskDescription td = taskDescription;
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index a7d5b05..6053400 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -561,6 +561,14 @@
     public abstract Intent getIntentForIntentSender(IIntentSender sender);
 
     /**
+     * Effectively PendingIntent.getActivityForUser(), but the PendingIntent is
+     * owned by the given uid rather than by the caller (i.e. the system).
+     */
+    public abstract PendingIntent getPendingIntentActivityAsApp(
+            int requestCode, @NonNull Intent intent, int flags, Bundle options,
+            String ownerPkgName, int ownerUid);
+
+    /**
      * @return mBootTimeTempAllowlistDuration of ActivityManagerConstants.
      */
     public abstract long getBootTimeTempAllowListDuration();
@@ -570,4 +578,9 @@
 
     /** Unregister an {@link AnrController} */
     public abstract void unregisterAnrController(AnrController controller);
+
+    /**
+     * Is the FGS started from an uid temporarily allowed to have while-in-use permission?
+     */
+    public abstract boolean isTempAllowlistedForFgsWhileInUse(int uid);
 }
diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java
index 28d6fbb..4a7fcd2 100644
--- a/core/java/android/app/ActivityTaskManager.java
+++ b/core/java/android/app/ActivityTaskManager.java
@@ -349,20 +349,6 @@
     }
 
     /**
-     * Whether to allow non-resizable apps to be shown in multi-window. The app will be letterboxed
-     * if the request orientation is not met, and will be shown in size-compat mode if the container
-     * size has changed.
-     * @hide
-     */
-    public static boolean supportsNonResizableMultiWindow() {
-        try {
-            return ActivityTaskManager.getService().supportsNonResizableMultiWindow();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
      * @return whether the UI mode of the given config supports error dialogs (ANR, crash, etc).
      * @hide
      */
@@ -400,8 +386,18 @@
      */
     public List<ActivityManager.RunningTaskInfo> getTasks(
             int maxNum, boolean filterOnlyVisibleRecents) {
+        return getTasks(maxNum, filterOnlyVisibleRecents, false /* keepIntentExtra */);
+    }
+
+    /**
+     * @return List of running tasks that can be filtered by visibility in recents and keep intent
+     * extra.
+     * @hide
+     */
+    public List<ActivityManager.RunningTaskInfo> getTasks(
+            int maxNum, boolean filterOnlyVisibleRecents, boolean keepIntentExtra) {
         try {
-            return getService().getTasks(maxNum, filterOnlyVisibleRecents);
+            return getService().getTasks(maxNum, filterOnlyVisibleRecents, keepIntentExtra);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 0acc4b3..8f645c8 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -39,7 +39,6 @@
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
 import android.app.backup.BackupAgent;
-import android.app.backup.BackupManager;
 import android.app.servertransaction.ActivityLifecycleItem;
 import android.app.servertransaction.ActivityLifecycleItem.LifecycleState;
 import android.app.servertransaction.ActivityRelaunchItem;
@@ -53,6 +52,7 @@
 import android.app.servertransaction.TransactionExecutor;
 import android.app.servertransaction.TransactionExecutorHelper;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.AutofillOptions;
 import android.content.BroadcastReceiver;
 import android.content.ComponentCallbacks2;
@@ -1587,9 +1587,17 @@
 
         @Override
         public void dumpGfxInfo(ParcelFileDescriptor pfd, String[] args) {
-            nDumpGraphicsInfo(pfd.getFileDescriptor());
-            WindowManagerGlobal.getInstance().dumpGfxInfo(pfd.getFileDescriptor(), args);
-            IoUtils.closeQuietly(pfd);
+            DumpComponentInfo data = new DumpComponentInfo();
+            try {
+                data.fd = pfd.dup();
+                data.token = null;
+                data.args = args;
+                sendMessage(H.DUMP_GFXINFO, data, 0, 0, true /*async*/);
+            } catch (IOException e) {
+                Slog.w(TAG, "dumpGfxInfo failed", e);
+            } finally {
+                IoUtils.closeQuietly(pfd);
+            }
         }
 
         @Override
@@ -1961,6 +1969,7 @@
         public static final int ATTACH_STARTUP_AGENTS = 162;
         public static final int UPDATE_UI_TRANSLATION_STATE = 163;
         public static final int SET_CONTENT_CAPTURE_OPTIONS_CALLBACK = 164;
+        public static final int DUMP_GFXINFO = 165;
 
         public static final int INSTRUMENT_WITHOUT_RESTART = 170;
         public static final int FINISH_INSTRUMENTATION_WITHOUT_RESTART = 171;
@@ -2010,6 +2019,7 @@
                     case UPDATE_UI_TRANSLATION_STATE: return "UPDATE_UI_TRANSLATION_STATE";
                     case SET_CONTENT_CAPTURE_OPTIONS_CALLBACK:
                         return "SET_CONTENT_CAPTURE_OPTIONS_CALLBACK";
+                    case DUMP_GFXINFO: return "DUMP GFXINFO";
                     case INSTRUMENT_WITHOUT_RESTART: return "INSTRUMENT_WITHOUT_RESTART";
                     case FINISH_INSTRUMENTATION_WITHOUT_RESTART:
                         return "FINISH_INSTRUMENTATION_WITHOUT_RESTART";
@@ -2083,6 +2093,9 @@
                 case DUMP_SERVICE:
                     handleDumpService((DumpComponentInfo)msg.obj);
                     break;
+                case DUMP_GFXINFO:
+                    handleDumpGfxInfo((DumpComponentInfo) msg.obj);
+                    break;
                 case LOW_MEMORY:
                     Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "lowMemory");
                     handleLowMemory();
@@ -2286,6 +2299,12 @@
                 ? am.getApplication().getOpPackageName() : null;
     }
 
+    public static AttributionSource currentAttributionSource() {
+        ActivityThread am = currentActivityThread();
+        return (am != null && am.getApplication() != null)
+                ? am.getApplication().getAttributionSource() : null;
+    }
+
     @UnsupportedAppUsage
     public static String currentPackageName() {
         ActivityThread am = currentActivityThread();
@@ -3987,6 +4006,12 @@
         }
     }
 
+    @Override
+    public void handlePictureInPictureStateChanged(@NonNull ActivityClientRecord r,
+            PictureInPictureUiState pipState) {
+        r.activity.onPictureInPictureUiStateChanged(pipState);
+    }
+
     /**
      * Register a splash screen manager to this process.
      */
@@ -4391,11 +4416,20 @@
             if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name);
 
             Application app = packageInfo.makeApplication(false, mInstrumentation);
-            java.lang.ClassLoader cl = packageInfo.getClassLoader();
+
+            final java.lang.ClassLoader cl;
+            if (data.info.splitName != null) {
+                cl = packageInfo.getSplitClassLoader(data.info.splitName);
+            } else {
+                cl = packageInfo.getClassLoader();
+            }
             service = packageInfo.getAppFactory()
                     .instantiateService(cl, data.info.name, data.intent);
-            final ContextImpl context = ContextImpl.getImpl(service
+            ContextImpl context = ContextImpl.getImpl(service
                     .createServiceBaseContext(this, packageInfo));
+            if (data.info.splitName != null) {
+                context = (ContextImpl) context.createContextForSplit(data.info.splitName);
+            }
             // Service resources must be initialized with the same loaders as the application
             // context.
             context.getResources().addLoaders(
@@ -4483,6 +4517,17 @@
         }
     }
 
+    private void handleDumpGfxInfo(DumpComponentInfo info) {
+        try {
+            nDumpGraphicsInfo(info.fd.getFileDescriptor());
+            WindowManagerGlobal.getInstance().dumpGfxInfo(info.fd.getFileDescriptor(), info.args);
+        } catch (Exception e) {
+            Log.w(TAG, "Caught exception from dumpGfxInfo()", e);
+        } finally {
+            IoUtils.closeQuietly(info.fd);
+        }
+    }
+
     private void handleDumpService(DumpComponentInfo info) {
         final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
         try {
diff --git a/core/java/android/app/AppCompatCallbacks.java b/core/java/android/app/AppCompatCallbacks.java
index 28a21f7..134cef5 100644
--- a/core/java/android/app/AppCompatCallbacks.java
+++ b/core/java/android/app/AppCompatCallbacks.java
@@ -28,7 +28,7 @@
  *
  * @hide
  */
-public final class AppCompatCallbacks extends Compatibility.Callbacks {
+public final class AppCompatCallbacks implements Compatibility.BehaviorChangeDelegate {
     private final long[] mDisabledChanges;
     private final ChangeReporter mChangeReporter;
 
@@ -38,7 +38,7 @@
      * @param disabledChanges Set of compatibility changes that are disabled for this process.
      */
     public static void install(long[] disabledChanges) {
-        Compatibility.setCallbacks(new AppCompatCallbacks(disabledChanges));
+        Compatibility.setBehaviorChangeDelegate(new AppCompatCallbacks(disabledChanges));
     }
 
     private AppCompatCallbacks(long[] disabledChanges) {
@@ -48,11 +48,11 @@
                 ChangeReporter.SOURCE_APP_PROCESS);
     }
 
-    protected void reportChange(long changeId) {
+    public void onChangeReported(long changeId) {
         reportChange(changeId, ChangeReporter.STATE_LOGGED);
     }
 
-    protected boolean isChangeEnabled(long changeId) {
+    public boolean isChangeEnabled(long changeId) {
         if (Arrays.binarySearch(mDisabledChanges, changeId) < 0) {
             // Not present in the disabled array
             reportChange(changeId, ChangeReporter.STATE_ENABLED);
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 1cb46b1..d798620 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -6511,13 +6511,21 @@
             NoteOpEvent note = new NoteOpEvent(discreteAccessTime, discreteAccessDuration, null);
             accessEvents.append(key, note);
             AttributedOpEntry access = new AttributedOpEntry(mOp, false, accessEvents, null);
-            for (int i = discreteAccesses.size() - 1; i >= 0; i--) {
-                if (discreteAccesses.get(i).getLastAccessTime(OP_FLAGS_ALL) < discreteAccessTime) {
-                    discreteAccesses.add(i + 1, access);
-                    return;
+            int insertionPoint = discreteAccesses.size() - 1;
+            for (; insertionPoint >= 0; insertionPoint--) {
+                if (discreteAccesses.get(insertionPoint).getLastAccessTime(OP_FLAGS_ALL)
+                        < discreteAccessTime) {
+                    break;
                 }
             }
-            discreteAccesses.add(0, access);
+            insertionPoint++;
+            if (insertionPoint < discreteAccesses.size() && discreteAccesses.get(
+                    insertionPoint).getLastAccessTime(OP_FLAGS_ALL) == discreteAccessTime) {
+                discreteAccesses.set(insertionPoint, mergeAttributedOpEntries(
+                        Arrays.asList(discreteAccesses.get(insertionPoint), access)));
+            } else {
+                discreteAccesses.add(insertionPoint, access);
+            }
         }
 
         /**
@@ -9858,7 +9866,10 @@
                 NoteOpEvent reject = a.getLastRejectEvent(uidState, uidState, flags);
 
                 if (access != null) {
-                    accessEvents.append(key, access);
+                    NoteOpEvent existingAccess = accessEvents.get(key);
+                    if (existingAccess == null || existingAccess.getDuration() == -1) {
+                        accessEvents.append(key, access);
+                    }
                 }
                 if (reject != null) {
                     rejectEvents.append(key, reject);
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java
index 6af4d93..341b9c5 100644
--- a/core/java/android/app/AppOpsManagerInternal.java
+++ b/core/java/android/app/AppOpsManagerInternal.java
@@ -26,6 +26,7 @@
 import com.android.internal.app.IAppOpsCallback;
 import com.android.internal.util.function.HeptFunction;
 import com.android.internal.util.function.HexFunction;
+import com.android.internal.util.function.NonaFunction;
 import com.android.internal.util.function.OctFunction;
 import com.android.internal.util.function.QuadFunction;
 import com.android.internal.util.function.TriFunction;
@@ -101,8 +102,31 @@
                         Boolean, SyncNotedAppOp> superImpl);
 
         /**
+         * Allows overriding start operation behavior.
+         *
+         * @param token The client state.
+         * @param code The op code to start.
+         * @param uid The UID for which to note.
+         * @param packageName The package for which to note. {@code null} for system package.
+         * @param attributionTag the attribution tag.
+         * @param startIfModeDefault Whether to start the op of the mode is default.
+         * @param shouldCollectAsyncNotedOp If an {@link AsyncNotedAppOp} should be collected
+         * @param message The message in the async noted op
+         * @param shouldCollectMessage whether to collect messages
+         * @param superImpl The super implementation.
+         * @return The app op note result.
+         */
+        SyncNotedAppOp startOperation(IBinder token, int code, int uid,
+                @Nullable String packageName, @Nullable String attributionTag,
+                boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
+                @Nullable String message, boolean shouldCollectMessage, @NonNull NonaFunction<
+                        IBinder, Integer, Integer, String, String, Boolean, Boolean, String,
+                        Boolean, SyncNotedAppOp> superImpl);
+
+        /**
          * Allows overriding start proxy operation behavior.
          *
+         * @param token The client state.
          * @param code The op code to start.
          * @param attributionSource The permission identity of the caller.
          * @param startIfModeDefault Whether to start the op of the mode is default.
diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java
index cf5fd14..c752f34 100644
--- a/core/java/android/app/ClientTransactionHandler.java
+++ b/core/java/android/app/ClientTransactionHandler.java
@@ -159,6 +159,10 @@
     /** Request that an activity enter picture-in-picture. */
     public abstract void handlePictureInPictureRequested(@NonNull ActivityClientRecord r);
 
+    /** Signal to an activity (that is currently in PiP) of PiP state changes. */
+    public abstract void handlePictureInPictureStateChanged(@NonNull ActivityClientRecord r,
+            PictureInPictureUiState pipState);
+
     /** Whether the activity want to handle splash screen exit animation */
     public abstract boolean isHandleSplashScreenExit(@NonNull IBinder token);
 
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 9753b67..656942d 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1218,6 +1218,23 @@
     }
 
     @Override
+    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions,
+            Bundle options) {
+        warnIfCallingFromSystemProcess();
+        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
+        try {
+            intent.prepareToLeaveProcess(this);
+            ActivityManager.getService().broadcastIntentWithFeature(
+                    mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType,
+                    null, Activity.RESULT_OK, null, null, receiverPermissions,
+                    null /*excludedPermissions=*/, AppOpsManager.OP_NONE, options, false, false,
+                    getUserId());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @Override
     public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
             String[] receiverPermissions) {
         String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
diff --git a/core/java/android/app/IActivityClientController.aidl b/core/java/android/app/IActivityClientController.aidl
index ed4836e..09b0c2f 100644
--- a/core/java/android/app/IActivityClientController.aidl
+++ b/core/java/android/app/IActivityClientController.aidl
@@ -37,7 +37,11 @@
 interface IActivityClientController {
     oneway void activityIdle(in IBinder token, in Configuration config, in boolean stopProfiling);
     oneway void activityResumed(in IBinder token, in boolean handleSplashScreenExit);
-    oneway void activityTopResumedStateLost();
+    /**
+     * This call is not one-way because {@link #activityPaused()) is not one-way, or
+     * the top-resumed-lost could be reported after activity paused.
+     */
+    void activityTopResumedStateLost();
     /**
      * Notifies that the activity has completed paused. This call is not one-way because it can make
      * consecutive launch in the same process more coherent. About the order of binder call, it
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index 346882e..74d51a0 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -36,6 +36,7 @@
 import android.app.IUserSwitchObserver;
 import android.app.Notification;
 import android.app.PendingIntent;
+import android.app.PictureInPictureUiState;
 import android.app.ProfilerInfo;
 import android.app.WaitResult;
 import android.app.assist.AssistContent;
@@ -148,7 +149,8 @@
     void setFocusedTask(int taskId);
     boolean removeTask(int taskId);
     void removeAllVisibleRecentTasks();
-    List<ActivityManager.RunningTaskInfo> getTasks(int maxNum, boolean filterOnlyVisibleRecents);
+    List<ActivityManager.RunningTaskInfo> getTasks(int maxNum, boolean filterOnlyVisibleRecents,
+            boolean keepIntentExtra);
     void moveTaskToFront(in IApplicationThread app, in String callingPackage, int task,
             int flags, in Bundle options);
     ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
@@ -257,13 +259,6 @@
     void setSplitScreenResizing(boolean resizing);
     boolean supportsLocalVoiceInteraction();
 
-    /**
-     * Whether to allow non-resizable apps to be shown in multi-window. The app will be letterboxed
-     * if the request orientation is not met, and will be shown in size-compat mode if the container
-     * size has changed.
-     */
-    boolean supportsNonResizableMultiWindow();
-
     // Get device configuration
     ConfigurationInfo getDeviceConfigurationInfo();
 
@@ -330,4 +325,9 @@
      */
     void onSplashScreenViewCopyFinished(int taskId,
             in SplashScreenView.SplashScreenViewParcelable material);
+
+    /**
+     * When the Picture-in-picture state has changed.
+     */
+    void onPictureInPictureStateChanged(in PictureInPictureUiState pipState);
 }
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 35a9f9b..f33adb3 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -189,7 +189,7 @@
     ComponentName getAllowedNotificationAssistantForUser(int userId);
     ComponentName getAllowedNotificationAssistant();
     ComponentName getDefaultNotificationAssistant();
-    void resetDefaultNotificationAssistant(boolean loadFromConfig);
+    void setNASMigrationDoneAndResetDefault(int userId, boolean loadFromConfig);
     boolean hasEnabledNotificationListener(String packageName, int userId);
 
     @UnsupportedAppUsage
diff --git a/core/java/android/app/IUiAutomationConnection.aidl b/core/java/android/app/IUiAutomationConnection.aidl
index c30bc24..623af5f 100644
--- a/core/java/android/app/IUiAutomationConnection.aidl
+++ b/core/java/android/app/IUiAutomationConnection.aidl
@@ -20,6 +20,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.view.InputEvent;
+import android.view.SurfaceControl;
 import android.view.WindowContentFrameStats;
 import android.view.WindowAnimationFrameStats;
 import android.os.ParcelFileDescriptor;
@@ -42,6 +43,7 @@
     void syncInputTransactions(boolean waitForAnimations);
     boolean setRotation(int rotation);
     Bitmap takeScreenshot(in Rect crop);
+    Bitmap takeSurfaceControlScreenshot(in SurfaceControl surfaceControl);
     boolean clearWindowContentFrameStats(int windowId);
     WindowContentFrameStats getWindowContentFrameStats(int windowId);
     void clearWindowAnimationFrameStats();
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 83d0246..ea6c874 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -58,6 +58,7 @@
 import android.util.SparseArray;
 import android.view.DisplayAdjustments;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.ArrayUtils;
 
 import dalvik.system.BaseDexClassLoader;
@@ -156,6 +157,7 @@
     private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mUnboundServices
         = new ArrayMap<>();
     private AppComponentFactory mAppComponentFactory;
+    private final Object mLock = new Object();
 
     Application getApplication() {
         return mApplication;
@@ -354,7 +356,7 @@
         } else {
             addedPaths.addAll(newPaths);
         }
-        synchronized (this) {
+        synchronized (mLock) {
             createOrUpdateClassLoaderLocked(addedPaths);
             if (mResources != null) {
                 final String[] splitPaths;
@@ -589,7 +591,9 @@
      * include the base APK in the list of splits.
      */
     private class SplitDependencyLoaderImpl extends SplitDependencyLoader<NameNotFoundException> {
+        @GuardedBy("mLock")
         private final String[][] mCachedResourcePaths;
+        @GuardedBy("mLock")
         private final ClassLoader[] mCachedClassLoaders;
 
         SplitDependencyLoaderImpl(@NonNull SparseArray<int[]> dependencies) {
@@ -600,37 +604,41 @@
 
         @Override
         protected boolean isSplitCached(int splitIdx) {
-            return mCachedClassLoaders[splitIdx] != null;
+            synchronized (mLock) {
+                return mCachedClassLoaders[splitIdx] != null;
+            }
         }
 
         @Override
         protected void constructSplit(int splitIdx, @NonNull int[] configSplitIndices,
                 int parentSplitIdx) throws NameNotFoundException {
-            final ArrayList<String> splitPaths = new ArrayList<>();
-            if (splitIdx == 0) {
-                createOrUpdateClassLoaderLocked(null);
-                mCachedClassLoaders[0] = mClassLoader;
+            synchronized (mLock) {
+                final ArrayList<String> splitPaths = new ArrayList<>();
+                if (splitIdx == 0) {
+                    createOrUpdateClassLoaderLocked(null);
+                    mCachedClassLoaders[0] = mClassLoader;
 
-                // Never add the base resources here, they always get added no matter what.
+                    // Never add the base resources here, they always get added no matter what.
+                    for (int configSplitIdx : configSplitIndices) {
+                        splitPaths.add(mSplitResDirs[configSplitIdx - 1]);
+                    }
+                    mCachedResourcePaths[0] = splitPaths.toArray(new String[splitPaths.size()]);
+                    return;
+                }
+
+                // Since we handled the special base case above, parentSplitIdx is always valid.
+                final ClassLoader parent = mCachedClassLoaders[parentSplitIdx];
+                mCachedClassLoaders[splitIdx] = ApplicationLoaders.getDefault().getClassLoader(
+                        mSplitAppDirs[splitIdx - 1], getTargetSdkVersion(), false, null,
+                        null, parent, mSplitClassLoaderNames[splitIdx - 1]);
+
+                Collections.addAll(splitPaths, mCachedResourcePaths[parentSplitIdx]);
+                splitPaths.add(mSplitResDirs[splitIdx - 1]);
                 for (int configSplitIdx : configSplitIndices) {
                     splitPaths.add(mSplitResDirs[configSplitIdx - 1]);
                 }
-                mCachedResourcePaths[0] = splitPaths.toArray(new String[splitPaths.size()]);
-                return;
+                mCachedResourcePaths[splitIdx] = splitPaths.toArray(new String[splitPaths.size()]);
             }
-
-            // Since we handled the special base case above, parentSplitIdx is always valid.
-            final ClassLoader parent = mCachedClassLoaders[parentSplitIdx];
-            mCachedClassLoaders[splitIdx] = ApplicationLoaders.getDefault().getClassLoader(
-                    mSplitAppDirs[splitIdx - 1], getTargetSdkVersion(), false, null, null, parent,
-                    mSplitClassLoaderNames[splitIdx - 1]);
-
-            Collections.addAll(splitPaths, mCachedResourcePaths[parentSplitIdx]);
-            splitPaths.add(mSplitResDirs[splitIdx - 1]);
-            for (int configSplitIdx : configSplitIndices) {
-                splitPaths.add(mSplitResDirs[configSplitIdx - 1]);
-            }
-            mCachedResourcePaths[splitIdx] = splitPaths.toArray(new String[splitPaths.size()]);
         }
 
         private int ensureSplitLoaded(String splitName) throws NameNotFoundException {
@@ -648,11 +656,17 @@
         }
 
         ClassLoader getClassLoaderForSplit(String splitName) throws NameNotFoundException {
-            return mCachedClassLoaders[ensureSplitLoaded(splitName)];
+            final int idx = ensureSplitLoaded(splitName);
+            synchronized (mLock) {
+                return mCachedClassLoaders[idx];
+            }
         }
 
         String[] getSplitPathsForSplit(String splitName) throws NameNotFoundException {
-            return mCachedResourcePaths[ensureSplitLoaded(splitName)];
+            final int idx = ensureSplitLoaded(splitName);
+            synchronized (mLock) {
+                return mCachedResourcePaths[idx];
+            }
         }
     }
 
@@ -749,6 +763,7 @@
         }
     }
 
+    @GuardedBy("mLock")
     private void createOrUpdateClassLoaderLocked(List<String> addedPaths) {
         if (mPackageName.equals("android")) {
             // Note: This branch is taken for system server and we don't need to setup
@@ -1023,7 +1038,7 @@
 
     @UnsupportedAppUsage
     public ClassLoader getClassLoader() {
-        synchronized (this) {
+        synchronized (mLock) {
             if (mClassLoader == null) {
                 createOrUpdateClassLoaderLocked(null /*addedPaths*/);
             }
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 7ce0c70..d255616 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -6103,6 +6103,9 @@
                     button.setImageViewIcon(R.id.action0, action.getIcon());
                     boolean priority = action.getExtras().getBoolean(CallStyle.KEY_ACTION_PRIORITY);
                     button.setBoolean(R.id.action0, "setWrapModePriority", priority);
+                    int minWidthDimen =
+                            priority ? R.dimen.call_notification_system_action_min_width : 0;
+                    button.setIntDimen(R.id.action0, "setMinimumWidth", minWidthDimen);
                 }
             } else {
                 button.setTextViewText(R.id.action0, processTextSpans(
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index ca08683..0136a35 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -358,12 +358,6 @@
     private static void checkFlags(int flags, String packageName) {
         final boolean flagImmutableSet = (flags & PendingIntent.FLAG_IMMUTABLE) != 0;
         final boolean flagMutableSet = (flags & PendingIntent.FLAG_MUTABLE) != 0;
-        String msg = packageName + ": Targeting S+ (version " + Build.VERSION_CODES.S
-                    + " and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE"
-                    + " be specified when creating a PendingIntent.\nStrongly consider"
-                    + " using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality"
-                    + " depends on the PendingIntent being mutable, e.g. if it needs to"
-                    + " be used with inline replies or bubbles.";
 
         if (flagImmutableSet && flagMutableSet) {
             throw new IllegalArgumentException(
@@ -372,6 +366,12 @@
 
         if (Compatibility.isChangeEnabled(PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED)
                 && !flagImmutableSet && !flagMutableSet) {
+            String msg = packageName + ": Targeting S+ (version " + Build.VERSION_CODES.S
+                    + " and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE"
+                    + " be specified when creating a PendingIntent.\nStrongly consider"
+                    + " using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality"
+                    + " depends on the PendingIntent being mutable, e.g. if it needs to"
+                    + " be used with inline replies or bubbles.";
                 throw new IllegalArgumentException(msg);
         }
     }
diff --git a/telephony/java/android/telephony/ims/RcsConfig.aidl b/core/java/android/app/PictureInPictureUiState.aidl
similarity index 75%
copy from telephony/java/android/telephony/ims/RcsConfig.aidl
copy to core/java/android/app/PictureInPictureUiState.aidl
index cfd93fb..ca81fb6 100644
--- a/telephony/java/android/telephony/ims/RcsConfig.aidl
+++ b/core/java/android/app/PictureInPictureUiState.aidl
@@ -1,11 +1,11 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
+/**
+ * Copyright (c) 2021, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *      http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,6 +14,6 @@
  * limitations under the License.
  */
 
-package android.telephony.ims;
+package android.app;
 
-parcelable RcsConfig;
+parcelable PictureInPictureUiState;
\ No newline at end of file
diff --git a/core/java/android/app/PictureInPictureUiState.java b/core/java/android/app/PictureInPictureUiState.java
new file mode 100644
index 0000000..3d2cb3f
--- /dev/null
+++ b/core/java/android/app/PictureInPictureUiState.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.annotation.NonNull;
+import android.annotation.TestApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Used by {@link Activity#onPictureInPictureUiStateChanged(PictureInPictureUiState)}.
+ */
+public final class PictureInPictureUiState implements Parcelable {
+
+    private boolean mIsStashed;
+
+    /** {@hide} */
+    PictureInPictureUiState(Parcel in) {
+        mIsStashed = in.readBoolean();
+    }
+
+    /** {@hide} */
+    @TestApi
+    public PictureInPictureUiState(boolean isStashed) {
+        mIsStashed = isStashed;
+    }
+
+    /**
+     * Returns whether Picture-in-Picture is stashed or not.
+     */
+    public boolean isStashed() {
+        return mIsStashed;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof PictureInPictureUiState)) return false;
+        PictureInPictureUiState that = (PictureInPictureUiState) o;
+        return Objects.equals(mIsStashed, that.mIsStashed);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mIsStashed);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel out, int flags) {
+        out.writeBoolean(mIsStashed);
+    }
+
+    public static final @android.annotation.NonNull Creator<PictureInPictureUiState> CREATOR =
+            new Creator<PictureInPictureUiState>() {
+                public PictureInPictureUiState createFromParcel(Parcel in) {
+                    return new PictureInPictureUiState(in);
+                }
+                public PictureInPictureUiState[] newArray(int size) {
+                    return new PictureInPictureUiState[size];
+                }
+            };
+}
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 1765849..232b077 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -74,6 +74,9 @@
     public static final int DISABLE_SEARCH = View.STATUS_BAR_DISABLE_SEARCH;
 
     /** @hide */
+    public static final int DISABLE_ONGOING_CALL_CHIP = View.STATUS_BAR_DISABLE_ONGOING_CALL_CHIP;
+
+    /** @hide */
     @Deprecated
     public static final int DISABLE_NAVIGATION =
             View.STATUS_BAR_DISABLE_HOME | View.STATUS_BAR_DISABLE_RECENT;
@@ -85,7 +88,7 @@
     public static final int DISABLE_MASK = DISABLE_EXPAND | DISABLE_NOTIFICATION_ICONS
             | DISABLE_NOTIFICATION_ALERTS | DISABLE_NOTIFICATION_TICKER
             | DISABLE_SYSTEM_INFO | DISABLE_RECENT | DISABLE_HOME | DISABLE_BACK | DISABLE_CLOCK
-            | DISABLE_SEARCH;
+            | DISABLE_SEARCH | DISABLE_ONGOING_CALL_CHIP;
 
     /** @hide */
     @IntDef(flag = true, prefix = {"DISABLE_"}, value = {
@@ -99,7 +102,8 @@
             DISABLE_RECENT,
             DISABLE_BACK,
             DISABLE_CLOCK,
-            DISABLE_SEARCH
+            DISABLE_SEARCH,
+            DISABLE_ONGOING_CALL_CHIP
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DisableFlags {}
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java
index 6ad5eea..b95412f 100644
--- a/core/java/android/app/TaskInfo.java
+++ b/core/java/android/app/TaskInfo.java
@@ -138,6 +138,13 @@
     public boolean supportsSplitScreenMultiWindow;
 
     /**
+     * Whether this task supports multi windowing modes based on the device settings and the
+     * root activity resizability and configuration.
+     * @hide
+     */
+    public boolean supportsMultiWindow;
+
+    /**
      * The resize mode of the task. See {@link ActivityInfo#resizeMode}.
      * @hide
      */
@@ -329,6 +336,7 @@
         }
         return topActivityType == that.topActivityType
                 && isResizeable == that.isResizeable
+                && supportsMultiWindow == that.supportsMultiWindow
                 && Objects.equals(positionInParent, that.positionInParent)
                 && Objects.equals(pictureInPictureParams, that.pictureInPictureParams)
                 && getWindowingMode() == that.getWindowingMode()
@@ -375,6 +383,7 @@
 
         taskDescription = source.readTypedObject(ActivityManager.TaskDescription.CREATOR);
         supportsSplitScreenMultiWindow = source.readBoolean();
+        supportsMultiWindow = source.readBoolean();
         resizeMode = source.readInt();
         configuration.readFromParcel(source);
         token = WindowContainerToken.CREATOR.createFromParcel(source);
@@ -412,6 +421,7 @@
 
         dest.writeTypedObject(taskDescription, flags);
         dest.writeBoolean(supportsSplitScreenMultiWindow);
+        dest.writeBoolean(supportsMultiWindow);
         dest.writeInt(resizeMode);
         configuration.writeToParcel(dest, flags);
         token.writeToParcel(dest, flags);
@@ -440,6 +450,7 @@
                 + " numActivities=" + numActivities
                 + " lastActiveTime=" + lastActiveTime
                 + " supportsSplitScreenMultiWindow=" + supportsSplitScreenMultiWindow
+                + " supportsMultiWindow=" + supportsMultiWindow
                 + " resizeMode=" + resizeMode
                 + " isResizeable=" + isResizeable
                 + " token=" + token
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 7d3db5e..e0b484c 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -50,6 +50,10 @@
 import android.view.InputEvent;
 import android.view.KeyEvent;
 import android.view.Surface;
+import android.view.SurfaceControl;
+import android.view.View;
+import android.view.ViewRootImpl;
+import android.view.Window;
 import android.view.WindowAnimationFrameStats;
 import android.view.WindowContentFrameStats;
 import android.view.accessibility.AccessibilityEvent;
@@ -1012,7 +1016,7 @@
                 return null;
             }
         } catch (RemoteException re) {
-            Log.e(LOG_TAG, "Error while taking screnshot!", re);
+            Log.e(LOG_TAG, "Error while taking screenshot!", re);
             return null;
         }
 
@@ -1023,6 +1027,51 @@
     }
 
     /**
+     * Used to capture a screenshot of a Window. This can return null in the following cases:
+     * 1. Window content hasn't been layed out.
+     * 2. Window doesn't have a valid SurfaceControl
+     * 3. An error occurred in SurfaceFlinger when trying to take the screenshot.
+     *
+     * @param window Window to take a screenshot of
+     *
+     * @return The screenshot bitmap on success, null otherwise.
+     *
+     * @hide
+     */
+    @TestApi
+    @Nullable
+    public Bitmap takeScreenshot(@NonNull Window window) {
+        if (window == null) {
+            return null;
+        }
+
+        View decorView = window.peekDecorView();
+        if (decorView == null) {
+            return null;
+        }
+
+        ViewRootImpl viewRoot = decorView.getViewRootImpl();
+        if (viewRoot == null) {
+            return null;
+        }
+
+        SurfaceControl sc = viewRoot.getSurfaceControl();
+        if (!sc.isValid()) {
+            return null;
+        }
+
+        // Apply a sync transaction to ensure SurfaceFlinger is flushed before capturing a
+        // screenshot.
+        new SurfaceControl.Transaction().apply(true);
+        try {
+            return mUiAutomationConnection.takeSurfaceControlScreenshot(sc);
+        } catch (RemoteException re) {
+            Log.e(LOG_TAG, "Error while taking screenshot!", re);
+            return null;
+        }
+    }
+
+    /**
      * Sets whether this UiAutomation to run in a "monkey" mode. Applications can query whether
      * they are executed in a "monkey" mode, i.e. run by a test framework, and avoid doing
      * potentially undesirable actions such as calling 911 or posting on public forums etc.
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index 90210a9..e693c5e 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -18,6 +18,7 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.accessibilityservice.IAccessibilityServiceClient;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
@@ -206,6 +207,30 @@
         }
     }
 
+    @Nullable
+    @Override
+    public Bitmap takeSurfaceControlScreenshot(@NonNull SurfaceControl surfaceControl) {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+
+        SurfaceControl.ScreenshotHardwareBuffer captureBuffer;
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            captureBuffer = SurfaceControl.captureLayers(
+                    new SurfaceControl.LayerCaptureArgs.Builder(surfaceControl).build());
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+
+        if (captureBuffer == null) {
+            return null;
+        }
+        return captureBuffer.asBitmap();
+    }
+
     @Override
     public boolean clearWindowContentFrameStats(int windowId) throws RemoteException {
         synchronized (mLock) {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 4dc0442..cbf2d6a 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -6432,7 +6432,7 @@
      * broadcast when access to a key is granted.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
-     *        {@code null} if calling from a delegated certificate installer.
+     *        {@code null} if calling from a delegated certificate chooser.
      * @param alias The alias of the key to grant access to.
      * @param packageName The name of the (already installed) package to grant access to.
      * @return {@code true} if the grant was set successfully, {@code false} otherwise.
@@ -6498,7 +6498,7 @@
      * broadcast when access to a key is revoked.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
-     *        {@code null} if calling from a delegated certificate installer.
+     *        {@code null} if calling from a delegated certificate chooser.
      * @param alias The alias of the key to revoke access from.
      * @param packageName The name of the (already installed) package to revoke access from.
      * @return {@code true} if the grant was revoked successfully, {@code false} otherwise.
@@ -10368,6 +10368,9 @@
     /**
      * Called by device owners to set the user's global location setting.
      *
+     * <p><b>Note: </b> this call is ignored on
+     * {@link android.content.pm.PackageManager#FEATURE_AUTOMOTIVE automotive builds}.
+     *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with
      * @param locationEnabled whether location should be enabled or disabled
      * @throws SecurityException if {@code admin} is not a device owner.
diff --git a/core/java/android/app/admin/PasswordMetrics.java b/core/java/android/app/admin/PasswordMetrics.java
index 759597c..4c1a363 100644
--- a/core/java/android/app/admin/PasswordMetrics.java
+++ b/core/java/android/app/admin/PasswordMetrics.java
@@ -531,7 +531,7 @@
         }
 
         final PasswordMetrics enteredMetrics = computeForPasswordOrPin(password, isPin);
-        return validatePasswordMetrics(adminMetrics, minComplexity, isPin, enteredMetrics);
+        return validatePasswordMetrics(adminMetrics, minComplexity, enteredMetrics);
     }
 
     /**
@@ -539,15 +539,13 @@
      *
      * @param adminMetrics - minimum metrics to satisfy admin requirements.
      * @param minComplexity - minimum complexity imposed by the requester.
-     * @param isPin - whether it is PIN that should be only digits
      * @param actualMetrics - metrics for password to validate.
      * @return a list of password validation errors. An empty list means the password is OK.
      *
      * TODO: move to PasswordPolicy
      */
     public static List<PasswordValidationError> validatePasswordMetrics(
-            PasswordMetrics adminMetrics, int minComplexity, boolean isPin,
-            PasswordMetrics actualMetrics) {
+            PasswordMetrics adminMetrics, int minComplexity, PasswordMetrics actualMetrics) {
         final ComplexityBucket bucket = ComplexityBucket.forComplexity(minComplexity);
 
         // Make sure credential type is satisfactory.
@@ -561,7 +559,7 @@
             return Collections.emptyList(); // Nothing to check for pattern or none.
         }
 
-        if (isPin && actualMetrics.nonNumeric > 0) {
+        if (actualMetrics.credType == CREDENTIAL_TYPE_PIN && actualMetrics.nonNumeric > 0) {
             return Collections.singletonList(
                     new PasswordValidationError(CONTAINS_INVALID_CHARACTERS, 0));
         }
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 0841910..b1b59b0 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -16,6 +16,7 @@
 
 package android.app.backup;
 
+import android.annotation.IntDef;
 import android.annotation.Nullable;
 import android.app.IBackupAgent;
 import android.app.QueuedWork;
@@ -48,6 +49,8 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -188,6 +191,15 @@
      */
     public static final int FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED = 1 << 31;
 
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(flag = true, value = {
+            FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED,
+            FLAG_DEVICE_TO_DEVICE_TRANSFER,
+            FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED
+    })
+    public @interface BackupTransportFlags {}
+
     Handler mHandler = null;
 
     @Nullable private UserHandle mUser;
diff --git a/core/java/android/app/backup/RestoreSet.java b/core/java/android/app/backup/RestoreSet.java
index 51430c0..24b6910 100644
--- a/core/java/android/app/backup/RestoreSet.java
+++ b/core/java/android/app/backup/RestoreSet.java
@@ -18,6 +18,7 @@
 
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.app.backup.BackupAgent.BackupTransportFlags;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -54,6 +55,7 @@
      * Properties of the {@link BackupTransport} transport that was used to obtain the data in
      * this restore set.
      */
+    @BackupTransportFlags
     public final int backupTransportFlags;
 
     /**
@@ -87,7 +89,7 @@
      *                             flag values.
      */
     public RestoreSet(@Nullable String name, @Nullable String device, long token,
-            int backupTransportFlags) {
+            @BackupTransportFlags int backupTransportFlags) {
         this.name = name;
         this.device = device;
         this.token = token;
diff --git a/core/java/android/app/compat/PackageOverride.java b/core/java/android/app/compat/PackageOverride.java
index 59b3555..fad6cd3 100644
--- a/core/java/android/app/compat/PackageOverride.java
+++ b/core/java/android/app/compat/PackageOverride.java
@@ -19,6 +19,7 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.content.pm.PackageInfo;
 import android.os.Parcel;
 
 import java.lang.annotation.Retention;
@@ -101,12 +102,20 @@
         return VALUE_UNDEFINED;
     }
 
-    /** Returns the minimum version code the override applies to. */
+    /**
+     * Returns the minimum APK version code the override applies to.
+     *
+     * @see PackageInfo#getLongVersionCode()
+     */
     public long getMinVersionCode() {
         return mMinVersionCode;
     }
 
-    /** Returns the minimum version code the override applies from. */
+    /**
+     * Returns the maximum APK version code the override applies from.
+     *
+     * @see PackageInfo#getLongVersionCode()
+     */
     public long getMaxVersionCode() {
         return mMaxVersionCode;
     }
@@ -146,9 +155,11 @@
         private boolean mEnabled;
 
         /**
-         * Sets the minimum version code the override should apply from.
+         * Sets the minimum APK version code the override should apply from.
          *
          * default value: {@code Long.MIN_VALUE}.
+         *
+         * @see PackageInfo#getLongVersionCode()
          */
         @NonNull
         public Builder setMinVersionCode(long minVersionCode) {
@@ -157,9 +168,11 @@
         }
 
         /**
-         * Sets the maximum version code the override should apply to.
+         * Sets the maximum APK version code the override should apply to.
          *
          * default value: {@code Long.MAX_VALUE}.
+         *
+         * @see PackageInfo#getLongVersionCode()
          */
         @NonNull
         public Builder setMaxVersionCode(long maxVersionCode) {
diff --git a/core/java/android/app/people/ConversationStatus.java b/core/java/android/app/people/ConversationStatus.java
index d351683..8038158 100644
--- a/core/java/android/app/people/ConversationStatus.java
+++ b/core/java/android/app/people/ConversationStatus.java
@@ -142,32 +142,52 @@
         dest.writeLong(mEndTimeMs);
     }
 
+    /**
+     * Returns the unique identifier for the status.
+     */
     public @NonNull String getId() {
         return mId;
     }
 
+    /**
+     * Returns the type of activity represented by this status
+     */
     public @ActivityType int getActivity() {
         return mActivity;
     }
 
-    public @Availability
-    int getAvailability() {
+    /**
+     * Returns the availability of the people behind this conversation while this activity is
+     * happening.
+     */
+    public @Availability int getAvailability() {
         return mAvailability;
     }
 
-    public @Nullable
-    CharSequence getDescription() {
+    /**
+     * Returns the description for this activity.
+     */
+    public @Nullable CharSequence getDescription() {
         return mDescription;
     }
 
+    /**
+     * Returns the image for this activity.
+     */
     public @Nullable Icon getIcon() {
         return mIcon;
     }
 
+    /**
+     * Returns the time at which this status started
+     */
     public long getStartTimeMillis() {
         return mStartTimeMs;
     }
 
+    /**
+     * Returns the time at which this status should be expired.
+     */
     public long getEndTimeMillis() {
         return mEndTimeMs;
     }
@@ -242,26 +262,51 @@
         }
 
 
+        /**
+         * Sets the availability of the conversation to provide a hint about how likely
+         * it is that the user would receive a timely response if they sent a message.
+         */
         public @NonNull Builder setAvailability(@Availability int availability) {
             mAvailability = availability;
             return this;
         }
 
+        /**
+         * Sets a user visible description expanding on the conversation user(s)'s activity.
+         *
+         * <p>Examples include: what media someone is watching or listening to, their approximate
+         * location, or what type of anniversary they are celebrating.</p>
+         */
         public @NonNull Builder setDescription(@Nullable CharSequence description) {
             mDescription = description;
             return this;
         }
 
+        /**
+         * Sets an image representing the conversation user(s)'s activity.
+         *
+         * <p>Examples include: A still from a new story update, album art, or a map showing
+         * approximate location.</p>
+         */
         public @NonNull Builder setIcon(@Nullable Icon icon) {
             mIcon = icon;
             return this;
         }
 
+        /**
+         * Sets the time at which this status became valid.
+         */
         public @NonNull Builder setStartTimeMillis(long startTimeMs) {
             mStartTimeMs = startTimeMs;
             return this;
         }
 
+        /**
+         * Sets an expiration time for this status.
+         *
+         * <p>The system will remove the status at this time if it hasn't already been withdrawn.
+         * </p>
+         */
         public @NonNull Builder setEndTimeMillis(long endTimeMs) {
             mEndTimeMs = endTimeMs;
             return this;
diff --git a/core/java/android/app/people/PeopleSpaceTile.java b/core/java/android/app/people/PeopleSpaceTile.java
index e645831..de3eeee 100644
--- a/core/java/android/app/people/PeopleSpaceTile.java
+++ b/core/java/android/app/people/PeopleSpaceTile.java
@@ -54,6 +54,7 @@
     private boolean mIsImportantConversation;
     private String mNotificationKey;
     private CharSequence mNotificationContent;
+    private CharSequence mNotificationSender;
     private String mNotificationCategory;
     private Uri mNotificationDataUri;
     private int mMessagesCount;
@@ -73,6 +74,7 @@
         mIsImportantConversation = b.mIsImportantConversation;
         mNotificationKey = b.mNotificationKey;
         mNotificationContent = b.mNotificationContent;
+        mNotificationSender = b.mNotificationSender;
         mNotificationCategory = b.mNotificationCategory;
         mNotificationDataUri = b.mNotificationDataUri;
         mMessagesCount = b.mMessagesCount;
@@ -134,6 +136,10 @@
         return mNotificationContent;
     }
 
+    public CharSequence getNotificationSender() {
+        return mNotificationSender;
+    }
+
     public String getNotificationCategory() {
         return mNotificationCategory;
     }
@@ -170,7 +176,7 @@
     /** Converts a {@link PeopleSpaceTile} into a {@link PeopleSpaceTile.Builder}. */
     public Builder toBuilder() {
         Builder builder =
-                new Builder(mId, mUserName.toString(), mUserIcon, mIntent);
+                new Builder(mId, mUserName, mUserIcon, mIntent);
         builder.setContactUri(mContactUri);
         builder.setUserHandle(mUserHandle);
         builder.setPackageName(mPackageName);
@@ -179,6 +185,7 @@
         builder.setIsImportantConversation(mIsImportantConversation);
         builder.setNotificationKey(mNotificationKey);
         builder.setNotificationContent(mNotificationContent);
+        builder.setNotificationSender(mNotificationSender);
         builder.setNotificationCategory(mNotificationCategory);
         builder.setNotificationDataUri(mNotificationDataUri);
         builder.setMessagesCount(mMessagesCount);
@@ -201,6 +208,7 @@
         private boolean mIsImportantConversation;
         private String mNotificationKey;
         private CharSequence mNotificationContent;
+        private CharSequence mNotificationSender;
         private String mNotificationCategory;
         private Uri mNotificationDataUri;
         private int mMessagesCount;
@@ -209,7 +217,7 @@
         private List<ConversationStatus> mStatuses;
 
         /** Builder for use only if a shortcut is not available for the tile. */
-        public Builder(String id, String userName, Icon userIcon, Intent intent) {
+        public Builder(String id, CharSequence userName, Icon userIcon, Intent intent) {
             mId = id;
             mUserName = userName;
             mUserIcon = userIcon;
@@ -316,6 +324,12 @@
             return this;
         }
 
+        /** Sets the associated notification's sender. */
+        public Builder setNotificationSender(CharSequence notificationSender) {
+            mNotificationSender = notificationSender;
+            return this;
+        }
+
         /** Sets the associated notification's category. */
         public Builder setNotificationCategory(String notificationCategory) {
             mNotificationCategory = notificationCategory;
@@ -371,6 +385,7 @@
         mIsImportantConversation = in.readBoolean();
         mNotificationKey = in.readString();
         mNotificationContent = in.readCharSequence();
+        mNotificationSender = in.readCharSequence();
         mNotificationCategory = in.readString();
         mNotificationDataUri = in.readParcelable(Uri.class.getClassLoader());
         mMessagesCount = in.readInt();
@@ -398,6 +413,7 @@
         dest.writeBoolean(mIsImportantConversation);
         dest.writeString(mNotificationKey);
         dest.writeCharSequence(mNotificationContent);
+        dest.writeCharSequence(mNotificationSender);
         dest.writeString(mNotificationCategory);
         dest.writeParcelable(mNotificationDataUri, flags);
         dest.writeInt(mMessagesCount);
diff --git a/core/java/android/app/servertransaction/PipStateTransactionItem.java b/core/java/android/app/servertransaction/PipStateTransactionItem.java
new file mode 100644
index 0000000..167f5a4
--- /dev/null
+++ b/core/java/android/app/servertransaction/PipStateTransactionItem.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.servertransaction;
+
+import android.annotation.Nullable;
+import android.app.ActivityThread.ActivityClientRecord;
+import android.app.ClientTransactionHandler;
+import android.app.PictureInPictureUiState;
+import android.os.Parcel;
+
+/**
+ * Request an activity to enter picture-in-picture mode.
+ * @hide
+ */
+public final class PipStateTransactionItem extends ActivityTransactionItem {
+
+    private PictureInPictureUiState mPipState;
+
+    @Override
+    public void execute(ClientTransactionHandler client, ActivityClientRecord r,
+            PendingTransactionActions pendingActions) {
+        client.handlePictureInPictureStateChanged(r, mPipState);
+    }
+
+    // ObjectPoolItem implementation
+
+    private PipStateTransactionItem() {}
+
+    /** Obtain an instance initialized with provided params. */
+    public static PipStateTransactionItem obtain(PictureInPictureUiState pipState) {
+        PipStateTransactionItem instance = ObjectPool.obtain(PipStateTransactionItem.class);
+        if (instance == null) {
+            instance = new PipStateTransactionItem();
+        }
+        instance.mPipState = pipState;
+
+        return instance;
+    }
+
+    @Override
+    public void recycle() {
+        mPipState = null;
+        ObjectPool.recycle(this);
+    }
+
+    // Parcelable implementation
+
+    /** Write to Parcel. */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        mPipState.writeToParcel(dest, flags);
+    }
+
+    /** Read from Parcel. */
+    private PipStateTransactionItem(Parcel in) {
+        mPipState = PictureInPictureUiState.CREATOR.createFromParcel(in);
+    }
+
+    public static final @android.annotation.NonNull Creator<PipStateTransactionItem> CREATOR =
+            new Creator<PipStateTransactionItem>() {
+                public PipStateTransactionItem createFromParcel(Parcel in) {
+                    return new PipStateTransactionItem(in);
+                }
+
+                public PipStateTransactionItem[] newArray(int size) {
+                    return new PipStateTransactionItem[size];
+                }
+            };
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        return this == o;
+    }
+
+    @Override
+    public String toString() {
+        return "PipStateTransactionItem{}";
+    }
+}
diff --git a/core/java/android/app/smartspace/SmartspaceConfig.java b/core/java/android/app/smartspace/SmartspaceConfig.java
index 07d7bf0..0897b5f 100644
--- a/core/java/android/app/smartspace/SmartspaceConfig.java
+++ b/core/java/android/app/smartspace/SmartspaceConfig.java
@@ -15,6 +15,7 @@
  */
 package android.app.smartspace;
 
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
@@ -41,6 +42,7 @@
      * The least number of smartspace targets expected to be predicted by the backend. The backend
      * will always try to satisfy this threshold but it is not guaranteed to always meet it.
      */
+    @IntRange(from = 0, to = 50)
     private final int mSmartspaceTargetCount;
 
     /**
@@ -54,13 +56,15 @@
     @NonNull
     private String mPackageName;
 
-    /** Send other client UI configurations in extras.
+    /**
+     * Send other client UI configurations in extras.
      *
      * This can include:
      *
-     *  - Desired maximum update frequency
-     *  - Request to get periodic updates
-     *  - Request to support multiple clients for the same UISurface.
+     * - Desired maximum update frequency (For example 1 minute update frequency for AoD, 1 second
+     * update frequency for home screen etc).
+     * - Request to get periodic updates
+     * - Request to support multiple clients for the same UISurface.
      */
     @Nullable
     private final Bundle mExtras;
@@ -165,7 +169,7 @@
         private Bundle mExtras = Bundle.EMPTY;
 
         /**
-         * @param context The {@link Context} which is used to fetch the package name.
+         * @param context   The {@link Context} which is used to fetch the package name.
          * @param uiSurface the UI Surface name associated with this context.
          * @hide
          */
@@ -179,7 +183,8 @@
          * Used to set the expected number of cards for this context.
          */
         @NonNull
-        public Builder setSmartspaceTargetCount(int smartspaceTargetCount) {
+        public Builder setSmartspaceTargetCount(
+                @IntRange(from = 0, to = 50) int smartspaceTargetCount) {
             this.mSmartspaceTargetCount = smartspaceTargetCount;
             return this;
         }
diff --git a/core/java/android/app/smartspace/SmartspaceSession.java b/core/java/android/app/smartspace/SmartspaceSession.java
index 16def61..9199581 100644
--- a/core/java/android/app/smartspace/SmartspaceSession.java
+++ b/core/java/android/app/smartspace/SmartspaceSession.java
@@ -63,7 +63,7 @@
  *
  *    void onDestroy() {
  *        mSmartspaceSession.unregisterPredictionUpdates()
- *        mSmartspaceSession.destroy();
+ *        mSmartspaceSession.close();
  *    }
  *
  * }</pre>
@@ -81,7 +81,8 @@
     private final AtomicBoolean mIsClosed = new AtomicBoolean(false);
 
     private final SmartspaceSessionId mSessionId;
-    private final ArrayMap<Callback, CallbackWrapper> mRegisteredCallbacks = new ArrayMap<>();
+    private final ArrayMap<OnTargetsAvailableListener, CallbackWrapper> mRegisteredCallbacks =
+            new ArrayMap<>();
     private final IBinder mToken = new Binder();
 
     /**
@@ -98,11 +99,11 @@
         IBinder b = ServiceManager.getService(Context.SMARTSPACE_SERVICE);
         mInterface = android.app.smartspace.ISmartspaceManager.Stub.asInterface(b);
         mSessionId = new SmartspaceSessionId(
-                context.getPackageName() + ":" + UUID.randomUUID().toString(), context.getUserId());
+                context.getPackageName() + ":" + UUID.randomUUID().toString(), context.getUser());
         try {
             mInterface.createSmartspaceSession(smartspaceConfig, mSessionId, mToken);
         } catch (RemoteException e) {
-            Log.e(TAG, "Failed to cerate Smartspace session", e);
+            Log.e(TAG, "Failed to create Smartspace session", e);
             e.rethrowFromSystemServer();
         }
 
@@ -145,24 +146,24 @@
      * Requests the smartspace service provide continuous updates of smartspace cards via the
      * provided callback, until the given callback is unregistered.
      *
-     * @param callbackExecutor The callback executor to use when calling the callback.
-     * @param callback         The Callback to be called when updates of Smartspace targets are
+     * @param listenerExecutor The listener executor to use when firing the listener.
+     * @param listener         The listener to be called when updates of Smartspace targets are
      *                         available.
      */
-    public void registerSmartspaceUpdates(@NonNull @CallbackExecutor Executor callbackExecutor,
-            @NonNull Callback callback) {
+    public void addOnTargetsAvailableListener(@NonNull @CallbackExecutor Executor listenerExecutor,
+            @NonNull OnTargetsAvailableListener listener) {
         if (mIsClosed.get()) {
             throw new IllegalStateException("This client has already been destroyed.");
         }
 
-        if (mRegisteredCallbacks.containsKey(callback)) {
+        if (mRegisteredCallbacks.containsKey(listener)) {
             // Skip if this callback is already registered
             return;
         }
         try {
-            final CallbackWrapper callbackWrapper = new CallbackWrapper(callbackExecutor,
-                    callback::onTargetsAvailable);
-            mRegisteredCallbacks.put(callback, callbackWrapper);
+            final CallbackWrapper callbackWrapper = new CallbackWrapper(listenerExecutor,
+                    listener::onTargetsAvailable);
+            mRegisteredCallbacks.put(listener, callbackWrapper);
             mInterface.registerSmartspaceUpdates(mSessionId, callbackWrapper);
             mInterface.requestSmartspaceUpdate(mSessionId);
         } catch (RemoteException e) {
@@ -175,21 +176,21 @@
      * Requests the smartspace service to stop providing continuous updates to the provided
      * callback until the callback is re-registered.
      *
-     * @see {@link SmartspaceSession#registerSmartspaceUpdates(Executor, Callback)}.
-     *
-     * @param callback The callback to be unregistered.
+     * @param listener The callback to be unregistered.
+     * @see {@link SmartspaceSession#addOnTargetsAvailableListener(Executor,
+     * OnTargetsAvailableListener)}.
      */
-    public void unregisterSmartspaceUpdates(@NonNull Callback callback) {
+    public void removeOnTargetsAvailableListener(@NonNull OnTargetsAvailableListener listener) {
         if (mIsClosed.get()) {
             throw new IllegalStateException("This client has already been destroyed.");
         }
 
-        if (!mRegisteredCallbacks.containsKey(callback)) {
+        if (!mRegisteredCallbacks.containsKey(listener)) {
             // Skip if this callback was never registered
             return;
         }
         try {
-            final CallbackWrapper callbackWrapper = mRegisteredCallbacks.remove(callback);
+            final CallbackWrapper callbackWrapper = mRegisteredCallbacks.remove(listener);
             mInterface.unregisterSmartspaceUpdates(mSessionId, callbackWrapper);
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to unregister for smartspace updates", e);
@@ -201,7 +202,7 @@
      * Destroys the client and unregisters the callback. Any method on this class after this call
      * will throw {@link IllegalStateException}.
      */
-    public void destroy() {
+    private void destroy() {
         if (!mIsClosed.getAndSet(true)) {
             mCloseGuard.close();
 
@@ -238,6 +239,7 @@
     @Override
     public void close() {
         try {
+            destroy();
             finalize();
         } catch (Throwable throwable) {
             throwable.printStackTrace();
@@ -245,14 +247,14 @@
     }
 
     /**
-     * Callback for receiving smartspace updates.
+     * Listener to receive smartspace targets from the service.
      */
-    public interface Callback {
+    public interface OnTargetsAvailableListener {
 
         /**
          * Called when a new set of smartspace targets are available.
          *
-         * @param targets Sorted list of smartspace targets.
+         * @param targets Ranked list of smartspace targets.
          */
         void onTargetsAvailable(@NonNull List<SmartspaceTarget> targets);
     }
diff --git a/core/java/android/app/smartspace/SmartspaceSessionId.java b/core/java/android/app/smartspace/SmartspaceSessionId.java
index 5220c35..4040cb3 100644
--- a/core/java/android/app/smartspace/SmartspaceSessionId.java
+++ b/core/java/android/app/smartspace/SmartspaceSessionId.java
@@ -21,6 +21,7 @@
 import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.UserHandle;
 
 import java.util.Objects;
 
@@ -36,21 +37,21 @@
     private final String mId;
 
     @NonNull
-    private final int mUserId;
+    private final UserHandle mUserHandle;
 
     /**
      * Creates a new id for a Smartspace session.
      *
      * @hide
      */
-    public SmartspaceSessionId(@NonNull final String id, @NonNull final int userId) {
+    public SmartspaceSessionId(@NonNull final String id, @NonNull final UserHandle userHandle) {
         mId = id;
-        mUserId = userId;
+        mUserHandle = userHandle;
     }
 
     private SmartspaceSessionId(Parcel p) {
         mId = p.readString();
-        mUserId = p.readInt();
+        mUserHandle = p.readTypedObject(UserHandle.CREATOR);
     }
 
     /**
@@ -65,8 +66,8 @@
      * Returns the userId associated with this sessionId.
      */
     @NonNull
-    public int getUserId() {
-        return mUserId;
+    public UserHandle getUserHandle() {
+        return mUserHandle;
     }
 
     @Override
@@ -74,20 +75,20 @@
         if (!getClass().equals(o != null ? o.getClass() : null)) return false;
 
         SmartspaceSessionId other = (SmartspaceSessionId) o;
-        return mId.equals(other.mId) && mUserId == other.mUserId;
+        return mId.equals(other.mId) && mUserHandle == other.mUserHandle;
     }
 
     @Override
     public String toString() {
         return "SmartspaceSessionId{"
                 + "mId='" + mId + '\''
-                + ", mUserId=" + mUserId
+                + ", mUserId=" + mUserHandle.getIdentifier()
                 + '}';
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mId, mUserId);
+        return Objects.hash(mId, mUserHandle);
     }
 
     @Override
@@ -98,7 +99,7 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeString(mId);
-        dest.writeInt(mUserId);
+        dest.writeTypedObject(this.mUserHandle, flags);
     }
 
     public static final @NonNull Creator<SmartspaceSessionId> CREATOR =
diff --git a/core/java/android/app/smartspace/SmartspaceTarget.java b/core/java/android/app/smartspace/SmartspaceTarget.java
index ce5040e..8e98535 100644
--- a/core/java/android/app/smartspace/SmartspaceTarget.java
+++ b/core/java/android/app/smartspace/SmartspaceTarget.java
@@ -15,6 +15,7 @@
  */
 package android.app.smartspace;
 
+import android.annotation.CurrentTimeMillisLong;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -39,7 +40,7 @@
  * {@link SmartspaceAction} as their type because they can have associated actions.
  *
  * <p><b>NOTE: </b>
- * If {@link mWidgetId} is set, it should be preferred over all other properties.
+ * If {@link mWidget} is set, it should be preferred over all other properties.
  * Else, if {@link mSliceUri} is set, it should be preferred over all other data properties.
  * Otherwise, the instance should be treated as a data object.
  *
@@ -61,18 +62,17 @@
     private final SmartspaceAction mBaseAction;
 
     /** A timestamp indicating when the card was created. */
-    @NonNull
+    @CurrentTimeMillisLong
     private final long mCreationTimeMillis;
 
     /**
      * A timestamp indicating when the card should be removed from view, in case the service
      * disconnects or restarts.
      */
-    @NonNull
+    @CurrentTimeMillisLong
     private final long mExpiryTimeMillis;
 
     /** A score assigned to a target. */
-    @NonNull
     private final float mScore;
 
     /** A {@link List<SmartspaceAction>} containing all action chips. */
@@ -89,18 +89,15 @@
      * @see FeatureType
      */
     @FeatureType
-    @NonNull
     private final int mFeatureType;
 
     /**
      * Indicates whether the content is sensitive. Certain UI surfaces may choose to skip rendering
      * real content until the device is unlocked.
      */
-    @NonNull
     private final boolean mSensitive;
 
     /** Indicating if the UI should show this target in its expanded state. */
-    @NonNull
     private final boolean mShouldShowExpanded;
 
     /** A Notification key if the target was generated using a notification. */
@@ -115,7 +112,14 @@
     @NonNull
     private final UserHandle mUserHandle;
 
-    /** Target Ids of other {@link SmartspaceTarget}s if they are associated with this target. */
+    /**
+     * Target Id of other {@link SmartspaceTarget}s if it is associated with this target. This
+     * association is added to tell the UI that a card would be more useful if displayed with the
+     * associated smartspace target. This field is supposed to be taken as a suggestion and the
+     * association can be ignored based on the situation in the UI. It is possible to have a one way
+     * card association. In other words, Card B can be associated with Card A but not the other way
+     * around.
+     */
     @Nullable
     private final String mAssociatedSmartspaceTargetId;
 
@@ -125,7 +129,7 @@
 
     /** {@link AppWidgetProviderInfo} if this target is a widget. */
     @Nullable
-    private final AppWidgetProviderInfo mWidgetId;
+    private final AppWidgetProviderInfo mWidget;
 
     public static final int FEATURE_UNDEFINED = 0;
     public static final int FEATURE_WEATHER = 1;
@@ -202,7 +206,7 @@
         this.mUserHandle = in.readTypedObject(UserHandle.CREATOR);
         this.mAssociatedSmartspaceTargetId = in.readString();
         this.mSliceUri = in.readTypedObject(Uri.CREATOR);
-        this.mWidgetId = in.readTypedObject(AppWidgetProviderInfo.CREATOR);
+        this.mWidget = in.readTypedObject(AppWidgetProviderInfo.CREATOR);
     }
 
     private SmartspaceTarget(String smartspaceTargetId,
@@ -213,7 +217,7 @@
             boolean shouldShowExpanded, String sourceNotificationKey,
             ComponentName componentName, UserHandle userHandle,
             String associatedSmartspaceTargetId, Uri sliceUri,
-            AppWidgetProviderInfo widgetId) {
+            AppWidgetProviderInfo widget) {
         mSmartspaceTargetId = smartspaceTargetId;
         mHeaderAction = headerAction;
         mBaseAction = baseAction;
@@ -230,7 +234,7 @@
         mUserHandle = userHandle;
         mAssociatedSmartspaceTargetId = associatedSmartspaceTargetId;
         mSliceUri = sliceUri;
-        mWidgetId = widgetId;
+        mWidget = widget;
     }
 
     /**
@@ -260,7 +264,7 @@
     /**
      * Returns the creation time of the target.
      */
-    @NonNull
+    @CurrentTimeMillisLong
     public long getCreationTimeMillis() {
         return mCreationTimeMillis;
     }
@@ -268,7 +272,7 @@
     /**
      * Returns the expiry time of the target.
      */
-    @NonNull
+    @CurrentTimeMillisLong
     public long getExpiryTimeMillis() {
         return mExpiryTimeMillis;
     }
@@ -276,7 +280,6 @@
     /**
      * Returns the score of the target.
      */
-    @NonNull
     public float getScore() {
         return mScore;
     }
@@ -300,7 +303,7 @@
     /**
      * Returns the feature type of the target.
      */
-    @NonNull
+    @FeatureType
     public int getFeatureType() {
         return mFeatureType;
     }
@@ -308,7 +311,6 @@
     /**
      * Returns whether the target is sensitive or not.
      */
-    @NonNull
     public boolean isSensitive() {
         return mSensitive;
     }
@@ -316,7 +318,6 @@
     /**
      * Returns whether the target should be shown in expanded state.
      */
-    @NonNull
     public boolean shouldShowExpanded() {
         return mShouldShowExpanded;
     }
@@ -365,8 +366,8 @@
      * Returns the AppWidgetProviderInfo, if the target is a widget.
      */
     @Nullable
-    public AppWidgetProviderInfo getWidgetId() {
-        return mWidgetId;
+    public AppWidgetProviderInfo getWidget() {
+        return mWidget;
     }
 
     /**
@@ -403,7 +404,7 @@
         dest.writeTypedObject(this.mUserHandle, flags);
         dest.writeString(this.mAssociatedSmartspaceTargetId);
         dest.writeTypedObject(this.mSliceUri, flags);
-        dest.writeTypedObject(this.mWidgetId, flags);
+        dest.writeTypedObject(this.mWidget, flags);
     }
 
     @Override
@@ -430,7 +431,7 @@
                 + ", mUserHandle=" + mUserHandle
                 + ", mAssociatedSmartspaceTargetId='" + mAssociatedSmartspaceTargetId + '\''
                 + ", mSliceUri=" + mSliceUri
-                + ", mWidgetId=" + mWidgetId
+                + ", mWidget=" + mWidget
                 + '}';
     }
 
@@ -456,7 +457,7 @@
                 && Objects.equals(mAssociatedSmartspaceTargetId,
                 that.mAssociatedSmartspaceTargetId)
                 && Objects.equals(mSliceUri, that.mSliceUri)
-                && Objects.equals(mWidgetId, that.mWidgetId);
+                && Objects.equals(mWidget, that.mWidget);
     }
 
     @Override
@@ -464,7 +465,7 @@
         return Objects.hash(mSmartspaceTargetId, mHeaderAction, mBaseAction, mCreationTimeMillis,
                 mExpiryTimeMillis, mScore, mActionChips, mIconGrid, mFeatureType, mSensitive,
                 mShouldShowExpanded, mSourceNotificationKey, mComponentName, mUserHandle,
-                mAssociatedSmartspaceTargetId, mSliceUri, mWidgetId);
+                mAssociatedSmartspaceTargetId, mSliceUri, mWidget);
     }
 
     /**
@@ -490,7 +491,7 @@
         private final UserHandle mUserHandle;
         private String mAssociatedSmartspaceTargetId;
         private Uri mSliceUri;
-        private AppWidgetProviderInfo mWidgetId;
+        private AppWidgetProviderInfo mWidget;
 
         /**
          * A builder for {@link SmartspaceTarget}.
@@ -528,7 +529,7 @@
          * Sets the creation time.
          */
         @NonNull
-        public Builder setCreationTimeMillis(@NonNull long creationTimeMillis) {
+        public Builder setCreationTimeMillis(@CurrentTimeMillisLong long creationTimeMillis) {
             this.mCreationTimeMillis = creationTimeMillis;
             return this;
         }
@@ -537,7 +538,7 @@
          * Sets the expiration time.
          */
         @NonNull
-        public Builder setExpiryTimeMillis(@NonNull long expiryTimeMillis) {
+        public Builder setExpiryTimeMillis(@CurrentTimeMillisLong long expiryTimeMillis) {
             this.mExpiryTimeMillis = expiryTimeMillis;
             return this;
         }
@@ -546,7 +547,7 @@
          * Sets the score.
          */
         @NonNull
-        public Builder setScore(@NonNull float score) {
+        public Builder setScore(float score) {
             this.mScore = score;
             return this;
         }
@@ -573,7 +574,7 @@
          * Sets the feature type.
          */
         @NonNull
-        public Builder setFeatureType(@NonNull int featureType) {
+        public Builder setFeatureType(int featureType) {
             this.mFeatureType = featureType;
             return this;
         }
@@ -582,7 +583,7 @@
          * Sets whether the contents are sensitive.
          */
         @NonNull
-        public Builder setSensitive(@NonNull boolean sensitive) {
+        public Builder setSensitive(boolean sensitive) {
             this.mSensitive = sensitive;
             return this;
         }
@@ -591,7 +592,7 @@
          * Sets whether to show the card as expanded.
          */
         @NonNull
-        public Builder setShouldShowExpanded(@NonNull boolean shouldShowExpanded) {
+        public Builder setShouldShowExpanded(boolean shouldShowExpanded) {
             this.mShouldShowExpanded = shouldShowExpanded;
             return this;
         }
@@ -618,7 +619,7 @@
         /**
          * Sets the slice uri.
          *
-         * <p><b>NOTE: </b> If {@link mWidgetId} is also set, {@link mSliceUri} should be ignored.
+         * <p><b>NOTE: </b> If {@link mWidget} is also set, {@link mSliceUri} should be ignored.
          */
         @NonNull
         public Builder setSliceUri(@NonNull Uri sliceUri) {
@@ -629,12 +630,12 @@
         /**
          * Sets the widget id.
          *
-         * <p><b>NOTE: </b> If {@link mWidgetId} is set, all other @Nullable params should be
+         * <p><b>NOTE: </b> If {@link mWidget} is set, all other @Nullable params should be
          * ignored.
          */
         @NonNull
-        public Builder setWidgetId(@NonNull AppWidgetProviderInfo widgetId) {
-            this.mWidgetId = widgetId;
+        public Builder setWidget(@NonNull AppWidgetProviderInfo widget) {
+            this.mWidget = widget;
             return this;
         }
 
@@ -654,7 +655,7 @@
                     mHeaderAction, mBaseAction, mCreationTimeMillis, mExpiryTimeMillis, mScore,
                     mActionChips, mIconGrid, mFeatureType, mSensitive, mShouldShowExpanded,
                     mSourceNotificationKey, mComponentName, mUserHandle,
-                    mAssociatedSmartspaceTargetId, mSliceUri, mWidgetId);
+                    mAssociatedSmartspaceTargetId, mSliceUri, mWidget);
         }
     }
 }
diff --git a/core/java/android/app/smartspace/SmartspaceTargetEvent.java b/core/java/android/app/smartspace/SmartspaceTargetEvent.java
index 920b9fe..61f8723 100644
--- a/core/java/android/app/smartspace/SmartspaceTargetEvent.java
+++ b/core/java/android/app/smartspace/SmartspaceTargetEvent.java
@@ -41,11 +41,11 @@
     /**
      * Smartspace target was brought into view.
      */
-    public static final int EVENT_TARGET_IN_VIEW = 2;
+    public static final int EVENT_TARGET_SHOWN = 2;
     /**
      * Smartspace target went out of view.
      */
-    public static final int EVENT_TARGET_OUT_OF_VIEW = 3;
+    public static final int EVENT_TARGET_HIDDEN = 3;
     /**
      * A dismiss action was issued by the user.
      */
@@ -57,11 +57,11 @@
     /**
      * The Ui surface came into view.
      */
-    public static final int EVENT_UI_SURFACE_IN_VIEW = 6;
+    public static final int EVENT_UI_SURFACE_SHOWN = 6;
     /**
      * The Ui surface went out of view.
      */
-    public static final int EVENT_UI_SURFACE_OUT_OF_VIEW = 7;
+    public static final int EVENT_UI_SURFACE_HIDDEN = 7;
 
     /**
      * @see Parcelable.Creator
@@ -152,12 +152,12 @@
      */
     @IntDef(prefix = {"EVENT_"}, value = {
             EVENT_TARGET_INTERACTION,
-            EVENT_TARGET_IN_VIEW,
-            EVENT_TARGET_OUT_OF_VIEW,
+            EVENT_TARGET_SHOWN,
+            EVENT_TARGET_HIDDEN,
             EVENT_TARGET_DISMISS,
             EVENT_TARGET_BLOCK,
-            EVENT_UI_SURFACE_IN_VIEW,
-            EVENT_UI_SURFACE_OUT_OF_VIEW
+            EVENT_UI_SURFACE_SHOWN,
+            EVENT_UI_SURFACE_HIDDEN
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface EventType {
diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java
index 0d21e09..1fb7638 100644
--- a/core/java/android/bluetooth/BluetoothA2dp.java
+++ b/core/java/android/bluetooth/BluetoothA2dp.java
@@ -23,13 +23,13 @@
 import android.annotation.RequiresNoPermission;
 import android.annotation.RequiresPermission;
 import android.annotation.SdkConstant;
-import android.annotation.SuppressLint;
 import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemApi;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothAdminPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
-import android.annotation.SystemApi;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Build;
@@ -104,6 +104,8 @@
             "android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED";
 
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_AVRCP_CONNECTION_STATE_CHANGED =
             "android.bluetooth.a2dp.profile.action.AVRCP_CONNECTION_STATE_CHANGED";
@@ -263,7 +265,8 @@
     @SystemApi
     public static final int DYNAMIC_BUFFER_SUPPORT_A2DP_SOFTWARE_ENCODING = 2;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothA2dp> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.A2DP, "BluetoothA2dp",
                     IBluetoothA2dp.class.getName()) {
@@ -277,8 +280,10 @@
      * Create a BluetoothA2dp proxy object for interacting with the local
      * Bluetooth A2DP service.
      */
-    /*package*/ BluetoothA2dp(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothA2dp(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -384,7 +389,8 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(), mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<BluetoothDevice>();
@@ -405,7 +411,8 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states), mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<BluetoothDevice>();
@@ -466,7 +473,7 @@
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()
                     && ((device == null) || isValidDevice(device))) {
-                return service.setActiveDevice(device);
+                return service.setActiveDevice(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -493,7 +500,7 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                return service.getActiveDevice();
+                return service.getActiveDevice(mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return null;
@@ -553,7 +560,7 @@
                         && connectionPolicy != BluetoothProfile.CONNECTION_POLICY_ALLOWED) {
                     return false;
                 }
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -583,7 +590,8 @@
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                return BluetoothAdapter.connectionPolicyToPriority(service.getPriority(device));
+                return BluetoothAdapter.connectionPolicyToPriority(
+                        service.getPriority(device, mAttributionSource));
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return BluetoothProfile.PRIORITY_OFF;
@@ -605,14 +613,18 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
         if (VDBG) log("getConnectionPolicy(" + device + ")");
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -657,7 +669,7 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                service.setAvrcpAbsoluteVolume(volume);
+                service.setAvrcpAbsoluteVolume(volume, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
         } catch (RemoteException e) {
@@ -678,7 +690,7 @@
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                return service.isA2dpPlaying(device);
+                return service.isA2dpPlaying(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -730,7 +742,7 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                return service.getCodecStatus(device);
+                return service.getCodecStatus(device, mAttributionSource);
             }
             if (service == null) {
                 Log.w(TAG, "Proxy not attached to service");
@@ -765,7 +777,7 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                service.setCodecConfigPreference(device, codecConfig);
+                service.setCodecConfigPreference(device, codecConfig, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return;
@@ -822,9 +834,9 @@
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
                 if (enable) {
-                    service.enableOptionalCodecs(device);
+                    service.enableOptionalCodecs(device, mAttributionSource);
                 } else {
-                    service.disableOptionalCodecs(device);
+                    service.disableOptionalCodecs(device, mAttributionSource);
                 }
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
@@ -853,7 +865,7 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled() && isValidDevice(device)) {
-                return service.supportsOptionalCodecs(device);
+                return service.supportsOptionalCodecs(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return OPTIONAL_CODECS_SUPPORT_UNKNOWN;
@@ -881,7 +893,7 @@
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled() && isValidDevice(device)) {
-                return service.getOptionalCodecsEnabled(device);
+                return service.getOptionalCodecsEnabled(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return OPTIONAL_CODECS_PREF_UNKNOWN;
@@ -917,7 +929,7 @@
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                service.setOptionalCodecsEnabled(device, value);
+                service.setOptionalCodecsEnabled(device, value, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return;
@@ -939,13 +951,17 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @Type int getDynamicBufferSupport() {
         if (VDBG) log("getDynamicBufferSupport()");
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                return service.getDynamicBufferSupport();
+                return service.getDynamicBufferSupport(mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return DYNAMIC_BUFFER_SUPPORT_NONE;
@@ -966,13 +982,17 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @Nullable BufferConstraints getBufferConstraints() {
         if (VDBG) log("getBufferConstraints()");
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                return service.getBufferConstraints();
+                return service.getBufferConstraints(mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return null;
@@ -992,14 +1012,18 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean setBufferLengthMillis(@BluetoothCodecConfig.SourceCodecType int codec,
             int value) {
         if (VDBG) log("setBufferLengthMillis(" + codec + ", " + value + ")");
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
-                return service.setBufferLengthMillis(codec, value);
+                return service.setBufferLengthMillis(codec, value, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
diff --git a/core/java/android/bluetooth/BluetoothA2dpSink.java b/core/java/android/bluetooth/BluetoothA2dpSink.java
index 280e8bc..c0a2aa3 100755
--- a/core/java/android/bluetooth/BluetoothA2dpSink.java
+++ b/core/java/android/bluetooth/BluetoothA2dpSink.java
@@ -19,12 +19,15 @@
 import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothAdminPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Build;
@@ -70,11 +73,14 @@
      */
     @SystemApi
     @SuppressLint("ActionValue")
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED";
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothA2dpSink> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.A2DP_SINK,
                     "BluetoothA2dpSink", IBluetoothA2dpSink.class.getName()) {
@@ -88,8 +94,10 @@
      * Create a BluetoothA2dp proxy object for interacting with the local
      * Bluetooth A2DP service.
      */
-    /*package*/ BluetoothA2dpSink(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothA2dpSink(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -124,13 +132,17 @@
      * @return false on immediate error, true otherwise
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean connect(BluetoothDevice device) {
         if (DBG) log("connect(" + device + ")");
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -171,7 +183,7 @@
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -194,7 +206,8 @@
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -217,7 +230,9 @@
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -240,7 +255,7 @@
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -269,7 +284,7 @@
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getAudioConfig(device);
+                return service.getAudioConfig(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return null;
@@ -328,7 +343,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -348,7 +363,11 @@
      * @return priority of the device
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public int getPriority(BluetoothDevice device) {
         if (VDBG) log("getPriority(" + device + ")");
         return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -366,13 +385,17 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
         if (VDBG) log("getConnectionPolicy(" + device + ")");
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -391,12 +414,16 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean isAudioPlaying(@NonNull BluetoothDevice device) {
         final IBluetoothA2dpSink service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.isA2dpPlaying(device);
+                return service.isA2dpPlaying(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 052a773..8afc557 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -31,12 +31,12 @@
 import android.app.PropertyInvalidatedCache;
 import android.bluetooth.BluetoothDevice.Transport;
 import android.bluetooth.BluetoothProfile.ConnectionPolicy;
-import android.bluetooth.annotations.RequiresLegacyBluetoothAdminPermission;
 import android.bluetooth.annotations.RequiresBluetoothAdvertisePermission;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresBluetoothLocationPermission;
-import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.bluetooth.annotations.RequiresBluetoothScanPermission;
+import android.bluetooth.annotations.RequiresLegacyBluetoothAdminPermission;
+import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.bluetooth.le.BluetoothLeAdvertiser;
 import android.bluetooth.le.BluetoothLeScanner;
 import android.bluetooth.le.PeriodicAdvertisingManager;
@@ -53,7 +53,6 @@
 import android.os.Build;
 import android.os.IBinder;
 import android.os.ParcelUuid;
-import android.os.Process;
 import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
@@ -75,6 +74,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.Executor;
@@ -604,6 +604,7 @@
      *
      * @hide
      */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     @SystemApi public static final String ACTION_BLE_STATE_CHANGED =
             "android.bluetooth.adapter.action.BLE_STATE_CHANGED";
 
@@ -618,6 +619,9 @@
      *
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_BLUETOOTH_ADDRESS_CHANGED =
             "android.bluetooth.adapter.action.BLUETOOTH_ADDRESS_CHANGED";
 
@@ -642,6 +646,9 @@
      *
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_BLE_ACL_CONNECTED =
             "android.bluetooth.adapter.action.BLE_ACL_CONNECTED";
 
@@ -656,6 +663,9 @@
      *
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_BLE_ACL_DISCONNECTED =
             "android.bluetooth.adapter.action.BLE_ACL_DISCONNECTED";
 
@@ -696,14 +706,15 @@
      */
     private static BluetoothAdapter sAdapter;
 
-    private static BluetoothLeScanner sBluetoothLeScanner;
-    private static BluetoothLeAdvertiser sBluetoothLeAdvertiser;
-    private static PeriodicAdvertisingManager sPeriodicAdvertisingManager;
+    private BluetoothLeScanner mBluetoothLeScanner;
+    private BluetoothLeAdvertiser mBluetoothLeAdvertiser;
+    private PeriodicAdvertisingManager mPeriodicAdvertisingManager;
 
     private final IBluetoothManager mManagerService;
+    private final AttributionSource mAttributionSource;
+
     @UnsupportedAppUsage
     private IBluetooth mService;
-    private Context mContext;
     private final ReentrantReadWriteLock mServiceLock = new ReentrantReadWriteLock();
 
     private final Object mLock = new Object();
@@ -741,32 +752,43 @@
 
     /**
      * Get a handle to the default local Bluetooth adapter.
-     * <p>Currently Android only supports one Bluetooth adapter, but the API
-     * could be extended to support more. This will always return the default
-     * adapter.
+     * <p>
+     * Currently Android only supports one Bluetooth adapter, but the API could
+     * be extended to support more. This will always return the default adapter.
      * </p>
      *
-     * @return the default local adapter, or null if Bluetooth is not supported on this hardware
-     * platform
+     * @return the default local adapter, or null if Bluetooth is not supported
+     *         on this hardware platform
+     * @deprecated this method will continue to work, but developers are
+     *             strongly encouraged to migrate to using
+     *             {@link BluetoothManager#getAdapter()}, since that approach
+     *             enables support for {@link Context#createAttributionContext}.
      */
+    @Deprecated
     @RequiresNoPermission
     public static synchronized BluetoothAdapter getDefaultAdapter() {
         if (sAdapter == null) {
-            IBinder b = ServiceManager.getService(BLUETOOTH_MANAGER_SERVICE);
-            if (b != null) {
-                IBluetoothManager managerService = IBluetoothManager.Stub.asInterface(b);
-                sAdapter = new BluetoothAdapter(managerService);
-            } else {
-                Log.e(TAG, "Bluetooth binder is null");
-            }
+            sAdapter = createAdapter(BluetoothManager.resolveAttributionSource(null));
         }
         return sAdapter;
     }
 
+    /** {@hide} */
+    public static BluetoothAdapter createAdapter(AttributionSource attributionSource) {
+        IBinder binder = ServiceManager.getService(BLUETOOTH_MANAGER_SERVICE);
+        if (binder != null) {
+            return new BluetoothAdapter(IBluetoothManager.Stub.asInterface(binder),
+                    attributionSource);
+        } else {
+            Log.e(TAG, "Bluetooth binder is null");
+            return null;
+        }
+    }
+
     /**
      * Use {@link #getDefaultAdapter} to get the BluetoothAdapter instance.
      */
-    BluetoothAdapter(IBluetoothManager managerService) {
+    BluetoothAdapter(IBluetoothManager managerService, AttributionSource attributionSource) {
         if (managerService == null) {
             throw new IllegalArgumentException("bluetooth manager service is null");
         }
@@ -778,7 +800,8 @@
         } finally {
             mServiceLock.writeLock().unlock();
         }
-        mManagerService = managerService;
+        mManagerService = Objects.requireNonNull(managerService);
+        mAttributionSource = Objects.requireNonNull(attributionSource);
         mLeScanClients = new HashMap<LeScanCallback, ScanCallback>();
         mToken = new Binder();
     }
@@ -797,7 +820,9 @@
      */
     @RequiresNoPermission
     public BluetoothDevice getRemoteDevice(String address) {
-        return new BluetoothDevice(address);
+        final BluetoothDevice res = new BluetoothDevice(address);
+        res.setAttributionSource(mAttributionSource);
+        return res;
     }
 
     /**
@@ -816,9 +841,11 @@
         if (address == null || address.length != 6) {
             throw new IllegalArgumentException("Bluetooth address must have 6 bytes");
         }
-        return new BluetoothDevice(
+        final BluetoothDevice res = new BluetoothDevice(
                 String.format(Locale.US, "%02X:%02X:%02X:%02X:%02X:%02X", address[0], address[1],
                         address[2], address[3], address[4], address[5]));
+        res.setAttributionSource(mAttributionSource);
+        return res;
     }
 
     /**
@@ -835,11 +862,11 @@
             return null;
         }
         synchronized (mLock) {
-            if (sBluetoothLeAdvertiser == null) {
-                sBluetoothLeAdvertiser = new BluetoothLeAdvertiser(mManagerService);
+            if (mBluetoothLeAdvertiser == null) {
+                mBluetoothLeAdvertiser = new BluetoothLeAdvertiser(this);
             }
+            return mBluetoothLeAdvertiser;
         }
-        return sBluetoothLeAdvertiser;
     }
 
     /**
@@ -863,11 +890,11 @@
         }
 
         synchronized (mLock) {
-            if (sPeriodicAdvertisingManager == null) {
-                sPeriodicAdvertisingManager = new PeriodicAdvertisingManager(mManagerService);
+            if (mPeriodicAdvertisingManager == null) {
+                mPeriodicAdvertisingManager = new PeriodicAdvertisingManager(this);
             }
+            return mPeriodicAdvertisingManager;
         }
-        return sPeriodicAdvertisingManager;
     }
 
     /**
@@ -879,12 +906,11 @@
             return null;
         }
         synchronized (mLock) {
-            if (sBluetoothLeScanner == null) {
-                sBluetoothLeScanner =
-                        new BluetoothLeScanner(mManagerService, getAttributionSource());
+            if (mBluetoothLeScanner == null) {
+                mBluetoothLeScanner = new BluetoothLeScanner(this);
             }
+            return mBluetoothLeScanner;
         }
-        return sBluetoothLeScanner;
     }
 
     /**
@@ -955,7 +981,7 @@
         }
         String packageName = ActivityThread.currentPackageName();
         try {
-            return mManagerService.disableBle(packageName, mToken);
+            return mManagerService.disableBle(mAttributionSource, mToken);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1002,7 +1028,7 @@
         }
         String packageName = ActivityThread.currentPackageName();
         try {
-            return mManagerService.enableBle(packageName, mToken);
+            return mManagerService.enableBle(mAttributionSource, mToken);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1167,7 +1193,7 @@
             return true;
         }
         try {
-            return mManagerService.enable(ActivityThread.currentPackageName());
+            return mManagerService.enable(mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1200,7 +1226,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     public boolean disable() {
         try {
-            return mManagerService.disable(ActivityThread.currentPackageName(), true);
+            return mManagerService.disable(mAttributionSource, true);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1220,7 +1246,7 @@
     public boolean disable(boolean persist) {
 
         try {
-            return mManagerService.disable(ActivityThread.currentPackageName(), persist);
+            return mManagerService.disable(mAttributionSource, persist);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1241,7 +1267,7 @@
     })
     public String getAddress() {
         try {
-            return mManagerService.getAddress();
+            return mManagerService.getAddress(mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1259,7 +1285,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     public String getName() {
         try {
-            return mManagerService.getName();
+            return mManagerService.getName(mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1271,7 +1297,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
     public int getNameLengthForAdvertise() {
         try {
-            return mService.getNameLengthForAdvertise();
+            return mService.getNameLengthForAdvertise(mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1290,7 +1316,8 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null && mService.factoryReset()
-                    && mManagerService != null && mManagerService.onFactoryReset()) {
+                    && mManagerService != null
+                    && mManagerService.onFactoryReset(mAttributionSource)) {
                 return true;
             }
             Log.e(TAG, "factoryReset(): Setting persist.bluetooth.factoryreset to retry later");
@@ -1320,7 +1347,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.getUuids();
+                return mService.getUuids(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1354,7 +1381,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.setName(name);
+                return mService.setName(name, mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1382,7 +1409,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.getBluetoothClass();
+                return mService.getBluetoothClass(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1438,7 +1465,7 @@
         if (getState() != STATE_ON) return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;
         try {
             mServiceLock.readLock().lock();
-            if (mService != null) return mService.getIoCapability();
+            if (mService != null) return mService.getIoCapability(mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, e.getMessage(), e);
         } finally {
@@ -1491,7 +1518,7 @@
         if (getState() != STATE_ON) return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;
         try {
             mServiceLock.readLock().lock();
-            if (mService != null) return mService.getLeIoCapability();
+            if (mService != null) return mService.getLeIoCapability(mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, e.getMessage(), e);
         } finally {
@@ -1553,7 +1580,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.getScanMode();
+                return mService.getScanMode(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1602,7 +1629,7 @@
             mServiceLock.readLock().lock();
             if (mService != null) {
                 int durationSeconds = Math.toIntExact(durationMillis / 1000);
-                return mService.setScanMode(mode, durationSeconds);
+                return mService.setScanMode(mode, durationSeconds, mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1652,7 +1679,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.setScanMode(mode, getDiscoverableTimeout());
+                return mService.setScanMode(mode, getDiscoverableTimeout(), mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1673,7 +1700,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.getDiscoverableTimeout();
+                return mService.getDiscoverableTimeout(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1694,7 +1721,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                mService.setDiscoverableTimeout(timeout);
+                mService.setDiscoverableTimeout(timeout, mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1728,31 +1755,6 @@
     }
 
     /**
-     * Set the context for this BluetoothAdapter (only called from BluetoothManager)
-     * @hide
-     */
-    @RequiresNoPermission
-    public void setContext(Context context) {
-        mContext = context;
-    }
-
-    String getOpPackageName() {
-        // Workaround for legacy API for getting a BluetoothAdapter not
-        // passing a context
-        if (mContext != null) {
-            return mContext.getOpPackageName();
-        }
-        return ActivityThread.currentOpPackageName();
-    }
-
-    private AttributionSource getAttributionSource() {
-        if (mContext != null) {
-            return mContext.getAttributionSource();
-        }
-        return new AttributionSource(Process.myUid(), ActivityThread.currentOpPackageName(), null);
-    }
-
-    /**
      * Start the remote device discovery process.
      * <p>The discovery process usually involves an inquiry scan of about 12
      * seconds, followed by a page scan of each new device to retrieve its
@@ -1792,7 +1794,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.startDiscovery(getAttributionSource());
+                return mService.startDiscovery(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1828,7 +1830,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.cancelDiscovery();
+                return mService.cancelDiscovery(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1866,7 +1868,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.isDiscovering();
+                return mService.isDiscovering(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1909,7 +1911,7 @@
             mServiceLock.readLock().lock();
             if (mService != null) {
                 if (DBG) Log.d(TAG, "removeActiveDevice, profiles: " + profiles);
-                return mService.removeActiveDevice(profiles);
+                return mService.removeActiveDevice(profiles, mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1961,7 +1963,7 @@
                 if (DBG) {
                     Log.d(TAG, "setActiveDevice, device: " + device + ", profiles: " + profiles);
                 }
-                return mService.setActiveDevice(device, profiles);
+                return mService.setActiveDevice(device, profiles, mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1994,7 +1996,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.connectAllEnabledProfiles(device);
+                return mService.connectAllEnabledProfiles(device, mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -2026,7 +2028,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.disconnectAllEnabledProfiles(device);
+                return mService.disconnectAllEnabledProfiles(device, mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -2303,7 +2305,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.getMaxConnectedAudioDevices();
+                return mService.getMaxConnectedAudioDevices(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "failed to get getMaxConnectedAudioDevices, error: ", e);
@@ -2331,7 +2333,7 @@
                 // BLE is not supported
                 return false;
             }
-            return (iGatt.numHwTrackFiltersAvailable() != 0);
+            return (iGatt.numHwTrackFiltersAvailable(mAttributionSource) != 0);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -2415,7 +2417,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return mService.getMostRecentlyConnectedDevices();
+                return mService.getMostRecentlyConnectedDevices(mAttributionSource);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -2445,7 +2447,7 @@
         try {
             mServiceLock.readLock().lock();
             if (mService != null) {
-                return toDeviceSet(mService.getBondedDevices());
+                return toDeviceSet(mService.getBondedDevices(mAttributionSource));
             }
             return toDeviceSet(new BluetoothDevice[0]);
         } catch (RemoteException e) {
@@ -2970,50 +2972,51 @@
         }
 
         if (profile == BluetoothProfile.HEADSET) {
-            BluetoothHeadset headset = new BluetoothHeadset(context, listener);
+            BluetoothHeadset headset = new BluetoothHeadset(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.A2DP) {
-            BluetoothA2dp a2dp = new BluetoothA2dp(context, listener);
+            BluetoothA2dp a2dp = new BluetoothA2dp(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.A2DP_SINK) {
-            BluetoothA2dpSink a2dpSink = new BluetoothA2dpSink(context, listener);
+            BluetoothA2dpSink a2dpSink = new BluetoothA2dpSink(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.AVRCP_CONTROLLER) {
-            BluetoothAvrcpController avrcp = new BluetoothAvrcpController(context, listener);
+            BluetoothAvrcpController avrcp = new BluetoothAvrcpController(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.HID_HOST) {
-            BluetoothHidHost iDev = new BluetoothHidHost(context, listener);
+            BluetoothHidHost iDev = new BluetoothHidHost(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.PAN) {
-            BluetoothPan pan = new BluetoothPan(context, listener);
+            BluetoothPan pan = new BluetoothPan(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.PBAP) {
-            BluetoothPbap pbap = new BluetoothPbap(context, listener);
+            BluetoothPbap pbap = new BluetoothPbap(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.HEALTH) {
             Log.e(TAG, "getProfileProxy(): BluetoothHealth is deprecated");
             return false;
         } else if (profile == BluetoothProfile.MAP) {
-            BluetoothMap map = new BluetoothMap(context, listener);
+            BluetoothMap map = new BluetoothMap(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.HEADSET_CLIENT) {
-            BluetoothHeadsetClient headsetClient = new BluetoothHeadsetClient(context, listener);
+            BluetoothHeadsetClient headsetClient =
+                    new BluetoothHeadsetClient(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.SAP) {
-            BluetoothSap sap = new BluetoothSap(context, listener);
+            BluetoothSap sap = new BluetoothSap(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.PBAP_CLIENT) {
-            BluetoothPbapClient pbapClient = new BluetoothPbapClient(context, listener);
+            BluetoothPbapClient pbapClient = new BluetoothPbapClient(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.MAP_CLIENT) {
-            BluetoothMapClient mapClient = new BluetoothMapClient(context, listener);
+            BluetoothMapClient mapClient = new BluetoothMapClient(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.HID_DEVICE) {
-            BluetoothHidDevice hidDevice = new BluetoothHidDevice(context, listener);
+            BluetoothHidDevice hidDevice = new BluetoothHidDevice(context, listener, this);
             return true;
         } else if (profile == BluetoothProfile.HEARING_AID) {
             if (isHearingAidProfileSupported()) {
-                BluetoothHearingAid hearingAid = new BluetoothHearingAid(context, listener);
+                BluetoothHearingAid hearingAid = new BluetoothHearingAid(context, listener, this);
                 return true;
             }
             return false;
@@ -3167,11 +3170,11 @@
                         if (mLeScanClients != null) {
                             mLeScanClients.clear();
                         }
-                        if (sBluetoothLeAdvertiser != null) {
-                            sBluetoothLeAdvertiser.cleanup();
+                        if (mBluetoothLeAdvertiser != null) {
+                            mBluetoothLeAdvertiser.cleanup();
                         }
-                        if (sBluetoothLeScanner != null) {
-                            sBluetoothLeScanner.cleanup();
+                        if (mBluetoothLeScanner != null) {
+                            mBluetoothLeScanner.cleanup();
                         }
                     } finally {
                         mServiceLock.writeLock().unlock();
@@ -3217,7 +3220,7 @@
             return true;
         }
         try {
-            return mManagerService.enableNoAutoConnect(ActivityThread.currentPackageName());
+            return mManagerService.enableNoAutoConnect(mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -3260,7 +3263,7 @@
 
     /**
      * Provides callback methods for receiving {@link OobData} from the host stack, as well as an
-     * error interface in order to allow the caller to determine next steps based on the {@link
+     * error interface in order to allow the caller to determine next steps based on the {@code
      * ErrorCode}.
      *
      * @hide
@@ -3510,11 +3513,17 @@
                 && (Integer.parseInt(address.split(":")[5], 16) & 0b11) == 0b11;
     }
 
+    /** {@hide} */
     @UnsupportedAppUsage
-    /*package*/ IBluetoothManager getBluetoothManager() {
+    public IBluetoothManager getBluetoothManager() {
         return mManagerService;
     }
 
+    /** {@hide} */
+    public AttributionSource getAttributionSource() {
+        return mAttributionSource;
+    }
+
     private final ArrayList<IBluetoothManagerCallback> mProxyServiceStateCallbacks =
             new ArrayList<IBluetoothManagerCallback>();
 
diff --git a/core/java/android/bluetooth/BluetoothAvrcpController.java b/core/java/android/bluetooth/BluetoothAvrcpController.java
index 5148d5b..0b43e71 100644
--- a/core/java/android/bluetooth/BluetoothAvrcpController.java
+++ b/core/java/android/bluetooth/BluetoothAvrcpController.java
@@ -17,9 +17,12 @@
 package android.bluetooth;
 
 import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
 import android.annotation.SuppressLint;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -62,6 +65,7 @@
     @RequiresLegacyBluetoothPermission
     @RequiresBluetoothConnectPermission
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.avrcp-controller.profile.action.CONNECTION_STATE_CHANGED";
 
@@ -74,13 +78,17 @@
      * most recent player setting. </li>
      * </ul>
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PLAYER_SETTING =
             "android.bluetooth.avrcp-controller.profile.action.PLAYER_SETTING";
 
     public static final String EXTRA_PLAYER_SETTING =
             "android.bluetooth.avrcp-controller.profile.extra.PLAYER_SETTING";
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothAvrcpController> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.AVRCP_CONTROLLER,
                     "BluetoothAvrcpController", IBluetoothAvrcpController.class.getName()) {
@@ -95,8 +103,10 @@
      * Create a BluetoothAvrcpController proxy object for interacting with the local
      * Bluetooth AVRCP service.
      */
-    /*package*/ BluetoothAvrcpController(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothAvrcpController(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -125,7 +135,8 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -147,7 +158,9 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -169,7 +182,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -193,7 +206,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                settings = service.getPlayerSettings(device);
+                settings = service.getPlayerSettings(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Error talking to BT service in getMetadata() " + e);
                 return null;
@@ -214,7 +227,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.setPlayerApplicationSetting(plAppSetting);
+                return service.setPlayerApplicationSetting(plAppSetting, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Error talking to BT service in setPlayerApplicationSetting() " + e);
                 return false;
@@ -237,7 +250,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                service.sendGroupNavigationCmd(device, keyCode, keyState);
+                service.sendGroupNavigationCmd(device, keyCode, keyState, mAttributionSource);
                 return;
             } catch (RemoteException e) {
                 Log.e(TAG, "Error talking to BT service in sendGroupNavigationCmd()", e);
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 1201663..98823b09 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -32,6 +32,7 @@
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.companion.AssociationRequest;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Build;
 import android.os.Handler;
@@ -46,6 +47,7 @@
 import java.io.UnsupportedEncodingException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -389,6 +391,8 @@
 
 
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public static final String ACTION_SDP_RECORD =
@@ -663,13 +667,15 @@
      * <p> Always contains the extra field {@link #EXTRA_UUID}
      */
     @RequiresLegacyBluetoothAdminPermission
-    @RequiresBluetoothScanPermission
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_UUID =
             "android.bluetooth.device.action.UUID";
 
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_MAS_INSTANCE =
             "android.bluetooth.device.action.MAS_INSTANCE";
@@ -693,28 +699,36 @@
      * Broadcast Action: This intent is used to broadcast PAIRING REQUEST
      */
     @RequiresLegacyBluetoothAdminPermission
-    @RequiresBluetoothScanPermission
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_SCAN)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PAIRING_REQUEST =
             "android.bluetooth.device.action.PAIRING_REQUEST";
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     @UnsupportedAppUsage
     public static final String ACTION_PAIRING_CANCEL =
             "android.bluetooth.device.action.PAIRING_CANCEL";
 
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_ACCESS_REQUEST =
             "android.bluetooth.device.action.CONNECTION_ACCESS_REQUEST";
 
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_ACCESS_REPLY =
             "android.bluetooth.device.action.CONNECTION_ACCESS_REPLY";
 
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_ACCESS_CANCEL =
             "android.bluetooth.device.action.CONNECTION_ACCESS_CANCEL";
@@ -725,6 +739,8 @@
      *
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     @SystemApi
     public static final String ACTION_SILENCE_MODE_CHANGED =
@@ -1090,6 +1106,8 @@
     private final String mAddress;
     @AddressType private final int mAddressType;
 
+    private AttributionSource mAttributionSource;
+
     /*package*/
     @UnsupportedAppUsage
     static IBluetooth getService() {
@@ -1135,6 +1153,7 @@
      * and is validated in this constructor.
      *
      * @param address valid Bluetooth MAC address
+     * @param attributionSource attribution for permission-protected calls
      * @throws RuntimeException Bluetooth is not available on this platform
      * @throws IllegalArgumentException address is invalid
      * @hide
@@ -1148,6 +1167,27 @@
 
         mAddress = address;
         mAddressType = ADDRESS_TYPE_PUBLIC;
+        mAttributionSource = BluetoothManager.resolveAttributionSource(null);
+    }
+
+    void setAttributionSource(AttributionSource attributionSource) {
+        mAttributionSource = attributionSource;
+    }
+
+    static BluetoothDevice setAttributionSource(BluetoothDevice device,
+            AttributionSource attributionSource) {
+        device.setAttributionSource(attributionSource);
+        return device;
+    }
+
+    static List<BluetoothDevice> setAttributionSource(List<BluetoothDevice> devices,
+            AttributionSource attributionSource) {
+        if (devices != null) {
+            for (BluetoothDevice device : devices) {
+                device.setAttributionSource(attributionSource);
+            }
+        }
+        return devices;
     }
 
     @Override
@@ -1240,7 +1280,7 @@
             return null;
         }
         try {
-            String name = service.getRemoteName(this);
+            String name = service.getRemoteName(this, mAttributionSource);
             if (name != null) {
                 // remove whitespace characters from the name
                 return name
@@ -1271,7 +1311,7 @@
             return DEVICE_TYPE_UNKNOWN;
         }
         try {
-            return service.getRemoteType(this);
+            return service.getRemoteType(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1295,7 +1335,7 @@
             return null;
         }
         try {
-            String alias = service.getRemoteAlias(this);
+            String alias = service.getRemoteAliasWithAttribution(this, mAttributionSource);
             if (alias == null) {
                 return getName();
             }
@@ -1336,8 +1376,7 @@
             return false;
         }
         try {
-            BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-            return service.setRemoteAlias(this, alias, adapter.getOpPackageName());
+            return service.setRemoteAlias(this, alias, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1363,7 +1402,7 @@
             return BATTERY_LEVEL_BLUETOOTH_OFF;
         }
         try {
-            return service.getBatteryLevel(this);
+            return service.getBatteryLevel(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1453,8 +1492,8 @@
             return false;
         }
         try {
-            return service.createBond(this, transport, remoteP192Data, remoteP256Data,
-                    BluetoothAdapter.getDefaultAdapter().getOpPackageName());
+            return service.createBond(
+                    this, transport, remoteP192Data, remoteP256Data, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1479,7 +1518,7 @@
             return false;
         }
         try {
-            return service.isBondingInitiatedLocally(this);
+            return service.isBondingInitiatedLocally(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1504,7 +1543,7 @@
             Log.i(TAG, "cancelBondProcess() for device " + getAddress()
                     + " called by pid: " + Process.myPid()
                     + " tid: " + Process.myTid());
-            return service.cancelBondProcess(this);
+            return service.cancelBondProcess(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1532,7 +1571,7 @@
             Log.i(TAG, "removeBond() for device " + getAddress()
                     + " called by pid: " + Process.myPid()
                     + " tid: " + Process.myTid());
-            return service.removeBond(this);
+            return service.removeBond(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1548,7 +1587,7 @@
                 @SuppressLint("AndroidFrameworkRequiresPermission")
                 protected Integer recompute(BluetoothDevice query) {
                     try {
-                        return sService.getBondState(query);
+                        return sService.getBondState(query, mAttributionSource);
                     } catch (RemoteException e) {
                         throw e.rethrowAsRuntimeException();
                     }
@@ -1638,7 +1677,8 @@
             return false;
         }
         try {
-            return service.getConnectionState(this) != CONNECTION_STATE_DISCONNECTED;
+            return service.getConnectionStateWithAttribution(this, mAttributionSource)
+                    != CONNECTION_STATE_DISCONNECTED;
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1663,7 +1703,8 @@
             return false;
         }
         try {
-            return service.getConnectionState(this) > CONNECTION_STATE_CONNECTED;
+            return service.getConnectionStateWithAttribution(this, mAttributionSource)
+                    > CONNECTION_STATE_CONNECTED;
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1685,7 +1726,7 @@
             return null;
         }
         try {
-            int classInt = service.getRemoteClass(this);
+            int classInt = service.getRemoteClass(this, mAttributionSource);
             if (classInt == BluetoothClass.ERROR) return null;
             return new BluetoothClass(classInt);
         } catch (RemoteException e) {
@@ -1714,7 +1755,7 @@
             return null;
         }
         try {
-            return service.getRemoteUuids(this);
+            return service.getRemoteUuids(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1744,7 +1785,7 @@
             return false;
         }
         try {
-            return service.fetchRemoteUuids(this);
+            return service.fetchRemoteUuidsWithAttribution(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1781,7 +1822,7 @@
             return false;
         }
         try {
-            return service.sdpSearch(this, uuid);
+            return service.sdpSearch(this, uuid, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1803,7 +1844,7 @@
             return false;
         }
         try {
-            return service.setPin(this, true, pin.length, pin);
+            return service.setPin(this, true, pin.length, pin, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1866,7 +1907,7 @@
             return false;
         }
         try {
-            return service.cancelBondProcess(this);
+            return service.cancelBondProcess(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1899,7 +1940,7 @@
             return ACCESS_UNKNOWN;
         }
         try {
-            return service.getPhonebookAccessPermission(this);
+            return service.getPhonebookAccessPermission(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -2005,7 +2046,7 @@
             return ACCESS_UNKNOWN;
         }
         try {
-            return service.getMessageAccessPermission(this);
+            return service.getMessageAccessPermission(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -2056,7 +2097,7 @@
             return ACCESS_UNKNOWN;
         }
         try {
-            return service.getSimAccessPermission(this);
+            return service.getSimAccessPermission(this, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -2485,7 +2526,8 @@
                 // BLE is not supported
                 return null;
             }
-            BluetoothGatt gatt = new BluetoothGatt(iGatt, this, transport, opportunistic, phy);
+            BluetoothGatt gatt = new BluetoothGatt(
+                    iGatt, this, transport, opportunistic, phy, mAttributionSource);
             gatt.connect(autoConnect, callback, handler);
             return gatt;
         } catch (RemoteException e) {
diff --git a/core/java/android/bluetooth/BluetoothDevicePicker.java b/core/java/android/bluetooth/BluetoothDevicePicker.java
index 09b0a80..26e4657 100644
--- a/core/java/android/bluetooth/BluetoothDevicePicker.java
+++ b/core/java/android/bluetooth/BluetoothDevicePicker.java
@@ -16,8 +16,10 @@
 
 package android.bluetooth;
 
+import android.annotation.RequiresPermission;
 import android.annotation.SdkConstant;
 import android.annotation.SdkConstant.SdkConstantType;
+import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 
 /**
  * A helper to show a system "Device Picker" activity to the user.
@@ -39,6 +41,8 @@
      * Selected {@link BluetoothDevice} is returned in extra data named
      * {@link BluetoothDevice#EXTRA_DEVICE}.
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_DEVICE_SELECTED =
             "android.bluetooth.devicepicker.action.DEVICE_SELECTED";
@@ -54,6 +58,8 @@
      * - {@link #EXTRA_LAUNCH_CLASS} (string): where(which class) this intent
      * come from
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_LAUNCH =
             "android.bluetooth.devicepicker.action.LAUNCH";
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 9d3eed8..aea8210 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -22,6 +22,7 @@
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.os.Build;
 import android.os.Handler;
 import android.os.ParcelUuid;
@@ -69,6 +70,7 @@
     private int mTransport;
     private int mPhy;
     private boolean mOpportunistic;
+    private final AttributionSource mAttributionSource;
 
     private static final int AUTH_RETRY_STATE_IDLE = 0;
     private static final int AUTH_RETRY_STATE_NO_MITM = 1;
@@ -198,7 +200,7 @@
                     try {
                         mService.clientConnect(mClientIf, mDevice.getAddress(),
                                 !mAutoConnect, mTransport, mOpportunistic,
-                                mPhy); // autoConnect is inverse of "isDirect"
+                                mPhy, mAttributionSource); // autoConnect is inverse of "isDirect"
                     } catch (RemoteException e) {
                         Log.e(TAG, "", e);
                     }
@@ -376,7 +378,8 @@
                         try {
                             final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE)
                                     ? AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
-                            mService.readCharacteristic(mClientIf, address, handle, authReq);
+                            mService.readCharacteristic(
+                                    mClientIf, address, handle, authReq, mAttributionSource);
                             mAuthRetryState++;
                             return;
                         } catch (RemoteException e) {
@@ -439,7 +442,7 @@
                                     ? AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
                             mService.writeCharacteristic(mClientIf, address, handle,
                                     characteristic.getWriteType(), authReq,
-                                    characteristic.getValue());
+                                    characteristic.getValue(), mAttributionSource);
                             mAuthRetryState++;
                             return;
                         } catch (RemoteException e) {
@@ -521,7 +524,8 @@
                         try {
                             final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE)
                                     ? AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
-                            mService.readDescriptor(mClientIf, address, handle, authReq);
+                            mService.readDescriptor(
+                                    mClientIf, address, handle, authReq, mAttributionSource);
                             mAuthRetryState++;
                             return;
                         } catch (RemoteException e) {
@@ -573,7 +577,7 @@
                             final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE)
                                     ? AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
                             mService.writeDescriptor(mClientIf, address, handle,
-                                    authReq, descriptor.getValue());
+                                    authReq, descriptor.getValue(), mAttributionSource);
                             mAuthRetryState++;
                             return;
                         } catch (RemoteException e) {
@@ -726,13 +730,14 @@
                 }
             };
 
-    /*package*/ BluetoothGatt(IBluetoothGatt iGatt, BluetoothDevice device,
-            int transport, boolean opportunistic, int phy) {
+    /* package */ BluetoothGatt(IBluetoothGatt iGatt, BluetoothDevice device, int transport,
+            boolean opportunistic, int phy, AttributionSource attributionSource) {
         mService = iGatt;
         mDevice = device;
         mTransport = transport;
         mPhy = phy;
         mOpportunistic = opportunistic;
+        mAttributionSource = attributionSource;
         mServices = new ArrayList<BluetoothGattService>();
 
         mConnState = CONN_STATE_IDLE;
@@ -867,7 +872,8 @@
         if (DBG) Log.d(TAG, "registerApp() - UUID=" + uuid);
 
         try {
-            mService.registerClient(new ParcelUuid(uuid), mBluetoothGattCallback, eatt_support);
+            mService.registerClient(
+                    new ParcelUuid(uuid), mBluetoothGattCallback, eatt_support, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -888,7 +894,7 @@
 
         try {
             mCallback = null;
-            mService.unregisterClient(mClientIf);
+            mService.unregisterClient(mClientIf, mAttributionSource);
             mClientIf = 0;
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -958,7 +964,7 @@
         if (mService == null || mClientIf == 0) return;
 
         try {
-            mService.clientDisconnect(mClientIf, mDevice.getAddress());
+            mService.clientDisconnect(mClientIf, mDevice.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -977,8 +983,9 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     public boolean connect() {
         try {
+            // autoConnect is inverse of "isDirect"
             mService.clientConnect(mClientIf, mDevice.getAddress(), false, mTransport,
-                    mOpportunistic, mPhy); // autoConnect is inverse of "isDirect"
+                    mOpportunistic, mPhy, mAttributionSource);
             return true;
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -1009,7 +1016,7 @@
     public void setPreferredPhy(int txPhy, int rxPhy, int phyOptions) {
         try {
             mService.clientSetPreferredPhy(mClientIf, mDevice.getAddress(), txPhy, rxPhy,
-                    phyOptions);
+                    phyOptions, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1023,7 +1030,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     public void readPhy() {
         try {
-            mService.clientReadPhy(mClientIf, mDevice.getAddress());
+            mService.clientReadPhy(mClientIf, mDevice.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1060,7 +1067,7 @@
         mServices.clear();
 
         try {
-            mService.discoverServices(mClientIf, mDevice.getAddress());
+            mService.discoverServices(mClientIf, mDevice.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1087,7 +1094,8 @@
         mServices.clear();
 
         try {
-            mService.discoverServiceByUuid(mClientIf, mDevice.getAddress(), new ParcelUuid(uuid));
+            mService.discoverServiceByUuid(
+                    mClientIf, mDevice.getAddress(), new ParcelUuid(uuid), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1179,7 +1187,7 @@
 
         try {
             mService.readCharacteristic(mClientIf, device.getAddress(),
-                    characteristic.getInstanceId(), AUTHENTICATION_NONE);
+                    characteristic.getInstanceId(), AUTHENTICATION_NONE, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             mDeviceBusy = false;
@@ -1214,7 +1222,8 @@
 
         try {
             mService.readUsingCharacteristicUuid(mClientIf, mDevice.getAddress(),
-                    new ParcelUuid(uuid), startHandle, endHandle, AUTHENTICATION_NONE);
+                    new ParcelUuid(uuid), startHandle, endHandle, AUTHENTICATION_NONE,
+                    mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             mDeviceBusy = false;
@@ -1262,7 +1271,7 @@
         try {
             mService.writeCharacteristic(mClientIf, device.getAddress(),
                     characteristic.getInstanceId(), characteristic.getWriteType(),
-                    AUTHENTICATION_NONE, characteristic.getValue());
+                    AUTHENTICATION_NONE, characteristic.getValue(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             mDeviceBusy = false;
@@ -1305,7 +1314,7 @@
 
         try {
             mService.readDescriptor(mClientIf, device.getAddress(),
-                    descriptor.getInstanceId(), AUTHENTICATION_NONE);
+                    descriptor.getInstanceId(), AUTHENTICATION_NONE, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             mDeviceBusy = false;
@@ -1347,7 +1356,7 @@
 
         try {
             mService.writeDescriptor(mClientIf, device.getAddress(), descriptor.getInstanceId(),
-                    AUTHENTICATION_NONE, descriptor.getValue());
+                    AUTHENTICATION_NONE, descriptor.getValue(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             mDeviceBusy = false;
@@ -1383,7 +1392,7 @@
         if (mService == null || mClientIf == 0) return false;
 
         try {
-            mService.beginReliableWrite(mClientIf, mDevice.getAddress());
+            mService.beginReliableWrite(mClientIf, mDevice.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1416,7 +1425,7 @@
         }
 
         try {
-            mService.endReliableWrite(mClientIf, mDevice.getAddress(), true);
+            mService.endReliableWrite(mClientIf, mDevice.getAddress(), true, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             mDeviceBusy = false;
@@ -1440,7 +1449,7 @@
         if (mService == null || mClientIf == 0) return;
 
         try {
-            mService.endReliableWrite(mClientIf, mDevice.getAddress(), false);
+            mService.endReliableWrite(mClientIf, mDevice.getAddress(), false, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -1487,7 +1496,7 @@
 
         try {
             mService.registerForNotification(mClientIf, device.getAddress(),
-                    characteristic.getInstanceId(), enable);
+                    characteristic.getInstanceId(), enable, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1510,7 +1519,7 @@
         if (mService == null || mClientIf == 0) return false;
 
         try {
-            mService.refreshDevice(mClientIf, mDevice.getAddress());
+            mService.refreshDevice(mClientIf, mDevice.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1535,7 +1544,7 @@
         if (mService == null || mClientIf == 0) return false;
 
         try {
-            mService.readRemoteRssi(mClientIf, mDevice.getAddress());
+            mService.readRemoteRssi(mClientIf, mDevice.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1567,7 +1576,7 @@
         if (mService == null || mClientIf == 0) return false;
 
         try {
-            mService.configureMTU(mClientIf, mDevice.getAddress(), mtu);
+            mService.configureMTU(mClientIf, mDevice.getAddress(), mtu, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1599,7 +1608,8 @@
         if (mService == null || mClientIf == 0) return false;
 
         try {
-            mService.connectionParameterUpdate(mClientIf, mDevice.getAddress(), connectionPriority);
+            mService.connectionParameterUpdate(
+                    mClientIf, mDevice.getAddress(), connectionPriority, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -1633,9 +1643,10 @@
 
         try {
             mService.leConnectionUpdate(mClientIf, mDevice.getAddress(),
-                                        minConnectionInterval, maxConnectionInterval,
-                                        slaveLatency, supervisionTimeout,
-                                        minConnectionEventLen, maxConnectionEventLen);
+                    minConnectionInterval, maxConnectionInterval,
+                    slaveLatency, supervisionTimeout,
+                    minConnectionEventLen, maxConnectionEventLen,
+                    mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
diff --git a/core/java/android/bluetooth/BluetoothGattServer.java b/core/java/android/bluetooth/BluetoothGattServer.java
index 865f476..3e799de 100644
--- a/core/java/android/bluetooth/BluetoothGattServer.java
+++ b/core/java/android/bluetooth/BluetoothGattServer.java
@@ -21,6 +21,7 @@
 import android.annotation.SuppressLint;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
+import android.content.AttributionSource;
 import android.os.ParcelUuid;
 import android.os.RemoteException;
 import android.util.Log;
@@ -45,8 +46,10 @@
     private static final boolean DBG = true;
     private static final boolean VDBG = false;
 
-    private BluetoothAdapter mAdapter;
-    private IBluetoothGatt mService;
+    private final IBluetoothGatt mService;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
+
     private BluetoothGattServerCallback mCallback;
 
     private Object mServerIfLock = new Object();
@@ -382,9 +385,11 @@
     /**
      * Create a BluetoothGattServer proxy object.
      */
-    /*package*/ BluetoothGattServer(IBluetoothGatt iGatt, int transport) {
+    /* package */ BluetoothGattServer(IBluetoothGatt iGatt, int transport,
+            BluetoothAdapter adapter) {
         mService = iGatt;
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mCallback = null;
         mServerIf = 0;
         mTransport = transport;
@@ -488,7 +493,8 @@
 
             mCallback = callback;
             try {
-                mService.registerServer(new ParcelUuid(uuid), mBluetoothGattServerCallback, eatt_support);
+                mService.registerServer(new ParcelUuid(uuid), mBluetoothGattServerCallback,
+                        eatt_support, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "", e);
                 mCallback = null;
@@ -522,7 +528,7 @@
 
         try {
             mCallback = null;
-            mService.unregisterServer(mServerIf);
+            mService.unregisterServer(mServerIf, mAttributionSource);
             mServerIf = 0;
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -576,7 +582,8 @@
 
         try {
             // autoConnect is inverse of "isDirect"
-            mService.serverConnect(mServerIf, device.getAddress(), !autoConnect, mTransport);
+            mService.serverConnect(
+                    mServerIf, device.getAddress(), !autoConnect, mTransport, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -599,7 +606,7 @@
         if (mService == null || mServerIf == 0) return;
 
         try {
-            mService.serverDisconnect(mServerIf, device.getAddress());
+            mService.serverDisconnect(mServerIf, device.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -628,7 +635,7 @@
     public void setPreferredPhy(BluetoothDevice device, int txPhy, int rxPhy, int phyOptions) {
         try {
             mService.serverSetPreferredPhy(mServerIf, device.getAddress(), txPhy, rxPhy,
-                    phyOptions);
+                    phyOptions, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -644,7 +651,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     public void readPhy(BluetoothDevice device) {
         try {
-            mService.serverReadPhy(mServerIf, device.getAddress());
+            mService.serverReadPhy(mServerIf, device.getAddress(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -679,7 +686,7 @@
 
         try {
             mService.sendResponse(mServerIf, device.getAddress(), requestId,
-                    status, offset, value);
+                    status, offset, value, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -722,7 +729,7 @@
         try {
             mService.sendNotification(mServerIf, device.getAddress(),
                     characteristic.getInstanceId(), confirm,
-                    characteristic.getValue());
+                    characteristic.getValue(), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -757,7 +764,7 @@
         mPendingService = service;
 
         try {
-            mService.addService(mServerIf, service);
+            mService.addService(mServerIf, service, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
             return false;
@@ -784,7 +791,7 @@
         if (intService == null) return false;
 
         try {
-            mService.removeService(mServerIf, service.getInstanceId());
+            mService.removeService(mServerIf, service.getInstanceId(), mAttributionSource);
             mServices.remove(intService);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
@@ -805,7 +812,7 @@
         if (mService == null || mServerIf == 0) return;
 
         try {
-            mService.clearServices(mServerIf);
+            mService.clearServices(mServerIf, mAttributionSource);
             mServices.clear();
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java
index a1ece7f..3bf517c 100644
--- a/core/java/android/bluetooth/BluetoothHeadset.java
+++ b/core/java/android/bluetooth/BluetoothHeadset.java
@@ -28,8 +28,10 @@
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.annotation.SystemApi;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Handler;
@@ -310,6 +312,7 @@
     @RequiresLegacyBluetoothPermission
     @RequiresBluetoothConnectPermission
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_HF_INDICATORS_VALUE_CHANGED =
             "android.bluetooth.headset.action.HF_INDICATORS_VALUE_CHANGED";
 
@@ -338,7 +341,8 @@
     private Context mContext;
     private ServiceListener mServiceListener;
     private volatile IBluetoothHeadset mService;
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
 
     @SuppressLint("AndroidFrameworkBluetoothPermission")
     private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
@@ -356,10 +360,20 @@
     /**
      * Create a BluetoothHeadset proxy object.
      */
-    /*package*/ BluetoothHeadset(Context context, ServiceListener l) {
+    /* package */ BluetoothHeadset(Context context, ServiceListener l, BluetoothAdapter adapter) {
         mContext = context;
         mServiceListener = l;
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
+
+        // Preserve legacy compatibility where apps were depending on
+        // registerStateChangeCallback() performing a permissions check which
+        // has been relaxed in modern platform versions
+        if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.R
+                && context.checkSelfPermission(android.Manifest.permission.BLUETOOTH)
+                        != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException("Need BLUETOOTH permission");
+        }
 
         IBluetoothManager mgr = mAdapter.getBluetoothManager();
         if (mgr != null) {
@@ -518,7 +532,8 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -539,7 +554,9 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -602,7 +619,8 @@
             }
             try {
                 return service.setPriority(
-                        device, BluetoothAdapter.priorityToConnectionPolicy(priority));
+                        device, BluetoothAdapter.priorityToConnectionPolicy(priority),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -641,7 +659,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -671,7 +689,8 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return BluetoothAdapter.connectionPolicyToPriority(service.getPriority(device));
+                return BluetoothAdapter.connectionPolicyToPriority(
+                        service.getPriority(device, mAttributionSource));
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.PRIORITY_OFF;
@@ -693,13 +712,17 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
         if (VDBG) log("getConnectionPolicy(" + device + ")");
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -723,7 +746,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.isNoiseReductionSupported(device);
+                return service.isNoiseReductionSupported(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -746,7 +769,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.isVoiceRecognitionSupported(device);
+                return service.isVoiceRecognitionSupported(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -785,7 +808,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.startVoiceRecognition(device);
+                return service.startVoiceRecognition(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -814,7 +837,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.stopVoiceRecognition(device);
+                return service.stopVoiceRecognition(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -837,7 +860,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.isAudioConnected(device);
+                return service.isAudioConnected(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -871,7 +894,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && !isDisabled()) {
             try {
-                return service.getAudioState(device);
+                return service.getAudioState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -899,7 +922,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                service.setAudioRouteAllowed(allowed);
+                service.setAudioRouteAllowed(allowed, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -922,7 +945,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.getAudioRouteAllowed();
+                return service.getAudioRouteAllowed(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -947,7 +970,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                service.setForceScoAudio(forced);
+                service.setForceScoAudio(forced, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -972,7 +995,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.isAudioOn();
+                return service.isAudioOn(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -1007,7 +1030,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.connectAudio();
+                return service.connectAudio(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1036,7 +1059,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.disconnectAudio();
+                return service.disconnectAudio(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1080,7 +1103,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.startScoUsingVirtualVoiceCall();
+                return service.startScoUsingVirtualVoiceCall(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1115,7 +1138,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.stopScoUsingVirtualVoiceCall();
+                return service.stopScoUsingVirtualVoiceCall(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1145,7 +1168,8 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                service.phoneStateChanged(numActive, numHeld, callState, number, type, name);
+                service.phoneStateChanged(numActive, numHeld, callState, number, type, name,
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1170,7 +1194,8 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                service.clccResponse(index, direction, status, mode, mpty, number, type);
+                service.clccResponse(index, direction, status, mode, mpty, number, type,
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1210,7 +1235,8 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.sendVendorSpecificResultCode(device, command, arg);
+                return service.sendVendorSpecificResultCode(device, command, arg,
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -1254,7 +1280,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled() && (device == null || isValidDevice(device))) {
             try {
-                return service.setActiveDevice(device);
+                return service.setActiveDevice(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -1284,7 +1310,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.getActiveDevice();
+                return service.getActiveDevice(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -1312,7 +1338,7 @@
         final IBluetoothHeadset service = mService;
         if (service != null && isEnabled()) {
             try {
-                return service.isInbandRingingEnabled();
+                return service.isInbandRingingEnabled(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
diff --git a/core/java/android/bluetooth/BluetoothHeadsetClient.java b/core/java/android/bluetooth/BluetoothHeadsetClient.java
index eef42d1..0059cdb 100644
--- a/core/java/android/bluetooth/BluetoothHeadsetClient.java
+++ b/core/java/android/bluetooth/BluetoothHeadsetClient.java
@@ -18,9 +18,12 @@
 
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Build;
@@ -72,6 +75,9 @@
      * booleans with value <code>true</code>,
      * and not supported ones are <strong>not</strong> being sent at all.</p>
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.headsetclient.profile.action.CONNECTION_STATE_CHANGED";
 
@@ -90,6 +96,9 @@
      * it also includes {@link #EXTRA_AUDIO_WBS}
      * indicating wide band speech support.</p>
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_AUDIO_STATE_CHANGED =
             "android.bluetooth.headsetclient.profile.action.AUDIO_STATE_CHANGED";
 
@@ -106,6 +115,9 @@
      * {@link #EXTRA_VOICE_RECOGNITION},
      * {@link #EXTRA_IN_BAND_RING}</p>
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_AG_EVENT =
             "android.bluetooth.headsetclient.profile.action.AG_EVENT";
 
@@ -117,6 +129,9 @@
      * with value of {@link BluetoothHeadsetClientCall} instance,
      * representing actual call state.</p>
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CALL_CHANGED =
             "android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED";
 
@@ -127,6 +142,9 @@
      * like <code>ACTION_AG_EVENT</code> with <code>EXTRA_VOICE_RECOGNITION</code> value
      * when for example user started voice recognition from HF unit.
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_RESULT =
             "android.bluetooth.headsetclient.profile.action.RESULT";
 
@@ -138,6 +156,9 @@
      * Vendor event can be a response to an vendor specific command or unsolicited.
      *
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_VENDOR_SPECIFIC_HEADSETCLIENT_EVENT =
             "android.bluetooth.headsetclient.profile.action.VENDOR_SPECIFIC_EVENT";
 
@@ -149,6 +170,9 @@
      * {@link #EXTRA_NUMBER},
      * with a <code>String</code> value representing phone number.</p>
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_LAST_VTAG =
             "android.bluetooth.headsetclient.profile.action.LAST_VTAG";
 
@@ -401,7 +425,8 @@
     public static final int CALL_ACCEPT_HOLD = 1;
     public static final int CALL_ACCEPT_TERMINATE = 2;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothHeadsetClient> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.HEADSET_CLIENT,
                     "BluetoothHeadsetClient", IBluetoothHeadsetClient.class.getName()) {
@@ -414,8 +439,10 @@
     /**
      * Create a BluetoothHeadsetClient proxy object.
      */
-    /*package*/ BluetoothHeadsetClient(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothHeadsetClient(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -456,7 +483,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -484,7 +511,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -508,7 +535,8 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -534,7 +562,9 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -559,7 +589,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -612,7 +642,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -660,7 +690,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -689,7 +719,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.startVoiceRecognition(device);
+                return service.startVoiceRecognition(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -716,7 +746,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.sendVendorAtCommand(device, vendorId, atCommand);
+                return service.sendVendorAtCommand(device, vendorId, atCommand, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -744,7 +774,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.stopVoiceRecognition(device);
+                return service.stopVoiceRecognition(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -767,7 +797,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getCurrentCalls(device);
+                return service.getCurrentCalls(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -790,7 +820,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getCurrentAgEvents(device);
+                return service.getCurrentAgEvents(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -817,7 +847,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.acceptCall(device, flag);
+                return service.acceptCall(device, flag, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -841,7 +871,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.holdCall(device);
+                return service.holdCall(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -870,7 +900,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.rejectCall(device);
+                return service.rejectCall(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -903,7 +933,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.terminateCall(device, call);
+                return service.terminateCall(device, call, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -934,7 +964,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.enterPrivateMode(device, index);
+                return service.enterPrivateMode(device, index, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -964,7 +994,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.explicitCallTransfer(device);
+                return service.explicitCallTransfer(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -990,7 +1020,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.dial(device, number);
+                return service.dial(device, number, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -1017,7 +1047,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.sendDTMF(device, code);
+                return service.sendDTMF(device, code, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -1046,7 +1076,7 @@
                 getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getLastVoiceTagNumber(device);
+                return service.getLastVoiceTagNumber(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -1069,7 +1099,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getAudioState(device);
+                return service.getAudioState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1095,7 +1125,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                service.setAudioRouteAllowed(device, allowed);
+                service.setAudioRouteAllowed(device, allowed, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1120,7 +1150,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getAudioRouteAllowed(device);
+                return service.getAudioRouteAllowed(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1147,7 +1177,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.connectAudio(device);
+                return service.connectAudio(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1174,7 +1204,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.disconnectAudio(device);
+                return service.disconnectAudio(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -1198,7 +1228,7 @@
                 getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getCurrentAgFeatures(device);
+                return service.getCurrentAgFeatures(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
diff --git a/core/java/android/bluetooth/BluetoothHearingAid.java b/core/java/android/bluetooth/BluetoothHearingAid.java
index fa52eda..3ff2ebd 100644
--- a/core/java/android/bluetooth/BluetoothHearingAid.java
+++ b/core/java/android/bluetooth/BluetoothHearingAid.java
@@ -28,6 +28,7 @@
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.annotation.SystemApi;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Build;
@@ -130,7 +131,8 @@
      */
     public static final long HI_SYNC_ID_INVALID = IBluetoothHearingAid.HI_SYNC_ID_INVALID;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothHearingAid> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.HEARING_AID,
                     "BluetoothHearingAid", IBluetoothHearingAid.class.getName()) {
@@ -144,8 +146,10 @@
      * Create a BluetoothHearingAid proxy object for interacting with the local
      * Bluetooth Hearing Aid service.
      */
-    /*package*/ BluetoothHearingAid(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothHearingAid(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -181,7 +185,7 @@
         final IBluetoothHearingAid service = getService();
         try {
             if (service != null && isEnabled() && isValidDevice(device)) {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -213,13 +217,17 @@
      * @return false on immediate error, true otherwise
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean disconnect(BluetoothDevice device) {
         if (DBG) log("disconnect(" + device + ")");
         final IBluetoothHearingAid service = getService();
         try {
             if (service != null && isEnabled() && isValidDevice(device)) {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -240,7 +248,8 @@
         final IBluetoothHearingAid service = getService();
         try {
             if (service != null && isEnabled()) {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<BluetoothDevice>();
@@ -262,7 +271,9 @@
         final IBluetoothHearingAid service = getService();
         try {
             if (service != null && isEnabled()) {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<BluetoothDevice>();
@@ -285,7 +296,7 @@
         try {
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return BluetoothProfile.STATE_DISCONNECTED;
@@ -324,7 +335,7 @@
         try {
             if (service != null && isEnabled()
                     && ((device == null) || isValidDevice(device))) {
-                service.setActiveDevice(device);
+                service.setActiveDevice(device, mAttributionSource);
                 return true;
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
@@ -352,7 +363,7 @@
         final IBluetoothHearingAid service = getService();
         try {
             if (service != null && isEnabled()) {
-                return service.getActiveDevices();
+                return service.getActiveDevices(mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<>();
@@ -413,7 +424,7 @@
                         && connectionPolicy != BluetoothProfile.CONNECTION_POLICY_ALLOWED) {
                     return false;
                 }
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -433,7 +444,11 @@
      * @return priority of the device
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public int getPriority(BluetoothDevice device) {
         if (VDBG) log("getPriority(" + device + ")");
         return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -451,7 +466,11 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
         if (VDBG) log("getConnectionPolicy(" + device + ")");
         verifyDeviceNotNull(device, "getConnectionPolicy");
@@ -459,7 +478,7 @@
         try {
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -511,7 +530,7 @@
 
             if (!isEnabled()) return;
 
-            service.setVolume(volume);
+            service.setVolume(volume, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
         }
@@ -528,7 +547,11 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public long getHiSyncId(@NonNull BluetoothDevice device) {
         if (VDBG) {
             log("getHiSyncId(" + device + ")");
@@ -543,7 +566,7 @@
 
             if (!isEnabled() || !isValidDevice(device)) return HI_SYNC_ID_INVALID;
 
-            return service.getHiSyncId(device);
+            return service.getHiSyncId(device, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
             return HI_SYNC_ID_INVALID;
@@ -568,7 +591,7 @@
         try {
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                return service.getDeviceSide(device);
+                return service.getDeviceSide(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return SIDE_LEFT;
@@ -596,7 +619,7 @@
         try {
             if (service != null && isEnabled()
                     && isValidDevice(device)) {
-                return service.getDeviceMode(device);
+                return service.getDeviceMode(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return MODE_MONAURAL;
diff --git a/core/java/android/bluetooth/BluetoothHidDevice.java b/core/java/android/bluetooth/BluetoothHidDevice.java
index 6565ec0..11e5711 100644
--- a/core/java/android/bluetooth/BluetoothHidDevice.java
+++ b/core/java/android/bluetooth/BluetoothHidDevice.java
@@ -25,6 +25,7 @@
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.annotation.SystemApi;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -415,7 +416,8 @@
         }
     }
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothHidDevice> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.HID_DEVICE,
                     "BluetoothHidDevice", IBluetoothHidDevice.class.getName()) {
@@ -425,8 +427,9 @@
                 }
     };
 
-    BluetoothHidDevice(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    BluetoothHidDevice(Context context, ServiceListener listener, BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -446,7 +449,8 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -465,7 +469,9 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -484,7 +490,7 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -544,7 +550,7 @@
         if (service != null) {
             try {
                 CallbackWrapper cbw = new CallbackWrapper(executor, callback);
-                result = service.registerApp(sdp, inQos, outQos, cbw);
+                result = service.registerApp(sdp, inQos, outQos, cbw, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -573,7 +579,7 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                result = service.unregisterApp();
+                result = service.unregisterApp(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -600,7 +606,7 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                result = service.sendReport(device, id, data);
+                result = service.sendReport(device, id, data, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -628,7 +634,7 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                result = service.replyReport(device, type, id, data);
+                result = service.replyReport(device, type, id, data, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -654,7 +660,7 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                result = service.reportError(device, error);
+                result = service.reportError(device, error, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -678,7 +684,7 @@
 
         if (service != null) {
             try {
-                return service.getUserAppName();
+                return service.getUserAppName(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -705,7 +711,7 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                result = service.connect(device);
+                result = service.connect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -731,7 +737,7 @@
         final IBluetoothHidDevice service = getService();
         if (service != null) {
             try {
-                result = service.disconnect(device);
+                result = service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -776,7 +782,7 @@
                         && connectionPolicy != BluetoothProfile.CONNECTION_POLICY_ALLOWED) {
                     return false;
                 }
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
diff --git a/core/java/android/bluetooth/BluetoothHidHost.java b/core/java/android/bluetooth/BluetoothHidHost.java
index bef4472..0abe18c 100644
--- a/core/java/android/bluetooth/BluetoothHidHost.java
+++ b/core/java/android/bluetooth/BluetoothHidHost.java
@@ -26,6 +26,7 @@
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -80,6 +81,8 @@
     /**
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PROTOCOL_MODE_CHANGED =
             "android.bluetooth.input.profile.action.PROTOCOL_MODE_CHANGED";
@@ -87,6 +90,8 @@
     /**
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_HANDSHAKE =
             "android.bluetooth.input.profile.action.HANDSHAKE";
@@ -94,6 +99,8 @@
     /**
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_REPORT =
             "android.bluetooth.input.profile.action.REPORT";
@@ -101,6 +108,8 @@
     /**
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_VIRTUAL_UNPLUG_STATUS =
             "android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS";
@@ -108,6 +117,8 @@
     /**
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_IDLE_TIME_CHANGED =
             "android.bluetooth.input.profile.action.IDLE_TIME_CHANGED";
@@ -226,7 +237,8 @@
     public static final String EXTRA_IDLE_TIME =
             "android.bluetooth.BluetoothHidHost.extra.IDLE_TIME";
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothHidHost> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.HID_HOST,
                     "BluetoothHidHost", IBluetoothHidHost.class.getName()) {
@@ -240,8 +252,10 @@
      * Create a BluetoothHidHost proxy object for interacting with the local
      * Bluetooth Service which handles the InputDevice profile
      */
-    /*package*/ BluetoothHidHost(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothHidHost(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -270,13 +284,17 @@
      * @return false on immediate error, true otherwise
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean connect(BluetoothDevice device) {
         if (DBG) log("connect(" + device + ")");
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -308,13 +326,17 @@
      * @return false on immediate error, true otherwise
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean disconnect(BluetoothDevice device) {
         if (DBG) log("disconnect(" + device + ")");
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -338,7 +360,8 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -361,7 +384,9 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -388,7 +413,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -409,7 +434,11 @@
      * @return true if priority is set, false on error
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean setPriority(BluetoothDevice device, int priority) {
         if (DBG) log("setPriority(" + device + ", " + priority + ")");
         return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -428,7 +457,11 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
             @ConnectionPolicy int connectionPolicy) {
         if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -442,7 +475,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -462,7 +495,11 @@
      * @return priority of the device
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public int getPriority(BluetoothDevice device) {
         if (VDBG) log("getPriority(" + device + ")");
         return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -480,7 +517,11 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
         if (VDBG) log("getConnectionPolicy(" + device + ")");
         if (device == null) {
@@ -489,7 +530,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -522,7 +563,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.virtualUnplug(device);
+                return service.virtualUnplug(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -549,7 +590,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getProtocolMode(device);
+                return service.getProtocolMode(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -574,7 +615,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.setProtocolMode(device, protocolMode);
+                return service.setProtocolMode(device, protocolMode, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -606,7 +647,8 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getReport(device, reportType, reportId, bufferSize);
+                return service.getReport(device, reportType, reportId, bufferSize,
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -633,7 +675,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.setReport(device, reportType, report);
+                return service.setReport(device, reportType, report, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -659,7 +701,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.sendData(device, report);
+                return service.sendData(device, report, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -684,7 +726,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getIdleTime(device);
+                return service.getIdleTime(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -710,7 +752,7 @@
         final IBluetoothHidHost service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.setIdleTime(device, idleTime);
+                return service.setIdleTime(device, idleTime, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
diff --git a/core/java/android/bluetooth/BluetoothLeAudio.java b/core/java/android/bluetooth/BluetoothLeAudio.java
index 462c7b7..51bfd04 100644
--- a/core/java/android/bluetooth/BluetoothLeAudio.java
+++ b/core/java/android/bluetooth/BluetoothLeAudio.java
@@ -26,6 +26,7 @@
 import android.annotation.SuppressLint;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -101,7 +102,8 @@
      */
     public static final int GROUP_ID_INVALID = IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothLeAudio> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.LE_AUDIO, "BluetoothLeAudio",
                     IBluetoothLeAudio.class.getName()) {
@@ -115,8 +117,10 @@
      * Create a BluetoothLeAudio proxy object for interacting with the local
      * Bluetooth LeAudio service.
      */
-    /*package*/ BluetoothLeAudio(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothLeAudio(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
         mCloseGuard = new CloseGuard();
         mCloseGuard.open("close");
@@ -162,7 +166,7 @@
         try {
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled() && isValidDevice(device)) {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -202,7 +206,7 @@
         try {
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled() && isValidDevice(device)) {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -223,7 +227,8 @@
         try {
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled()) {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<BluetoothDevice>();
@@ -245,7 +250,9 @@
         try {
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled()) {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<BluetoothDevice>();
@@ -268,7 +275,7 @@
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled()
                     && isValidDevice(device)) {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return BluetoothProfile.STATE_DISCONNECTED;
@@ -306,7 +313,7 @@
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled()
                     && ((device == null) || isValidDevice(device))) {
-                service.setActiveDevice(device);
+                service.setActiveDevice(device, mAttributionSource);
                 return true;
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
@@ -332,7 +339,7 @@
         try {
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled()) {
-                return service.getActiveDevices();
+                return service.getActiveDevices(mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return new ArrayList<>();
@@ -357,7 +364,7 @@
         try {
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled()) {
-                return service.getGroupId(device);
+                return service.getGroupId(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return GROUP_ID_INVALID;
@@ -395,7 +402,7 @@
                         && connectionPolicy != BluetoothProfile.CONNECTION_POLICY_ALLOWED) {
                     return false;
                 }
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -424,7 +431,7 @@
             final IBluetoothLeAudio service = getService();
             if (service != null && mAdapter.isEnabled()
                     && isValidDevice(device)) {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java
index 2374f1c..b13ccaf 100644
--- a/core/java/android/bluetooth/BluetoothManager.java
+++ b/core/java/android/bluetooth/BluetoothManager.java
@@ -16,19 +16,18 @@
 
 package android.bluetooth;
 
-import android.Manifest;
 import android.annotation.RequiresFeature;
 import android.annotation.RequiresNoPermission;
 import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
 import android.annotation.SystemService;
+import android.app.ActivityThread;
+import android.app.AppGlobals;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.os.IBinder;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.util.Log;
 
 import java.util.ArrayList;
@@ -60,34 +59,41 @@
     private static final String TAG = "BluetoothManager";
     private static final boolean DBG = false;
 
+    private final AttributionSource mAttributionSource;
     private final BluetoothAdapter mAdapter;
 
     /**
      * @hide
      */
     public BluetoothManager(Context context) {
-        if (context.getAttributionTag() == null) {
-            context = context.getApplicationContext();
-            if (context == null) {
-                throw new IllegalArgumentException(
-                        "context not associated with any application (using a mock context?)");
-            }
+        mAttributionSource = resolveAttributionSource(context);
+        mAdapter = BluetoothAdapter.createAdapter(mAttributionSource);
+    }
 
-            mAdapter = BluetoothAdapter.getDefaultAdapter();
-        } else {
-            IBinder b = ServiceManager.getService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE);
-            if (b != null) {
-                mAdapter = new BluetoothAdapter(IBluetoothManager.Stub.asInterface(b));
-            } else {
-                Log.e(TAG, "Bluetooth binder is null");
-                mAdapter = null;
+    /** {@hide} */
+    public static AttributionSource resolveAttributionSource(Context context) {
+        AttributionSource res = null;
+        if (context != null) {
+            res = context.getAttributionSource();
+        }
+        if (res == null) {
+            res = ActivityThread.currentAttributionSource();
+        }
+        if (res == null) {
+            int uid = android.os.Process.myUid();
+            if (uid == android.os.Process.ROOT_UID) {
+                uid = android.os.Process.SYSTEM_UID;
+            }
+            try {
+                res = new AttributionSource(uid,
+                        AppGlobals.getPackageManager().getPackagesForUid(uid)[0], null);
+            } catch (RemoteException ignored) {
             }
         }
-
-        // Context is not initialized in constructor
-        if (mAdapter != null) {
-            mAdapter.setContext(context);
+        if (res == null) {
+            throw new IllegalStateException("Failed to resolve AttributionSource");
         }
+        return res;
     }
 
     /**
@@ -148,24 +154,9 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     public List<BluetoothDevice> getConnectedDevices(int profile) {
         if (DBG) Log.d(TAG, "getConnectedDevices");
-        if (profile != BluetoothProfile.GATT && profile != BluetoothProfile.GATT_SERVER) {
-            throw new IllegalArgumentException("Profile not supported: " + profile);
-        }
-
-        List<BluetoothDevice> connectedDevices = new ArrayList<BluetoothDevice>();
-
-        try {
-            IBluetoothManager managerService = mAdapter.getBluetoothManager();
-            IBluetoothGatt iGatt = managerService.getBluetoothGatt();
-            if (iGatt == null) return connectedDevices;
-
-            connectedDevices = iGatt.getDevicesMatchingConnectionStates(
-                    new int[]{BluetoothProfile.STATE_CONNECTED});
-        } catch (RemoteException e) {
-            Log.e(TAG, "", e);
-        }
-
-        return connectedDevices;
+        return getDevicesMatchingConnectionStates(profile, new int[] {
+                BluetoothProfile.STATE_CONNECTED
+        });
     }
 
     /**
@@ -202,7 +193,9 @@
             IBluetoothManager managerService = mAdapter.getBluetoothManager();
             IBluetoothGatt iGatt = managerService.getBluetoothGatt();
             if (iGatt == null) return devices;
-            devices = iGatt.getDevicesMatchingConnectionStates(states);
+            devices = BluetoothDevice.setAttributionSource(
+                    iGatt.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                    mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
@@ -305,7 +298,8 @@
                 Log.e(TAG, "Fail to get GATT Server connection");
                 return null;
             }
-            BluetoothGattServer mGattServer = new BluetoothGattServer(iGatt, transport);
+            BluetoothGattServer mGattServer =
+                    new BluetoothGattServer(iGatt, transport, mAdapter);
             Boolean regStatus = mGattServer.registerCallback(callback, eatt_support);
             return regStatus ? mGattServer : null;
         } catch (RemoteException e) {
diff --git a/core/java/android/bluetooth/BluetoothMap.java b/core/java/android/bluetooth/BluetoothMap.java
index 998fde0..88505b5 100644
--- a/core/java/android/bluetooth/BluetoothMap.java
+++ b/core/java/android/bluetooth/BluetoothMap.java
@@ -20,10 +20,13 @@
 import android.annotation.NonNull;
 import android.annotation.RequiresNoPermission;
 import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Build;
@@ -53,6 +56,9 @@
     /** @hide */
     @SuppressLint("ActionValue")
     @SystemApi
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED";
 
@@ -74,7 +80,8 @@
      */
     public static final int RESULT_CANCELED = 2;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothMap> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.MAP,
                     "BluetoothMap", IBluetoothMap.class.getName()) {
@@ -87,9 +94,11 @@
     /**
      * Create a BluetoothMap proxy object.
      */
-    /*package*/ BluetoothMap(Context context, ServiceListener listener) {
+    /* package */ BluetoothMap(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
         if (DBG) Log.d(TAG, "Create BluetoothMap proxy object");
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
         mCloseGuard = new CloseGuard();
         mCloseGuard.open("close");
@@ -135,7 +144,7 @@
         final IBluetoothMap service = getService();
         if (service != null) {
             try {
-                return service.getState();
+                return service.getState(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -161,7 +170,7 @@
         final IBluetoothMap service = getService();
         if (service != null) {
             try {
-                return service.getClient();
+                return service.getClient(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -186,7 +195,7 @@
         final IBluetoothMap service = getService();
         if (service != null) {
             try {
-                return service.isConnected(device);
+                return service.isConnected(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -225,7 +234,7 @@
         final IBluetoothMap service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -276,7 +285,8 @@
         final IBluetoothMap service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -300,7 +310,9 @@
         final IBluetoothMap service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -324,7 +336,7 @@
         final IBluetoothMap service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -383,7 +395,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -435,7 +447,7 @@
         final IBluetoothMap service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -450,13 +462,10 @@
     }
 
     private boolean isEnabled() {
-        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-        if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON) return true;
-        log("Bluetooth is Not enabled");
-        return false;
+        return mAdapter.isEnabled();
     }
+
     private static boolean isValidDevice(BluetoothDevice device) {
         return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
     }
-
 }
diff --git a/core/java/android/bluetooth/BluetoothMapClient.java b/core/java/android/bluetooth/BluetoothMapClient.java
index f20b533..14804db 100644
--- a/core/java/android/bluetooth/BluetoothMapClient.java
+++ b/core/java/android/bluetooth/BluetoothMapClient.java
@@ -20,11 +20,13 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.annotation.SystemApi;
 import android.app.PendingIntent;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.net.Uri;
 import android.os.Binder;
@@ -50,16 +52,27 @@
     private static final boolean VDBG = Log.isLoggable(TAG, Log.VERBOSE);
 
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.mapmce.profile.action.CONNECTION_STATE_CHANGED";
     /** @hide */
+    @RequiresPermission(android.Manifest.permission.RECEIVE_SMS)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_MESSAGE_RECEIVED =
             "android.bluetooth.mapmce.profile.action.MESSAGE_RECEIVED";
     /* Actions to be used for pending intents */
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_MESSAGE_SENT_SUCCESSFULLY =
             "android.bluetooth.mapmce.profile.action.MESSAGE_SENT_SUCCESSFULLY";
     /** @hide */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_MESSAGE_DELIVERED_SUCCESSFULLY =
             "android.bluetooth.mapmce.profile.action.MESSAGE_DELIVERED_SUCCESSFULLY";
 
@@ -68,6 +81,9 @@
      *
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_MESSAGE_READ_STATUS_CHANGED =
             "android.bluetooth.mapmce.profile.action.MESSAGE_READ_STATUS_CHANGED";
 
@@ -76,6 +92,9 @@
      *
      * @hide
      */
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_MESSAGE_DELETED_STATUS_CHANGED =
             "android.bluetooth.mapmce.profile.action.MESSAGE_DELETED_STATUS_CHANGED";
 
@@ -154,7 +173,8 @@
     /** @hide */
     public static final int DELETED = 3;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothMapClient> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.MAP_CLIENT,
                     "BluetoothMapClient", IBluetoothMapClient.class.getName()) {
@@ -167,9 +187,11 @@
     /**
      * Create a BluetoothMapClient proxy object.
      */
-    /*package*/ BluetoothMapClient(Context context, ServiceListener listener) {
+    /* package */ BluetoothMapClient(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
         if (DBG) Log.d(TAG, "Create BluetoothMapClient proxy object");
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -201,7 +223,7 @@
         final IBluetoothMapClient service = getService();
         if (service != null) {
             try {
-                return service.isConnected(device);
+                return service.isConnected(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -228,7 +250,7 @@
         final IBluetoothMapClient service = getService();
         if (service != null) {
             try {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -257,7 +279,7 @@
         final IBluetoothMapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
             }
@@ -280,7 +302,8 @@
         final IBluetoothMapClient service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<>();
@@ -304,7 +327,9 @@
         final IBluetoothMapClient service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<>();
@@ -328,7 +353,7 @@
         final IBluetoothMapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -386,7 +411,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -437,7 +462,7 @@
         final IBluetoothMapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -474,7 +499,7 @@
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
                 return service.sendMessage(device, contacts.toArray(new Uri[contacts.size()]),
-                        message, sentIntent, deliveredIntent);
+                        message, sentIntent, deliveredIntent, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -508,7 +533,8 @@
         final IBluetoothMapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.sendMessage(device, contacts, message, sentIntent, deliveredIntent);
+                return service.sendMessage(device, contacts, message, sentIntent, deliveredIntent,
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -534,7 +560,7 @@
         final IBluetoothMapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getUnreadMessages(device);
+                return service.getUnreadMessages(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -557,7 +583,8 @@
         final IBluetoothMapClient service = getService();
         try {
             return (service != null && isEnabled() && isValidDevice(device))
-                && ((service.getSupportedFeatures(device) & UPLOADING_FEATURE_BITMASK) > 0);
+                    && ((service.getSupportedFeatures(device, mAttributionSource)
+                            & UPLOADING_FEATURE_BITMASK) > 0);
         } catch (RemoteException e) {
             Log.e(TAG, e.getMessage());
         }
@@ -591,7 +618,7 @@
         if (service != null && isEnabled() && isValidDevice(device) && handle != null &&
             (status == READ || status == UNREAD || status == UNDELETED  || status == DELETED)) {
             try {
-                return service.setMessageStatus(device, handle, status);
+                return service.setMessageStatus(device, handle, status, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -601,14 +628,10 @@
     }
 
     private boolean isEnabled() {
-        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-        if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON) return true;
-        if (DBG) Log.d(TAG, "Bluetooth is Not enabled");
-        return false;
+        return mAdapter.isEnabled();
     }
 
     private static boolean isValidDevice(BluetoothDevice device) {
         return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
     }
-
 }
diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java
index c41c9de..90c94de 100644
--- a/core/java/android/bluetooth/BluetoothPan.java
+++ b/core/java/android/bluetooth/BluetoothPan.java
@@ -22,11 +22,12 @@
 import android.annotation.RequiresPermission;
 import android.annotation.SdkConstant;
 import android.annotation.SdkConstant.SdkConstantType;
-import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
-import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
+import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
+import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Build;
@@ -183,7 +184,8 @@
 
     private final Context mContext;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothPan> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.PAN,
                     "BluetoothPan", IBluetoothPan.class.getName()) {
@@ -201,8 +203,10 @@
      * @hide
      */
     @UnsupportedAppUsage
-    /*package*/ BluetoothPan(Context context, ServiceListener listener) {
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+    /* package */ BluetoothPan(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mContext = context;
         mProfileConnector.connect(context, listener);
     }
@@ -250,7 +254,7 @@
         final IBluetoothPan service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -290,7 +294,7 @@
         final IBluetoothPan service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return false;
@@ -329,7 +333,7 @@
                         && connectionPolicy != BluetoothProfile.CONNECTION_POLICY_ALLOWED) {
                     return false;
                 }
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -355,7 +359,8 @@
         final IBluetoothPan service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -381,7 +386,9 @@
         final IBluetoothPan service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -397,13 +404,17 @@
      */
     @SystemApi
     @Override
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public int getConnectionState(@NonNull BluetoothDevice device) {
         if (VDBG) log("getState(" + device + ")");
         final IBluetoothPan service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -432,7 +443,7 @@
         final IBluetoothPan service = getService();
         if (service != null && isEnabled()) {
             try {
-                service.setBluetoothTethering(value, pkgName, mContext.getAttributionTag());
+                service.setBluetoothTethering(value, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
             }
@@ -453,7 +464,7 @@
         final IBluetoothPan service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.isTetheringOn();
+                return service.isTetheringOn(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
             }
diff --git a/core/java/android/bluetooth/BluetoothPbap.java b/core/java/android/bluetooth/BluetoothPbap.java
index e41eb4f..8ce01a3 100644
--- a/core/java/android/bluetooth/BluetoothPbap.java
+++ b/core/java/android/bluetooth/BluetoothPbap.java
@@ -25,10 +25,12 @@
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -89,7 +91,8 @@
      */
     @SuppressLint("ActionValue")
     @SystemApi
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
@@ -97,7 +100,8 @@
     private volatile IBluetoothPbap mService;
     private final Context mContext;
     private ServiceListener mServiceListener;
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
 
     /** @hide */
     public static final int RESULT_FAILURE = 0;
@@ -128,10 +132,21 @@
      *
      * @hide
      */
-    public BluetoothPbap(Context context, ServiceListener l) {
+    public BluetoothPbap(Context context, ServiceListener l, BluetoothAdapter adapter) {
         mContext = context;
         mServiceListener = l;
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
+
+        // Preserve legacy compatibility where apps were depending on
+        // registerStateChangeCallback() performing a permissions check which
+        // has been relaxed in modern platform versions
+        if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.R
+                && context.checkSelfPermission(android.Manifest.permission.BLUETOOTH)
+                        != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException("Need BLUETOOTH permission");
+        }
+
         IBluetoothManager mgr = mAdapter.getBluetoothManager();
         if (mgr != null) {
             try {
@@ -228,7 +243,8 @@
             return new ArrayList<BluetoothDevice>();
         }
         try {
-            return service.getConnectedDevices();
+            return BluetoothDevice.setAttributionSource(
+                    service.getConnectedDevices(mAttributionSource), mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, e.toString());
         }
@@ -242,13 +258,17 @@
      */
     @SystemApi
     @Override
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @BtProfileState int getConnectionState(@NonNull BluetoothDevice device) {
         log("getConnectionState: device=" + device);
         try {
             final IBluetoothPbap service = mService;
             if (service != null && isEnabled() && isValidDevice(device)) {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             }
             if (service == null) {
                 Log.w(TAG, "Proxy not attached to service");
@@ -276,7 +296,9 @@
             return new ArrayList<BluetoothDevice>();
         }
         try {
-            return service.getDevicesMatchingConnectionStates(states);
+            return BluetoothDevice.setAttributionSource(
+                    service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                    mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, e.toString());
         }
@@ -316,7 +338,7 @@
                         && connectionPolicy != BluetoothProfile.CONNECTION_POLICY_ALLOWED) {
                     return false;
                 }
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             }
             if (service == null) Log.w(TAG, "Proxy not attached to service");
             return false;
@@ -344,7 +366,7 @@
             return false;
         }
         try {
-            service.disconnect(device);
+            service.disconnect(device, mAttributionSource);
             return true;
         } catch (RemoteException e) {
             Log.e(TAG, e.toString());
diff --git a/core/java/android/bluetooth/BluetoothPbapClient.java b/core/java/android/bluetooth/BluetoothPbapClient.java
index 85b8650..3ebd8fe 100644
--- a/core/java/android/bluetooth/BluetoothPbapClient.java
+++ b/core/java/android/bluetooth/BluetoothPbapClient.java
@@ -19,8 +19,11 @@
 import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
 import android.annotation.SuppressLint;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -41,6 +44,9 @@
     private static final boolean DBG = false;
     private static final boolean VDBG = false;
 
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.pbapclient.profile.action.CONNECTION_STATE_CHANGED";
 
@@ -52,7 +58,8 @@
     /** Connection canceled before completion. */
     public static final int RESULT_CANCELED = 2;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothPbapClient> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.PBAP_CLIENT,
                     "BluetoothPbapClient", IBluetoothPbapClient.class.getName()) {
@@ -65,11 +72,12 @@
     /**
      * Create a BluetoothPbapClient proxy object.
      */
-    BluetoothPbapClient(Context context, ServiceListener listener) {
+    BluetoothPbapClient(Context context, ServiceListener listener, BluetoothAdapter adapter) {
         if (DBG) {
             Log.d(TAG, "Create BluetoothPbapClient proxy object");
         }
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -106,7 +114,11 @@
      *
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean connect(BluetoothDevice device) {
         if (DBG) {
             log("connect(" + device + ") for PBAP Client.");
@@ -114,7 +126,7 @@
         final IBluetoothPbapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.connect(device);
+                return service.connect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -134,7 +146,11 @@
      *
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean disconnect(BluetoothDevice device) {
         if (DBG) {
             log("disconnect(" + device + ")" + new Exception());
@@ -142,7 +158,7 @@
         final IBluetoothPbapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                service.disconnect(device);
+                service.disconnect(device, mAttributionSource);
                 return true;
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
@@ -171,7 +187,8 @@
         final IBluetoothPbapClient service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -198,7 +215,9 @@
         final IBluetoothPbapClient service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -225,7 +244,7 @@
         final IBluetoothPbapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -242,12 +261,7 @@
     }
 
     private boolean isEnabled() {
-        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-        if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON) {
-            return true;
-        }
-        log("Bluetooth is Not enabled");
-        return false;
+        return mAdapter.isEnabled();
     }
 
     private static boolean isValidDevice(BluetoothDevice device) {
@@ -265,7 +279,11 @@
      * @return true if priority is set, false on error
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean setPriority(BluetoothDevice device, int priority) {
         if (DBG) log("setPriority(" + device + ", " + priority + ")");
         return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -283,7 +301,11 @@
      * @return true if connectionPolicy is set, false on error
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
             @ConnectionPolicy int connectionPolicy) {
         if (DBG) {
@@ -296,7 +318,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -318,7 +340,11 @@
      * @return priority of the device
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public int getPriority(BluetoothDevice device) {
         if (VDBG) log("getPriority(" + device + ")");
         return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -335,7 +361,11 @@
      * @return connection policy of the device
      * @hide
      */
-    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(allOf = {
+            android.Manifest.permission.BLUETOOTH_CONNECT,
+            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
+    })
     public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
         if (VDBG) {
             log("getConnectionPolicy(" + device + ")");
@@ -343,7 +373,7 @@
         final IBluetoothPbapClient service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
diff --git a/core/java/android/bluetooth/BluetoothProfileConnector.java b/core/java/android/bluetooth/BluetoothProfileConnector.java
index b20ab75..beff841 100644
--- a/core/java/android/bluetooth/BluetoothProfileConnector.java
+++ b/core/java/android/bluetooth/BluetoothProfileConnector.java
@@ -21,6 +21,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.os.Build;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.UserHandle;
@@ -123,6 +125,16 @@
         mContext = context;
         mServiceListener = listener;
         IBluetoothManager mgr = BluetoothAdapter.getDefaultAdapter().getBluetoothManager();
+
+        // Preserve legacy compatibility where apps were depending on
+        // registerStateChangeCallback() performing a permissions check which
+        // has been relaxed in modern platform versions
+        if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.R
+                && context.checkSelfPermission(android.Manifest.permission.BLUETOOTH)
+                        != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException("Need BLUETOOTH permission");
+        }
+
         if (mgr != null) {
             try {
                 mgr.registerStateChangeCallback(mBluetoothStateChangeCallback);
diff --git a/core/java/android/bluetooth/BluetoothSap.java b/core/java/android/bluetooth/BluetoothSap.java
index 87da22c..0631abd 100644
--- a/core/java/android/bluetooth/BluetoothSap.java
+++ b/core/java/android/bluetooth/BluetoothSap.java
@@ -19,10 +19,12 @@
 import android.Manifest;
 import android.annotation.RequiresNoPermission;
 import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
 import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
 import android.compat.annotation.UnsupportedAppUsage;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Build;
@@ -70,6 +72,7 @@
     @RequiresLegacyBluetoothPermission
     @RequiresBluetoothConnectPermission
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONNECTION_STATE_CHANGED =
             "android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED";
 
@@ -94,7 +97,8 @@
      */
     public static final int RESULT_CANCELED = 2;
 
-    private BluetoothAdapter mAdapter;
+    private final BluetoothAdapter mAdapter;
+    private final AttributionSource mAttributionSource;
     private final BluetoothProfileConnector<IBluetoothSap> mProfileConnector =
             new BluetoothProfileConnector(this, BluetoothProfile.SAP,
                     "BluetoothSap", IBluetoothSap.class.getName()) {
@@ -107,9 +111,11 @@
     /**
      * Create a BluetoothSap proxy object.
      */
-    /*package*/ BluetoothSap(Context context, ServiceListener listener) {
+    /* package */ BluetoothSap(Context context, ServiceListener listener,
+            BluetoothAdapter adapter) {
         if (DBG) Log.d(TAG, "Create BluetoothSap proxy object");
-        mAdapter = BluetoothAdapter.getDefaultAdapter();
+        mAdapter = adapter;
+        mAttributionSource = adapter.getAttributionSource();
         mProfileConnector.connect(context, listener);
     }
 
@@ -151,7 +157,7 @@
         final IBluetoothSap service = getService();
         if (service != null) {
             try {
-                return service.getState();
+                return service.getState(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -176,7 +182,7 @@
         final IBluetoothSap service = getService();
         if (service != null) {
             try {
-                return service.getClient();
+                return service.getClient(mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -201,7 +207,7 @@
         final IBluetoothSap service = getService();
         if (service != null) {
             try {
-                return service.isConnected(device);
+                return service.isConnected(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, e.toString());
             }
@@ -239,7 +245,7 @@
         final IBluetoothSap service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.disconnect(device);
+                return service.disconnect(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -262,7 +268,8 @@
         final IBluetoothSap service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getConnectedDevices();
+                return BluetoothDevice.setAttributionSource(
+                        service.getConnectedDevices(mAttributionSource), mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -285,7 +292,9 @@
         final IBluetoothSap service = getService();
         if (service != null && isEnabled()) {
             try {
-                return service.getDevicesMatchingConnectionStates(states);
+                return BluetoothDevice.setAttributionSource(
+                        service.getDevicesMatchingConnectionStates(states, mAttributionSource),
+                        mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return new ArrayList<BluetoothDevice>();
@@ -308,7 +317,7 @@
         final IBluetoothSap service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionState(device);
+                return service.getConnectionState(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.STATE_DISCONNECTED;
@@ -366,7 +375,7 @@
                 return false;
             }
             try {
-                return service.setConnectionPolicy(device, connectionPolicy);
+                return service.setConnectionPolicy(device, connectionPolicy, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return false;
@@ -417,7 +426,7 @@
         final IBluetoothSap service = getService();
         if (service != null && isEnabled() && isValidDevice(device)) {
             try {
-                return service.getConnectionPolicy(device);
+                return service.getConnectionPolicy(device, mAttributionSource);
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));
                 return BluetoothProfile.CONNECTION_POLICY_FORBIDDEN;
@@ -432,17 +441,10 @@
     }
 
     private boolean isEnabled() {
-        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-
-        if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON) {
-            return true;
-        }
-        log("Bluetooth is Not enabled");
-        return false;
+        return mAdapter.isEnabled();
     }
 
     private static boolean isValidDevice(BluetoothDevice device) {
         return device != null && BluetoothAdapter.checkBluetoothAddress(device.getAddress());
     }
-
 }
diff --git a/core/java/android/bluetooth/le/AdvertisingSet.java b/core/java/android/bluetooth/le/AdvertisingSet.java
index d7e48ca..caa91fb 100644
--- a/core/java/android/bluetooth/le/AdvertisingSet.java
+++ b/core/java/android/bluetooth/le/AdvertisingSet.java
@@ -18,12 +18,12 @@
 
 import android.annotation.RequiresNoPermission;
 import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.IBluetoothGatt;
 import android.bluetooth.IBluetoothManager;
 import android.bluetooth.annotations.RequiresBluetoothAdvertisePermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothAdminPermission;
+import android.content.AttributionSource;
 import android.os.RemoteException;
 import android.util.Log;
 
@@ -40,11 +40,12 @@
 
     private final IBluetoothGatt mGatt;
     private int mAdvertiserId;
+    private AttributionSource mAttributionSource;
 
-    /* package */ AdvertisingSet(int advertiserId,
-            IBluetoothManager bluetoothManager) {
+    /* package */ AdvertisingSet(int advertiserId, IBluetoothManager bluetoothManager,
+            AttributionSource attributionSource) {
         mAdvertiserId = advertiserId;
-
+        mAttributionSource = attributionSource;
         try {
             mGatt = bluetoothManager.getBluetoothGatt();
         } catch (RemoteException e) {
@@ -75,7 +76,7 @@
             int maxExtendedAdvertisingEvents) {
         try {
             mGatt.enableAdvertisingSet(mAdvertiserId, enable, duration,
-                    maxExtendedAdvertisingEvents);
+                    maxExtendedAdvertisingEvents, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "remote exception - ", e);
         }
@@ -98,7 +99,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
     public void setAdvertisingData(AdvertiseData advertiseData) {
         try {
-            mGatt.setAdvertisingData(mAdvertiserId, advertiseData);
+            mGatt.setAdvertisingData(mAdvertiserId, advertiseData, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "remote exception - ", e);
         }
@@ -118,7 +119,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
     public void setScanResponseData(AdvertiseData scanResponse) {
         try {
-            mGatt.setScanResponseData(mAdvertiserId, scanResponse);
+            mGatt.setScanResponseData(mAdvertiserId, scanResponse, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "remote exception - ", e);
         }
@@ -136,7 +137,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
     public void setAdvertisingParameters(AdvertisingSetParameters parameters) {
         try {
-            mGatt.setAdvertisingParameters(mAdvertiserId, parameters);
+            mGatt.setAdvertisingParameters(mAdvertiserId, parameters, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "remote exception - ", e);
         }
@@ -152,7 +153,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
     public void setPeriodicAdvertisingParameters(PeriodicAdvertisingParameters parameters) {
         try {
-            mGatt.setPeriodicAdvertisingParameters(mAdvertiserId, parameters);
+            mGatt.setPeriodicAdvertisingParameters(mAdvertiserId, parameters, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "remote exception - ", e);
         }
@@ -173,7 +174,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
     public void setPeriodicAdvertisingData(AdvertiseData periodicData) {
         try {
-            mGatt.setPeriodicAdvertisingData(mAdvertiserId, periodicData);
+            mGatt.setPeriodicAdvertisingData(mAdvertiserId, periodicData, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "remote exception - ", e);
         }
@@ -191,7 +192,7 @@
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADVERTISE)
     public void setPeriodicAdvertisingEnabled(boolean enable) {
         try {
-            mGatt.setPeriodicAdvertisingEnable(mAdvertiserId, enable);
+            mGatt.setPeriodicAdvertisingEnable(mAdvertiserId, enable, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "remote exception - ", e);
         }
diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
index ff279d8..5802974 100644
--- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
+++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
@@ -26,6 +26,7 @@
 import android.bluetooth.IBluetoothManager;
 import android.bluetooth.annotations.RequiresBluetoothAdvertisePermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothAdminPermission;
+import android.content.AttributionSource;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.ParcelUuid;
@@ -35,6 +36,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * This class provides a way to perform Bluetooth LE advertise operations, such as starting and
@@ -58,9 +60,11 @@
     private static final int FLAGS_FIELD_BYTES = 3;
     private static final int MANUFACTURER_SPECIFIC_DATA_LENGTH = 2;
 
+    private final BluetoothAdapter mBluetoothAdapter;
     private final IBluetoothManager mBluetoothManager;
+    private final AttributionSource mAttributionSource;
+
     private final Handler mHandler;
-    private BluetoothAdapter mBluetoothAdapter;
     private final Map<AdvertiseCallback, AdvertisingSetCallback>
             mLegacyAdvertisers = new HashMap<>();
     private final Map<AdvertisingSetCallback, IAdvertisingSetCallback>
@@ -74,9 +78,10 @@
      * @param bluetoothManager BluetoothManager that conducts overall Bluetooth Management
      * @hide
      */
-    public BluetoothLeAdvertiser(IBluetoothManager bluetoothManager) {
-        mBluetoothManager = bluetoothManager;
-        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    public BluetoothLeAdvertiser(BluetoothAdapter bluetoothAdapter) {
+        mBluetoothAdapter = Objects.requireNonNull(bluetoothAdapter);
+        mBluetoothManager = mBluetoothAdapter.getBluetoothManager();
+        mAttributionSource = mBluetoothAdapter.getAttributionSource();
         mHandler = new Handler(Looper.getMainLooper());
     }
 
@@ -453,7 +458,8 @@
 
         try {
             gatt.startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters,
-                    periodicData, duration, maxExtendedAdvertisingEvents, wrapped);
+                    periodicData, duration, maxExtendedAdvertisingEvents, wrapped,
+                    mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to start advertising set - ", e);
             postStartSetFailure(handler, callback,
@@ -482,7 +488,7 @@
         IBluetoothGatt gatt;
         try {
             gatt = mBluetoothManager.getBluetoothGatt();
-            gatt.stopAdvertisingSet(wrapped);
+            gatt.stopAdvertisingSet(wrapped, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to stop advertising - ", e);
         }
@@ -600,8 +606,8 @@
                             return;
                         }
 
-                        AdvertisingSet advertisingSet =
-                                new AdvertisingSet(advertiserId, mBluetoothManager);
+                        AdvertisingSet advertisingSet = new AdvertisingSet(
+                                advertiserId, mBluetoothManager, mAttributionSource);
                         mAdvertisingSets.put(advertiserId, advertisingSet);
                         callback.onAdvertisingSetStarted(advertisingSet, txPower, status);
                     }
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index f27f22b..60d4e2d 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -41,6 +41,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * This class provides methods to perform scan related operations for Bluetooth LE devices. An
@@ -80,12 +81,13 @@
      */
     public static final String EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE";
 
+    private final BluetoothAdapter mBluetoothAdapter;
     private final IBluetoothManager mBluetoothManager;
-    private final Handler mHandler;
-    private BluetoothAdapter mBluetoothAdapter;
-    private final Map<ScanCallback, BleScanCallbackWrapper> mLeScanClients;
     private final AttributionSource mAttributionSource;
 
+    private final Handler mHandler;
+    private final Map<ScanCallback, BleScanCallbackWrapper> mLeScanClients;
+
     /**
      * Use {@link BluetoothAdapter#getBluetoothLeScanner()} instead.
      *
@@ -94,13 +96,12 @@
      * @param featureId  The featureId of the context this object was created from
      * @hide
      */
-    public BluetoothLeScanner(IBluetoothManager bluetoothManager,
-            @NonNull AttributionSource attributionSource) {
-        mBluetoothManager = bluetoothManager;
-        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    public BluetoothLeScanner(BluetoothAdapter bluetoothAdapter) {
+        mBluetoothAdapter = Objects.requireNonNull(bluetoothAdapter);
+        mBluetoothManager = mBluetoothAdapter.getBluetoothManager();
+        mAttributionSource = mBluetoothAdapter.getAttributionSource();
         mHandler = new Handler(Looper.getMainLooper());
         mLeScanClients = new HashMap<ScanCallback, BleScanCallbackWrapper>();
-        mAttributionSource = attributionSource;
     }
 
     /**
@@ -276,7 +277,8 @@
                 wrapper.startRegistration();
             } else {
                 try {
-                    gatt.startScanForIntent(callbackIntent, settings, filters, mAttributionSource);
+                    gatt.startScanForIntent(callbackIntent, settings, filters,
+                            mAttributionSource);
                 } catch (RemoteException e) {
                     return ScanCallback.SCAN_FAILED_INTERNAL_ERROR;
                 }
@@ -321,7 +323,7 @@
         IBluetoothGatt gatt;
         try {
             gatt = mBluetoothManager.getBluetoothGatt();
-            gatt.stopScanForIntent(callbackIntent);
+            gatt.stopScanForIntent(callbackIntent, mAttributionSource);
         } catch (RemoteException e) {
         }
     }
@@ -420,7 +422,7 @@
                 // Scan stopped.
                 if (mScannerId == -1 || mScannerId == -2) return;
                 try {
-                    mBluetoothGatt.registerScanner(this, mWorkSource);
+                    mBluetoothGatt.registerScanner(this, mWorkSource, mAttributionSource);
                     wait(REGISTRATION_CALLBACK_TIMEOUT_MILLIS);
                 } catch (InterruptedException | RemoteException e) {
                     Log.e(TAG, "application registeration exception", e);
@@ -450,8 +452,8 @@
                     return;
                 }
                 try {
-                    mBluetoothGatt.stopScan(mScannerId);
-                    mBluetoothGatt.unregisterScanner(mScannerId);
+                    mBluetoothGatt.stopScan(mScannerId, mAttributionSource);
+                    mBluetoothGatt.unregisterScanner(mScannerId, mAttributionSource);
                 } catch (RemoteException e) {
                     Log.e(TAG, "Failed to stop scan and unregister", e);
                 }
@@ -467,7 +469,7 @@
                     return;
                 }
                 try {
-                    mBluetoothGatt.flushPendingBatchResults(mScannerId);
+                    mBluetoothGatt.flushPendingBatchResults(mScannerId, mAttributionSource);
                 } catch (RemoteException e) {
                     Log.e(TAG, "Failed to get pending scan results", e);
                 }
@@ -486,7 +488,7 @@
                     try {
                         if (mScannerId == -1) {
                             // Registration succeeds after timeout, unregister scanner.
-                            mBluetoothGatt.unregisterScanner(scannerId);
+                            mBluetoothGatt.unregisterScanner(scannerId, mAttributionSource);
                         } else {
                             mScannerId = scannerId;
                             mBluetoothGatt.startScan(mScannerId, mSettings, mFilters,
diff --git a/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java b/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java
index 26978e3..47f47bb 100644
--- a/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java
+++ b/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java
@@ -25,6 +25,7 @@
 import android.bluetooth.annotations.RequiresBluetoothLocationPermission;
 import android.bluetooth.annotations.RequiresBluetoothScanPermission;
 import android.bluetooth.annotations.RequiresLegacyBluetoothAdminPermission;
+import android.content.AttributionSource;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.RemoteException;
@@ -32,6 +33,7 @@
 
 import java.util.IdentityHashMap;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * This class provides methods to perform periodic advertising related
@@ -54,8 +56,9 @@
 
     private static final int SYNC_STARTING = -1;
 
+    private final BluetoothAdapter mBluetoothAdapter;
     private final IBluetoothManager mBluetoothManager;
-    private BluetoothAdapter mBluetoothAdapter;
+    private final AttributionSource mAttributionSource;
 
     /* maps callback, to callback wrapper and sync handle */
     Map<PeriodicAdvertisingCallback,
@@ -67,9 +70,10 @@
      * @param bluetoothManager BluetoothManager that conducts overall Bluetooth Management.
      * @hide
      */
-    public PeriodicAdvertisingManager(IBluetoothManager bluetoothManager) {
-        mBluetoothManager = bluetoothManager;
-        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    public PeriodicAdvertisingManager(BluetoothAdapter bluetoothAdapter) {
+        mBluetoothAdapter = Objects.requireNonNull(bluetoothAdapter);
+        mBluetoothManager = mBluetoothAdapter.getBluetoothManager();
+        mAttributionSource = mBluetoothAdapter.getAttributionSource();
         mCallbackWrappers = new IdentityHashMap<>();
     }
 
@@ -166,7 +170,8 @@
         mCallbackWrappers.put(callback, wrapped);
 
         try {
-            gatt.registerSync(scanResult, skip, timeout, wrapped);
+            gatt.registerSync(
+                    scanResult, skip, timeout, wrapped, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to register sync - ", e);
             return;
@@ -202,7 +207,7 @@
         }
 
         try {
-            gatt.unregisterSync(wrapper);
+            gatt.unregisterSync(wrapper, mAttributionSource);
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to cancel sync creation - ", e);
             return;
diff --git a/core/java/android/bluetooth/le/ScanSettings.java b/core/java/android/bluetooth/le/ScanSettings.java
index f3e971a..1aa7cb5 100644
--- a/core/java/android/bluetooth/le/ScanSettings.java
+++ b/core/java/android/bluetooth/le/ScanSettings.java
@@ -20,7 +20,6 @@
 import android.bluetooth.BluetoothDevice;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.provider.DeviceConfig;
 
 /**
  * Bluetooth LE scan settings are passed to {@link BluetoothLeScanner#startScan} to define the
@@ -142,12 +141,6 @@
      */
     public static final int PHY_LE_ALL_SUPPORTED = 255;
 
-    /**
-     * The default floor value for report delays greater than 0 in
-     * {@link Builder#setReportDelay(long)}.
-     */
-    private static final long DEFAULT_REPORT_DELAY_FLOOR = 5000;
-
     // Bluetooth LE scan mode.
     private int mScanMode;
 
@@ -365,15 +358,7 @@
             if (reportDelayMillis < 0) {
                 throw new IllegalArgumentException("reportDelay must be > 0");
             }
-
-            long floor = DeviceConfig.getLong(DeviceConfig.NAMESPACE_BLUETOOTH, "report_delay",
-                    DEFAULT_REPORT_DELAY_FLOOR);
-
-            if (reportDelayMillis > 0 && reportDelayMillis < floor) {
-                mReportDelayMillis = floor;
-            } else {
-                mReportDelayMillis = reportDelayMillis;
-            }
+            mReportDelayMillis = reportDelayMillis;
             return this;
         }
 
diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java
index b13bf09..2c155d58 100644
--- a/core/java/android/content/AttributionSource.java
+++ b/core/java/android/content/AttributionSource.java
@@ -550,8 +550,27 @@
         }
 
         /**
-         * Permissions that should be considered revoked regardless if granted.
+         * Sets permissions which have been voluntarily "renounced" by the
+         * calling app.
+         * <p>
+         * Interactions performed through services obtained from the created
+         * Context will ideally be treated as if these "renounced" permissions
+         * have not actually been granted to the app, regardless of their actual
+         * grant status.
+         * <p>
+         * This is designed for use by separate logical components within an app
+         * which have no intention of interacting with data or services that are
+         * protected by the renounced permissions.
+         * <p>
+         * Note that only {@link PermissionInfo#PROTECTION_DANGEROUS}
+         * permissions are supported by this mechanism. Additionally, this
+         * mechanism only applies to calls made through services obtained via
+         * {@link Context#getSystemService}; it has no effect on static or raw
+         * Binder calls.
          *
+         * @param renouncedPermissions The set of permissions to treat as
+         *            renounced, which is as if not granted.
+         * @return This builder.
          * @hide
          */
         @SystemApi
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index a88c9ed..6a22491 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2219,6 +2219,26 @@
     }
 
     /**
+     * Version of {@link #sendBroadcastMultiplePermissions(Intent, String[])} that allows you to
+     * specify the {@link android.app.BroadcastOptions}.
+     *
+     * @param intent The Intent to broadcast; all receivers matching this
+     *               Intent will receive the broadcast.
+     * @param receiverPermissions Array of names of permissions that a receiver must hold
+     *                            in order to receive your broadcast.
+     *                            If empty, no permissions are required.
+     * @param options Additional sending options, generated from a
+     *                {@link android.app.BroadcastOptions}.
+     * @see #sendBroadcastMultiplePermissions(Intent, String[])
+     * @see android.app.BroadcastOptions
+     * @hide
+     */
+    public void sendBroadcastMultiplePermissions(@NonNull Intent intent,
+            @NonNull String[] receiverPermissions, @Nullable Bundle options) {
+        throw new RuntimeException("Not implemented. Must override in a subclass.");
+    }
+
+    /**
      * Broadcast the given intent to all interested BroadcastReceivers, allowing
      * an array of required permissions to be enforced.  This call is asynchronous; it returns
      * immediately, and you will continue executing while the receivers are run.  No results are
@@ -4814,6 +4834,7 @@
      * @see #getSystemService(String)
      * @hide
      */
+    @SystemApi
     public static final String PERMISSION_CONTROLLER_SERVICE = "permission_controller";
 
     /**
diff --git a/core/java/android/content/ContextParams.java b/core/java/android/content/ContextParams.java
index ace2ba7..5cc3a24 100644
--- a/core/java/android/content/ContextParams.java
+++ b/core/java/android/content/ContextParams.java
@@ -162,16 +162,20 @@
          * Sets permissions which have been voluntarily "renounced" by the
          * calling app.
          * <p>
-         * Interactions performed through the created Context will ideally be
-         * treated as if these "renounced" permissions have not actually been
-         * granted to the app, regardless of their actual grant status.
+         * Interactions performed through services obtained from the created
+         * Context will ideally be treated as if these "renounced" permissions
+         * have not actually been granted to the app, regardless of their actual
+         * grant status.
          * <p>
          * This is designed for use by separate logical components within an app
          * which have no intention of interacting with data or services that are
          * protected by the renounced permissions.
          * <p>
          * Note that only {@link PermissionInfo#PROTECTION_DANGEROUS}
-         * permissions are supported by this mechanism.
+         * permissions are supported by this mechanism. Additionally, this
+         * mechanism only applies to calls made through services obtained via
+         * {@link Context#getSystemService}; it has no effect on static or raw
+         * Binder calls.
          *
          * @param renouncedPermissions The set of permissions to treat as
          *            renounced, which is as if not granted.
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index dddcbea..6324d0e 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -500,6 +500,13 @@
 
     /** @hide */
     @Override
+    public void sendBroadcastMultiplePermissions(@NonNull Intent intent,
+            @NonNull String[] receiverPermissions, @Nullable Bundle options) {
+        mBase.sendBroadcastMultiplePermissions(intent, receiverPermissions, options);
+    }
+
+    /** @hide */
+    @Override
     public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
             String[] receiverPermissions) {
         mBase.sendBroadcastAsUserMultiplePermissions(intent, user, receiverPermissions);
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 3cc7ff8..b498325 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2189,6 +2189,8 @@
      * Type: String
      * </p>
      *
+     * E.g. {@link android.Manifest.permission_group.CONTACTS}
+     *
      * @hide
      */
     @SystemApi
@@ -2569,6 +2571,32 @@
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
     /**
+     * Broadcast Action: An existing application package has been removed from
+     * the device. The data contains the name of the package and the visibility
+     * allow list. The package that is being removed does <em>not</em> receive
+     * this Intent.
+     * <ul>
+     * <li> {@link #EXTRA_UID} containing the integer uid previously assigned
+     * to the package.
+     * <li> {@link #EXTRA_DATA_REMOVED} is set to true if the entire
+     * application -- data and code -- is being removed.
+     * <li> {@link #EXTRA_REPLACING} is set to true if this will be followed
+     * by an {@link #ACTION_PACKAGE_ADDED} broadcast for the same package.
+     * <li> {@link #EXTRA_USER_INITIATED} containing boolean field to signal
+     * that the application was removed with the user-initiated action.
+     * <li> {@link #EXTRA_VISIBILITY_ALLOW_LIST} containing an int array to
+     * indicate the visibility allow list.
+     * </ul>
+     *
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
+     *
+     * @hide This broadcast is used internally by the system.
+     */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+    public static final String ACTION_PACKAGE_REMOVED_INTERNAL =
+            "android.intent.action.PACKAGE_REMOVED_INTERNAL";
+    /**
      * Broadcast Action: An existing application package has been completely
      * removed from the device.  The data contains the name of the package.
      * This is like {@link #ACTION_PACKAGE_REMOVED}, but only set when
@@ -2829,55 +2857,6 @@
     public static final String ACTION_MY_PACKAGE_UNSUSPENDED = "android.intent.action.MY_PACKAGE_UNSUSPENDED";
 
     /**
-     * Broadcast Action: Sent to indicate that the package becomes startable.
-     * The intent will have the following extra values:
-     * <ul>
-     * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. </li>
-     * <li> {@link #EXTRA_PACKAGE_NAME} containing the package name. </li>
-     * </li>
-     * </ul>
-     *
-     * <p class="note">This is a protected intent that can only be sent by the system.
-     * @hide
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String ACTION_PACKAGE_STARTABLE = "android.intent.action.PACKAGE_STARTABLE";
-
-    /**
-     * Broadcast Action: Sent to indicate that the package becomes unstartable.
-     * The intent will have the following extra values:
-     * <ul>
-     * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. </li>
-     * <li> {@link #EXTRA_PACKAGE_NAME} containing the package name. </li>
-     * <li> {@link #EXTRA_UNSTARTABLE_REASON} containing the integer indicating the reason for
-     * the state change,
-     * @see PackageManager.UnstartableReason
-     * </li>
-     * </ul>
-     *
-     * <p class="note">This is a protected intent that can only be sent by the system.
-     * @hide
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String ACTION_PACKAGE_UNSTARTABLE =
-            "android.intent.action.PACKAGE_UNSTARTABLE";
-
-    /**
-     * Broadcast Action: Sent to indicate that the package is fully loaded.
-     * <ul>
-     * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. </li>
-     * <li> {@link #EXTRA_PACKAGE_NAME} containing the package name. </li>
-     * </li>
-     * </ul>
-     *
-     * <p class="note">This is a protected intent that can only be sent by the system.
-     * @hide
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String ACTION_PACKAGE_FULLY_LOADED =
-            "android.intent.action.PACKAGE_FULLY_LOADED";
-
-    /**
      * Broadcast Action: A user ID has been removed from the system.  The user
      * ID number is stored in the extra data under {@link #EXTRA_UID}.
      *
@@ -5362,6 +5341,8 @@
      * A String[] holding attribution tags when used with
      * {@link #ACTION_VIEW_PERMISSION_USAGE_FOR_PERIOD}
      *
+     * E.g. an attribution tag could be location_provider, com.google.android.gms.*, etc.
+     *
      * @hide
      */
     @SystemApi
@@ -6172,11 +6153,14 @@
     public static final String EXTRA_LOCUS_ID = "android.intent.extra.LOCUS_ID";
 
     /**
-     * Intent extra: the reason that the package associated with this intent has become unstartable.
+     * Used as an int array extra field in
+     * {@link android.content.Intent#ACTION_PACKAGE_REMOVED_INTERNAL}
+     * intents to indicate that visibility allow list of this removed package.
      *
-     * <p>Type: String
+     * @hide
      */
-    public static final String EXTRA_UNSTARTABLE_REASON = "android.intent.extra.UNSTARTABLE_REASON";
+    public static final String EXTRA_VISIBILITY_ALLOW_LIST =
+            "android.intent.extra.VISIBILITY_ALLOW_LIST";
 
     // ---------------------------------------------------------------------
     // ---------------------------------------------------------------------
diff --git a/core/java/android/content/OWNERS b/core/java/android/content/OWNERS
index 1735aa2..8ad1349 100644
--- a/core/java/android/content/OWNERS
+++ b/core/java/android/content/OWNERS
@@ -1,6 +1,7 @@
 # Remain no owner because multiple modules may touch this file.
 per-file Context.java = *
 per-file ContextWrapper.java = *
+per-file Content* = varunshah@google.com, omakoto@google.com, jsharkey@google.com
 per-file IntentFilter.java = toddke@google.com
 per-file IntentFilter.java = patb@google.com
 per-file Intent.java = toddke@google.com
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index fa9142c..fbed907 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -17,6 +17,7 @@
 package android.content.pm;
 
 import android.annotation.IntDef;
+import android.annotation.SuppressLint;
 import android.annotation.TestApi;
 import android.app.compat.CompatChanges;
 import android.compat.annotation.ChangeId;
@@ -961,6 +962,29 @@
     public @interface SizeChangesSupportMode {}
 
     /**
+     * This change id forces the packages it is applied to never have Display API sandboxing
+     * applied for a letterbox or SCM activity. The Display APIs will continue to provide
+     * DisplayArea bounds.
+     * @hide
+     */
+    @ChangeId
+    @Overridable
+    @Disabled
+    @TestApi
+    public static final long NEVER_SANDBOX_DISPLAY_APIS = 184838306L; // buganizer id
+
+    /**
+     * This change id forces the packages it is applied to always have Display API sandboxing
+     * applied, regardless of windowing mode. The Display APIs will always provide the app bounds.
+     * @hide
+     */
+    @ChangeId
+    @Overridable
+    @Disabled
+    @TestApi
+    public static final long ALWAYS_SANDBOX_DISPLAY_APIS = 185004937L; // buganizer id
+
+    /**
      * This change id is the gatekeeper for all treatments that force a given min aspect ratio.
      * Enabling this change will allow the following min aspect ratio treatments to be applied:
      * OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
@@ -1151,10 +1175,10 @@
     public WindowLayout windowLayout;
 
     /**
-     * Attribution tags for finer grained calls if a {@android.content.Context#sendBroadcast(Intent,
-     * String)} is used with a permission.
-     * @hide
+     * Attribution tags for finer grained calls if a {@link
+     * android.content.Context#sendBroadcast(Intent, String)} is used with a permission.
      */
+    @SuppressLint("MissingNullability")
     public String[] attributionTags;
 
     public ActivityInfo() {
@@ -1325,6 +1349,26 @@
         return SIZE_CHANGES_UNSUPPORTED_METADATA;
     }
 
+    /**
+     * Returns if the activity should never be sandboxed to the activity window bounds.
+     * @hide
+     */
+    public boolean neverSandboxDisplayApis() {
+        return CompatChanges.isChangeEnabled(NEVER_SANDBOX_DISPLAY_APIS,
+                applicationInfo.packageName,
+                UserHandle.getUserHandleForUid(applicationInfo.uid));
+    }
+
+    /**
+     * Returns if the activity should always be sandboxed to the activity window bounds.
+     * @hide
+     */
+    public boolean alwaysSandboxDisplayApis() {
+        return CompatChanges.isChangeEnabled(ALWAYS_SANDBOX_DISPLAY_APIS,
+                applicationInfo.packageName,
+                UserHandle.getUserHandleForUid(applicationInfo.uid));
+    }
+
     /** @hide */
     public void setMaxAspectRatio(float maxAspectRatio) {
         this.mMaxAspectRatio = maxAspectRatio;
diff --git a/core/java/android/content/pm/AppSearchPerson.java b/core/java/android/content/pm/AppSearchPerson.java
index 9283e5f..98d150b 100644
--- a/core/java/android/content/pm/AppSearchPerson.java
+++ b/core/java/android/content/pm/AppSearchPerson.java
@@ -91,7 +91,7 @@
         String uri;
         try {
             uri = UriCodec.decode(
-                    getUri(), false /* convertPlus */, StandardCharsets.UTF_8,
+                    getId(), false /* convertPlus */, StandardCharsets.UTF_8,
                     true /* throwOnFailure */);
         } catch (IllegalArgumentException e) {
             uri = null;
diff --git a/core/java/android/content/pm/AppSearchShortcutInfo.java b/core/java/android/content/pm/AppSearchShortcutInfo.java
index eb50924..afaecec 100644
--- a/core/java/android/content/pm/AppSearchShortcutInfo.java
+++ b/core/java/android/content/pm/AppSearchShortcutInfo.java
@@ -153,8 +153,8 @@
                     .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
                     .build()
 
-            ).addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder(KEY_PERSON)
-                    .setSchemaType(AppSearchPerson.SCHEMA_TYPE)
+            ).addProperty(new AppSearchSchema.DocumentPropertyConfig.Builder(
+                    KEY_PERSON, AppSearchPerson.SCHEMA_TYPE)
                     .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
                     .build()
 
@@ -419,7 +419,7 @@
         final String bitmapPath = getPropertyString(KEY_BITMAP_PATH);
         final int disabledReason = Integer.parseInt(getPropertyString(KEY_DISABLED_REASON));
         final ShortcutInfo si = new ShortcutInfo(
-                userId, getUri(), packageName, activity, icon, shortLabel, shortLabelResId,
+                userId, getId(), packageName, activity, icon, shortLabel, shortLabelResId,
                 shortLabelResName, longLabel, longLabelResId, longLabelResName, disabledMessage,
                 disabledMessageResId, disabledMessageResName, categoriesSet, intents, rank, extras,
                 getCreationTimestampMillis(), flags, iconResId, iconResName, bitmapPath, iconUri,
diff --git a/core/java/android/content/pm/IDataLoaderStatusListener.aidl b/core/java/android/content/pm/IDataLoaderStatusListener.aidl
index 79b70f2..9d8d0a4 100644
--- a/core/java/android/content/pm/IDataLoaderStatusListener.aidl
+++ b/core/java/android/content/pm/IDataLoaderStatusListener.aidl
@@ -52,30 +52,7 @@
     *            fail and all retry limits are exceeded. */
     const int DATA_LOADER_UNRECOVERABLE = 9;
 
-    /** There are no known issues with the data stream. */
-    const int STREAM_HEALTHY = 0;
-
-    /** There are issues with the current transport layer (network, adb connection, etc.) that may
-     * recover automatically or could eventually require user intervention. */
-    const int STREAM_TRANSPORT_ERROR = 1;
-
-    /** Integrity failures in the data stream, this could be due to file corruption, decompression
-     * issues or similar. This indicates a likely unrecoverable error. */
-    const int STREAM_INTEGRITY_ERROR = 2;
-
-    /** There are issues with the source of the data, e.g., backend availability issues, account
-     * issues. This indicates a potentially recoverable error, but one that may take a long time to
-     * resolve. */
-    const int STREAM_SOURCE_ERROR = 3;
-
-    /** The device or app is low on storage and cannot complete the stream as a result.
-      * A subsequent page miss resulting in app failure will transition app to unstartable state. */
-    const int STREAM_STORAGE_ERROR = 4;
-
     /** Data loader status callback */
     void onStatusChanged(in int dataLoaderId, in int status);
-
-    /** Callback to report streaming health status of a specific data loader */
-    void reportStreamHealth(in int dataLoaderId, in int streamStatus);
 }
 
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 7fe2a41..5e72325 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -796,6 +796,10 @@
 
     void setMimeGroup(String packageName, String group, in List<String> mimeTypes);
 
+    String getSplashScreenTheme(String packageName, int userId);
+
+    void setSplashScreenTheme(String packageName, String themeName, int userId);
+
     List<String> getMimeGroup(String packageName, String group);
 
     boolean isAutoRevokeWhitelisted(String packageName);
diff --git a/core/java/android/content/pm/IShortcutService.aidl b/core/java/android/content/pm/IShortcutService.aidl
index c91334a..9d381ef 100644
--- a/core/java/android/content/pm/IShortcutService.aidl
+++ b/core/java/android/content/pm/IShortcutService.aidl
@@ -26,29 +26,29 @@
 /** {@hide} */
 interface IShortcutService {
 
-    oneway void setDynamicShortcuts(String packageName, in ParceledListSlice shortcutInfoList,
-            int userId, in AndroidFuture callback);
+    AndroidFuture setDynamicShortcuts(String packageName,
+            in ParceledListSlice shortcutInfoList, int userId);
 
-    oneway void addDynamicShortcuts(String packageName, in ParceledListSlice shortcutInfoList,
-            int userId, in AndroidFuture callback);
+    AndroidFuture addDynamicShortcuts(String packageName,
+            in ParceledListSlice shortcutInfoList, int userId);
 
-    oneway void removeDynamicShortcuts(String packageName, in List shortcutIds, int userId);
+    AndroidFuture removeDynamicShortcuts(String packageName, in List shortcutIds, int userId);
 
-    oneway void removeAllDynamicShortcuts(String packageName, int userId);
+    AndroidFuture removeAllDynamicShortcuts(String packageName, int userId);
 
-    oneway void updateShortcuts(String packageName, in ParceledListSlice shortcuts, int userId,
-            in AndroidFuture callback);
+    AndroidFuture updateShortcuts(String packageName, in ParceledListSlice shortcuts,
+            int userId);
 
-    oneway void requestPinShortcut(String packageName, in ShortcutInfo shortcut,
-            in IntentSender resultIntent, int userId, in AndroidFuture callback);
+    AndroidFuture requestPinShortcut(String packageName, in ShortcutInfo shortcut,
+            in IntentSender resultIntent, int userId);
 
-    oneway void createShortcutResultIntent(String packageName, in ShortcutInfo shortcut,
-            int userId, in AndroidFuture callback);
+    AndroidFuture<Intent> createShortcutResultIntent(String packageName, in ShortcutInfo shortcut,
+            int userId);
 
-    oneway void disableShortcuts(String packageName, in List shortcutIds,
+    AndroidFuture disableShortcuts(String packageName, in List shortcutIds,
             CharSequence disabledMessage, int disabledMessageResId, int userId);
 
-    oneway void enableShortcuts(String packageName, in List shortcutIds, int userId);
+    AndroidFuture enableShortcuts(String packageName, in List shortcutIds, int userId);
 
     int getMaxShortcutCountPerActivity(String packageName, int userId);
 
@@ -58,31 +58,30 @@
 
     int getIconMaxDimensions(String packageName, int userId);
 
-    oneway void reportShortcutUsed(String packageName, String shortcutId, int userId);
+    AndroidFuture reportShortcutUsed(String packageName, String shortcutId, int userId);
 
-    oneway void resetThrottling(); // system only API for developer opsions
+    void resetThrottling(); // system only API for developer opsions
 
-    oneway void onApplicationActive(String packageName, int userId); // system only API for sysUI
+    AndroidFuture onApplicationActive(String packageName, int userId); // system only API for sysUI
 
     byte[] getBackupPayload(int user);
 
-    oneway void applyRestore(in byte[] payload, int user);
+    AndroidFuture applyRestore(in byte[] payload, int user);
 
     boolean isRequestPinItemSupported(int user, int requestType);
 
     // System API used by framework's ShareSheet (ChooserActivity)
-    oneway void getShareTargets(String packageName, in IntentFilter filter, int userId,
-           in AndroidFuture<ParceledListSlice> callback);
+    AndroidFuture<ParceledListSlice> getShareTargets(String packageName, in IntentFilter filter,
+            int userId);
 
     boolean hasShareTargets(String packageName, String packageToCheck, int userId);
 
-    oneway void removeLongLivedShortcuts(String packageName, in List shortcutIds, int userId);
+    AndroidFuture removeLongLivedShortcuts(String packageName, in List shortcutIds, int userId);
 
-    oneway void getShortcuts(String packageName, int matchFlags, int userId,
-            in AndroidFuture<ParceledListSlice<ShortcutInfo>> callback);
+    AndroidFuture<ParceledListSlice> getShortcuts(String packageName, int matchFlags, int userId);
 
-    oneway void pushDynamicShortcut(String packageName, in ShortcutInfo shortcut, int userId);
+    AndroidFuture pushDynamicShortcut(String packageName, in ShortcutInfo shortcut, int userId);
 
-    oneway void updateShortcutVisibility(String callingPkg, String packageName,
+    AndroidFuture updateShortcutVisibility(String callingPkg, String packageName,
             in byte[] certificate, in boolean visible, int userId);
 }
diff --git a/core/java/android/content/pm/IncrementalStatesInfo.java b/core/java/android/content/pm/IncrementalStatesInfo.java
index 6e91c19..0393d34b 100644
--- a/core/java/android/content/pm/IncrementalStatesInfo.java
+++ b/core/java/android/content/pm/IncrementalStatesInfo.java
@@ -24,26 +24,19 @@
  * @hide
  */
 public class IncrementalStatesInfo implements Parcelable {
-    private boolean mIsStartable;
     private boolean mIsLoading;
     private float mProgress;
 
-    public IncrementalStatesInfo(boolean isStartable, boolean isLoading, float progress) {
-        mIsStartable = isStartable;
+    public IncrementalStatesInfo(boolean isLoading, float progress) {
         mIsLoading = isLoading;
         mProgress = progress;
     }
 
     private IncrementalStatesInfo(Parcel source) {
-        mIsStartable = source.readBoolean();
         mIsLoading = source.readBoolean();
         mProgress = source.readFloat();
     }
 
-    public boolean isStartable() {
-        return mIsStartable;
-    }
-
     public boolean isLoading() {
         return mIsLoading;
     }
@@ -59,7 +52,6 @@
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeBoolean(mIsStartable);
         dest.writeBoolean(mIsLoading);
         dest.writeFloat(mProgress);
     }
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 8b9b736..a8a5837 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -225,7 +225,6 @@
          * Indicates that a package was modified in the specified profile.
          * This can happen, for example, when the package is updated or when
          * one or more components are enabled or disabled.
-         * It can also happen if package state has changed, i.e., package becomes unstartable.
          *
          * @param packageName The name of the package that has changed.
          * @param user The UserHandle of the profile that generated the change.
diff --git a/core/java/android/content/pm/OWNERS b/core/java/android/content/pm/OWNERS
index f0def805..4e674f6 100644
--- a/core/java/android/content/pm/OWNERS
+++ b/core/java/android/content/pm/OWNERS
@@ -4,7 +4,8 @@
 toddke@google.com
 patb@google.com
 
-per-file PackageParser.java = chiuwinson@google.com
+per-file PackageParser.java = set noparent
+per-file PackageParser.java = chiuwinson@google.com,patb@google.com,toddke@google.com
 per-file *Shortcut* = file:/core/java/android/content/pm/SHORTCUT_OWNERS
 per-file AppSearchPerson.java = file:/core/java/android/content/pm/SHORTCUT_OWNERS
 per-file *Launcher* = file:/core/java/android/content/pm/LAUNCHER_OWNERS
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 5157e08..75dd9fb 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -1529,6 +1529,33 @@
          */
         public static final int MAX_PACKAGE_NAME_LENGTH = 255;
 
+        /** @hide */
+        @IntDef(prefix = {"USER_ACTION_"}, value = {
+                USER_ACTION_UNSPECIFIED,
+                USER_ACTION_REQUIRED,
+                USER_ACTION_NOT_REQUIRED
+        })
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface UserActionRequirement {}
+
+        /**
+         * The installer did not call {@link SessionParams#setRequireUserAction(int)} to
+         * specify whether user action should be required for the install.
+         */
+        public static final int USER_ACTION_UNSPECIFIED = 0;
+
+        /**
+         * The installer called {@link SessionParams#setRequireUserAction(int)} with
+         * {@code true} to require user action for the install to complete.
+         */
+        public static final int USER_ACTION_REQUIRED = 1;
+
+        /**
+         * The installer called {@link SessionParams#setRequireUserAction(int)} with
+         * {@code false} to request that user action not be required for this install.
+         */
+        public static final int USER_ACTION_NOT_REQUIRED = 2;
+
         /** {@hide} */
         @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
         public int mode = MODE_INVALID;
@@ -1593,7 +1620,7 @@
         /** {@hide} */
         public boolean forceQueryableOverride;
         /** {@hide} */
-        public int requireUserAction = SessionInfo.USER_ACTION_UNSPECIFIED;
+        public int requireUserAction = USER_ACTION_UNSPECIFIED;
 
         /**
          * Construct parameters for a new package install session.
@@ -1987,6 +2014,14 @@
         }
 
         /**
+         * @hide
+         */
+        @TestApi
+        public void setInstallFlagAllowTest() {
+            installFlags |= PackageManager.INSTALL_ALLOW_TEST;
+        }
+
+        /**
          * Set the installer package for the app.
          *
          * By default this is the app that created the {@link PackageInstaller} object.
@@ -2074,11 +2109,14 @@
          * Optionally indicate whether user action should be required when the session is
          * committed.
          * <p>
-         * Defaults to {@code true} for installers using the
+         * Defaults to {@link #USER_ACTION_UNSPECIFIED} unless otherwise set. When unspecified for
+         * installers using the
          * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
-         * #REQUEST_INSTALL_PACKAGES} permission, and {@code false} otherwise. When {@code true},
-         * installers will receive a {@link #STATUS_PENDING_USER_ACTION} callback once the
-         * session is committed, indicating that user action is required for the install to proceed.
+         * #REQUEST_INSTALL_PACKAGES} permission will behave as if set to
+         * {@link #USER_ACTION_REQUIRED}, and {@link #USER_ACTION_NOT_REQUIRED} otherwise.
+         * When {@code requireUserAction} is set to {@link #USER_ACTION_REQUIRED}, installers will
+         * receive a {@link #STATUS_PENDING_USER_ACTION} callback once the session is committed,
+         * indicating that user action is required for the install to proceed.
          * <p>
          * For installers that have been granted the
          * {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES android.permission
@@ -2086,7 +2124,7 @@
          * the following conditions are met:
          *
          * <ul>
-         *     <li>{@code requireUserAction} is set to {@code false}.</li>
+         *     <li>{@code requireUserAction} is set to {@link #USER_ACTION_NOT_REQUIRED}.</li>
          *     <li>The app being installed targets {@link android.os.Build.VERSION_CODES#Q API 29}
          *     or higher.</li>
          *     <li>The installer is the {@link InstallSourceInfo#getInstallingPackageName()
@@ -2102,10 +2140,17 @@
          *
          * @param requireUserAction whether user action should be required.
          */
-        public void setRequireUserAction(boolean requireUserAction) {
-            this.requireUserAction = requireUserAction
-                    ? SessionInfo.USER_ACTION_REQUIRED
-                    : SessionInfo.USER_ACTION_NOT_REQUIRED;
+        public void setRequireUserAction(
+                @SessionParams.UserActionRequirement int requireUserAction) {
+            if (requireUserAction != USER_ACTION_UNSPECIFIED
+                    && requireUserAction != USER_ACTION_REQUIRED
+                    && requireUserAction != USER_ACTION_NOT_REQUIRED) {
+                throw new IllegalArgumentException("requireUserAction set as invalid value of "
+                        + requireUserAction + ", but must be one of ["
+                        + "USER_ACTION_UNSPECIFIED, USER_ACTION_REQUIRED, USER_ACTION_NOT_REQUIRED"
+                        + "]");
+            }
+            this.requireUserAction = requireUserAction;
         }
 
         /**
@@ -2247,36 +2292,11 @@
          */
         public static final int STAGED_SESSION_CONFLICT = 4;
 
-        /** @hide */
-        @IntDef(prefix = {"USER_ACTION"}, value = {
-                USER_ACTION_UNSPECIFIED,
-                USER_ACTION_REQUIRED,
-                USER_ACTION_NOT_REQUIRED
-        })
-        @Retention(RetentionPolicy.SOURCE)
-        public @interface UserActionRequirement {}
-
-        /**
-         * The installer did not call {@link SessionParams#setRequireUserAction(boolean)} to
-         * specify whether user action should be required for the install.
-         */
-        public static final int USER_ACTION_UNSPECIFIED = 0;
-        /**
-         * The installer called {@link SessionParams#setRequireUserAction(boolean)} with
-         * {@code true} to require user action for the install to complete.
-         */
-        public static final int USER_ACTION_REQUIRED = 1;
-        /**
-         * The installer called {@link SessionParams#setRequireUserAction(boolean)} with
-         * {@code false} to request that user action not be required for this install.
-         */
-        public static final int USER_ACTION_NOT_REQUIRED = 2;
-
         private static String userActionToString(int requireUserAction) {
             switch(requireUserAction) {
-                case SessionInfo.USER_ACTION_REQUIRED:
+                case SessionParams.USER_ACTION_REQUIRED:
                     return "REQUIRED";
-                case SessionInfo.USER_ACTION_NOT_REQUIRED:
+                case SessionParams.USER_ACTION_NOT_REQUIRED:
                     return "NOT_REQUIRED";
                 default:
                     return "UNSPECIFIED";
@@ -2933,10 +2953,11 @@
          * Note: a return value of {@code USER_ACTION_NOT_REQUIRED} does not guarantee that the
          * install will not result in user action.
          *
-         * @return {@link #USER_ACTION_NOT_REQUIRED}, {@link #USER_ACTION_REQUIRED} or
-         *         {@link #USER_ACTION_UNSPECIFIED}
+         * @return {@link SessionParams#USER_ACTION_NOT_REQUIRED},
+         *         {@link SessionParams#USER_ACTION_REQUIRED} or
+         *         {@link SessionParams#USER_ACTION_UNSPECIFIED}
          */
-        @UserActionRequirement
+        @SessionParams.UserActionRequirement
         public int getRequireUserAction() {
             return requireUserAction;
         }
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index bba2fd0..90105d3 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -3654,32 +3654,6 @@
     public static final String FEATURE_TUNER = "android.hardware.tv.tuner";
 
     /**
-     * Feature for {@link #getSystemAvailableFeatures} and
-     * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for
-     * microphone. When sensory privacy for the microphone is enabled no microphone data is sent to
-     * clients, e.g. all audio data is silent.
-     *
-     * @hide
-     */
-    @SystemApi
-    @TestApi
-    @SdkConstant(SdkConstantType.FEATURE)
-    public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle";
-
-    /**
-     * Feature for {@link #getSystemAvailableFeatures} and
-     * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for
-     * camera. When sensory privacy for the camera is enabled no camera data is sent to clients,
-     * e.g. the view finder in a camera app would appear blank.
-     *
-     * @hide
-     */
-    @SystemApi
-    @TestApi
-    @SdkConstant(SdkConstantType.FEATURE)
-    public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle";
-
-    /**
      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device has
      * the necessary changes to support app enumeration.
      *
@@ -4370,39 +4344,6 @@
     public static final int SYSTEM_APP_STATE_UNINSTALLED = 3;
 
     /**
-     * Reasons for why a package is unstartable.
-     * @hide
-     */
-    @IntDef({UNSTARTABLE_REASON_UNKNOWN,
-            UNSTARTABLE_REASON_CONNECTION_ERROR,
-            UNSTARTABLE_REASON_INSUFFICIENT_STORAGE
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface UnstartableReason {}
-
-    /**
-     * Unstartable state with no root cause specified. E.g., data loader seeing missing pages but
-     * unclear about the cause. This corresponds to a generic alert window shown to the user when
-     * the user attempts to launch the app.
-     * @hide
-     */
-    public static final int UNSTARTABLE_REASON_UNKNOWN = 0;
-
-    /**
-     * Unstartable state due to connection issues that interrupt package loading.
-     * This corresponds to an alert window shown to the user indicating connection errors.
-     * @hide
-     */
-    public static final int UNSTARTABLE_REASON_CONNECTION_ERROR = 1;
-
-    /**
-     * Unstartable state after encountering storage limitations.
-     * This corresponds to an alert window indicating limited storage.
-     * @hide
-     */
-    public static final int UNSTARTABLE_REASON_INSUFFICIENT_STORAGE = 2;
-
-    /**
      * A manifest property to control app's participation in {@code adb backup}. Should only
      * be used by system / privileged apps.
      *
@@ -7775,6 +7716,9 @@
      * {@link #SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_VISIBLE} or its installation state (via
      * {@link #SYSTEM_APP_STATE_INSTALLED} and {@link #SYSTEM_APP_STATE_UNINSTALLED}.
      *
+     * This API may only be called from {@link android.os.Process#SYSTEM_UID} or
+     * {@link android.os.Process#PHONE_UID}.
+     *
      * @param packageName Package name of the app.
      * @param state State of the app.
      * @hide
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 86a8a9d..4ff2624 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -214,7 +214,6 @@
     public static final String METADATA_SUPPORTS_SIZE_CHANGES = "android.supports_size_changes";
     public static final String METADATA_ACTIVITY_WINDOW_LAYOUT_AFFINITY =
             "android.activity_window_layout_affinity";
-    public static final String METADATA_ACTIVITY_LAUNCH_MODE = "android.activity.launch_mode";
 
     /**
      * Bit mask of all the valid bits that can be set in recreateOnConfigChanges.
diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java
index 55a6ab7..84317b3 100644
--- a/core/java/android/content/pm/PackageUserState.java
+++ b/core/java/android/content/pm/PackageUserState.java
@@ -81,6 +81,7 @@
     public int installReason;
     public @PackageManager.UninstallReason int uninstallReason;
     public String harmfulAppWarning;
+    public String splashScreenTheme;
 
     public ArraySet<String> disabledComponents;
     public ArraySet<String> enabledComponents;
@@ -130,6 +131,7 @@
         if (o.componentLabelIconOverrideMap != null) {
             this.componentLabelIconOverrideMap = new ArrayMap<>(o.componentLabelIconOverrideMap);
         }
+        splashScreenTheme = o.splashScreenTheme;
     }
 
     @Nullable
@@ -242,6 +244,7 @@
         return componentLabelIconOverrideMap.get(componentName);
     }
 
+
     /**
      * Test if this package is installed.
      */
@@ -479,7 +482,11 @@
         }
         if (harmfulAppWarning == null && oldState.harmfulAppWarning != null
                 || (harmfulAppWarning != null
-                        && !harmfulAppWarning.equals(oldState.harmfulAppWarning))) {
+                && !harmfulAppWarning.equals(oldState.harmfulAppWarning))) {
+            return false;
+        }
+
+        if (!Objects.equals(splashScreenTheme, oldState.splashScreenTheme)) {
             return false;
         }
         return true;
@@ -505,6 +512,7 @@
         hashCode = 31 * hashCode + Objects.hashCode(disabledComponents);
         hashCode = 31 * hashCode + Objects.hashCode(enabledComponents);
         hashCode = 31 * hashCode + Objects.hashCode(harmfulAppWarning);
+        hashCode = 31 * hashCode + Objects.hashCode(splashScreenTheme);
         return hashCode;
     }
 
diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java
index f584ff3..2a36c11 100644
--- a/core/java/android/content/pm/ShortcutManager.java
+++ b/core/java/android/content/pm/ShortcutManager.java
@@ -145,14 +145,13 @@
      */
     @WorkerThread
     public boolean setDynamicShortcuts(@NonNull List<ShortcutInfo> shortcutInfoList) {
-        final AndroidFuture<Boolean> future = new AndroidFuture<>();
         try {
-            mService.setDynamicShortcuts(mContext.getPackageName(),
-                    new ParceledListSlice(shortcutInfoList), injectMyUserId(), future);
+            return ((boolean) getFutureOrThrow(mService.setDynamicShortcuts(
+                    mContext.getPackageName(), new ParceledListSlice(
+                            shortcutInfoList), injectMyUserId())));
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future);
     }
 
     /**
@@ -167,14 +166,12 @@
     @WorkerThread
     @NonNull
     public List<ShortcutInfo> getDynamicShortcuts() {
-        final AndroidFuture<ParceledListSlice<ShortcutInfo>> future = new AndroidFuture<>();
         try {
-            mService.getShortcuts(mContext.getPackageName(), FLAG_MATCH_DYNAMIC, injectMyUserId(),
-                    future);
+            return getFutureOrThrow(mService.getShortcuts(mContext.getPackageName(),
+                    FLAG_MATCH_DYNAMIC, injectMyUserId())).getList();
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future).getList();
     }
 
     /**
@@ -189,14 +186,12 @@
     @WorkerThread
     @NonNull
     public List<ShortcutInfo> getManifestShortcuts() {
-        final AndroidFuture<ParceledListSlice<ShortcutInfo>> future = new AndroidFuture<>();
         try {
-            mService.getShortcuts(mContext.getPackageName(), FLAG_MATCH_MANIFEST, injectMyUserId(),
-                    future);
+            return getFutureOrThrow(mService.getShortcuts(mContext.getPackageName(),
+                    FLAG_MATCH_MANIFEST, injectMyUserId())).getList();
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future).getList();
     }
 
     /**
@@ -220,13 +215,12 @@
     @WorkerThread
     @NonNull
     public List<ShortcutInfo> getShortcuts(@ShortcutMatchFlags int matchFlags) {
-        final AndroidFuture<ParceledListSlice<ShortcutInfo>> future = new AndroidFuture<>();
         try {
-            mService.getShortcuts(mContext.getPackageName(), matchFlags, injectMyUserId(), future);
+            return getFutureOrThrow(mService.getShortcuts(mContext.getPackageName(), matchFlags,
+                    injectMyUserId())).getList();
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future).getList();
     }
 
     /**
@@ -244,14 +238,13 @@
      */
     @WorkerThread
     public boolean addDynamicShortcuts(@NonNull List<ShortcutInfo> shortcutInfoList) {
-        final AndroidFuture<Boolean> future = new AndroidFuture<>();
         try {
-            mService.addDynamicShortcuts(mContext.getPackageName(),
-                    new ParceledListSlice(shortcutInfoList), injectMyUserId(), future);
+            return (boolean) getFutureOrThrow(mService.addDynamicShortcuts(
+                    mContext.getPackageName(), new ParceledListSlice(shortcutInfoList),
+                    injectMyUserId()));
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future);
     }
 
     /**
@@ -261,8 +254,8 @@
      */
     public void removeDynamicShortcuts(@NonNull List<String> shortcutIds) {
         try {
-            mService.removeDynamicShortcuts(mContext.getPackageName(), shortcutIds,
-                    injectMyUserId());
+            getFutureOrThrow(mService.removeDynamicShortcuts(mContext.getPackageName(), shortcutIds,
+                    injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -275,7 +268,8 @@
      */
     public void removeAllDynamicShortcuts() {
         try {
-            mService.removeAllDynamicShortcuts(mContext.getPackageName(), injectMyUserId());
+            getFutureOrThrow(mService.removeAllDynamicShortcuts(mContext.getPackageName(),
+                    injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -288,8 +282,8 @@
      */
     public void removeLongLivedShortcuts(@NonNull List<String> shortcutIds) {
         try {
-            mService.removeLongLivedShortcuts(mContext.getPackageName(), shortcutIds,
-                    injectMyUserId());
+            getFutureOrThrow(mService.removeLongLivedShortcuts(mContext.getPackageName(),
+                    shortcutIds, injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -307,14 +301,12 @@
     @WorkerThread
     @NonNull
     public List<ShortcutInfo> getPinnedShortcuts() {
-        final AndroidFuture<ParceledListSlice<ShortcutInfo>> future = new AndroidFuture<>();
         try {
-            mService.getShortcuts(mContext.getPackageName(), FLAG_MATCH_PINNED, injectMyUserId(),
-                    future);
+            return getFutureOrThrow(mService.getShortcuts(mContext.getPackageName(),
+                    FLAG_MATCH_PINNED, injectMyUserId())).getList();
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future).getList();
     }
 
     /**
@@ -331,14 +323,12 @@
      */
     @WorkerThread
     public boolean updateShortcuts(@NonNull List<ShortcutInfo> shortcutInfoList) {
-        final AndroidFuture<Boolean> future = new AndroidFuture<>();
         try {
-            mService.updateShortcuts(mContext.getPackageName(),
-                    new ParceledListSlice(shortcutInfoList), injectMyUserId(), future);
+            return (boolean) getFutureOrThrow(mService.updateShortcuts(mContext.getPackageName(),
+                    new ParceledListSlice(shortcutInfoList), injectMyUserId()));
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future);
     }
 
     /**
@@ -352,9 +342,9 @@
      */
     public void disableShortcuts(@NonNull List<String> shortcutIds) {
         try {
-            mService.disableShortcuts(mContext.getPackageName(), shortcutIds,
+            getFutureOrThrow(mService.disableShortcuts(mContext.getPackageName(), shortcutIds,
                     /* disabledMessage =*/ null, /* disabledMessageResId =*/ 0,
-                    injectMyUserId());
+                    injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -365,9 +355,9 @@
      */
     public void disableShortcuts(@NonNull List<String> shortcutIds, int disabledMessageResId) {
         try {
-            mService.disableShortcuts(mContext.getPackageName(), shortcutIds,
+            getFutureOrThrow(mService.disableShortcuts(mContext.getPackageName(), shortcutIds,
                     /* disabledMessage =*/ null, disabledMessageResId,
-                    injectMyUserId());
+                    injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -393,9 +383,9 @@
      */
     public void disableShortcuts(@NonNull List<String> shortcutIds, CharSequence disabledMessage) {
         try {
-            mService.disableShortcuts(mContext.getPackageName(), shortcutIds,
+            getFutureOrThrow(mService.disableShortcuts(mContext.getPackageName(), shortcutIds,
                     disabledMessage, /* disabledMessageResId =*/ 0,
-                    injectMyUserId());
+                    injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -411,7 +401,8 @@
      */
     public void enableShortcuts(@NonNull List<String> shortcutIds) {
         try {
-            mService.enableShortcuts(mContext.getPackageName(), shortcutIds, injectMyUserId());
+            getFutureOrThrow(mService.enableShortcuts(
+                    mContext.getPackageName(), shortcutIds, injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -532,8 +523,8 @@
      */
     public void reportShortcutUsed(String shortcutId) {
         try {
-            mService.reportShortcutUsed(mContext.getPackageName(), shortcutId,
-                    injectMyUserId());
+            getFutureOrThrow(mService.reportShortcutUsed(mContext.getPackageName(), shortcutId,
+                    injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -610,14 +601,12 @@
     @WorkerThread
     public boolean requestPinShortcut(@NonNull ShortcutInfo shortcut,
             @Nullable IntentSender resultIntent) {
-        final AndroidFuture<Boolean> future = new AndroidFuture<>();
         try {
-            mService.requestPinShortcut(mContext.getPackageName(), shortcut,
-                    resultIntent, injectMyUserId(), future);
+            return (boolean) getFutureOrThrow(mService.requestPinShortcut(mContext.getPackageName(),
+                    shortcut, resultIntent, injectMyUserId()));
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future);
     }
 
     /**
@@ -639,14 +628,12 @@
      */
     @WorkerThread
     public Intent createShortcutResultIntent(@NonNull ShortcutInfo shortcut) {
-        final AndroidFuture<Intent> future = new AndroidFuture<>();
         try {
-            mService.createShortcutResultIntent(mContext.getPackageName(), shortcut,
-                    injectMyUserId(), future);
+            return getFutureOrThrow(mService.createShortcutResultIntent(mContext.getPackageName(),
+                    shortcut, injectMyUserId()));
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future);
     }
 
     /**
@@ -659,7 +646,7 @@
      */
     public void onApplicationActive(@NonNull String packageName, @UserIdInt int userId) {
         try {
-            mService.onApplicationActive(packageName, userId);
+            getFutureOrThrow(mService.onApplicationActive(packageName, userId));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -684,13 +671,12 @@
     @SystemApi
     @RequiresPermission(Manifest.permission.MANAGE_APP_PREDICTIONS)
     public List<ShareShortcutInfo> getShareTargets(@NonNull IntentFilter filter) {
-        final AndroidFuture<ParceledListSlice> future = new AndroidFuture<>();
         try {
-            mService.getShareTargets(mContext.getPackageName(), filter, injectMyUserId(), future);
+            return getFutureOrThrow(mService.getShareTargets(mContext.getPackageName(), filter,
+                    injectMyUserId())).getList();
         } catch (RemoteException e) {
-            future.completeExceptionally(e);
+            throw e.rethrowFromSystemServer();
         }
-        return getFutureOrThrow(future).getList();
     }
 
     /**
@@ -797,7 +783,8 @@
      */
     public void pushDynamicShortcut(@NonNull ShortcutInfo shortcut) {
         try {
-            mService.pushDynamicShortcut(mContext.getPackageName(), shortcut, injectMyUserId());
+            getFutureOrThrow(mService.pushDynamicShortcut(
+                    mContext.getPackageName(), shortcut, injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -813,8 +800,8 @@
     public void updateShortcutVisibility(@NonNull final String packageName,
             @Nullable final byte[] certificate, final boolean visible) {
         try {
-            mService.updateShortcutVisibility(mContext.getPackageName(), packageName, certificate,
-                    visible, injectMyUserId());
+            getFutureOrThrow(mService.updateShortcutVisibility(mContext.getPackageName(),
+                    packageName, certificate, visible, injectMyUserId()));
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 0fc6b2b..e3aca97 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -183,6 +183,7 @@
     public static final String METADATA_SUPPORTS_SIZE_CHANGES = "android.supports_size_changes";
     public static final String METADATA_ACTIVITY_WINDOW_LAYOUT_AFFINITY =
             "android.activity_window_layout_affinity";
+    public static final String METADATA_ACTIVITY_LAUNCH_MODE = "android.activity.launch_mode";
 
     public static final int SDK_VERSION = Build.VERSION.SDK_INT;
     public static final String[] SDK_CODENAMES = Build.VERSION.ACTIVE_CODENAMES;
diff --git a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
index ff6aaad..aa740bd 100644
--- a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
+++ b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
@@ -24,7 +24,6 @@
 import android.app.ActivityTaskManager;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
-import android.content.pm.PackageParser;
 import android.content.pm.parsing.ParsingPackage;
 import android.content.pm.parsing.ParsingPackageUtils;
 import android.content.pm.parsing.ParsingUtils;
@@ -414,9 +413,9 @@
 
         if (!isAlias && activity.launchMode != LAUNCH_SINGLE_INSTANCE_PER_TASK
                 && activity.metaData != null && activity.metaData.containsKey(
-                PackageParser.METADATA_ACTIVITY_LAUNCH_MODE)) {
+                ParsingPackageUtils.METADATA_ACTIVITY_LAUNCH_MODE)) {
             final String launchMode = activity.metaData.getString(
-                    PackageParser.METADATA_ACTIVITY_LAUNCH_MODE);
+                    ParsingPackageUtils.METADATA_ACTIVITY_LAUNCH_MODE);
             if (launchMode != null && launchMode.equals("singleInstancePerTask")) {
                 activity.launchMode = LAUNCH_SINGLE_INSTANCE_PER_TASK;
             }
diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java
index 4c6255d..45b956b 100644
--- a/core/java/android/content/res/ColorStateList.java
+++ b/core/java/android/content/res/ColorStateList.java
@@ -115,11 +115,11 @@
  * </pre>
  * <p>
  * Starting with API 31, items may optionally define an {@link android.R.attr#lStar android:lStar}
- * attribute to modify the base color's perceptual luminance. This attribute takes a either
+ * attribute to modify the base color's perceptual luminance. This attribute takes either a
  * floating-point value between 0 and 100 or a theme attribute that resolves as such. The item's
  * overall color is calculated by converting the base color to an accessibility friendly color space
  * and setting its L* to the value specified on the {@code lStar} attribute. For
- * example, the following item represents the theme's accent color at 50% perpectual luminosity:
+ * example, the following item represents the theme's accent color at 50% perceptual luminance:
  * <pre>
  * &lt;item android:state_enabled="false"
  *         android:color="?android:attr/colorAccent"
diff --git a/core/java/android/hardware/ISensorPrivacyManager.aidl b/core/java/android/hardware/ISensorPrivacyManager.aidl
index dbcd79d..a71bb09 100644
--- a/core/java/android/hardware/ISensorPrivacyManager.aidl
+++ b/core/java/android/hardware/ISensorPrivacyManager.aidl
@@ -24,6 +24,8 @@
     // the ones in
     //   frameworks/native/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl
     // =============== Beginning of transactions used on native side as well ======================
+    boolean supportsSensorToggle(int sensor);
+
     void addSensorPrivacyListener(in ISensorPrivacyListener listener);
 
     void addIndividualSensorPrivacyListener(int userId, int sensor,
diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java
index 85e7d77..fc0204a 100644
--- a/core/java/android/hardware/SensorPrivacyManager.java
+++ b/core/java/android/hardware/SensorPrivacyManager.java
@@ -16,6 +16,7 @@
 
 package android.hardware;
 
+import android.Manifest;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
@@ -30,6 +31,8 @@
 import android.os.ServiceManager;
 import android.service.SensorPrivacyIndividualEnabledSensorProto;
 import android.util.ArrayMap;
+import android.util.Pair;
+import android.util.SparseArray;
 
 import com.android.internal.annotations.GuardedBy;
 
@@ -43,24 +46,11 @@
  * current state of sensor privacy as well as to register / unregister for notification when
  * the sensor privacy state changes.
  *
- * @hide
  */
-@SystemApi
-@TestApi
 @SystemService(Context.SENSOR_PRIVACY_SERVICE)
 public final class SensorPrivacyManager {
 
     /**
-     * @hide
-     */
-    public static final boolean USE_MICROPHONE_TOGGLE = true;
-
-    /**
-     * @hide
-     */
-    public static final boolean USE_CAMERA_TOGGLE = true;
-
-    /**
      * Unique Id of this manager to identify to the service
      * @hide
      */
@@ -80,25 +70,23 @@
     public static final String EXTRA_ALL_SENSORS = SensorPrivacyManager.class.getName()
             + ".extra.all_sensors";
 
+    private final SparseArray<Boolean> mToggleSupportCache = new SparseArray<>();
+
     /**
      * Individual sensors not listed in {@link Sensors}
-     * @hide
      */
-    @SystemApi
-    @TestApi
     public static class Sensors {
 
         private Sensors() {}
 
-        /** Microphone
-         * @hide */
-        @SystemApi
-        @TestApi
+        /**
+         * Constant for the microphone
+         */
         public static final int MICROPHONE = SensorPrivacyIndividualEnabledSensorProto.MICROPHONE;
-        /** Camera
-         * @hide */
-        @SystemApi
-        @TestApi
+
+        /**
+         * Constant for the camera
+         */
         public static final int CAMERA = SensorPrivacyIndividualEnabledSensorProto.CAMERA;
 
         /**
@@ -122,14 +110,14 @@
      * @hide
      */
     @SystemApi
-    @TestApi
     public interface OnSensorPrivacyChangedListener {
         /**
          * Callback invoked when the sensor privacy state changes.
          *
+         * @param sensor the sensor whose state is changing
          * @param enabled true if sensor privacy is enabled, false otherwise.
          */
-        void onSensorPrivacyChanged(boolean enabled);
+        void onSensorPrivacyChanged(int sensor, boolean enabled);
     }
 
     private static final Object sInstanceLock = new Object();
@@ -144,7 +132,11 @@
     private final ISensorPrivacyManager mService;
 
     @NonNull
-    private final ArrayMap<OnSensorPrivacyChangedListener, ISensorPrivacyListener> mListeners;
+    private final ArrayMap<OnAllSensorPrivacyChangedListener, ISensorPrivacyListener> mListeners;
+
+    @NonNull
+    private final ArrayMap<Pair<OnSensorPrivacyChangedListener, Integer>, ISensorPrivacyListener>
+            mIndividualListeners;
 
     /**
      * Private constructor to ensure only a single instance is created.
@@ -153,6 +145,7 @@
         mContext = context;
         mService = service;
         mListeners = new ArrayMap<>();
+        mIndividualListeners = new ArrayMap<>();
     }
 
     /**
@@ -176,16 +169,18 @@
     }
 
     /**
-     * Sets sensor privacy to the specified state.
-     *
-     * @param enable the state to which sensor privacy should be set.
-     *
-     * @hide
+     * Checks if the given toggle is supported on this device
+     * @param sensor The sensor to check
+     * @return whether the toggle for the sensor is supported on this device.
      */
-    @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
-    public void setSensorPrivacy(boolean enable) {
+    public boolean supportsSensorToggle(@Sensors.Sensor int sensor) {
         try {
-            mService.setSensorPrivacy(enable);
+            Boolean val = mToggleSupportCache.get(sensor);
+            if (val == null) {
+                val = mService.supportsSensorToggle(sensor);
+                mToggleSupportCache.put(sensor, val);
+            }
+            return val;
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -195,37 +190,6 @@
      * Registers a new listener to receive notification when the state of sensor privacy
      * changes.
      *
-     * @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor
-     *                 privacy changes.
-     *
-     * @hide
-     */
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
-    public void addSensorPrivacyListener(@NonNull final OnSensorPrivacyChangedListener listener) {
-        synchronized (mListeners) {
-            ISensorPrivacyListener iListener = mListeners.get(listener);
-            if (iListener == null) {
-                iListener = new ISensorPrivacyListener.Stub() {
-                    @Override
-                    public void onSensorPrivacyChanged(boolean enabled) {
-                        listener.onSensorPrivacyChanged(enabled);
-                    }
-                };
-                mListeners.put(listener, iListener);
-            }
-
-            try {
-                mService.addSensorPrivacyListener(iListener);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /**
-     * Registers a new listener to receive notification when the state of sensor privacy
-     * changes.
-     *
      * @param sensor the sensor to listen to changes to
      * @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor
      *                 privacy changes.
@@ -233,8 +197,7 @@
      * @hide
      */
     @SystemApi
-    @TestApi
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
     public void addSensorPrivacyListener(@Sensors.Sensor int sensor,
             @NonNull OnSensorPrivacyChangedListener listener) {
         addSensorPrivacyListener(sensor, mContext.getUserId(), mContext.getMainExecutor(),
@@ -252,7 +215,7 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
     public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @UserIdInt int userId,
             @NonNull OnSensorPrivacyChangedListener listener) {
         addSensorPrivacyListener(sensor, userId, mContext.getMainExecutor(), listener);
@@ -270,8 +233,7 @@
      * @hide
      */
     @SystemApi
-    @TestApi
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
     public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @NonNull Executor executor,
             @NonNull OnSensorPrivacyChangedListener listener) {
         addSensorPrivacyListener(sensor, mContext.getUserId(), executor, listener);
@@ -289,19 +251,19 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
     public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @UserIdInt int userId,
             @NonNull Executor executor, @NonNull OnSensorPrivacyChangedListener listener) {
-        synchronized (mListeners) {
-            ISensorPrivacyListener iListener = mListeners.get(listener);
+        synchronized (mIndividualListeners) {
+            ISensorPrivacyListener iListener = mIndividualListeners.get(listener);
             if (iListener == null) {
                 iListener = new ISensorPrivacyListener.Stub() {
                     @Override
                     public void onSensorPrivacyChanged(boolean enabled) {
-                        executor.execute(() -> listener.onSensorPrivacyChanged(enabled));
+                        executor.execute(() -> listener.onSensorPrivacyChanged(sensor, enabled));
                     }
                 };
-                mListeners.put(listener, iListener);
+                mIndividualListeners.put(new Pair<>(listener, sensor), iListener);
             }
 
             try {
@@ -314,7 +276,7 @@
     }
 
     /**
-     * Unregisters the specified listener from receiving notifications when the state of sensor
+     * Unregisters the specified listener from receiving notifications when the state of any sensor
      * privacy changes.
      *
      * @param listener the OnSensorPrivacyChangedListener to be unregistered from notifications when
@@ -323,39 +285,24 @@
      * @hide
      */
     @SystemApi
-    @TestApi
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
     public void removeSensorPrivacyListener(@NonNull OnSensorPrivacyChangedListener listener) {
         synchronized (mListeners) {
-            ISensorPrivacyListener iListener = mListeners.get(listener);
-            if (iListener != null) {
-                mListeners.remove(iListener);
-                try {
-                    mService.removeSensorPrivacyListener(iListener);
-                } catch (RemoteException e) {
-                    throw e.rethrowFromSystemServer();
+            for (int i = 0; i < mIndividualListeners.size(); i++) {
+                Pair<OnSensorPrivacyChangedListener, Integer> pair = mIndividualListeners.keyAt(i);
+                if (pair.first.equals(listener)) {
+                    try {
+                        mService.removeSensorPrivacyListener(mIndividualListeners.valueAt(i));
+                    } catch (RemoteException e) {
+                        throw e.rethrowFromSystemServer();
+                    }
+                    mIndividualListeners.removeAt(i--);
                 }
             }
         }
     }
 
     /**
-     * Returns whether sensor privacy is currently enabled.
-     *
-     * @return true if sensor privacy is currently enabled, false otherwise.
-     *
-     * @hide
-     */
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
-    public boolean isSensorPrivacyEnabled() {
-        try {
-            return mService.isSensorPrivacyEnabled();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
      * Returns whether sensor privacy is currently enabled for a specific sensor.
      *
      * @return true if sensor privacy is currently enabled, false otherwise.
@@ -363,8 +310,7 @@
      * @hide
      */
     @SystemApi
-    @TestApi
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
     public boolean isSensorPrivacyEnabled(@Sensors.Sensor int sensor) {
         return isSensorPrivacyEnabled(sensor, mContext.getUserId());
     }
@@ -376,7 +322,7 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
     public boolean isSensorPrivacyEnabled(@Sensors.Sensor int sensor, @UserIdInt int userId) {
         try {
             return mService.isIndividualSensorPrivacyEnabled(userId, sensor);
@@ -394,7 +340,7 @@
      * @hide
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
     public void setSensorPrivacy(@Sensors.Sensor int sensor, boolean enable) {
         setSensorPrivacy(sensor, enable, mContext.getUserId());
     }
@@ -408,7 +354,7 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
     public void setSensorPrivacy(@Sensors.Sensor int sensor, boolean enable,
             @UserIdInt int userId) {
         try {
@@ -428,7 +374,7 @@
      * @hide
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
     public void setSensorPrivacyForProfileGroup(@Sensors.Sensor int sensor,
             boolean enable) {
         setSensorPrivacyForProfileGroup(sensor, enable, mContext.getUserId());
@@ -444,7 +390,7 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
     public void setSensorPrivacyForProfileGroup(@Sensors.Sensor int sensor,
             boolean enable, @UserIdInt int userId) {
         try {
@@ -463,7 +409,7 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
     public void suppressSensorPrivacyReminders(@NonNull String packageName,
             boolean suppress) {
         suppressSensorPrivacyReminders(packageName, suppress, mContext.getUserId());
@@ -478,7 +424,7 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
+    @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
     public void suppressSensorPrivacyReminders(@NonNull String packageName,
             boolean suppress, @UserIdInt int userId) {
         try {
@@ -488,4 +434,109 @@
             throw e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * A class implementing this interface can register with the {@link
+     * android.hardware.SensorPrivacyManager} to receive notification when the all-sensor privacy
+     * state changes.
+     *
+     * @hide
+     */
+    public interface OnAllSensorPrivacyChangedListener {
+        /**
+         * Callback invoked when the sensor privacy state changes.
+         *
+         * @param enabled true if sensor privacy is enabled, false otherwise.
+         */
+        void onAllSensorPrivacyChanged(boolean enabled);
+    }
+
+    /**
+     * Sets all-sensor privacy to the specified state.
+     *
+     * @param enable the state to which sensor privacy should be set.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
+    public void setAllSensorPrivacy(boolean enable) {
+        try {
+            mService.setSensorPrivacy(enable);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Registers a new listener to receive notification when the state of all-sensor privacy
+     * changes.
+     *
+     * @param listener the OnSensorPrivacyChangedListener to be notified when the state of
+     *                 all-sensor privacy changes.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    public void addAllSensorPrivacyListener(
+            @NonNull final OnAllSensorPrivacyChangedListener listener) {
+        synchronized (mListeners) {
+            ISensorPrivacyListener iListener = mListeners.get(listener);
+            if (iListener == null) {
+                iListener = new ISensorPrivacyListener.Stub() {
+                    @Override
+                    public void onSensorPrivacyChanged(boolean enabled) {
+                        listener.onAllSensorPrivacyChanged(enabled);
+                    }
+                };
+                mListeners.put(listener, iListener);
+            }
+
+            try {
+                mService.addSensorPrivacyListener(iListener);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        }
+    }
+
+    /**
+     * Unregisters the specified listener from receiving notifications when the state of all-sensor
+     * privacy changes.
+     *
+     * @param listener the OnAllSensorPrivacyChangedListener to be unregistered from notifications
+     *                 when all-sensor privacy changes.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    public void removeAllSensorPrivacyListener(
+            @NonNull OnAllSensorPrivacyChangedListener listener) {
+        synchronized (mListeners) {
+            ISensorPrivacyListener iListener = mListeners.get(listener);
+            if (iListener != null) {
+                mListeners.remove(iListener);
+                try {
+                    mService.removeSensorPrivacyListener(iListener);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns whether all-sensor privacy is currently enabled.
+     *
+     * @return true if all-sensor privacy is currently enabled, false otherwise.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.OBSERVE_SENSOR_PRIVACY)
+    public boolean isAllSensorPrivacyEnabled() {
+        try {
+            return mService.isSensorPrivacyEnabled();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/hardware/biometrics/BiometricFaceConstants.java b/core/java/android/hardware/biometrics/BiometricFaceConstants.java
index 4385b1da..83e273a 100644
--- a/core/java/android/hardware/biometrics/BiometricFaceConstants.java
+++ b/core/java/android/hardware/biometrics/BiometricFaceConstants.java
@@ -16,10 +16,14 @@
 
 package android.hardware.biometrics;
 
+import android.annotation.IntDef;
 import android.app.KeyguardManager;
 import android.hardware.biometrics.BiometricManager.Authenticators;
 import android.hardware.face.FaceManager;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 /**
  * Interface containing all of the face-specific constants.
  *
@@ -48,6 +52,31 @@
     // Error messages from face authentication hardware during initialization, enrollment,
     // authentication or removal. Must agree with the list in HAL h file
     //
+
+    /**
+     * @hide
+     */
+    @IntDef({FACE_ERROR_HW_UNAVAILABLE,
+            FACE_ERROR_UNABLE_TO_PROCESS,
+            FACE_ERROR_TIMEOUT,
+            FACE_ERROR_NO_SPACE,
+            FACE_ERROR_CANCELED,
+            FACE_ERROR_UNABLE_TO_REMOVE,
+            FACE_ERROR_LOCKOUT,
+            FACE_ERROR_VENDOR,
+            FACE_ERROR_LOCKOUT_PERMANENT,
+            FACE_ERROR_USER_CANCELED,
+            FACE_ERROR_NOT_ENROLLED,
+            FACE_ERROR_HW_NOT_PRESENT,
+            FACE_ERROR_NEGATIVE_BUTTON,
+            BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL,
+            BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED,
+            BIOMETRIC_ERROR_RE_ENROLL,
+            FACE_ERROR_UNKNOWN
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @interface FaceError {}
+
     /**
      * The hardware is unavailable. Try again later.
      */
@@ -159,6 +188,12 @@
     int BIOMETRIC_ERROR_RE_ENROLL = 16;
 
     /**
+     * Unknown error received from the HAL.
+     * @hide
+     */
+    int FACE_ERROR_UNKNOWN = 17;
+
+    /**
      * @hide
      */
     int FACE_ERROR_VENDOR_BASE = 1000;
@@ -169,6 +204,36 @@
     //
 
     /**
+     * @hide
+     */
+    @IntDef({FACE_ACQUIRED_GOOD,
+            FACE_ACQUIRED_INSUFFICIENT,
+            FACE_ACQUIRED_TOO_BRIGHT,
+            FACE_ACQUIRED_TOO_DARK,
+            FACE_ACQUIRED_TOO_CLOSE,
+            FACE_ACQUIRED_TOO_FAR,
+            FACE_ACQUIRED_TOO_HIGH,
+            FACE_ACQUIRED_TOO_LOW,
+            FACE_ACQUIRED_TOO_RIGHT,
+            FACE_ACQUIRED_TOO_LEFT,
+            FACE_ACQUIRED_POOR_GAZE,
+            FACE_ACQUIRED_NOT_DETECTED,
+            FACE_ACQUIRED_TOO_MUCH_MOTION,
+            FACE_ACQUIRED_RECALIBRATE,
+            FACE_ACQUIRED_TOO_DIFFERENT,
+            FACE_ACQUIRED_TOO_SIMILAR,
+            FACE_ACQUIRED_PAN_TOO_EXTREME,
+            FACE_ACQUIRED_TILT_TOO_EXTREME,
+            FACE_ACQUIRED_ROLL_TOO_EXTREME,
+            FACE_ACQUIRED_FACE_OBSCURED,
+            FACE_ACQUIRED_START,
+            FACE_ACQUIRED_SENSOR_DIRTY,
+            FACE_ACQUIRED_VENDOR,
+            FACE_ACQUIRED_UNKNOWN})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface FaceAcquired {}
+
+    /**
      * The image acquired was good.
      */
     int FACE_ACQUIRED_GOOD = 0;
@@ -343,6 +408,12 @@
     int FACE_ACQUIRED_VENDOR = 22;
 
     /**
+     * Unknown acquired code received from the HAL.
+     * @hide
+     */
+    int FACE_ACQUIRED_UNKNOWN = 23;
+
+    /**
      * @hide
      */
     int FACE_ACQUIRED_VENDOR_BASE = 1000;
diff --git a/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java b/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java
index 30e24d2e..79f716c 100644
--- a/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java
+++ b/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java
@@ -57,7 +57,10 @@
             FINGERPRINT_ERROR_HW_NOT_PRESENT,
             FINGERPRINT_ERROR_NEGATIVE_BUTTON,
             BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL,
-            BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED})
+            BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED,
+            BIOMETRIC_ERROR_RE_ENROLL,
+            BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED,
+            FINGERPRINT_ERROR_UNKNOWN})
     @Retention(RetentionPolicy.SOURCE)
     @interface FingerprintError {}
 
@@ -163,7 +166,7 @@
      * sensor's strength can currently only meet {@link Authenticators#BIOMETRIC_WEAK}.
      * @hide
      */
-    public static final int BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED = 15;
+    int BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED = 15;
 
     /**
      * Authentication cannot proceed because re-enrollment is required.
@@ -172,6 +175,12 @@
     int BIOMETRIC_ERROR_RE_ENROLL = 16;
 
     /**
+     * Unknown error received from the HAL.
+     * @hide
+     */
+    int FINGERPRINT_ERROR_UNKNOWN = 17;
+
+    /**
      * @hide
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@@ -191,7 +200,8 @@
             FINGERPRINT_ACQUIRED_TOO_SLOW,
             FINGERPRINT_ACQUIRED_TOO_FAST,
             FINGERPRINT_ACQUIRED_VENDOR,
-            FINGERPRINT_ACQUIRED_START})
+            FINGERPRINT_ACQUIRED_START,
+            FINGERPRINT_ACQUIRED_UNKNOWN})
     @Retention(RetentionPolicy.SOURCE)
     @interface FingerprintAcquired {}
 
@@ -255,6 +265,12 @@
     int FINGERPRINT_ACQUIRED_START = 7;
 
     /**
+     * Unknown acquired code received from the HAL.
+     * @hide
+     */
+    int FINGERPRINT_ACQUIRED_UNKNOWN = 8;
+
+    /**
      * @hide
      */
     int FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000;
diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java
index 304b2af..f3a8342 100644
--- a/core/java/android/hardware/biometrics/BiometricManager.java
+++ b/core/java/android/hardware/biometrics/BiometricManager.java
@@ -21,6 +21,8 @@
 import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
 import static android.Manifest.permission.WRITE_DEVICE_CONFIG;
 
+import static com.android.internal.util.FrameworkStatsLog.AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_BIOMETRIC_MANAGER_CAN_AUTHENTICATE;
+
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -31,9 +33,13 @@
 import android.content.Context;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.os.UserHandle;
+import android.security.keystore.KeyGenParameterSpec;
 import android.security.keystore.KeyProperties;
 import android.util.Slog;
 
+import com.android.internal.util.FrameworkStatsLog;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -188,6 +194,140 @@
         int DEVICE_CREDENTIAL = 1 << 15;
     }
 
+    /**
+     * Provides localized strings for an application that uses {@link BiometricPrompt} to
+     * authenticate the user.
+     */
+    public static class Strings {
+        @NonNull private final Context mContext;
+        @NonNull private final IAuthService mService;
+        @Authenticators.Types int mAuthenticators;
+
+        @Nullable CharSequence mButtonLabel;
+        @Nullable CharSequence mPromptMessage;
+        @Nullable CharSequence mSettingName;
+
+        private Strings(@NonNull Context context, @NonNull IAuthService service,
+                @Authenticators.Types int authenticators) {
+            mContext = context;
+            mService = service;
+            mAuthenticators = authenticators;
+        }
+
+        /**
+         * Provides a localized string that can be used as the label for a button that invokes
+         * {@link BiometricPrompt}.
+         *
+         * <p>When possible, this method should use the given authenticator requirements to more
+         * precisely specify the authentication type that will be used. For example, if
+         * <strong>Class 3</strong> biometric authentication is requested on a device with a
+         * <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor,
+         * the returned string should indicate that fingerprint authentication will be used.
+         *
+         * <p>This method should also try to specify which authentication method(s) will be used in
+         * practice when multiple authenticators meet the given requirements. For example, if
+         * biometric authentication is requested on a device with both face and fingerprint sensors
+         * but the user has selected face as their preferred method, the returned string should
+         * indicate that face authentication will be used.
+         *
+         * <p>This method may return {@code null} if none of the requested authenticator types are
+         * available, but this should <em>not</em> be relied upon for checking the status of
+         * authenticators. Instead, use {@link #canAuthenticate(int)}.
+         *
+         * @return The label for a button that invokes {@link BiometricPrompt} for authentication.
+         */
+        @RequiresPermission(USE_BIOMETRIC)
+        @Nullable
+        public CharSequence getButtonLabel() {
+            if (mButtonLabel == null) {
+                final int userId = mContext.getUserId();
+                final String opPackageName = mContext.getOpPackageName();
+                try {
+                    mButtonLabel = mService.getButtonLabel(userId, opPackageName, mAuthenticators);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
+            }
+            return mButtonLabel;
+        }
+
+        /**
+         * Provides a localized string that can be shown while the user is authenticating with
+         * {@link BiometricPrompt}.
+         *
+         * <p>When possible, this method should use the given authenticator requirements to more
+         * precisely specify the authentication type that will be used. For example, if
+         * <strong>Class 3</strong> biometric authentication is requested on a device with a
+         * <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor,
+         * the returned string should indicate that fingerprint authentication will be used.
+         *
+         * <p>This method should also try to specify which authentication method(s) will be used in
+         * practice when multiple authenticators meet the given requirements. For example, if
+         * biometric authentication is requested on a device with both face and fingerprint sensors
+         * but the user has selected face as their preferred method, the returned string should
+         * indicate that face authentication will be used.
+         *
+         * <p>This method may return {@code null} if none of the requested authenticator types are
+         * available, but this should <em>not</em> be relied upon for checking the status of
+         * authenticators. Instead, use {@link #canAuthenticate(int)}.
+         *
+         * @return The label for a button that invokes {@link BiometricPrompt} for authentication.
+         */
+        @RequiresPermission(USE_BIOMETRIC)
+        @Nullable
+        public CharSequence getPromptMessage() {
+            if (mPromptMessage == null) {
+                final int userId = mContext.getUserId();
+                final String opPackageName = mContext.getOpPackageName();
+                try {
+                    return mService.getPromptMessage(userId, opPackageName, mAuthenticators);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
+            }
+            return mPromptMessage;
+        }
+
+        /**
+         * Provides a localized string that can be shown as the title for an app setting that
+         * enables authentication with {@link BiometricPrompt}.
+         *
+         * <p>When possible, this method should use the given authenticator requirements to more
+         * precisely specify the authentication type that will be used. For example, if
+         * <strong>Class 3</strong> biometric authentication is requested on a device with a
+         * <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor,
+         * the returned string should indicate that fingerprint authentication will be used.
+         *
+         * <p>This method should <em>not</em> try to specify which authentication method(s) will be
+         * used in practice when multiple authenticators meet the given requirements. For example,
+         * if biometric authentication is requested on a device with both face and fingerprint
+         * sensors, the returned string should indicate that either face or fingerprint
+         * authentication may be used, regardless of whether the user has enrolled or selected
+         * either as their preferred method.
+         *
+         * <p>This method may return {@code null} if none of the requested authenticator types are
+         * supported by the system, but this should <em>not</em> be relied upon for checking the
+         * status of authenticators. Instead, use {@link #canAuthenticate(int)} or
+         * {@link android.content.pm.PackageManager#hasSystemFeature(String)}.
+         *
+         * @return The label for a button that invokes {@link BiometricPrompt} for authentication.
+         */
+        @RequiresPermission(USE_BIOMETRIC)
+        @Nullable
+        public CharSequence getSettingName() {
+            if (mSettingName == null) {
+                final int userId = mContext.getUserId();
+                final String opPackageName = mContext.getOpPackageName();
+                try {
+                    return mService.getSettingName(userId, opPackageName, mAuthenticators);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
+            }
+            return mSettingName;
+        }
+    }
+
     @NonNull private final Context mContext;
     @NonNull private final IAuthService mService;
 
@@ -271,7 +411,17 @@
     @RequiresPermission(USE_BIOMETRIC)
     @BiometricError
     public int canAuthenticate() {
-        return canAuthenticate(Authenticators.BIOMETRIC_WEAK);
+        @BiometricError final int result = canAuthenticate(mContext.getUserId(),
+                Authenticators.BIOMETRIC_WEAK);
+
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_MANAGER_CAN_AUTHENTICATE_INVOKED,
+                false /* isAllowedAuthenticatorsSet */, Authenticators.EMPTY_SET, result);
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_DEPRECATED_API_USED,
+                AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_BIOMETRIC_MANAGER_CAN_AUTHENTICATE,
+                mContext.getApplicationInfo().uid,
+                mContext.getApplicationInfo().targetSdkVersion);
+
+        return result;
     }
 
     /**
@@ -302,7 +452,12 @@
     @RequiresPermission(USE_BIOMETRIC)
     @BiometricError
     public int canAuthenticate(@Authenticators.Types int authenticators) {
-        return canAuthenticate(mContext.getUserId(), authenticators);
+        @BiometricError final int result = canAuthenticate(mContext.getUserId(), authenticators);
+
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_MANAGER_CAN_AUTHENTICATE_INVOKED,
+                true /* isAllowedAuthenticatorsSet */, authenticators, result);
+
+        return result;
     }
 
     /**
@@ -310,9 +465,7 @@
      */
     @RequiresPermission(USE_BIOMETRIC_INTERNAL)
     @BiometricError
-    public int canAuthenticate(
-            int userId, @Authenticators.Types int authenticators) {
-
+    public int canAuthenticate(int userId, @Authenticators.Types int authenticators) {
         if (mService != null) {
             try {
                 final String opPackageName = mContext.getOpPackageName();
@@ -327,6 +480,20 @@
     }
 
     /**
+     * Produces an instance of the {@link Strings} class, which provides localized strings for an
+     * application, given a set of allowed authenticator types.
+     *
+     * @param authenticators A bit field representing the types of {@link Authenticators} that may
+     *                       be used for authentication.
+     * @return A {@link Strings} collection for the given allowed authenticator types.
+     */
+    @RequiresPermission(USE_BIOMETRIC)
+    @NonNull
+    public Strings getStrings(@Authenticators.Types int authenticators) {
+        return new Strings(mContext, mService, authenticators);
+    }
+
+    /**
      * @hide
      * @param userId
      * @return
@@ -391,9 +558,22 @@
      * @hide
      */
     public long[] getAuthenticatorIds() {
+        return getAuthenticatorIds(UserHandle.myUserId());
+    }
+
+    /**
+     * Get a list of AuthenticatorIDs for biometric authenticators which have 1) enrolled templates,
+     * and 2) meet the requirements for integrating with Keystore. The AuthenticatorIDs are known
+     * in Keystore land as SIDs, and are used during key generation.
+     *
+     * @param userId Android user ID for user to look up.
+     *
+     * @hide
+     */
+    public long[] getAuthenticatorIds(int userId) {
         if (mService != null) {
             try {
-                return mService.getAuthenticatorIds();
+                return mService.getAuthenticatorIds(userId);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -432,116 +612,5 @@
             }
         }
     }
-
-    /**
-     * Provides a localized string that may be used as the label for a button that invokes
-     * {@link BiometricPrompt}.
-     *
-     * <p>When possible, this method should use the given authenticator requirements to more
-     * precisely specify the authentication type that will be used. For example, if
-     * <strong>Class 3</strong> biometric authentication is requested on a device with a
-     * <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor, the
-     * returned string should indicate that fingerprint authentication will be used.
-     *
-     * <p>This method should also try to specify which authentication method(s) will be used in
-     * practice when multiple authenticators meet the given requirements. For example, if biometric
-     * authentication is requested on a device with both face and fingerprint sensors but the user
-     * has selected face as their preferred method, the returned string should indicate that face
-     * authentication will be used.
-     *
-     * @param authenticators A bit field representing the types of {@link Authenticators} that may
-     *                       be used for authentication.
-     * @return The label for a button that invokes {@link BiometricPrompt} for authentication.
-     */
-    @RequiresPermission(USE_BIOMETRIC)
-    @Nullable
-    public CharSequence getButtonLabel(@Authenticators.Types int authenticators) {
-        if (mService != null) {
-            final int userId = mContext.getUserId();
-            final String opPackageName = mContext.getOpPackageName();
-            try {
-                return mService.getButtonLabel(userId, opPackageName, authenticators);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        } else {
-            Slog.w(TAG, "getButtonLabel(): Service not connected");
-            return null;
-        }
-    }
-
-    /**
-     * Provides a localized string that may be shown while the user is authenticating with
-     * {@link BiometricPrompt}.
-     *
-     * <p>When possible, this method should use the given authenticator requirements to more
-     * precisely specify the authentication type that will be used. For example, if
-     * <strong>Class 3</strong> biometric authentication is requested on a device with a
-     * <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor, the
-     * returned string should indicate that fingerprint authentication will be used.
-     *
-     * <p>This method should also try to specify which authentication method(s) will be used in
-     * practice when multiple authenticators meet the given requirements. For example, if biometric
-     * authentication is requested on a device with both face and fingerprint sensors but the user
-     * has selected face as their preferred method, the returned string should indicate that face
-     * authentication will be used.
-     *
-     * @param authenticators A bit field representing the types of {@link Authenticators} that may
-     *                       be used for authentication.
-     * @return The label for a button that invokes {@link BiometricPrompt} for authentication.
-     */
-    @RequiresPermission(USE_BIOMETRIC)
-    @Nullable
-    public CharSequence getPromptMessage(@Authenticators.Types int authenticators) {
-        if (mService != null) {
-            final int userId = mContext.getUserId();
-            final String opPackageName = mContext.getOpPackageName();
-            try {
-                return mService.getPromptMessage(userId, opPackageName, authenticators);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        } else {
-            Slog.w(TAG, "getPromptMessage(): Service not connected");
-            return null;
-        }
-    }
-
-    /**
-     * Provides a localized string that may be shown as the title for an app setting that enables
-     * biometric authentication.
-     *
-     * <p>When possible, this method should use the given authenticator requirements to more
-     * precisely specify the authentication type that will be used. For example, if
-     * <strong>Class 3</strong> biometric authentication is requested on a device with a
-     * <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor, the
-     * returned string should indicate that fingerprint authentication will be used.
-     *
-     * <p>This method should <em>not</em> try to specify which authentication method(s) will be used
-     * in practice when multiple authenticators meet the given requirements. For example, if
-     * biometric authentication is requested on a device with both face and fingerprint sensors, the
-     * returned string should indicate that either face or fingerprint authentication may be used,
-     * regardless of whether the user has enrolled or selected either as their preferred method.
-     *
-     * @param authenticators A bit field representing the types of {@link Authenticators} that may
-     *                       be used for authentication.
-     * @return The label for a button that invokes {@link BiometricPrompt} for authentication.
-     */
-    @RequiresPermission(USE_BIOMETRIC)
-    @Nullable
-    public CharSequence getSettingName(@Authenticators.Types int authenticators) {
-        if (mService != null) {
-            final int userId = mContext.getUserId();
-            final String opPackageName = mContext.getOpPackageName();
-            try {
-                return mService.getSettingName(userId, opPackageName, authenticators);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        } else {
-            Slog.w(TAG, "getSettingName(): Service not connected");
-            return null;
-        }
-    }
 }
 
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index 2e51dc4..3f3db29 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -43,6 +43,7 @@
 import android.util.Log;
 
 import com.android.internal.R;
+import com.android.internal.util.FrameworkStatsLog;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -422,7 +423,7 @@
             final boolean deviceCredentialAllowed = mPromptInfo.isDeviceCredentialAllowed();
             final @Authenticators.Types int authenticators = mPromptInfo.getAuthenticators();
             final boolean willShowDeviceCredentialButton = deviceCredentialAllowed
-                    || (authenticators & Authenticators.DEVICE_CREDENTIAL) != 0;
+                    || isCredentialAllowed(authenticators);
 
             if (TextUtils.isEmpty(title) && !useDefaultTitle) {
                 throw new IllegalArgumentException("Title must be set and non-empty");
@@ -916,6 +917,14 @@
             @NonNull CancellationSignal cancel,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull AuthenticationCallback callback) {
+
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_PROMPT_AUTHENTICATE_INVOKED,
+                true /* isCrypto */,
+                mPromptInfo.isConfirmationRequested(),
+                mPromptInfo.isDeviceCredentialAllowed(),
+                mPromptInfo.getAuthenticators() != Authenticators.EMPTY_SET,
+                mPromptInfo.getAuthenticators());
+
         if (crypto == null) {
             throw new IllegalArgumentException("Must supply a crypto object");
         }
@@ -973,6 +982,14 @@
     public void authenticate(@NonNull CancellationSignal cancel,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull AuthenticationCallback callback) {
+
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_PROMPT_AUTHENTICATE_INVOKED,
+                false /* isCrypto */,
+                mPromptInfo.isConfirmationRequested(),
+                mPromptInfo.isDeviceCredentialAllowed(),
+                mPromptInfo.getAuthenticators() != Authenticators.EMPTY_SET,
+                mPromptInfo.getAuthenticators());
+
         if (cancel == null) {
             throw new IllegalArgumentException("Must supply a cancellation signal");
         }
@@ -1058,4 +1075,8 @@
                     mContext.getString(R.string.biometric_error_hw_unavailable)));
         }
     }
+
+    private static boolean isCredentialAllowed(@Authenticators.Types int allowedAuthenticators) {
+        return (allowedAuthenticators & Authenticators.DEVICE_CREDENTIAL) != 0;
+    }
 }
diff --git a/core/java/android/hardware/biometrics/IAuthService.aidl b/core/java/android/hardware/biometrics/IAuthService.aidl
index 86df099..4c2a9ae 100644
--- a/core/java/android/hardware/biometrics/IAuthService.aidl
+++ b/core/java/android/hardware/biometrics/IAuthService.aidl
@@ -67,7 +67,9 @@
     // Get a list of AuthenticatorIDs for authenticators which have enrolled templates and meet
     // the requirements for integrating with Keystore. The AuthenticatorID are known in Keystore
     // land as SIDs, and are used during key generation.
-    long[] getAuthenticatorIds();
+    // If userId is not equal to the calling user ID, the caller must have the
+    // USE_BIOMETRIC_INTERNAL permission.
+    long[] getAuthenticatorIds(in int userId);
 
     // See documentation in BiometricManager.
     void resetLockoutTimeBound(IBinder token, String opPackageName, int fromSensorId, int userId,
diff --git a/core/java/android/hardware/biometrics/SensorPropertiesInternal.java b/core/java/android/hardware/biometrics/SensorPropertiesInternal.java
index 17b2abf..f365ee6 100644
--- a/core/java/android/hardware/biometrics/SensorPropertiesInternal.java
+++ b/core/java/android/hardware/biometrics/SensorPropertiesInternal.java
@@ -44,7 +44,7 @@
                 prop.resetLockoutRequiresHardwareAuthToken, prop.resetLockoutRequiresChallenge);
     }
 
-    protected SensorPropertiesInternal(int sensorId, @SensorProperties.Strength int sensorStrength,
+    public SensorPropertiesInternal(int sensorId, @SensorProperties.Strength int sensorStrength,
             int maxEnrollmentsPerUser, @NonNull List<ComponentInfoInternal> componentInfo,
             boolean resetLockoutRequiresHardwareAuthToken, boolean resetLockoutRequiresChallenge) {
         this.sensorId = sensorId;
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 6654c2c..0a12470 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -2513,7 +2513,7 @@
      * android.scaler.availableInputOutputFormatsMap.</p>
      * <p>The following table describes the minimum required output stream
      * configurations based on the hardware level
-     * ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel}):</p>
+     * ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel}), prior to Android 12:</p>
      * <table>
      * <thead>
      * <tr>
@@ -2574,6 +2574,76 @@
      * </tr>
      * </tbody>
      * </table>
+     * <p>Starting from Android 12, the camera device may not support JPEG sizes smaller than the
+     * minimum of 1080p and the camera sensor active array size. The requirements for
+     * IMPLEMENTATION_DEFINED and YUV_420_888 stay the same. This new minimum required output
+     * stream configurations are illustrated by the table below:</p>
+     * <table>
+     * <thead>
+     * <tr>
+     * <th align="center">Format</th>
+     * <th align="center">Size</th>
+     * <th align="center">Hardware Level</th>
+     * <th align="center">Notes</th>
+     * </tr>
+     * </thead>
+     * <tbody>
+     * <tr>
+     * <td align="center">JPEG</td>
+     * <td align="center">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td>
+     * <td align="center">Any</td>
+     * <td align="center"></td>
+     * </tr>
+     * <tr>
+     * <td align="center">JPEG</td>
+     * <td align="center">1920x1080 (1080p)</td>
+     * <td align="center">Any</td>
+     * <td align="center">if 1080p &lt;= activeArraySize</td>
+     * </tr>
+     * <tr>
+     * <td align="center">YUV_420_888</td>
+     * <td align="center">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td>
+     * <td align="center">FULL</td>
+     * <td align="center"></td>
+     * </tr>
+     * <tr>
+     * <td align="center">YUV_420_888</td>
+     * <td align="center">1920x1080 (1080p)</td>
+     * <td align="center">FULL</td>
+     * <td align="center">if 1080p &lt;= activeArraySize</td>
+     * </tr>
+     * <tr>
+     * <td align="center">YUV_420_888</td>
+     * <td align="center">1280x720 (720)</td>
+     * <td align="center">FULL</td>
+     * <td align="center">if 720p &lt;= activeArraySize</td>
+     * </tr>
+     * <tr>
+     * <td align="center">YUV_420_888</td>
+     * <td align="center">640x480 (480p)</td>
+     * <td align="center">FULL</td>
+     * <td align="center">if 480p &lt;= activeArraySize</td>
+     * </tr>
+     * <tr>
+     * <td align="center">YUV_420_888</td>
+     * <td align="center">320x240 (240p)</td>
+     * <td align="center">FULL</td>
+     * <td align="center">if 240p &lt;= activeArraySize</td>
+     * </tr>
+     * <tr>
+     * <td align="center">YUV_420_888</td>
+     * <td align="center">all output sizes available for FULL hardware level, up to the maximum video size</td>
+     * <td align="center">LIMITED</td>
+     * <td align="center"></td>
+     * </tr>
+     * <tr>
+     * <td align="center">IMPLEMENTATION_DEFINED</td>
+     * <td align="center">same as YUV_420_888</td>
+     * <td align="center">Any</td>
+     * <td align="center"></td>
+     * </tr>
+     * </tbody>
+     * </table>
      * <p>Refer to {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES android.request.availableCapabilities} for additional
      * mandatory stream configurations on a per-capability basis.</p>
      * <p>Exception on 176x144 (QCIF) resolution: camera devices usually have a fixed capability for
@@ -3166,6 +3236,33 @@
             new Key<android.hardware.camera2.params.MandatoryStreamCombination[]>("android.scaler.mandatoryMaximumResolutionStreamCombinations", android.hardware.camera2.params.MandatoryStreamCombination[].class);
 
     /**
+     * <p>Whether the camera device supports multi-resolution input or output streams</p>
+     * <p>A logical multi-camera or an ultra high resolution camera may support multi-resolution
+     * input or output streams. With multi-resolution output streams, the camera device is able
+     * to output different resolution images depending on the current active physical camera or
+     * pixel mode. With multi-resolution input streams, the camera device can reprocess images
+     * of different resolutions from different physical cameras or sensor pixel modes.</p>
+     * <p>When set to TRUE:
+     * * For a logical multi-camera, the camera framework derives
+     * {@link CameraCharacteristics#SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP android.scaler.multiResolutionStreamConfigurationMap} by combining the
+     * android.scaler.physicalCameraMultiResolutionStreamConfigurations from its physical
+     * cameras.
+     * * For an ultra-high resolution sensor camera, the camera framework directly copies
+     * the value of android.scaler.physicalCameraMultiResolutionStreamConfigurations to
+     * {@link CameraCharacteristics#SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP android.scaler.multiResolutionStreamConfigurationMap}.</p>
+     * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+     * <p><b>Limited capability</b> -
+     * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
+     * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
+     *
+     * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
+     * @see CameraCharacteristics#SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP
+     * @hide
+     */
+    public static final Key<Boolean> SCALER_MULTI_RESOLUTION_STREAM_SUPPORTED =
+            new Key<Boolean>("android.scaler.multiResolutionStreamSupported", boolean.class);
+
+    /**
      * <p>The area of the image sensor which corresponds to active pixels after any geometric
      * distortion correction has been applied.</p>
      * <p>This is the rectangle representing the size of the active region of the sensor (i.e.
diff --git a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java
index 6121cd2..80b5078 100644
--- a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java
@@ -15,6 +15,7 @@
  */
 package android.hardware.camera2;
 
+import android.annotation.Nullable;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -33,6 +34,7 @@
 import android.annotation.NonNull;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import java.util.HashSet;
@@ -71,6 +73,9 @@
  * {@link CameraExtensionCharacteristics#getExtensionSupportedSizes(int, Class)} for supported
  * repeating request output sizes.</p>
  *
+ * <p>The extension characteristics for a given device are expected to remain static under
+ * normal operating conditions.</p>
+ *
  * @see CameraManager#getCameraExtensionCharacteristics(String)
  */
 public final class CameraExtensionCharacteristics {
@@ -566,4 +571,47 @@
             return new ArrayList<>();
         }
     }
+
+    /**
+     * Returns the estimated capture latency range in milliseconds for the
+     * target capture resolution during the calls to {@link CameraExtensionSession#capture}. This
+     * includes the time spent processing the multi-frame capture request along with any additional
+     * time for encoding of the processed buffer if necessary.
+     *
+     * @param extension         the extension type
+     * @param captureOutputSize size of the capture output surface. If it is not in the supported
+     *                          output sizes, maximum capture output size is used for the estimation
+     * @param format            device-specific extension output format
+     * @return the range of estimated minimal and maximal capture latency in milliseconds
+     * or null if no capture latency info can be provided
+     *
+     * @throws IllegalArgumentException in case of format different from {@link ImageFormat#JPEG} /
+     *                                  {@link ImageFormat#YUV_420_888}; or unsupported extension.
+     */
+    public @Nullable Range<Long> getEstimatedCaptureLatencyRangeMillis(@Extension int extension,
+            @NonNull Size captureOutputSize, @ImageFormat.Format int format) {
+        switch (format) {
+            case ImageFormat.YUV_420_888:
+            case ImageFormat.JPEG:
+                //No op
+                break;
+            default:
+                throw new IllegalArgumentException("Unsupported format: " + format);
+        }
+
+        long clientId = registerClient(mContext);
+        if (clientId < 0) {
+            throw new IllegalArgumentException("Unsupported extensions");
+        }
+
+        try {
+            if (!isExtensionSupported(mCameraId, extension, mChars)) {
+                throw new IllegalArgumentException("Unsupported extension");
+            }
+        } finally {
+            unregisterClient(clientId);
+        }
+
+        return null;
+    }
 }
diff --git a/core/java/android/hardware/camera2/CameraInjectionSession.java b/core/java/android/hardware/camera2/CameraInjectionSession.java
new file mode 100644
index 0000000..bd5a4bc
--- /dev/null
+++ b/core/java/android/hardware/camera2/CameraInjectionSession.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * <p>The CameraInjectionSession class is what determines when injection is active.</p>
+ *
+ * <p>Your application must declare the
+ * {@link android.Manifest.permission#CAMERA_INJECT_EXTERNAL_CAMERA CAMERA} permission in its
+ * manifest in order to use camera injection function.</p>
+ *
+ * @hide
+ * @see CameraManager#injectCamera
+ * @see android.Manifest.permission#CAMERA_INJECT_EXTERNAL_CAMERA
+ */
+public abstract class CameraInjectionSession implements AutoCloseable {
+
+    /**
+     * Close the external camera and switch back to the internal camera.
+     *
+     * <p>Call the method when app streaming stops or the app exits, it switch back to the internal
+     * camera.</p>
+     */
+    @Override
+    public abstract void close();
+
+    /**
+     * A callback for external camera has a success or an error during injecting.
+     *
+     * <p>A callback instance must be provided to the {@link CameraManager#injectCamera} method to
+     * inject camera.</p>
+     *
+     * @hide
+     * @see CameraManager#injectCamera
+     */
+    public abstract static class InjectionStatusCallback {
+
+        /**
+         * An error code that can be reported by {@link #onInjectionError} indicating that the
+         * camera injection session has encountered a fatal error.
+         *
+         * @see #onInjectionError
+         */
+        public static final int ERROR_INJECTION_SESSION = 0;
+
+        /**
+         * An error code that can be reported by {@link #onInjectionError} indicating that the
+         * camera service has encountered a fatal error.
+         *
+         * <p>The Android device may need to be shut down and restarted to restore
+         * camera function, or there may be a persistent hardware problem.</p>
+         *
+         * <p>An attempt at recovery <i>may</i> be possible by closing the
+         * CameraDevice and the CameraManager, and trying to acquire all resources again from
+         * scratch.</p>
+         *
+         * @see #onInjectionError
+         */
+        public static final int ERROR_INJECTION_SERVICE = 1;
+
+        /**
+         * An error code that can be reported by {@link #onInjectionError} indicating that the
+         * injection camera does not support certain camera functions. When this error occurs, the
+         * default processing is still in the inject state, and the app is notified to display an
+         * error message and a black screen.
+         *
+         * @see #onInjectionError
+         */
+        public static final int ERROR_INJECTION_UNSUPPORTED = 2;
+
+        /**
+         * @hide
+         */
+        @Retention(RetentionPolicy.SOURCE)
+        @IntDef(prefix = {"ERROR_"}, value =
+                {ERROR_INJECTION_SESSION,
+                        ERROR_INJECTION_SERVICE,
+                        ERROR_INJECTION_UNSUPPORTED})
+        public @interface ErrorCode {};
+
+        /**
+         * The method will be called when an external camera has been injected and replaced
+         * internal camera's feed.
+         *
+         * @param injectionSession The camera injection session that has been injected.
+         */
+        public abstract void onInjectionSucceeded(
+                @NonNull CameraInjectionSession injectionSession);
+
+        /**
+         * The method will be called when an error occurs in the injected external camera.
+         *
+         * @param errorCode   The error code.
+         * @see #ERROR_INJECTION_SESSION
+         * @see #ERROR_INJECTION_SERVICE
+         * @see #ERROR_INJECTION_UNSUPPORTED
+         */
+        public abstract void onInjectionError(@NonNull int errorCode);
+    }
+
+    /**
+     * To be inherited by android.hardware.camera2.* code only.
+     *
+     * @hide
+     */
+    public CameraInjectionSession() {
+    }
+}
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index c1009ff..2c5ec25 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -28,6 +28,7 @@
 import android.hardware.ICameraService;
 import android.hardware.ICameraServiceListener;
 import android.hardware.camera2.impl.CameraDeviceImpl;
+import android.hardware.camera2.impl.CameraInjectionSessionImpl;
 import android.hardware.camera2.impl.CameraMetadataNative;
 import android.hardware.camera2.params.ExtensionSessionConfiguration;
 import android.hardware.camera2.params.SessionConfiguration;
@@ -379,17 +380,36 @@
      * <p>For a logical multi-camera, query the map between physical camera id and
      * the physical camera's multi-resolution stream configuration. This map is in turn
      * combined to form the logical camera's multi-resolution stream configuration map.</p>
+     *
+     * <p>For an ultra high resolution camera, directly use
+     * android.scaler.physicalCameraMultiResolutionStreamConfigurations as the camera device's
+     * multi-resolution stream configuration map.</p>
      */
     private Map<String, StreamConfiguration[]> getPhysicalCameraMultiResolutionConfigs(
-            CameraMetadataNative info, ICameraService cameraService)
+            String cameraId, CameraMetadataNative info, ICameraService cameraService)
             throws CameraAccessException {
         HashMap<String, StreamConfiguration[]> multiResolutionStreamConfigurations =
                 new HashMap<String, StreamConfiguration[]>();
 
+        Boolean multiResolutionStreamSupported = info.get(
+                CameraCharacteristics.SCALER_MULTI_RESOLUTION_STREAM_SUPPORTED);
+        if (multiResolutionStreamSupported == null || !multiResolutionStreamSupported) {
+            return multiResolutionStreamConfigurations;
+        }
+
         // Query the characteristics of all physical sub-cameras, and combine the multi-resolution
-        // stream configurations. Note that framework derived formats such as HEIC and DEPTH_JPEG
-        // aren't supported as multi-resolution input or output formats.
+        // stream configurations. Alternatively, for ultra-high resolution camera, direclty use
+        // its multi-resolution stream configurations. Note that framework derived formats such as
+        // HEIC and DEPTH_JPEG aren't supported as multi-resolution input or output formats.
         Set<String> physicalCameraIds = info.getPhysicalCameraIds();
+        if (physicalCameraIds.size() == 0 && info.isUltraHighResolutionSensor()) {
+            StreamConfiguration[] configs = info.get(CameraCharacteristics.
+                    SCALER_PHYSICAL_CAMERA_MULTI_RESOLUTION_STREAM_CONFIGURATIONS);
+            if (configs != null) {
+                multiResolutionStreamConfigurations.put(cameraId, configs);
+            }
+            return multiResolutionStreamConfigurations;
+        }
         try {
             for (String physicalCameraId : physicalCameraIds) {
                 CameraMetadataNative physicalCameraInfo =
@@ -401,9 +421,6 @@
                     multiResolutionStreamConfigurations.put(physicalCameraId, configs);
                 }
             }
-
-            // TODO: If this is an ultra high resolution sensor camera, combine the multi-resolution
-            // stream combination from "info" as well.
         } catch (RemoteException e) {
             ServiceSpecificException sse = new ServiceSpecificException(
                     ICameraService.ERROR_DISCONNECTED,
@@ -468,7 +485,7 @@
                 info.setDisplaySize(displaySize);
 
                 Map<String, StreamConfiguration[]> multiResolutionSizeMap =
-                        getPhysicalCameraMultiResolutionConfigs(info, cameraService);
+                        getPhysicalCameraMultiResolutionConfigs(cameraId, info, cameraService);
                 if (multiResolutionSizeMap.size() > 0) {
                     info.setMultiResolutionStreamConfigurationMap(multiResolutionSizeMap);
                 }
@@ -1103,6 +1120,67 @@
     }
 
     /**
+     * Inject the external camera to replace the internal camera session.
+     *
+     * <p>If injecting the external camera device fails, then the injection callback's
+     * {@link CameraInjectionSession.InjectionStatusCallback#onInjectionError
+     * onInjectionError} method will be called.</p>
+     *
+     * @param packageName   It scopes the injection to a particular app.
+     * @param internalCamId The id of one of the physical or logical cameras on the phone.
+     * @param externalCamId The id of one of the remote cameras that are provided by the dynamic
+     *                      camera HAL.
+     * @param executor      The executor which will be used when invoking the callback.
+     * @param callback      The callback which is invoked once the external camera is injected.
+     *
+     * @throws CameraAccessException    If the camera device has been disconnected.
+     *                                  {@link CameraAccessException#CAMERA_DISCONNECTED} will be
+     *                                  thrown if camera service is not available.
+     * @throws SecurityException        If the specific application that can cast to external
+     *                                  devices does not have permission to inject the external
+     *                                  camera.
+     * @throws IllegalArgumentException If cameraId doesn't match any currently or previously
+     *                                  available camera device or some camera functions might not
+     *                                  work properly or the injection camera runs into a fatal
+     *                                  error.
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.CAMERA_INJECT_EXTERNAL_CAMERA)
+    public void injectCamera(@NonNull String packageName, @NonNull String internalCamId,
+            @NonNull String externalCamId, @NonNull @CallbackExecutor Executor executor,
+            @NonNull CameraInjectionSession.InjectionStatusCallback callback)
+            throws CameraAccessException, SecurityException,
+            IllegalArgumentException {
+        if (CameraManagerGlobal.sCameraServiceDisabled) {
+            throw new IllegalArgumentException("No cameras available on device");
+        }
+        ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
+        if (cameraService == null) {
+            throw new CameraAccessException(CameraAccessException.CAMERA_DISCONNECTED,
+                    "Camera service is currently unavailable");
+        }
+        synchronized (mLock) {
+            try {
+                CameraInjectionSessionImpl injectionSessionImpl =
+                        new CameraInjectionSessionImpl(callback, executor);
+                ICameraInjectionCallback cameraInjectionCallback =
+                        injectionSessionImpl.getCallback();
+                ICameraInjectionSession injectionSession = cameraService.injectCamera(packageName,
+                        internalCamId, externalCamId, cameraInjectionCallback);
+                injectionSessionImpl.setRemoteInjectionSession(injectionSession);
+            } catch (ServiceSpecificException e) {
+                throwAsPublicException(e);
+            } catch (RemoteException e) {
+                // Camera service died - act as if it's a CAMERA_DISCONNECTED case
+                ServiceSpecificException sse = new ServiceSpecificException(
+                        ICameraService.ERROR_DISCONNECTED,
+                        "Camera service is currently unavailable");
+                throwAsPublicException(sse);
+            }
+        }
+    }
+
+    /**
      * A per-process global camera manager instance, to retain a connection to the camera service,
      * and to distribute camera availability notices to API-registered callbacks
      */
diff --git a/core/java/android/hardware/camera2/MultiResolutionImageReader.java b/core/java/android/hardware/camera2/MultiResolutionImageReader.java
index bb3d91d..3af1b5b 100644
--- a/core/java/android/hardware/camera2/MultiResolutionImageReader.java
+++ b/core/java/android/hardware/camera2/MultiResolutionImageReader.java
@@ -265,8 +265,18 @@
      * @return a {@link Surface} to use as the target for a capture request.
      */
     public @NonNull Surface getSurface() {
-        //TODO: Pick the surface from the reader for default mode stream.
-        return mReaders[0].getSurface();
+        // Pick the surface of smallest size. This is necessary for an ultra high resolution
+        // camera not to default to maximum resolution pixel mode.
+        int minReaderSize = mReaders[0].getWidth() * mReaders[0].getHeight();
+        Surface candidateSurface = mReaders[0].getSurface();
+        for (int i = 1; i < mReaders.length; i++) {
+            int readerSize =  mReaders[i].getWidth() * mReaders[i].getHeight();
+            if (readerSize < minReaderSize) {
+                minReaderSize = readerSize;
+                candidateSurface = mReaders[i].getSurface();
+            }
+        }
+        return candidateSurface;
     }
 
     /**
diff --git a/core/java/android/hardware/camera2/impl/CameraInjectionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraInjectionSessionImpl.java
new file mode 100644
index 0000000..231cc05
--- /dev/null
+++ b/core/java/android/hardware/camera2/impl/CameraInjectionSessionImpl.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.impl;
+
+import static com.android.internal.util.function.pooled.PooledLambda.obtainRunnable;
+
+import android.hardware.camera2.CameraInjectionSession;
+import android.hardware.camera2.ICameraInjectionCallback;
+import android.hardware.camera2.ICameraInjectionSession;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.concurrent.Executor;
+
+
+/**
+ * The class inherits CameraInjectionSession. Use CameraManager#injectCamera to instantiate.
+ */
+public class CameraInjectionSessionImpl extends CameraInjectionSession
+        implements IBinder.DeathRecipient {
+    private static final String TAG = "CameraInjectionSessionImpl";
+
+    private final CameraInjectionCallback mCallback = new CameraInjectionCallback();
+    private final CameraInjectionSession.InjectionStatusCallback mInjectionStatusCallback;
+    private final Executor mExecutor;
+    private final Object mInterfaceLock = new Object();
+    private ICameraInjectionSession mInjectionSession;
+
+    public CameraInjectionSessionImpl(InjectionStatusCallback callback, Executor executor) {
+        mInjectionStatusCallback = callback;
+        mExecutor = executor;
+    }
+
+    @Override
+    public void close() {
+        synchronized (mInterfaceLock) {
+            try {
+                if (mInjectionSession != null) {
+                    mInjectionSession.stopInjection();
+                    mInjectionSession.asBinder().unlinkToDeath(this, /*flags*/0);
+                    mInjectionSession = null;
+                }
+            } catch (RemoteException e) {
+                // Ignore binder errors for disconnect
+            }
+        }
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        try {
+            close();
+        } finally {
+            super.finalize();
+        }
+    }
+
+    @Override
+    public void binderDied() {
+        synchronized (mInterfaceLock) {
+            Log.w(TAG, "CameraInjectionSessionImpl died unexpectedly");
+
+            if (mInjectionSession == null) {
+                return; // CameraInjectionSession already closed
+            }
+
+            Runnable r = new Runnable() {
+                @Override
+                public void run() {
+                    mInjectionStatusCallback.onInjectionError(
+                            CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_SERVICE);
+                }
+            };
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                CameraInjectionSessionImpl.this.mExecutor.execute(r);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+    }
+
+    public CameraInjectionCallback getCallback() {
+        return mCallback;
+    }
+
+    /**
+     * Set remote injection session, which triggers initial onInjectionSucceeded callbacks.
+     *
+     * <p>This function may post onInjectionError if remoteInjectionSession dies
+     * during injecting.</p>
+     */
+    public void setRemoteInjectionSession(ICameraInjectionSession injectionSession) {
+        synchronized (mInterfaceLock) {
+            if (injectionSession == null) {
+                Log.e(TAG, "The camera injection session has encountered a serious error");
+                scheduleNotifyError(
+                        CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_SESSION);
+                return;
+            }
+
+            mInjectionSession = injectionSession;
+
+            IBinder remoteSessionBinder = injectionSession.asBinder();
+            if (remoteSessionBinder == null) {
+                Log.e(TAG, "The camera injection session has encountered a serious error");
+                scheduleNotifyError(
+                        CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_SESSION);
+                return;
+            }
+
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                remoteSessionBinder.linkToDeath(this, /*flag*/ 0);
+                mExecutor.execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        mInjectionStatusCallback
+                                .onInjectionSucceeded(CameraInjectionSessionImpl.this);
+                    }
+                });
+            } catch (RemoteException e) {
+                scheduleNotifyError(
+                        CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_SESSION);
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+    }
+
+    /**
+     * The method called when the injection camera has encountered a serious error.
+     *
+     * @param errorCode The error code.
+     * @see #ERROR_INJECTION_SESSION
+     * @see #ERROR_INJECTION_SERVICE
+     * @see #ERROR_INJECTION_UNSUPPORTED
+     */
+    public void onInjectionError(final int errorCode) {
+        Log.v(TAG, String.format(
+                "Injection session error received, code %d", errorCode));
+
+        synchronized (mInterfaceLock) {
+            if (mInjectionSession == null) {
+                return; // mInjectionSession already closed
+            }
+
+            switch (errorCode) {
+                case CameraInjectionCallback.ERROR_INJECTION_SESSION:
+                    scheduleNotifyError(
+                            CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_SESSION);
+                    break;
+                case CameraInjectionCallback.ERROR_INJECTION_SERVICE:
+                    scheduleNotifyError(
+                            CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_SERVICE);
+                    break;
+                case CameraInjectionCallback.ERROR_INJECTION_UNSUPPORTED:
+                    scheduleNotifyError(
+                            CameraInjectionSession.InjectionStatusCallback
+                                    .ERROR_INJECTION_UNSUPPORTED);
+                    break;
+                default:
+                    Log.e(TAG, "Unknown error from injection session: " + errorCode);
+                    scheduleNotifyError(
+                            CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_SERVICE);
+            }
+        }
+    }
+
+    private void scheduleNotifyError(final int errorCode) {
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            mExecutor.execute(obtainRunnable(
+                    CameraInjectionSessionImpl::notifyError,
+                    this, errorCode).recycleOnUse());
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
+    private void notifyError(final int errorCode) {
+        if (mInjectionSession != null) {
+            mInjectionStatusCallback.onInjectionError(errorCode);
+        }
+    }
+
+    /**
+     * The class inherits ICameraInjectionCallbacks.Stub. Use CameraManager#injectCamera to
+     * instantiate.
+     */
+    public class CameraInjectionCallback extends ICameraInjectionCallback.Stub {
+
+        @Override
+        public IBinder asBinder() {
+            return this;
+        }
+
+        @Override
+        public void onInjectionError(int errorCode) {
+            CameraInjectionSessionImpl.this.onInjectionError(errorCode);
+        }
+    }
+}
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index aa84b02..2e841f5 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -1322,7 +1322,10 @@
         return ret;
     }
 
-    private boolean isUltraHighResolutionSensor() {
+    /**
+     * @hide
+     */
+    public boolean isUltraHighResolutionSensor() {
         return isCapabilitySupported(
                 CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR);
 
diff --git a/core/java/android/hardware/camera2/params/InputConfiguration.java b/core/java/android/hardware/camera2/params/InputConfiguration.java
index d63683f..8dfc0a7b 100644
--- a/core/java/android/hardware/camera2/params/InputConfiguration.java
+++ b/core/java/android/hardware/camera2/params/InputConfiguration.java
@@ -90,7 +90,6 @@
     public InputConfiguration(@NonNull Collection<MultiResolutionStreamInfo> multiResolutionInputs,
             @Format int format) {
         checkCollectionNotEmpty(multiResolutionInputs, "Input multi-resolution stream info");
-        //TODO: Pick the default mode stream info for ultra-high resolution sensor camera
         MultiResolutionStreamInfo info = multiResolutionInputs.iterator().next();
         mWidth = info.getWidth();
         mHeight = info.getHeight();
diff --git a/core/java/android/hardware/camera2/params/OutputConfiguration.java b/core/java/android/hardware/camera2/params/OutputConfiguration.java
index 84736dc..0662f16 100644
--- a/core/java/android/hardware/camera2/params/OutputConfiguration.java
+++ b/core/java/android/hardware/camera2/params/OutputConfiguration.java
@@ -353,7 +353,10 @@
             config.setPhysicalCameraId(streamInfo.getPhysicalCameraId());
             config.setMultiResolutionOutput();
             configs.add(config);
-            // TODO: Set sensor pixel mode for ultra high resolution sensor camera.
+
+            // No need to call addSensorPixelModeUsed for ultra high resolution sensor camera,
+            // because regular and max resolution output configurations are used for DEFAULT mode
+            // and MAX_RESOLUTION mode respectively by default.
         }
 
         return configs;
diff --git a/telephony/java/android/telephony/CarrierBandwidth.aidl b/core/java/android/hardware/display/BrightnessInfo.aidl
similarity index 82%
rename from telephony/java/android/telephony/CarrierBandwidth.aidl
rename to core/java/android/hardware/display/BrightnessInfo.aidl
index d0861b8..5da55c3 100644
--- a/telephony/java/android/telephony/CarrierBandwidth.aidl
+++ b/core/java/android/hardware/display/BrightnessInfo.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,5 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.telephony;
-parcelable CarrierBandwidth;
\ No newline at end of file
+
+package android.hardware.display;
+
+parcelable BrightnessInfo;
diff --git a/core/java/android/hardware/display/BrightnessInfo.java b/core/java/android/hardware/display/BrightnessInfo.java
new file mode 100644
index 0000000..4289860
--- /dev/null
+++ b/core/java/android/hardware/display/BrightnessInfo.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.display;
+
+import android.annotation.IntDef;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Data about the current brightness state.
+ * {@see android.view.Display.getBrightnessInfo()}
+ *
+ * @hide
+ */
+public final class BrightnessInfo implements Parcelable {
+
+    @IntDef(prefix = {"HIGH_BRIGHTNESS_MODE_"}, value = {
+            HIGH_BRIGHTNESS_MODE_OFF,
+            HIGH_BRIGHTNESS_MODE_SUNLIGHT
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface HighBrightnessMode {}
+
+    /**
+     * High brightness mode is OFF. The high brightness range is not currently accessible to the
+     * user.
+     */
+    public static final int HIGH_BRIGHTNESS_MODE_OFF = 0;
+
+    /**
+     * High brightness mode is ON due to high ambient light (sunlight). The high brightness range is
+     * currently accessible to the user.
+     */
+    public static final int HIGH_BRIGHTNESS_MODE_SUNLIGHT = 1;
+
+    /** Brightness */
+    public final float brightness;
+
+    /** Current minimum supported brightness. */
+    public final float brightnessMinimum;
+
+    /** Current maximum supported brightness. */
+    public final float brightnessMaximum;
+
+    /**
+     * Current state of high brightness mode.
+     * Can be any of HIGH_BRIGHTNESS_MODE_* values.
+     */
+    public final int highBrightnessMode;
+
+    public BrightnessInfo(float brightness, float brightnessMinimum, float brightnessMaximum,
+            @HighBrightnessMode int highBrightnessMode) {
+        this.brightness = brightness;
+        this.brightnessMinimum = brightnessMinimum;
+        this.brightnessMaximum = brightnessMaximum;
+        this.highBrightnessMode = highBrightnessMode;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeFloat(brightness);
+        dest.writeFloat(brightnessMinimum);
+        dest.writeFloat(brightnessMaximum);
+        dest.writeInt(highBrightnessMode);
+    }
+
+    public static final @android.annotation.NonNull Creator<BrightnessInfo> CREATOR =
+            new Creator<BrightnessInfo>() {
+                @Override
+                public BrightnessInfo createFromParcel(Parcel source) {
+                    return new BrightnessInfo(source);
+                }
+
+                @Override
+                public BrightnessInfo[] newArray(int size) {
+                    return new BrightnessInfo[size];
+                }
+            };
+
+    private BrightnessInfo(Parcel source) {
+        brightness = source.readFloat();
+        brightnessMinimum = source.readFloat();
+        brightnessMaximum = source.readFloat();
+        highBrightnessMode = source.readInt();
+    }
+
+}
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 6c2d140..de32adb1 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -418,6 +418,7 @@
             EVENT_FLAG_DISPLAY_ADDED,
             EVENT_FLAG_DISPLAY_CHANGED,
             EVENT_FLAG_DISPLAY_REMOVED,
+            EVENT_FLAG_DISPLAY_BRIGHTNESS
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface EventsMask {}
@@ -449,6 +450,17 @@
      */
     public static final long EVENT_FLAG_DISPLAY_CHANGED = 1L << 2;
 
+    /**
+     * Event flag to register for a display's brightness changes. This notification is sent
+     * through the {@link DisplayListener#onDisplayChanged} callback method. New brightness
+     * values can be retrieved via {@link android.view.Display#getBrightnessInfo()}.
+     *
+     * @see #registerDisplayListener(DisplayListener, Handler, long)
+     *
+     * @hide
+     */
+    public static final long EVENT_FLAG_DISPLAY_BRIGHTNESS = 1L << 3;
+
     /** @hide */
     public DisplayManager(Context context) {
         mContext = context;
@@ -583,6 +595,7 @@
      * @see #EVENT_FLAG_DISPLAY_ADDED
      * @see #EVENT_FLAG_DISPLAY_CHANGED
      * @see #EVENT_FLAG_DISPLAY_REMOVED
+     * @see #EVENT_FLAG_DISPLAY_BRIGHTNESS
      * @see #registerDisplayListener(DisplayListener, Handler)
      * @see #unregisterDisplayListener
      *
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 983a43a..df51734 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -79,6 +79,7 @@
             EVENT_DISPLAY_ADDED,
             EVENT_DISPLAY_CHANGED,
             EVENT_DISPLAY_REMOVED,
+            EVENT_DISPLAY_BRIGHTNESS_CHANGED
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DisplayEvent {}
@@ -86,6 +87,7 @@
     public static final int EVENT_DISPLAY_ADDED = 1;
     public static final int EVENT_DISPLAY_CHANGED = 2;
     public static final int EVENT_DISPLAY_REMOVED = 3;
+    public static final int EVENT_DISPLAY_BRIGHTNESS_CHANGED = 4;
 
     @UnsupportedAppUsage
     private static DisplayManagerGlobal sInstance;
@@ -665,6 +667,17 @@
     }
 
     /**
+     * Retrieves Brightness Info for the specified display.
+     */
+    public BrightnessInfo getBrightnessInfo(int displayId) {
+        try {
+            return mDm.getBrightnessInfo(displayId);
+        } catch (RemoteException ex) {
+            throw ex.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Gets the preferred wide gamut color space for all displays.
      * The wide gamut color space is returned from composition pipeline
      * based on hardware capability.
@@ -934,6 +947,11 @@
                         }
                     }
                     break;
+                case EVENT_DISPLAY_BRIGHTNESS_CHANGED:
+                    if ((mEventsMask & DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS) != 0) {
+                        mListener.onDisplayChanged(msg.arg1);
+                    }
+                    break;
                 case EVENT_DISPLAY_REMOVED:
                     if ((mEventsMask & DisplayManager.EVENT_FLAG_DISPLAY_REMOVED) != 0) {
                         mListener.onDisplayRemoved(msg.arg1);
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index 5ca4e0c..2303353 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -19,6 +19,7 @@
 import android.content.pm.ParceledListSlice;
 import android.graphics.Point;
 import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.BrightnessInfo;
 import android.hardware.display.Curve;
 import android.hardware.display.IDisplayManagerCallback;
 import android.hardware.display.IVirtualDisplayCallback;
@@ -143,6 +144,9 @@
     // Get the minimum brightness curve.
     Curve getMinimumBrightnessCurve();
 
+    // Get Brightness Information for the specified display.
+    BrightnessInfo getBrightnessInfo(int displayId);
+
     // Gets the id of the preferred wide gamut color space for all displays.
     // The wide gamut color space is returned from composition pipeline
     // based on hardware capability.
diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java
index 13e2700..5f87899 100644
--- a/core/java/android/hardware/face/FaceManager.java
+++ b/core/java/android/hardware/face/FaceManager.java
@@ -133,11 +133,11 @@
         }
 
         @Override
-        public void onFeatureGet(boolean success, int feature, boolean value) {
+        public void onFeatureGet(boolean success, int[] features, boolean[] featureState) {
             SomeArgs args = SomeArgs.obtain();
             args.arg1 = success;
-            args.argi1 = feature;
-            args.arg2 = value;
+            args.arg2 = features;
+            args.arg3 = featureState;
             mHandler.obtainMessage(MSG_GET_FEATURE_COMPLETED, args).sendToTarget();
         }
 
@@ -1088,7 +1088,7 @@
      * @hide
      */
     public abstract static class GetFeatureCallback {
-        public abstract void onCompleted(boolean success, int feature, boolean value);
+        public abstract void onCompleted(boolean success, int[] features, boolean[] featureState);
     }
 
     /**
@@ -1179,8 +1179,8 @@
                 case MSG_GET_FEATURE_COMPLETED:
                     SomeArgs args = (SomeArgs) msg.obj;
                     sendGetFeatureCompleted((boolean) args.arg1 /* success */,
-                            args.argi1 /* feature */,
-                            (boolean) args.arg2 /* value */);
+                            (int[]) args.arg2 /* features */,
+                            (boolean[]) args.arg3 /* featureState */);
                     args.recycle();
                     break;
                 case MSG_CHALLENGE_GENERATED:
@@ -1216,11 +1216,11 @@
         mSetFeatureCallback.onCompleted(success, feature);
     }
 
-    private void sendGetFeatureCompleted(boolean success, int feature, boolean value) {
+    private void sendGetFeatureCompleted(boolean success, int[] features, boolean[] featureState) {
         if (mGetFeatureCallback == null) {
             return;
         }
-        mGetFeatureCallback.onCompleted(success, feature, value);
+        mGetFeatureCallback.onCompleted(success, features, featureState);
     }
 
     private void sendChallengeGenerated(int sensorId, long challenge) {
diff --git a/core/java/android/hardware/face/FaceServiceReceiver.java b/core/java/android/hardware/face/FaceServiceReceiver.java
index f0f975d..9e62ca5 100644
--- a/core/java/android/hardware/face/FaceServiceReceiver.java
+++ b/core/java/android/hardware/face/FaceServiceReceiver.java
@@ -66,7 +66,8 @@
     }
 
     @Override
-    public void onFeatureGet(boolean success, int feature, boolean value) throws RemoteException {
+    public void onFeatureGet(boolean success, int[] features, boolean[] featureState)
+                throws RemoteException {
 
     }
 
diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl
index 0b44150..270d662 100644
--- a/core/java/android/hardware/face/IFaceService.aidl
+++ b/core/java/android/hardware/face/IFaceService.aidl
@@ -127,6 +127,8 @@
     void getFeature(IBinder token, int userId, int feature, IFaceServiceReceiver receiver,
             String opPackageName);
 
-    // Give FaceService its ID. See AuthService.java
-    void initializeConfiguration(int sensorId, int strength);
+    // Registers all HIDL and AIDL sensors. Only HIDL sensor properties need to be provided, because
+    // AIDL sensor properties are retrieved directly from the available HALs. If no HIDL HALs exist,
+    // hidlSensors must be non-null and empty. See AuthService.java
+    void registerAuthenticators(in List<FaceSensorPropertiesInternal> hidlSensors);
 }
diff --git a/core/java/android/hardware/face/IFaceServiceReceiver.aidl b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
index 2ef1430..0ccb395 100644
--- a/core/java/android/hardware/face/IFaceServiceReceiver.aidl
+++ b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
@@ -32,7 +32,7 @@
     void onError(int error, int vendorCode);
     void onRemoved(in Face face, int remaining);
     void onFeatureSet(boolean success, int feature);
-    void onFeatureGet(boolean success, int feature, boolean value);
+    void onFeatureGet(boolean success, in int[] features, in boolean[] featureState);
     void onChallengeGenerated(int sensorId, long challenge);
     void onChallengeInterrupted(int sensorId);
     void onChallengeInterruptFinished(int sensorId);
diff --git a/core/java/android/hardware/face/OWNERS b/core/java/android/hardware/face/OWNERS
index be10df1..0b4d9d9 100644
--- a/core/java/android/hardware/face/OWNERS
+++ b/core/java/android/hardware/face/OWNERS
@@ -1,7 +1,3 @@
 # Bug component: 879035
 
-curtislb@google.com
-ilyamaty@google.com
-jaggies@google.com
-joshmccloskey@google.com
-kchyn@google.com
+include /services/core/java/com/android/server/biometrics/OWNERS
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index ab9e0df..cc1aeeb 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -23,6 +23,11 @@
 import static android.Manifest.permission.USE_BIOMETRIC;
 import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
 import static android.Manifest.permission.USE_FINGERPRINT;
+import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWER_BUTTON;
+
+import static com.android.internal.util.FrameworkStatsLog.AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_FINGERPRINT_MANAGER_AUTHENTICATE;
+import static com.android.internal.util.FrameworkStatsLog.AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_FINGERPRINT_MANAGER_HAS_ENROLLED_FINGERPRINTS;
+import static com.android.internal.util.FrameworkStatsLog.AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_FINGERPRINT_MANAGER_IS_HARDWARE_DETECTED;
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
@@ -56,6 +61,8 @@
 import android.util.Slog;
 import android.view.Surface;
 
+import com.android.internal.util.FrameworkStatsLog;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.security.Signature;
@@ -534,6 +541,11 @@
     public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,
             @NonNull AuthenticationCallback callback, Handler handler, int sensorId, int userId) {
 
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_DEPRECATED_API_USED,
+                AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_FINGERPRINT_MANAGER_AUTHENTICATE,
+                mContext.getApplicationInfo().uid,
+                mContext.getApplicationInfo().targetSdkVersion);
+
         if (callback == null) {
             throw new IllegalArgumentException("Must supply an authentication callback");
         }
@@ -867,6 +879,19 @@
     }
 
     /**
+     * Forwards FingerprintStateListener to FingerprintService
+     * @param listener new FingerprintStateListener being added
+     * @hide
+     */
+    public void registerFingerprintStateListener(@NonNull FingerprintStateListener listener) {
+        try {
+            mService.registerFingerprintStateListener(listener);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * @hide
      */
     @RequiresPermission(USE_BIOMETRIC_INTERNAL)
@@ -910,6 +935,11 @@
     @Deprecated
     @RequiresPermission(USE_FINGERPRINT)
     public boolean hasEnrolledFingerprints() {
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_DEPRECATED_API_USED,
+                AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_FINGERPRINT_MANAGER_HAS_ENROLLED_FINGERPRINTS,
+                mContext.getApplicationInfo().uid,
+                mContext.getApplicationInfo().targetSdkVersion);
+
         return hasEnrolledFingerprints(UserHandle.myUserId());
     }
 
@@ -938,6 +968,11 @@
     @Deprecated
     @RequiresPermission(USE_FINGERPRINT)
     public boolean isHardwareDetected() {
+        FrameworkStatsLog.write(FrameworkStatsLog.AUTH_DEPRECATED_API_USED,
+                AUTH_DEPRECATED_APIUSED__DEPRECATED_API__API_FINGERPRINT_MANAGER_IS_HARDWARE_DETECTED,
+                mContext.getApplicationInfo().uid,
+                mContext.getApplicationInfo().targetSdkVersion);
+
         if (mService != null) {
             try {
                 return mService.isHardwareDetectedDeprecated(mContext.getOpPackageName());
@@ -968,6 +1003,41 @@
     }
 
     /**
+     * Returns whether the device has a power button fingerprint sensor.
+     * @return boolean indicating whether power button is fingerprint sensor
+     * @hide
+     */
+    public boolean isPowerbuttonFps() {
+        final FingerprintSensorPropertiesInternal sensorProps = getFirstFingerprintSensor();
+        return sensorProps.sensorType == TYPE_POWER_BUTTON;
+    }
+
+    /**
+     * Adds a callback that gets called when the service registers all of the fingerprint
+     * authenticators (HALs).
+     *
+     * If the fingerprint authenticators are already registered when the callback is added, the
+     * callback is invoked immediately.
+     *
+     * The callback is automatically removed after it's invoked.
+     *
+     * @hide
+     */
+    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
+    public void addAuthenticatorsRegisteredCallback(
+            IFingerprintAuthenticatorsRegisteredCallback callback) {
+        if (mService != null) {
+            try {
+                mService.addAuthenticatorsRegisteredCallback(callback);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        } else {
+            Slog.w(TAG, "addProvidersAvailableCallback(): Service not connected!");
+        }
+    }
+
+    /**
      * @hide
      */
     public void addLockoutResetCallback(final LockoutResetCallback callback) {
diff --git a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java
index 58f6e62..4ffe5f1 100644
--- a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java
+++ b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java
@@ -20,7 +20,6 @@
 import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC;
 
 import android.annotation.NonNull;
-import android.content.Context;
 import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.biometrics.SensorProperties;
 import android.hardware.biometrics.SensorPropertiesInternal;
@@ -92,34 +91,6 @@
                 1636 /* sensorLocationY */, 130 /* sensorRadius */);
     }
 
-    /**
-     * Initializes SensorProperties with specified values and values obtained from resources using
-     * context.
-     */
-    // TODO(b/179175438): Remove this constructor once all HALs move to AIDL.
-    public FingerprintSensorPropertiesInternal(@NonNull Context context, int sensorId,
-            @SensorProperties.Strength int strength, int maxEnrollmentsPerUser,
-            @NonNull List<ComponentInfoInternal> componentInfo,
-            @FingerprintSensorProperties.SensorType int sensorType,
-            boolean resetLockoutRequiresHardwareAuthToken) {
-        super(sensorId, strength, maxEnrollmentsPerUser, componentInfo,
-            resetLockoutRequiresHardwareAuthToken, false /* resetLockoutRequiresChallenge */);
-        this.sensorType = sensorType;
-
-        int[] props = context.getResources().getIntArray(
-                com.android.internal.R.array.config_udfps_sensor_props);
-        if (props != null && props.length == 3) {
-            this.sensorLocationX = props[0];
-            this.sensorLocationY = props[1];
-            this.sensorRadius = props[2];
-        } else {
-            // Fake coordinates that could be used for the fake UDFPS mode.
-            this.sensorLocationX = 540;
-            this.sensorLocationY = 1636;
-            this.sensorRadius = 130;
-        }
-    }
-
     protected FingerprintSensorPropertiesInternal(Parcel in) {
         super(in);
         sensorType = in.readInt();
diff --git a/core/java/android/hardware/fingerprint/FingerprintStateListener.java b/core/java/android/hardware/fingerprint/FingerprintStateListener.java
new file mode 100644
index 0000000..6e607a2
--- /dev/null
+++ b/core/java/android/hardware/fingerprint/FingerprintStateListener.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.fingerprint;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Interface for handling state changes in fingerprint-related events.
+ * @hide
+ */
+public abstract class FingerprintStateListener extends IFingerprintStateListener.Stub {
+    // Operation has not started yet.
+    public static final int STATE_IDLE = 0;
+
+    // Enrollment is in progress.
+    public static final int STATE_ENROLLING = 1;
+
+    // Lockscreen authentication in progress.
+    public static final int STATE_KEYGUARD_AUTH = 2;
+
+    // BiometricPrompt authentication in progress.
+    public static final int STATE_BP_AUTH = 3;
+
+    // Other Authentication State
+    public static final int STATE_AUTH_OTHER = 4;
+
+    @IntDef({STATE_IDLE, STATE_ENROLLING, STATE_KEYGUARD_AUTH, STATE_BP_AUTH, STATE_AUTH_OTHER})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface State {}
+
+    /**
+     * Defines behavior in response to state update
+     * @param newState new state of fingerprint sensor
+     */
+    public abstract void onStateChanged(@FingerprintStateListener.State int newState);
+}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintAuthenticatorsRegisteredCallback.aidl b/core/java/android/hardware/fingerprint/IFingerprintAuthenticatorsRegisteredCallback.aidl
new file mode 100644
index 0000000..5a2c931
--- /dev/null
+++ b/core/java/android/hardware/fingerprint/IFingerprintAuthenticatorsRegisteredCallback.aidl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.fingerprint;
+
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import java.util.List;
+
+/**
+ * Callback to notify FingerprintManager that FingerprintService has registered all of the
+ * fingerprint authenticators (HALs).
+ * See {@link android.hardware.fingerprint.IFingerprintService#registerAuthenticators}.
+ *
+ * @hide
+ */
+oneway interface IFingerprintAuthenticatorsRegisteredCallback {
+    /**
+     * Notifies FingerprintManager that all of the fingerprint authenticators have been registered.
+     *
+     * @param sensors A consolidated list of sensor properties for all of the authenticators.
+     */
+    void onAllAuthenticatorsRegistered(in List<FingerprintSensorPropertiesInternal> sensors);
+}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 469e87e2..833747f 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -21,7 +21,9 @@
 import android.hardware.biometrics.ITestSession;
 import android.hardware.biometrics.ITestSessionCallback;
 import android.hardware.fingerprint.IFingerprintClientActiveCallback;
+import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
 import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.hardware.fingerprint.IFingerprintStateListener;
 import android.hardware.fingerprint.IUdfpsOverlayController;
 import android.hardware.fingerprint.Fingerprint;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
@@ -143,8 +145,14 @@
     // Removes a callback set by addClientActiveCallback
     void removeClientActiveCallback(IFingerprintClientActiveCallback callback);
 
-    // Give FingerprintService its ID. See AuthService.java
-    void initializeConfiguration(int sensorId, int strength);
+    // Registers all HIDL and AIDL sensors. Only HIDL sensor properties need to be provided, because
+    // AIDL sensor properties are retrieved directly from the available HALs. If no HIDL HALs exist,
+    // hidlSensors must be non-null and empty. See AuthService.java
+    void registerAuthenticators(in List<FingerprintSensorPropertiesInternal> hidlSensors);
+
+    // Adds a callback which gets called when the service registers all of the fingerprint
+    // authenticators. The callback is automatically removed after it's invoked.
+    void addAuthenticatorsRegisteredCallback(IFingerprintAuthenticatorsRegisteredCallback callback);
 
     // Notifies about a finger touching the sensor area.
     void onPointerDown(int sensorId, int x, int y, float minor, float major);
@@ -154,4 +162,7 @@
 
     // Sets the controller for managing the UDFPS overlay.
     void setUdfpsOverlayController(in IUdfpsOverlayController controller);
+
+    // Registers FingerprintStateListener in list stored by FingerprintService.
+    void registerFingerprintStateListener(IFingerprintStateListener listener);
 }
diff --git a/telephony/java/android/telephony/CarrierBandwidth.aidl b/core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl
similarity index 60%
copy from telephony/java/android/telephony/CarrierBandwidth.aidl
copy to core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl
index d0861b8..56dba7e 100644
--- a/telephony/java/android/telephony/CarrierBandwidth.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintStateListener.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,5 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.telephony;
-parcelable CarrierBandwidth;
\ No newline at end of file
+package android.hardware.fingerprint;
+
+import android.hardware.fingerprint.Fingerprint;
+
+/**
+ * Communication channel for FingerprintManager to register the FingerprintStateListener
+ * in FingerprintService.
+ * @hide
+ */
+oneway interface IFingerprintStateListener {
+    void onStateChanged(int newState);
+}
diff --git a/core/java/android/hardware/fingerprint/OWNERS b/core/java/android/hardware/fingerprint/OWNERS
index e55b8c56..5c93672 100644
--- a/core/java/android/hardware/fingerprint/OWNERS
+++ b/core/java/android/hardware/fingerprint/OWNERS
@@ -1,8 +1,3 @@
 # Bug component: 114777
 
-curtislb@google.com
-ilyamaty@google.com
-jaggies@google.com
-joshmccloskey@google.com
-kchyn@google.com
-
+include /services/core/java/com/android/server/biometrics/OWNERS
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 6079c57..ecfc0d5 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -715,7 +715,7 @@
      * @hide
      */
     @SystemApi
-    public static final String CEC_SETTING_NAME_POWER_CONTROL_MODE = "send_standby_on_sleep";
+    public static final String CEC_SETTING_NAME_POWER_CONTROL_MODE = "power_control_mode";
     /**
      * Name of a setting deciding on power state action when losing Active Source.
      *
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl
index 336fbf2..19fb845 100644
--- a/core/java/android/hardware/input/IInputManager.aidl
+++ b/core/java/android/hardware/input/IInputManager.aidl
@@ -117,6 +117,11 @@
     // static association for the cleared input port will be restored.
     void removePortAssociation(in String inputPort);
 
+    // Add a runtime association between the input device and display.
+    void addUniqueIdAssociation(in String inputDeviceName, in String displayUniqueId);
+    // Remove the runtime association between the input device and display.
+    void removeUniqueIdAssociation(in String inputDeviceName);
+
     InputSensorInfo[] getSensorList(int deviceId);
 
     boolean registerSensorListener(IInputSensorEventListener listener);
diff --git a/core/java/android/hardware/input/InputDeviceLightsManager.java b/core/java/android/hardware/input/InputDeviceLightsManager.java
index a3b91a9..885df7b 100644
--- a/core/java/android/hardware/input/InputDeviceLightsManager.java
+++ b/core/java/android/hardware/input/InputDeviceLightsManager.java
@@ -81,6 +81,11 @@
         return session;
     }
 
+    @Override
+    public @NonNull LightsSession openSession(int priority) {
+        throw new UnsupportedOperationException();
+    }
+
     /**
      * Encapsulates a session that can be used to control device lights and represents the lifetime
      * of the requests.
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index b6d2eaf..648fda7 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -1293,7 +1293,7 @@
      * @param inputPort The port of the input device.
      * @param displayPort The physical port of the associated display.
      * <p>
-     * Requires {@link android.Manifest.permissions.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT}.
+     * Requires {@link android.Manifest.permissions.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY}.
      * </p>
      * @hide
      */
@@ -1310,7 +1310,7 @@
      * static association for the cleared input port will be restored.
      * @param inputPort The port of the input device to be cleared.
      * <p>
-     * Requires {@link android.Manifest.permissions.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT}.
+     * Requires {@link android.Manifest.permissions.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY}.
      * </p>
      * @hide
      */
@@ -1322,6 +1322,41 @@
         }
     }
 
+    /**
+     * Add a runtime association between the input device name and display, by unique id. Input
+     * device names are expected to be unique.
+     * @param inputDeviceName The name of the input device.
+     * @param displayUniqueId The unique id of the associated display.
+     * <p>
+     * Requires {@link android.Manifest.permissions.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY}.
+     * </p>
+     * @hide
+     */
+    public void addUniqueIdAssociation(@NonNull String inputDeviceName,
+            @NonNull String displayUniqueId) {
+        try {
+            mIm.addUniqueIdAssociation(inputDeviceName, displayUniqueId);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Removes a runtime association between the input device and display.
+     * @param inputDeviceName The name of the input device.
+     * <p>
+     * Requires {@link android.Manifest.permissions.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY}.
+     * </p>
+     * @hide
+     */
+    public void removeUniqueIdAssociation(@NonNull String inputDeviceName) {
+        try {
+            mIm.removeUniqueIdAssociation(inputDeviceName);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     private void populateInputDevicesLocked() {
         if (mInputDevicesChangedListener == null) {
             final InputDevicesChangedListener listener = new InputDevicesChangedListener();
diff --git a/core/java/android/hardware/iris/IIrisService.aidl b/core/java/android/hardware/iris/IIrisService.aidl
index 3d26318..98057d5 100644
--- a/core/java/android/hardware/iris/IIrisService.aidl
+++ b/core/java/android/hardware/iris/IIrisService.aidl
@@ -15,12 +15,16 @@
  */
 package android.hardware.iris;
 
+import android.hardware.biometrics.SensorPropertiesInternal;
+
 /**
  * Communication channel from client to the iris service. These methods are all require the
  * MANAGE_BIOMETRIC signature permission.
  * @hide
  */
 interface IIrisService {
-    // Give IrisService its ID. See AuthService.java
-    void initializeConfiguration(int sensorId, int strength);
+    // Registers all HIDL and AIDL sensors. Only HIDL sensor properties need to be provided, because
+    // AIDL sensor properties are retrieved directly from the available HALs. If no HIDL HALs exist,
+    // hidlSensors must be non-null and empty. See AuthService.java
+    void registerAuthenticators(in List<SensorPropertiesInternal> hidlSensors);
 }
diff --git a/core/java/android/hardware/iris/OWNERS b/core/java/android/hardware/iris/OWNERS
index 33527f8..0b4d9d9 100644
--- a/core/java/android/hardware/iris/OWNERS
+++ b/core/java/android/hardware/iris/OWNERS
@@ -1,3 +1,3 @@
 # Bug component: 879035
 
-jaggies@google.com
+include /services/core/java/com/android/server/biometrics/OWNERS
diff --git a/core/java/android/hardware/lights/ILightsManager.aidl b/core/java/android/hardware/lights/ILightsManager.aidl
index 6ea24b7..077797f 100644
--- a/core/java/android/hardware/lights/ILightsManager.aidl
+++ b/core/java/android/hardware/lights/ILightsManager.aidl
@@ -27,7 +27,7 @@
 interface ILightsManager {
   List<Light> getLights();
   LightState getLightState(int lightId);
-  void openSession(in IBinder sessionToken);
+  void openSession(in IBinder sessionToken, in int priority);
   void closeSession(in IBinder sessionToken);
   void setLightStates(in IBinder sessionToken, in int[] lightIds, in LightState[] states);
 }
diff --git a/core/java/android/hardware/lights/Light.java b/core/java/android/hardware/lights/Light.java
index 7bfff5d..2c78fcb 100644
--- a/core/java/android/hardware/lights/Light.java
+++ b/core/java/android/hardware/lights/Light.java
@@ -37,20 +37,25 @@
     /** Type for lights that indicate microphone usage */
     public static final int LIGHT_TYPE_MICROPHONE = 8;
 
+    // These enum values start from 10001 to avoid collision with expanding of HAL light types.
     /**
      * Type for lights that indicate a monochrome color LED light.
      */
-    public static final int LIGHT_TYPE_INPUT_SINGLE = 9;
+    public static final int LIGHT_TYPE_INPUT_SINGLE = 10001;
 
     /**
      * Type for lights that indicate a group of LED lights representing player ID.
+     * Player ID lights normally present on game controllers are lights that consist of a row of
+     * LEDs.
+     * During multi-player game, the player ID for the current game controller is represented by
+     * one of the LED that is lit according to its position in the row.
      */
-    public static final int LIGHT_TYPE_INPUT_PLAYER_ID = 10;
+    public static final int LIGHT_TYPE_INPUT_PLAYER_ID = 10002;
 
     /**
      * Type for lights that indicate a color LED light.
      */
-    public static final int LIGHT_TYPE_INPUT_RGB = 11;
+    public static final int LIGHT_TYPE_INPUT_RGB = 10003;
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
diff --git a/core/java/android/hardware/lights/LightState.java b/core/java/android/hardware/lights/LightState.java
index 650b383..c6d7f63 100644
--- a/core/java/android/hardware/lights/LightState.java
+++ b/core/java/android/hardware/lights/LightState.java
@@ -18,6 +18,7 @@
 
 import android.annotation.ColorInt;
 import android.annotation.NonNull;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -65,27 +66,61 @@
     }
 
     /**
-     * Creates a new LightState with the desired color and intensity, for a light type
-     * of RBG color or single monochrome color.
-     *
-     * @param color the desired color and intensity in ARGB format.
-     * @return The LightState object contains the color.
+     * Builder for creating device light change requests.
      */
-    @NonNull
-    public static LightState forColor(@ColorInt int color) {
-        return new LightState(color, 0);
-    }
+    public static final class Builder {
+        private int mValue;
+        private boolean mIsForPlayerId;
 
-    /**
-     * Creates a new LightState with the desired player id, for a light of type
-     * {@link android.hardware.lights.Light#LIGHT_TYPE_INPUT_PLAYER_ID}.
-     *
-     * @param playerId the desired player id.
-     * @return The LightState object contains the player id.
-     */
-    @NonNull
-    public static LightState forPlayerId(int playerId) {
-        return new LightState(0, playerId);
+        /** Creates a new {@link LightState.Builder}. */
+        public Builder() {
+            mValue = 0;
+            mIsForPlayerId = false;
+        }
+
+        /**
+         * Set the desired color and intensity of the LightState Builder, for a light type
+         * of RBG color or single monochrome color.
+         *
+         * @param color the desired color and intensity in ARGB format.
+         * @return The {@link LightState.Builder} object contains the light color and intensity.
+         */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        @NonNull
+        public Builder setColor(@ColorInt int color) {
+            mIsForPlayerId = false;
+            mValue = color;
+            return this;
+        }
+
+        /**
+         * Set the desired player id of the LightState Builder, for a light of type
+         * {@link android.hardware.lights.Light#LIGHT_TYPE_INPUT_PLAYER_ID}.
+         *
+         * @param playerId the desired player id.
+         * @return The {@link LightState.Builder} object contains the player id.
+         */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        @NonNull
+        public Builder setPlayerId(int playerId) {
+            mIsForPlayerId = true;
+            mValue = playerId;
+            return this;
+        }
+
+        /**
+         * Create a LightState object used to control lights on the device.
+         *
+         * <p>The generated {@link LightState} should be used in
+         * {@link LightsRequest.Builder#addLight(Light, LightState)}.
+         */
+        public @NonNull LightState build() {
+            if (!mIsForPlayerId) {
+                return new LightState(mValue, 0);
+            } else {
+                return new LightState(0, mValue);
+            }
+        }
     }
 
     /**
diff --git a/core/java/android/hardware/lights/LightsManager.java b/core/java/android/hardware/lights/LightsManager.java
index 8fd56db..cbcef86 100644
--- a/core/java/android/hardware/lights/LightsManager.java
+++ b/core/java/android/hardware/lights/LightsManager.java
@@ -20,6 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
+import android.annotation.TestApi;
 import android.content.Context;
 import android.os.Binder;
 import android.os.IBinder;
@@ -84,11 +85,33 @@
     public abstract @NonNull LightsSession openSession();
 
     /**
+     *
+     * Creates a new {@link LightsSession}
+     *
+     * @param priority the larger this number, the higher the priority of this session when multiple
+     *                 light state requests arrive simultaneously.
+     *
+     * @hide
+     */
+    @TestApi
+    public abstract @NonNull LightsSession openSession(int priority);
+
+    /**
      * Encapsulates a session that can be used to control device lights and represents the lifetime
      * of the requests.
+     *
+     * <p>Any lights requests always live in a lights session which defines the lifecycle of the
+     * lights requests. A lights session is AutoCloseable that will get closed when leaving the
+     * session context.
+     *
+     * <p>Multiple sessions can make lights requests which contains same light. In the case the
+     * LightsManager implementation will arbitrate and honor one of the session's request. When
+     * the session hold the current light request closed, LightsManager implementation will choose
+     * another live session to honor its lights requests.
      */
     public abstract static class LightsSession implements AutoCloseable {
         private final IBinder mToken = new Binder();
+
         /**
          * Sends a request to modify the states of multiple lights.
          *
diff --git a/core/java/android/hardware/lights/LightsRequest.java b/core/java/android/hardware/lights/LightsRequest.java
index 6fb0eb5..8d27dfd 100644
--- a/core/java/android/hardware/lights/LightsRequest.java
+++ b/core/java/android/hardware/lights/LightsRequest.java
@@ -24,7 +24,9 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 /**
  * Encapsulates a request to modify the state of multiple lights.
  *
@@ -51,7 +53,7 @@
     }
 
     /**
-     * Get a list of Light as ids.  The ids will returned in same order as the lights passed
+     * Get a list of Light as ids. The ids will returned in same order as the lights passed
      * in Builder.
      *
      * @return List of light ids
@@ -75,6 +77,18 @@
     }
 
     /**
+     * Get a map of light ids and states.  The map will contain all the light ids as keys and
+     * the corresponding LightState requested as values.
+     */
+    public @NonNull Map<Integer, LightState> getLightsAndStates() {
+        Map<Integer, LightState> map = new HashMap<>();
+        for (int i = 0; i < mLightIds.length; i++) {
+            map.put(mLightIds[i], mLightStates[i]);
+        }
+        return map;
+    }
+
+    /**
      * Builder for creating device light change requests.
      */
     public static final class Builder {
diff --git a/core/java/android/hardware/lights/SystemLightsManager.java b/core/java/android/hardware/lights/SystemLightsManager.java
index 726a613..da034ee 100644
--- a/core/java/android/hardware/lights/SystemLightsManager.java
+++ b/core/java/android/hardware/lights/SystemLightsManager.java
@@ -102,7 +102,28 @@
     public @NonNull LightsSession openSession() {
         try {
             final LightsSession session = new SystemLightsSession();
-            mService.openSession(session.getToken());
+            mService.openSession(session.getToken(), 0);
+            return session;
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     *
+     * Creates a new {@link LightsSession}
+     *
+     * @param priority the larger this number, the higher the priority of this session when multiple
+     *                 light state requests arrive simultaneously.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.CONTROL_DEVICE_LIGHTS)
+    @Override
+    public @NonNull LightsSession openSession(int priority) {
+        try {
+            final LightsSession session = new SystemLightsSession();
+            mService.openSession(session.getToken(), priority);
             return session;
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
index 0766917..5a517ee 100644
--- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
+++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
@@ -49,7 +49,6 @@
     private static final int DO_UPDATE_CURSOR = 95;
     private static final int DO_UPDATE_CURSOR_ANCHOR_INFO = 99;
     private static final int DO_APP_PRIVATE_COMMAND = 100;
-    private static final int DO_TOGGLE_SOFT_INPUT = 105;
     private static final int DO_FINISH_SESSION = 110;
     private static final int DO_VIEW_CLICKED = 115;
     private static final int DO_NOTIFY_IME_HIDDEN = 120;
@@ -123,10 +122,6 @@
                 args.recycle();
                 return;
             }
-            case DO_TOGGLE_SOFT_INPUT: {
-                mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2);
-                return;
-            }
             case DO_FINISH_SESSION: {
                 doFinishSession();
                 return;
@@ -218,12 +213,6 @@
     }
 
     @Override
-    public void toggleSoftInput(int showFlags, int hideFlags) {
-        mCaller.executeOrSendMessage(
-                mCaller.obtainMessageII(DO_TOGGLE_SOFT_INPUT, showFlags, hideFlags));
-    }
-
-    @Override
     public void finishSession() {
         mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_FINISH_SESSION));
     }
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 4b8e37c..1965e55 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -1042,8 +1042,14 @@
         }
         
         /**
-         * 
+         * Handles a request to toggle the IME visibility.
+         *
+         * @deprecated Starting in {@link Build.VERSION_CODES#S} the system no longer invokes this
+         * method, instead it explicitly shows or hides the IME. An {@code InputMethodService}
+         * wishing to toggle its own visibility should instead invoke {@link
+         * InputMethodService#requestShowSelf} or {@link InputMethodService#requestHideSelf}
          */
+        @Deprecated
         public void toggleSoftInput(int showFlags, int hideFlags) {
             InputMethodService.this.onToggleSoftInput(showFlags, hideFlags);
         }
@@ -1627,7 +1633,7 @@
     }
 
     private void reportFullscreenMode() {
-        mPrivOps.reportFullscreenMode(mIsFullscreen);
+        mPrivOps.reportFullscreenModeAsync(mIsFullscreen);
     }
 
     /**
@@ -1941,12 +1947,12 @@
 
     public void showStatusIcon(@DrawableRes int iconResId) {
         mStatusIcon = iconResId;
-        mPrivOps.updateStatusIcon(getPackageName(), iconResId);
+        mPrivOps.updateStatusIconAsync(getPackageName(), iconResId);
     }
 
     public void hideStatusIcon() {
         mStatusIcon = 0;
-        mPrivOps.updateStatusIcon(null, 0);
+        mPrivOps.updateStatusIconAsync(null, 0);
     }
 
     /**
@@ -3313,7 +3319,7 @@
             if (mNotifyUserActionSent) {
                 return;
             }
-            mPrivOps.notifyUserAction();
+            mPrivOps.notifyUserActionAsync();
             mNotifyUserActionSent = true;
         }
     }
diff --git a/core/java/android/inputmethodservice/MultiClientInputMethodClientCallbackAdaptor.java b/core/java/android/inputmethodservice/MultiClientInputMethodClientCallbackAdaptor.java
index 2db9ed1..f352f05 100644
--- a/core/java/android/inputmethodservice/MultiClientInputMethodClientCallbackAdaptor.java
+++ b/core/java/android/inputmethodservice/MultiClientInputMethodClientCallbackAdaptor.java
@@ -257,18 +257,6 @@
         }
 
         @Override
-        public void toggleSoftInput(int showFlags, int hideFlags) {
-            synchronized (mSessionLock) {
-                if (mCallbackImpl == null || mHandler == null) {
-                    return;
-                }
-                mHandler.sendMessage(PooledLambda.obtainMessage(
-                        CallbackImpl::toggleSoftInput, mCallbackImpl, showFlags,
-                        hideFlags));
-            }
-        }
-
-        @Override
         public void finishSession() {
             synchronized (mSessionLock) {
                 if (mCallbackImpl == null || mHandler == null) {
@@ -419,13 +407,6 @@
             mOriginalCallback.onAppPrivateCommand(action, data);
         }
 
-        void toggleSoftInput(int showFlags, int hideFlags) {
-            if (mFinished) {
-                return;
-            }
-            mOriginalCallback.onToggleSoftInput(showFlags, hideFlags);
-        }
-
         void finishSession() {
             if (mFinished) {
                 return;
diff --git a/core/java/android/inputmethodservice/MultiClientInputMethodServiceDelegate.java b/core/java/android/inputmethodservice/MultiClientInputMethodServiceDelegate.java
index 4b02085..0a23165 100644
--- a/core/java/android/inputmethodservice/MultiClientInputMethodServiceDelegate.java
+++ b/core/java/android/inputmethodservice/MultiClientInputMethodServiceDelegate.java
@@ -167,16 +167,6 @@
 
         /**
          * Called when the associated IME client called {@link
-         * android.view.inputmethod.InputMethodManager#toggleSoftInput(int, int)}.
-         *
-         * @param showFlags The flag passed by the client.
-         * @param hideFlags The flag passed by the client.
-         * @see android.inputmethodservice.InputMethodService#onToggleSoftInput(int, int)
-         */
-        void onToggleSoftInput(int showFlags, int hideFlags);
-
-        /**
-         * Called when the associated IME client called {@link
          * android.view.inputmethod.InputMethodManager#updateCursorAnchorInfo(View,
          * CursorAnchorInfo)}.
          *
diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java
index 1eef7d9..3bde6fa 100644
--- a/core/java/android/net/NetworkIdentity.java
+++ b/core/java/android/net/NetworkIdentity.java
@@ -186,19 +186,19 @@
      */
     public static NetworkIdentity buildNetworkIdentity(Context context,
             NetworkStateSnapshot snapshot, boolean defaultNetwork, @NetworkType int subType) {
-        final int legacyType = snapshot.legacyType;
+        final int legacyType = snapshot.getLegacyType();
 
-        final String subscriberId = snapshot.subscriberId;
+        final String subscriberId = snapshot.getSubscriberId();
         String networkId = null;
-        boolean roaming = !snapshot.networkCapabilities.hasCapability(
+        boolean roaming = !snapshot.getNetworkCapabilities().hasCapability(
                 NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
-        boolean metered = !snapshot.networkCapabilities.hasCapability(
+        boolean metered = !snapshot.getNetworkCapabilities().hasCapability(
                 NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
 
-        final int oemManaged = getOemBitfield(snapshot.networkCapabilities);
+        final int oemManaged = getOemBitfield(snapshot.getNetworkCapabilities());
 
         if (legacyType == TYPE_WIFI) {
-            networkId = snapshot.networkCapabilities.getSsid();
+            networkId = snapshot.getNetworkCapabilities().getSsid();
             if (networkId == null) {
                 final WifiManager wifi = context.getSystemService(WifiManager.class);
                 final WifiInfo info = wifi.getConnectionInfo();
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 053856b..7ebb646 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -767,7 +767,6 @@
      *                       blocked.
      * @hide
      */
-    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
     @NonNull
     public static String blockedReasonsToString(int blockedReasons) {
         return DebugUtils.flagsToString(ConnectivityManager.class, "BLOCKED_", blockedReasons);
diff --git a/core/java/android/net/NetworkStateSnapshot.java b/core/java/android/net/NetworkStateSnapshot.java
index 0d26c2d..9df861a 100644
--- a/core/java/android/net/NetworkStateSnapshot.java
+++ b/core/java/android/net/NetworkStateSnapshot.java
@@ -37,47 +37,76 @@
 public final class NetworkStateSnapshot implements Parcelable {
     /** The network associated with this snapshot. */
     @NonNull
-    public final Network network;
+    private final Network mNetwork;
 
     /** The {@link NetworkCapabilities} of the network associated with this snapshot. */
     @NonNull
-    public final NetworkCapabilities networkCapabilities;
+    private final NetworkCapabilities mNetworkCapabilities;
 
     /** The {@link LinkProperties} of the network associated with this snapshot. */
     @NonNull
-    public final LinkProperties linkProperties;
+    private final LinkProperties mLinkProperties;
 
     /**
      * The Subscriber Id of the network associated with this snapshot. See
      * {@link android.telephony.TelephonyManager#getSubscriberId()}.
      */
     @Nullable
-    public final String subscriberId;
+    private final String mSubscriberId;
 
     /**
      * The legacy type of the network associated with this snapshot. See
      * {@code ConnectivityManager#TYPE_*}.
      */
-    public final int legacyType;
+    private final int mLegacyType;
 
     public NetworkStateSnapshot(@NonNull Network network,
             @NonNull NetworkCapabilities networkCapabilities,
             @NonNull LinkProperties linkProperties,
             @Nullable String subscriberId, int legacyType) {
-        this.network = Objects.requireNonNull(network);
-        this.networkCapabilities = Objects.requireNonNull(networkCapabilities);
-        this.linkProperties = Objects.requireNonNull(linkProperties);
-        this.subscriberId = subscriberId;
-        this.legacyType = legacyType;
+        mNetwork = Objects.requireNonNull(network);
+        mNetworkCapabilities = Objects.requireNonNull(networkCapabilities);
+        mLinkProperties = Objects.requireNonNull(linkProperties);
+        mSubscriberId = subscriberId;
+        mLegacyType = legacyType;
     }
 
     /** @hide */
     public NetworkStateSnapshot(@NonNull Parcel in) {
-        network = in.readParcelable(null);
-        networkCapabilities = in.readParcelable(null);
-        linkProperties = in.readParcelable(null);
-        subscriberId = in.readString();
-        legacyType = in.readInt();
+        mNetwork = in.readParcelable(null);
+        mNetworkCapabilities = in.readParcelable(null);
+        mLinkProperties = in.readParcelable(null);
+        mSubscriberId = in.readString();
+        mLegacyType = in.readInt();
+    }
+
+    /** Get the network associated with this snapshot */
+    @NonNull
+    public Network getNetwork() {
+        return mNetwork;
+    }
+
+    /** Get {@link NetworkCapabilities} of the network associated with this snapshot. */
+    @NonNull
+    public NetworkCapabilities getNetworkCapabilities() {
+        return mNetworkCapabilities;
+    }
+
+    /** Get the {@link LinkProperties} of the network associated with this snapshot. */
+    @NonNull
+    public LinkProperties getLinkProperties() {
+        return mLinkProperties;
+    }
+
+    /** Get the Subscriber Id of the network associated with this snapshot. */
+    @Nullable
+    public String getSubscriberId() {
+        return mSubscriberId;
+    }
+
+    /** Get the legacy type of the network associated with this snapshot. */
+    public int getLegacyType() {
+        return mLegacyType;
     }
 
     @Override
@@ -87,11 +116,11 @@
 
     @Override
     public void writeToParcel(@NonNull Parcel out, int flags) {
-        out.writeParcelable(network, flags);
-        out.writeParcelable(networkCapabilities, flags);
-        out.writeParcelable(linkProperties, flags);
-        out.writeString(subscriberId);
-        out.writeInt(legacyType);
+        out.writeParcelable(mNetwork, flags);
+        out.writeParcelable(mNetworkCapabilities, flags);
+        out.writeParcelable(mLinkProperties, flags);
+        out.writeString(mSubscriberId);
+        out.writeInt(mLegacyType);
     }
 
     @NonNull
@@ -115,26 +144,27 @@
         if (this == o) return true;
         if (!(o instanceof NetworkStateSnapshot)) return false;
         NetworkStateSnapshot that = (NetworkStateSnapshot) o;
-        return legacyType == that.legacyType
-                && Objects.equals(network, that.network)
-                && Objects.equals(networkCapabilities, that.networkCapabilities)
-                && Objects.equals(linkProperties, that.linkProperties)
-                && Objects.equals(subscriberId, that.subscriberId);
+        return mLegacyType == that.mLegacyType
+                && Objects.equals(mNetwork, that.mNetwork)
+                && Objects.equals(mNetworkCapabilities, that.mNetworkCapabilities)
+                && Objects.equals(mLinkProperties, that.mLinkProperties)
+                && Objects.equals(mSubscriberId, that.mSubscriberId);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(network, networkCapabilities, linkProperties, subscriberId, legacyType);
+        return Objects.hash(mNetwork,
+                mNetworkCapabilities, mLinkProperties, mSubscriberId, mLegacyType);
     }
 
     @Override
     public String toString() {
         return "NetworkStateSnapshot{"
-                + "network=" + network
-                + ", networkCapabilities=" + networkCapabilities
-                + ", linkProperties=" + linkProperties
-                + ", subscriberId='" + NetworkIdentityUtils.scrubSubscriberId(subscriberId) + '\''
-                + ", legacyType=" + legacyType
+                + "network=" + mNetwork
+                + ", networkCapabilities=" + mNetworkCapabilities
+                + ", linkProperties=" + mLinkProperties
+                + ", subscriberId='" + NetworkIdentityUtils.scrubSubscriberId(mSubscriberId) + '\''
+                + ", legacyType=" + mLegacyType
                 + '}';
     }
 }
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index d42beae..6ccbab7 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -38,6 +38,7 @@
 import java.lang.annotation.RetentionPolicy;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.function.Predicate;
@@ -1423,11 +1424,11 @@
      * @hide
      */
     public void migrateTun(int tunUid, @NonNull String tunIface,
-            @NonNull String[] underlyingIfaces) {
+            @NonNull List<String> underlyingIfaces) {
         // Combined usage by all apps using VPN.
         final Entry tunIfaceTotal = new Entry();
         // Usage by VPN, grouped by its {@code underlyingIfaces}.
-        final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.length];
+        final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.size()];
         // Usage by VPN, summed across all its {@code underlyingIfaces}.
         final Entry underlyingIfacesTotal = new Entry();
 
@@ -1468,7 +1469,7 @@
      *     {@code underlyingIfaces}
      */
     private void tunAdjustmentInit(int tunUid, @NonNull String tunIface,
-            @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal,
+            @NonNull List<String> underlyingIfaces, @NonNull Entry tunIfaceTotal,
             @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) {
         final Entry recycle = new Entry();
         for (int i = 0; i < size; i++) {
@@ -1488,8 +1489,8 @@
 
             if (recycle.uid == tunUid) {
                 // Add up traffic through tunUid's underlying interfaces.
-                for (int j = 0; j < underlyingIfaces.length; j++) {
-                    if (Objects.equals(underlyingIfaces[j], recycle.iface)) {
+                for (int j = 0; j < underlyingIfaces.size(); j++) {
+                    if (Objects.equals(underlyingIfaces.get(j), recycle.iface)) {
                         perInterfaceTotal[j].add(recycle);
                         underlyingIfacesTotal.add(recycle);
                         break;
@@ -1515,12 +1516,12 @@
      *     underlyingIfaces}
      */
     private Entry[] addTrafficToApplications(int tunUid, @NonNull String tunIface,
-            @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal,
+            @NonNull List<String> underlyingIfaces, @NonNull Entry tunIfaceTotal,
             @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) {
         // Traffic that should be moved off of each underlying interface for tunUid (see
         // deductTrafficFromVpnApp below).
-        final Entry[] moved = new Entry[underlyingIfaces.length];
-        for (int i = 0; i < underlyingIfaces.length; i++) {
+        final Entry[] moved = new Entry[underlyingIfaces.size()];
+        for (int i = 0; i < underlyingIfaces.size(); i++) {
             moved[i] = new Entry();
         }
 
@@ -1582,8 +1583,8 @@
             }
             // In a second pass, distribute these values across interfaces in the proportion that
             // each interface represents of the total traffic of the underlying interfaces.
-            for (int j = 0; j < underlyingIfaces.length; j++) {
-                tmpEntry.iface = underlyingIfaces[j];
+            for (int j = 0; j < underlyingIfaces.size(); j++) {
+                tmpEntry.iface = underlyingIfaces.get(j);
                 tmpEntry.rxBytes = 0;
                 // Reset 'set' to correct value since it gets updated when adding debug info below.
                 tmpEntry.set = set[i];
@@ -1638,14 +1639,14 @@
 
     private void deductTrafficFromVpnApp(
             int tunUid,
-            @NonNull String[] underlyingIfaces,
+            @NonNull List<String> underlyingIfaces,
             @NonNull Entry[] moved) {
-        for (int i = 0; i < underlyingIfaces.length; i++) {
+        for (int i = 0; i < underlyingIfaces.size(); i++) {
             moved[i].uid = tunUid;
             // Add debug info
             moved[i].set = SET_DBG_VPN_OUT;
             moved[i].tag = TAG_NONE;
-            moved[i].iface = underlyingIfaces[i];
+            moved[i].iface = underlyingIfaces.get(i);
             moved[i].metered = METERED_ALL;
             moved[i].roaming = ROAMING_ALL;
             moved[i].defaultNetwork = DEFAULT_NETWORK_ALL;
@@ -1658,7 +1659,7 @@
             // METERED_NO, which should be the case as it comes directly from the /proc file.
             // We only blend in the roaming data after applying these adjustments, by checking the
             // NetworkIdentity of the underlying iface.
-            final int idxVpnBackground = findIndex(underlyingIfaces[i], tunUid, SET_DEFAULT,
+            final int idxVpnBackground = findIndex(underlyingIfaces.get(i), tunUid, SET_DEFAULT,
                             TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO);
             if (idxVpnBackground != -1) {
                 // Note - tunSubtract also updates moved[i]; whatever traffic that's left is removed
@@ -1666,7 +1667,7 @@
                 tunSubtract(idxVpnBackground, this, moved[i]);
             }
 
-            final int idxVpnForeground = findIndex(underlyingIfaces[i], tunUid, SET_FOREGROUND,
+            final int idxVpnForeground = findIndex(underlyingIfaces.get(i), tunUid, SET_FOREGROUND,
                             TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO);
             if (idxVpnForeground != -1) {
                 tunSubtract(idxVpnForeground, this, moved[i]);
diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java
index c83dd99..d3c8957 100644
--- a/core/java/android/net/NetworkTemplate.java
+++ b/core/java/android/net/NetworkTemplate.java
@@ -82,6 +82,24 @@
     public static final int MATCH_WIFI_WILDCARD = 7;
     public static final int MATCH_BLUETOOTH = 8;
     public static final int MATCH_PROXY = 9;
+    public static final int MATCH_CARRIER = 10;
+
+    /**
+     * Value of the match rule of the subscriberId to match networks with specific subscriberId.
+     */
+    public static final int SUBSCRIBER_ID_MATCH_RULE_EXACT = 0;
+    /**
+     * Value of the match rule of the subscriberId to match networks with any subscriberId which
+     * includes null and non-null.
+     */
+    public static final int SUBSCRIBER_ID_MATCH_RULE_ALL = 1;
+
+    /**
+     * Wi-Fi Network ID is never supposed to be null (if it is, it is a bug that
+     * should be fixed), so it's not possible to want to match null vs
+     * non-null. Therefore it's fine to use null as a sentinel for Network ID.
+     */
+    public static final String WIFI_NETWORKID_ALL = null;
 
     /**
      * Include all network types when filtering. This is meant to merge in with the
@@ -125,6 +143,7 @@
             case MATCH_WIFI_WILDCARD:
             case MATCH_BLUETOOTH:
             case MATCH_PROXY:
+            case MATCH_CARRIER:
                 return true;
 
             default:
@@ -168,10 +187,12 @@
             @NetworkType int ratType) {
         if (TextUtils.isEmpty(subscriberId)) {
             return new NetworkTemplate(MATCH_MOBILE_WILDCARD, null, null, null,
-                    METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL);
+                    METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL,
+                    SUBSCRIBER_ID_MATCH_RULE_EXACT);
         }
         return new NetworkTemplate(MATCH_MOBILE, subscriberId, new String[]{subscriberId}, null,
-                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL);
+                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT);
     }
 
     /**
@@ -189,6 +210,8 @@
      */
     @UnsupportedAppUsage
     public static NetworkTemplate buildTemplateWifiWildcard() {
+        // TODO: Consider replace this with MATCH_WIFI with NETWORK_ID_ALL
+        // and SUBSCRIBER_ID_MATCH_RULE_ALL.
         return new NetworkTemplate(MATCH_WIFI_WILDCARD, null, null);
     }
 
@@ -202,8 +225,27 @@
      * Template to match {@link ConnectivityManager#TYPE_WIFI} networks with the
      * given SSID.
      */
-    public static NetworkTemplate buildTemplateWifi(String networkId) {
-        return new NetworkTemplate(MATCH_WIFI, null, networkId);
+    public static NetworkTemplate buildTemplateWifi(@NonNull String networkId) {
+        Objects.requireNonNull(networkId);
+        return new NetworkTemplate(MATCH_WIFI, null /* subscriberId */,
+                new String[] { null } /* matchSubscriberIds */,
+                networkId, METERED_ALL, ROAMING_ALL,
+                DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL,
+                SUBSCRIBER_ID_MATCH_RULE_ALL);
+    }
+
+    /**
+     * Template to match all {@link ConnectivityManager#TYPE_WIFI} networks with the given SSID,
+     * and IMSI.
+     *
+     * Call with {@link #WIFI_NETWORKID_ALL} for {@code networkId} to get result regardless of SSID.
+     */
+    public static NetworkTemplate buildTemplateWifi(@Nullable String networkId,
+            @Nullable String subscriberId) {
+        return new NetworkTemplate(MATCH_WIFI, subscriberId, new String[] { subscriberId },
+                networkId, METERED_ALL, ROAMING_ALL,
+                DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT);
     }
 
     /**
@@ -231,6 +273,14 @@
         return new NetworkTemplate(MATCH_PROXY, null, null);
     }
 
+    /**
+     * Template to match all carrier networks with the given IMSI.
+     */
+    public static NetworkTemplate buildTemplateCarrier(@NonNull String subscriberId) {
+        Objects.requireNonNull(subscriberId);
+        return new NetworkTemplate(MATCH_CARRIER, subscriberId, null);
+    }
+
     private final int mMatchRule;
     private final String mSubscriberId;
 
@@ -251,10 +301,26 @@
     private final int mRoaming;
     private final int mDefaultNetwork;
     private final int mSubType;
+    private final int mSubscriberIdMatchRule;
 
     // Bitfield containing OEM network properties{@code NetworkIdentity#OEM_*}.
     private final int mOemManaged;
 
+    private void checkValidSubscriberIdMatchRule() {
+        switch (mMatchRule) {
+            case MATCH_MOBILE:
+            case MATCH_CARRIER:
+                // MOBILE and CARRIER templates must always specify a subscriber ID.
+                if (mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL) {
+                    throw new IllegalArgumentException("Invalid SubscriberIdMatchRule"
+                            + "on match rule: " + getMatchRuleName(mMatchRule));
+                }
+                return;
+            default:
+                return;
+        }
+    }
+
     @UnsupportedAppUsage
     public NetworkTemplate(int matchRule, String subscriberId, String networkId) {
         this(matchRule, subscriberId, new String[] { subscriberId }, networkId);
@@ -263,14 +329,25 @@
     public NetworkTemplate(int matchRule, String subscriberId, String[] matchSubscriberIds,
             String networkId) {
         this(matchRule, subscriberId, matchSubscriberIds, networkId, METERED_ALL, ROAMING_ALL,
-                DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL);
+                DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT);
+    }
+
+    // TODO: Remove it after updating all of the caller.
+    public NetworkTemplate(int matchRule, String subscriberId, String[] matchSubscriberIds,
+            String networkId, int metered, int roaming, int defaultNetwork, int subType,
+            int oemManaged) {
+        this(matchRule, subscriberId, matchSubscriberIds, networkId, metered, roaming,
+                defaultNetwork, subType, oemManaged, SUBSCRIBER_ID_MATCH_RULE_EXACT);
     }
 
     public NetworkTemplate(int matchRule, String subscriberId, String[] matchSubscriberIds,
             String networkId, int metered, int roaming, int defaultNetwork, int subType,
-            int oemManaged) {
+            int oemManaged, int subscriberIdMatchRule) {
         mMatchRule = matchRule;
         mSubscriberId = subscriberId;
+        // TODO: Check whether mMatchSubscriberIds = null or mMatchSubscriberIds = {null} when
+        // mSubscriberId is null
         mMatchSubscriberIds = matchSubscriberIds;
         mNetworkId = networkId;
         mMetered = metered;
@@ -278,7 +355,8 @@
         mDefaultNetwork = defaultNetwork;
         mSubType = subType;
         mOemManaged = oemManaged;
-
+        mSubscriberIdMatchRule = subscriberIdMatchRule;
+        checkValidSubscriberIdMatchRule();
         if (!isKnownMatchRule(matchRule)) {
             Log.e(TAG, "Unknown network template rule " + matchRule
                     + " will not match any identity.");
@@ -295,6 +373,7 @@
         mDefaultNetwork = in.readInt();
         mSubType = in.readInt();
         mOemManaged = in.readInt();
+        mSubscriberIdMatchRule = in.readInt();
     }
 
     @Override
@@ -308,6 +387,7 @@
         dest.writeInt(mDefaultNetwork);
         dest.writeInt(mSubType);
         dest.writeInt(mOemManaged);
+        dest.writeInt(mSubscriberIdMatchRule);
     }
 
     @Override
@@ -346,13 +426,15 @@
         if (mOemManaged != OEM_MANAGED_ALL) {
             builder.append(", oemManaged=").append(mOemManaged);
         }
+        builder.append(", subscriberIdMatchRule=")
+                .append(subscriberIdMatchRuleToString(mSubscriberIdMatchRule));
         return builder.toString();
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(mMatchRule, mSubscriberId, mNetworkId, mMetered, mRoaming,
-                mDefaultNetwork, mSubType, mOemManaged);
+                mDefaultNetwork, mSubType, mOemManaged, mSubscriberIdMatchRule);
     }
 
     @Override
@@ -366,11 +448,23 @@
                     && mRoaming == other.mRoaming
                     && mDefaultNetwork == other.mDefaultNetwork
                     && mSubType == other.mSubType
-                    && mOemManaged == other.mOemManaged;
+                    && mOemManaged == other.mOemManaged
+                    && mSubscriberIdMatchRule == other.mSubscriberIdMatchRule;
         }
         return false;
     }
 
+    private String subscriberIdMatchRuleToString(int rule) {
+        switch (rule) {
+            case SUBSCRIBER_ID_MATCH_RULE_EXACT:
+                return "EXACT_MATCH";
+            case SUBSCRIBER_ID_MATCH_RULE_ALL:
+                return "ALL";
+            default:
+                return "Unknown rule " + rule;
+        }
+    }
+
     public boolean isMatchRuleMobile() {
         switch (mMatchRule) {
             case MATCH_MOBILE:
@@ -386,6 +480,14 @@
             case MATCH_MOBILE_WILDCARD:
             case MATCH_WIFI_WILDCARD:
                 return false;
+            case MATCH_CARRIER:
+                return mSubscriberId != null;
+            case MATCH_WIFI:
+                if (Objects.equals(mNetworkId, WIFI_NETWORKID_ALL)
+                        && mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL) {
+                    return false;
+                }
+                return true;
             default:
                 return true;
         }
@@ -405,6 +507,10 @@
         return mNetworkId;
     }
 
+    public int getSubscriberIdMatchRule() {
+        return mSubscriberIdMatchRule;
+    }
+
     /**
      * Test if given {@link NetworkIdentity} matches this template.
      */
@@ -429,6 +535,8 @@
                 return matchesBluetooth(ident);
             case MATCH_PROXY:
                 return matchesProxy(ident);
+            case MATCH_CARRIER:
+                return matchesCarrier(ident);
             default:
                 // We have no idea what kind of network template we are, so we
                 // just claim not to match anything.
@@ -466,8 +574,23 @@
                 || getCollapsedRatType(mSubType) == getCollapsedRatType(ident.mSubType);
     }
 
-    public boolean matchesSubscriberId(String subscriberId) {
-        return ArrayUtils.contains(mMatchSubscriberIds, subscriberId);
+    /**
+     * Check if this template matches {@code subscriberId}. Returns true if this
+     * template was created with {@code SUBSCRIBER_ID_MATCH_RULE_ALL}, or with a
+     * {@code mMatchSubscriberIds} array that contains {@code subscriberId}.
+     */
+    public boolean matchesSubscriberId(@Nullable String subscriberId) {
+        return mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL
+                || ArrayUtils.contains(mMatchSubscriberIds, subscriberId);
+    }
+
+    /**
+     * Check if network with matching SSID. Returns true when the SSID matches, or when
+     * {@code mNetworkId} is {@code WIFI_NETWORKID_ALL}.
+     */
+    private boolean matchesWifiNetworkId(@Nullable String networkId) {
+        return Objects.equals(mNetworkId, WIFI_NETWORKID_ALL)
+                || Objects.equals(sanitizeSsid(mNetworkId), sanitizeSsid(networkId));
     }
 
     /**
@@ -566,8 +689,8 @@
     private boolean matchesWifi(NetworkIdentity ident) {
         switch (ident.mType) {
             case TYPE_WIFI:
-                return Objects.equals(
-                        sanitizeSsid(mNetworkId), sanitizeSsid(ident.mNetworkId));
+                return matchesSubscriberId(ident.mSubscriberId)
+                        && matchesWifiNetworkId(ident.mNetworkId);
             default:
                 return false;
         }
@@ -583,6 +706,15 @@
         return false;
     }
 
+    /**
+     * Check if matches carrier network. The carrier networks means it includes the subscriberId.
+     */
+    private boolean matchesCarrier(NetworkIdentity ident) {
+        return ident.mSubscriberId != null
+                && !ArrayUtils.isEmpty(mMatchSubscriberIds)
+                && ArrayUtils.contains(mMatchSubscriberIds, ident.mSubscriberId);
+    }
+
     private boolean matchesMobileWildcard(NetworkIdentity ident) {
         if (ident.mType == TYPE_WIMAX) {
             return true;
@@ -635,6 +767,8 @@
                 return "BLUETOOTH";
             case MATCH_PROXY:
                 return "PROXY";
+            case MATCH_CARRIER:
+                return "CARRIER";
             default:
                 return "UNKNOWN(" + matchRule + ")";
         }
diff --git a/core/java/android/net/Proxy.java b/core/java/android/net/Proxy.java
index 77c8a4f..1927e20 100644
--- a/core/java/android/net/Proxy.java
+++ b/core/java/android/net/Proxy.java
@@ -60,6 +60,7 @@
      * {@link ConnectivityManager#getDefaultProxy()} or
      * {@link ConnectivityManager#getLinkProperties(Network)}.{@link LinkProperties#getHttpProxy()}
      * to get the proxy for the Network(s) they are using.
+     * @removed
      */
     @Deprecated
     public static final String EXTRA_PROXY_INFO = "android.intent.extra.PROXY_INFO";
diff --git a/core/java/android/net/UnderlyingNetworkInfo.java b/core/java/android/net/UnderlyingNetworkInfo.java
index 7bf9231..33f9375 100644
--- a/core/java/android/net/UnderlyingNetworkInfo.java
+++ b/core/java/android/net/UnderlyingNetworkInfo.java
@@ -37,36 +37,56 @@
 @SystemApi(client = MODULE_LIBRARIES)
 public final class UnderlyingNetworkInfo implements Parcelable {
     /** The owner of this network. */
-    public final int ownerUid;
+    private final int mOwnerUid;
+
     /** The interface name of this network. */
     @NonNull
-    public final String iface;
+    private final String mIface;
+
     /** The names of the interfaces underlying this network. */
     @NonNull
-    public final List<String> underlyingIfaces;
+    private final List<String> mUnderlyingIfaces;
 
     public UnderlyingNetworkInfo(int ownerUid, @NonNull String iface,
             @NonNull List<String> underlyingIfaces) {
         Objects.requireNonNull(iface);
         Objects.requireNonNull(underlyingIfaces);
-        this.ownerUid = ownerUid;
-        this.iface = iface;
-        this.underlyingIfaces = Collections.unmodifiableList(new ArrayList<>(underlyingIfaces));
+        mOwnerUid = ownerUid;
+        mIface = iface;
+        mUnderlyingIfaces = Collections.unmodifiableList(new ArrayList<>(underlyingIfaces));
     }
 
     private UnderlyingNetworkInfo(@NonNull Parcel in) {
-        this.ownerUid = in.readInt();
-        this.iface = in.readString();
-        this.underlyingIfaces = new ArrayList<>();
-        in.readList(this.underlyingIfaces, null /*classLoader*/);
+        mOwnerUid = in.readInt();
+        mIface = in.readString();
+        List<String> underlyingIfaces = new ArrayList<>();
+        in.readList(underlyingIfaces, null /*classLoader*/);
+        mUnderlyingIfaces = Collections.unmodifiableList(underlyingIfaces);
+    }
+
+    /** Get the owner of this network. */
+    public int getOwnerUid() {
+        return mOwnerUid;
+    }
+
+    /** Get the interface name of this network. */
+    @NonNull
+    public String getInterface() {
+        return mIface;
+    }
+
+    /** Get the names of the interfaces underlying this network. */
+    @NonNull
+    public List<String> getUnderlyingInterfaces() {
+        return mUnderlyingIfaces;
     }
 
     @Override
     public String toString() {
         return "UnderlyingNetworkInfo{"
-                + "ownerUid=" + ownerUid
-                + ", iface='" + iface + '\''
-                + ", underlyingIfaces='" + underlyingIfaces.toString() + '\''
+                + "ownerUid=" + mOwnerUid
+                + ", iface='" + mIface + '\''
+                + ", underlyingIfaces='" + mUnderlyingIfaces.toString() + '\''
                 + '}';
     }
 
@@ -77,9 +97,9 @@
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeInt(ownerUid);
-        dest.writeString(iface);
-        dest.writeList(underlyingIfaces);
+        dest.writeInt(mOwnerUid);
+        dest.writeString(mIface);
+        dest.writeList(mUnderlyingIfaces);
     }
 
     @NonNull
@@ -103,13 +123,13 @@
         if (this == o) return true;
         if (!(o instanceof UnderlyingNetworkInfo)) return false;
         final UnderlyingNetworkInfo that = (UnderlyingNetworkInfo) o;
-        return ownerUid == that.ownerUid
-                && Objects.equals(iface, that.iface)
-                && Objects.equals(underlyingIfaces, that.underlyingIfaces);
+        return mOwnerUid == that.getOwnerUid()
+                && Objects.equals(mIface, that.getInterface())
+                && Objects.equals(mUnderlyingIfaces, that.getUnderlyingInterfaces());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(ownerUid, iface, underlyingIfaces);
+        return Objects.hash(mOwnerUid, mIface, mUnderlyingIfaces);
     }
 }
diff --git a/core/java/android/net/vcn/IVcnManagementService.aidl b/core/java/android/net/vcn/IVcnManagementService.aidl
index 5b79f73..e16f6b1 100644
--- a/core/java/android/net/vcn/IVcnManagementService.aidl
+++ b/core/java/android/net/vcn/IVcnManagementService.aidl
@@ -24,12 +24,15 @@
 import android.net.vcn.VcnUnderlyingNetworkPolicy;
 import android.os.ParcelUuid;
 
+import java.util.List;
+
 /**
  * @hide
  */
 interface IVcnManagementService {
     void setVcnConfig(in ParcelUuid subscriptionGroup, in VcnConfig config, in String opPkgName);
     void clearVcnConfig(in ParcelUuid subscriptionGroup, in String opPkgName);
+    List<ParcelUuid> getConfiguredSubscriptionGroups(in String opPkgName);
 
     void addVcnUnderlyingNetworkPolicyListener(in IVcnUnderlyingNetworkPolicyListener listener);
     void removeVcnUnderlyingNetworkPolicyListener(in IVcnUnderlyingNetworkPolicyListener listener);
diff --git a/core/java/android/net/vcn/VcnControlPlaneConfig.java b/core/java/android/net/vcn/VcnControlPlaneConfig.java
deleted file mode 100644
index 92f6c44..0000000
--- a/core/java/android/net/vcn/VcnControlPlaneConfig.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.net.vcn;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.os.PersistableBundle;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-/**
- * This class represents a control plane configuration for a Virtual Carrier Network connection.
- *
- * <p>Each {@link VcnGatewayConnectionConfig} must have a {@link VcnControlPlaneConfig}, containing
- * all connection, authentication and authorization parameters required to establish a Gateway
- * Connection with a remote endpoint.
- *
- * <p>A {@link VcnControlPlaneConfig} object can be shared by multiple {@link
- * VcnGatewayConnectionConfig}(s) if they will used for connecting with the same remote endpoint.
- *
- * @see VcnManager
- * @see VcnGatewayConnectionConfig
- */
-public abstract class VcnControlPlaneConfig {
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({CONFIG_TYPE_IKE})
-    public @interface ConfigType {}
-
-    /** @hide */
-    public static final int CONFIG_TYPE_IKE = 1;
-
-    private static final String CONFIG_TYPE_KEY = "mConfigType";
-    @ConfigType private final int mConfigType;
-
-    /**
-     * Package private constructor.
-     *
-     * @hide
-     */
-    VcnControlPlaneConfig(int configType) {
-        mConfigType = configType;
-    }
-
-    /**
-     * Constructs a VcnControlPlaneConfig object by deserializing a PersistableBundle.
-     *
-     * @param in the {@link PersistableBundle} containing an {@link VcnControlPlaneConfig} object
-     * @hide
-     */
-    public static VcnControlPlaneConfig fromPersistableBundle(@NonNull PersistableBundle in) {
-        Objects.requireNonNull(in, "PersistableBundle was null");
-
-        int configType = in.getInt(CONFIG_TYPE_KEY);
-        switch (configType) {
-            case CONFIG_TYPE_IKE:
-                return new VcnControlPlaneIkeConfig(in);
-            default:
-                throw new IllegalStateException("Unrecognized configType: " + configType);
-        }
-    }
-
-    /**
-     * Converts this VcnControlPlaneConfig to a PersistableBundle.
-     *
-     * @hide
-     */
-    @NonNull
-    public PersistableBundle toPersistableBundle() {
-        final PersistableBundle result = new PersistableBundle();
-        result.putInt(CONFIG_TYPE_KEY, mConfigType);
-        return result;
-    }
-
-    /** @hide */
-    @Override
-    public int hashCode() {
-        return Objects.hash(mConfigType);
-    }
-
-    /** @hide */
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof VcnControlPlaneConfig)) {
-            return false;
-        }
-
-        return mConfigType == ((VcnControlPlaneConfig) o).mConfigType;
-    }
-
-    /**
-     * Returns a deep copy of this object.
-     *
-     * @hide
-     */
-    public abstract VcnControlPlaneConfig copy();
-}
diff --git a/core/java/android/net/vcn/VcnControlPlaneIkeConfig.java b/core/java/android/net/vcn/VcnControlPlaneIkeConfig.java
deleted file mode 100644
index 22d7faf..0000000
--- a/core/java/android/net/vcn/VcnControlPlaneIkeConfig.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.vcn;
-
-import static android.net.vcn.VcnControlPlaneConfig.CONFIG_TYPE_IKE;
-
-import android.annotation.NonNull;
-import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.TunnelModeChildSessionParams;
-import android.net.vcn.persistablebundleutils.IkeSessionParamsUtils;
-import android.net.vcn.persistablebundleutils.TunnelModeChildSessionParamsUtils;
-import android.os.PersistableBundle;
-import android.util.ArraySet;
-import android.util.Log;
-
-import java.util.Objects;
-
-/**
- * This class is an IKEv2 control plane configuration for a Virtual Carrier Network connection.
- *
- * <p>This class is an extension of the {@link VcnControlPlaneConfig}, containing IKEv2-specific
- * configuration, authentication and authorization parameters.
- *
- * @see VcnControlPlaneConfig
- */
-public final class VcnControlPlaneIkeConfig extends VcnControlPlaneConfig {
-    private static final String TAG = VcnControlPlaneIkeConfig.class.getSimpleName();
-
-    private static final String IKE_PARAMS_KEY = "mIkeParams";
-    @NonNull private final IkeSessionParams mIkeParams;
-
-    private static final String CHILD_PARAMS_KEY = "mChildParams";
-    @NonNull private final TunnelModeChildSessionParams mChildParams;
-
-    private static final ArraySet<String> BUNDLE_KEY_SET = new ArraySet<>();
-
-    {
-        BUNDLE_KEY_SET.add(IKE_PARAMS_KEY);
-        BUNDLE_KEY_SET.add(CHILD_PARAMS_KEY);
-    }
-
-    /**
-     * Constructs a VcnControlPlaneIkeConfig object.
-     *
-     * @param ikeParams the IKE Session negotiation parameters
-     * @param childParams the tunnel mode Child Session negotiation parameters
-     */
-    public VcnControlPlaneIkeConfig(
-            @NonNull IkeSessionParams ikeParams,
-            @NonNull TunnelModeChildSessionParams childParams) {
-        super(CONFIG_TYPE_IKE);
-        mIkeParams = ikeParams;
-        mChildParams = childParams;
-        validate();
-    }
-
-    /**
-     * Constructs a VcnControlPlaneIkeConfig object by deserializing a PersistableBundle.
-     *
-     * @param in the {@link PersistableBundle} containing an {@link VcnControlPlaneIkeConfig} object
-     * @hide
-     */
-    public VcnControlPlaneIkeConfig(@NonNull PersistableBundle in) {
-        super(CONFIG_TYPE_IKE);
-        final PersistableBundle ikeParamsBundle = in.getPersistableBundle(IKE_PARAMS_KEY);
-        final PersistableBundle childParamsBundle = in.getPersistableBundle(CHILD_PARAMS_KEY);
-
-        Objects.requireNonNull(ikeParamsBundle, "IKE Session Params was null");
-        Objects.requireNonNull(childParamsBundle, "Child Session Params was null");
-
-        mIkeParams = IkeSessionParamsUtils.fromPersistableBundle(ikeParamsBundle);
-        mChildParams = TunnelModeChildSessionParamsUtils.fromPersistableBundle(childParamsBundle);
-
-        for (String key : in.keySet()) {
-            if (!BUNDLE_KEY_SET.contains(key)) {
-                Log.w(TAG, "Found an unexpected key in the PersistableBundle: " + key);
-            }
-        }
-
-        validate();
-    }
-
-    private void validate() {
-        Objects.requireNonNull(mIkeParams, "mIkeParams was null");
-        Objects.requireNonNull(mChildParams, "mChildParams was null");
-    }
-
-    /**
-     * Converts this VcnControlPlaneConfig to a PersistableBundle.
-     *
-     * @hide
-     */
-    @Override
-    @NonNull
-    public PersistableBundle toPersistableBundle() {
-        final PersistableBundle result = super.toPersistableBundle();
-        result.putPersistableBundle(
-                IKE_PARAMS_KEY, IkeSessionParamsUtils.toPersistableBundle(mIkeParams));
-        result.putPersistableBundle(
-                CHILD_PARAMS_KEY,
-                TunnelModeChildSessionParamsUtils.toPersistableBundle(mChildParams));
-        return result;
-    }
-
-    /** Retrieves the IKE Session configuration. */
-    @NonNull
-    public IkeSessionParams getIkeSessionParams() {
-        return mIkeParams;
-    }
-
-    /** Retrieves the tunnel mode Child Session configuration. */
-    @NonNull
-    public TunnelModeChildSessionParams getChildSessionParams() {
-        return mChildParams;
-    }
-
-    /** @hide */
-    @Override
-    public int hashCode() {
-        return Objects.hash(super.hashCode(), mIkeParams, mChildParams);
-    }
-
-    /** @hide */
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof VcnControlPlaneIkeConfig)) {
-            return false;
-        }
-
-        VcnControlPlaneIkeConfig other = (VcnControlPlaneIkeConfig) o;
-
-        return super.equals(o)
-                && Objects.equals(mIkeParams, other.mIkeParams)
-                && Objects.equals(mChildParams, other.mChildParams);
-    }
-
-    /** @hide */
-    @Override
-    public VcnControlPlaneConfig copy() {
-        return new VcnControlPlaneIkeConfig(
-                new IkeSessionParams.Builder(mIkeParams).build(),
-                new TunnelModeChildSessionParams.Builder(mChildParams).build());
-    }
-}
diff --git a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
index d7c6fa1..eedeeb5 100644
--- a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
+++ b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
@@ -24,6 +24,8 @@
 import android.annotation.SuppressLint;
 import android.net.Network;
 import android.net.NetworkCapabilities;
+import android.net.ipsec.ike.IkeTunnelConnectionParams;
+import android.net.vcn.persistablebundleutils.TunnelConnectionParamsUtils;
 import android.os.PersistableBundle;
 import android.util.ArraySet;
 
@@ -139,7 +141,7 @@
      * <p>To ensure the device is not constantly being woken up, this retry interval MUST be greater
      * than this value.
      *
-     * @see {@link Builder#setRetryInterval()}
+     * @see {@link Builder#setRetryIntervalsMs()}
      */
     private static final long MINIMUM_REPEATING_RETRY_INTERVAL_MS = TimeUnit.MINUTES.toMillis(15);
 
@@ -156,8 +158,8 @@
     private static final String GATEWAY_CONNECTION_NAME_KEY = "mGatewayConnectionName";
     @NonNull private final String mGatewayConnectionName;
 
-    private static final String CTRL_PLANE_CONFIG_KEY = "mCtrlPlaneConfig";
-    @NonNull private VcnControlPlaneConfig mCtrlPlaneConfig;
+    private static final String TUNNEL_CONNECTION_PARAMS_KEY = "mTunnelConnectionParams";
+    @NonNull private IkeTunnelConnectionParams mTunnelConnectionParams;
 
     private static final String EXPOSED_CAPABILITIES_KEY = "mExposedCapabilities";
     @NonNull private final SortedSet<Integer> mExposedCapabilities;
@@ -174,13 +176,13 @@
     /** Builds a VcnGatewayConnectionConfig with the specified parameters. */
     private VcnGatewayConnectionConfig(
             @NonNull String gatewayConnectionName,
-            @NonNull VcnControlPlaneConfig ctrlPlaneConfig,
+            @NonNull IkeTunnelConnectionParams tunnelConnectionParams,
             @NonNull Set<Integer> exposedCapabilities,
             @NonNull Set<Integer> underlyingCapabilities,
             @NonNull long[] retryIntervalsMs,
             @IntRange(from = MIN_MTU_V6) int maxMtu) {
         mGatewayConnectionName = gatewayConnectionName;
-        mCtrlPlaneConfig = ctrlPlaneConfig;
+        mTunnelConnectionParams = tunnelConnectionParams;
         mExposedCapabilities = new TreeSet(exposedCapabilities);
         mUnderlyingCapabilities = new TreeSet(underlyingCapabilities);
         mRetryIntervalsMs = retryIntervalsMs;
@@ -192,9 +194,10 @@
     /** @hide */
     @VisibleForTesting(visibility = Visibility.PRIVATE)
     public VcnGatewayConnectionConfig(@NonNull PersistableBundle in) {
-        final PersistableBundle ctrlPlaneConfigBundle =
-                in.getPersistableBundle(CTRL_PLANE_CONFIG_KEY);
-        Objects.requireNonNull(ctrlPlaneConfigBundle, "ctrlPlaneConfigBundle was null");
+        final PersistableBundle tunnelConnectionParamsBundle =
+                in.getPersistableBundle(TUNNEL_CONNECTION_PARAMS_KEY);
+        Objects.requireNonNull(
+                tunnelConnectionParamsBundle, "tunnelConnectionParamsBundle was null");
 
         final PersistableBundle exposedCapsBundle =
                 in.getPersistableBundle(EXPOSED_CAPABILITIES_KEY);
@@ -202,7 +205,8 @@
                 in.getPersistableBundle(UNDERLYING_CAPABILITIES_KEY);
 
         mGatewayConnectionName = in.getString(GATEWAY_CONNECTION_NAME_KEY);
-        mCtrlPlaneConfig = VcnControlPlaneConfig.fromPersistableBundle(ctrlPlaneConfigBundle);
+        mTunnelConnectionParams =
+                TunnelConnectionParamsUtils.fromPersistableBundle(tunnelConnectionParamsBundle);
         mExposedCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
                 exposedCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
         mUnderlyingCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
@@ -215,7 +219,7 @@
 
     private void validate() {
         Objects.requireNonNull(mGatewayConnectionName, "gatewayConnectionName was null");
-        Objects.requireNonNull(mCtrlPlaneConfig, "control plane config was null");
+        Objects.requireNonNull(mTunnelConnectionParams, "tunnel connection parameter was null");
 
         Preconditions.checkArgument(
                 mExposedCapabilities != null && !mExposedCapabilities.isEmpty(),
@@ -267,13 +271,13 @@
     }
 
     /**
-     * Returns control plane configuration.
+     * Returns tunnel connection parameters.
      *
      * @hide
      */
     @NonNull
-    public VcnControlPlaneConfig getControlPlaneConfig() {
-        return mCtrlPlaneConfig.copy();
+    public IkeTunnelConnectionParams getTunnelConnectionParams() {
+        return mTunnelConnectionParams;
     }
 
     /**
@@ -338,25 +342,11 @@
     /**
      * Retrieves the configured retry intervals.
      *
-     * @see Builder#setRetryInterval(long[])
+     * @see Builder#setRetryIntervalsMs(long[])
      */
     @NonNull
-    public long[] getRetryInterval() {
-        return Arrays.copyOf(mRetryIntervalsMs, mRetryIntervalsMs.length);
-    }
-
-    /**
-     * Retrieves the configured retry intervals.
-     *
-     * <p>Left to prevent the need to make major changes while changes are actively in flight.
-     *
-     * @deprecated use getRetryInterval() instead
-     * @hide
-     */
-    @Deprecated
-    @NonNull
     public long[] getRetryIntervalsMs() {
-        return getRetryInterval();
+        return Arrays.copyOf(mRetryIntervalsMs, mRetryIntervalsMs.length);
     }
 
     /**
@@ -379,7 +369,8 @@
     public PersistableBundle toPersistableBundle() {
         final PersistableBundle result = new PersistableBundle();
 
-        final PersistableBundle ctrlPlaneConfigBundle = mCtrlPlaneConfig.toPersistableBundle();
+        final PersistableBundle tunnelConnectionParamsBundle =
+                TunnelConnectionParamsUtils.toPersistableBundle(mTunnelConnectionParams);
         final PersistableBundle exposedCapsBundle =
                 PersistableBundleUtils.fromList(
                         new ArrayList<>(mExposedCapabilities),
@@ -390,7 +381,7 @@
                         PersistableBundleUtils.INTEGER_SERIALIZER);
 
         result.putString(GATEWAY_CONNECTION_NAME_KEY, mGatewayConnectionName);
-        result.putPersistableBundle(CTRL_PLANE_CONFIG_KEY, ctrlPlaneConfigBundle);
+        result.putPersistableBundle(TUNNEL_CONNECTION_PARAMS_KEY, tunnelConnectionParamsBundle);
         result.putPersistableBundle(EXPOSED_CAPABILITIES_KEY, exposedCapsBundle);
         result.putPersistableBundle(UNDERLYING_CAPABILITIES_KEY, underlyingCapsBundle);
         result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
@@ -428,7 +419,7 @@
      */
     public static final class Builder {
         @NonNull private final String mGatewayConnectionName;
-        @NonNull private final VcnControlPlaneConfig mCtrlPlaneConfig;
+        @NonNull private final IkeTunnelConnectionParams mTunnelConnectionParams;
         @NonNull private final Set<Integer> mExposedCapabilities = new ArraySet();
         @NonNull private final Set<Integer> mUnderlyingCapabilities = new ArraySet();
         @NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
@@ -446,18 +437,18 @@
          *     VcnConfig} must be given a unique name. This name is used by the caller to
          *     distinguish between VcnGatewayConnectionConfigs configured on a single {@link
          *     VcnConfig}. This will be used as the identifier in VcnStatusCallback invocations.
-         * @param ctrlPlaneConfig the control plane configuration
-         * @see VcnControlPlaneConfig
+         * @param tunnelConnectionParams the IKE tunnel connection configuration
+         * @see IkeTunnelConnectionParams
          * @see VcnManager.VcnStatusCallback#onGatewayConnectionError
          */
         public Builder(
                 @NonNull String gatewayConnectionName,
-                @NonNull VcnControlPlaneConfig ctrlPlaneConfig) {
+                @NonNull IkeTunnelConnectionParams tunnelConnectionParams) {
             Objects.requireNonNull(gatewayConnectionName, "gatewayConnectionName was null");
-            Objects.requireNonNull(ctrlPlaneConfig, "ctrlPlaneConfig was null");
+            Objects.requireNonNull(tunnelConnectionParams, "tunnelConnectionParams was null");
 
             mGatewayConnectionName = gatewayConnectionName;
-            mCtrlPlaneConfig = ctrlPlaneConfig;
+            mTunnelConnectionParams = tunnelConnectionParams;
         }
 
         /**
@@ -564,7 +555,7 @@
          * @see VcnManager for additional discussion on fail-safe mode
          */
         @NonNull
-        public Builder setRetryInterval(@NonNull long[] retryIntervalsMs) {
+        public Builder setRetryIntervalsMs(@NonNull long[] retryIntervalsMs) {
             validateRetryInterval(retryIntervalsMs);
 
             mRetryIntervalsMs = retryIntervalsMs;
@@ -602,7 +593,7 @@
         public VcnGatewayConnectionConfig build() {
             return new VcnGatewayConnectionConfig(
                     mGatewayConnectionName,
-                    mCtrlPlaneConfig,
+                    mTunnelConnectionParams,
                     mExposedCapabilities,
                     mUnderlyingCapabilities,
                     mRetryIntervalsMs,
diff --git a/core/java/android/net/vcn/VcnManager.java b/core/java/android/net/vcn/VcnManager.java
index 344b20c..9d1c1ff 100644
--- a/core/java/android/net/vcn/VcnManager.java
+++ b/core/java/android/net/vcn/VcnManager.java
@@ -38,6 +38,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
@@ -162,6 +163,23 @@
         }
     }
 
+    /**
+     * Retrieves the list of Subscription Groups for which a VCN Configuration has been set.
+     *
+     * <p>The returned list will include only subscription groups for which the carrier app is
+     * privileged, and which have an associated {@link VcnConfig}.
+     *
+     * @throws SecurityException if the caller is not running as the primary user
+     */
+    @NonNull
+    public List<ParcelUuid> getConfiguredSubscriptionGroups() {
+        try {
+            return mService.getConfiguredSubscriptionGroups(mContext.getOpPackageName());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     // TODO(b/180537630): remove all VcnUnderlyingNetworkPolicyListener refs once Telephony is using
     // the new VcnNetworkPolicyChangeListener API
     /**
diff --git a/core/java/android/net/vcn/VcnTransportInfo.java b/core/java/android/net/vcn/VcnTransportInfo.java
index 4d8cf91..0e9ccf1 100644
--- a/core/java/android/net/vcn/VcnTransportInfo.java
+++ b/core/java/android/net/vcn/VcnTransportInfo.java
@@ -16,14 +16,23 @@
 
 package android.net.vcn;
 
+import static android.net.NetworkCapabilities.REDACT_ALL;
+import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.net.NetworkCapabilities;
 import android.net.TransportInfo;
 import android.net.wifi.WifiInfo;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.telephony.SubscriptionManager;
 
+import com.android.internal.annotations.VisibleForTesting;
+
 import java.util.Objects;
 
 /**
@@ -37,28 +46,41 @@
  * SubscriptionManager#INVALID_SUBSCRIPTION_ID}. If the underlying Network is Cellular, the WifiInfo
  * will be {@code null}.
  *
+ * <p>Receipt of a VcnTransportInfo requires the NETWORK_SETTINGS permission; else the entire
+ * VcnTransportInfo instance will be redacted.
+ *
  * @hide
  */
 public class VcnTransportInfo implements TransportInfo, Parcelable {
     @Nullable private final WifiInfo mWifiInfo;
     private final int mSubId;
 
+    /**
+     * The redaction scheme to use when parcelling.
+     *
+     * <p>The TransportInfo/NetworkCapabilities redaction mechanisms rely on redaction being
+     * performed at parcelling time. This means that the redaction scheme must be stored for later
+     * use.
+     *
+     * <p>Since the redaction scheme itself is not parcelled, this field is listed as a transient.
+     *
+     * <p>Defaults to REDACT_ALL when constructed using public constructors, or creating from
+     * parcels.
+     */
+    private final transient long mRedactions;
+
     public VcnTransportInfo(@NonNull WifiInfo wifiInfo) {
-        this(wifiInfo, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        this(wifiInfo, INVALID_SUBSCRIPTION_ID, REDACT_ALL);
     }
 
     public VcnTransportInfo(int subId) {
-        this(null /* wifiInfo */, subId);
+        this(null /* wifiInfo */, subId, REDACT_ALL);
     }
 
-    private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId) {
-        if (wifiInfo == null && subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            throw new IllegalArgumentException(
-                    "VcnTransportInfo requires either non-null WifiInfo or valid subId");
-        }
-
+    private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId, long redactions) {
         mWifiInfo = wifiInfo;
         mSubId = subId;
+        mRedactions = redactions;
     }
 
     /**
@@ -86,8 +108,19 @@
         return mSubId;
     }
 
+    /**
+     * Gets the redaction scheme
+     *
+     * @hide
+     */
+    @VisibleForTesting(visibility = PRIVATE)
+    public long getRedaction() {
+        return mRedactions;
+    }
+
     @Override
     public int hashCode() {
+        // mRedactions not hashed, as it is a transient, for control of parcelling
         return Objects.hash(mWifiInfo, mSubId);
     }
 
@@ -96,6 +129,7 @@
         if (!(o instanceof VcnTransportInfo)) return false;
         final VcnTransportInfo that = (VcnTransportInfo) o;
 
+        // mRedactions not compared, as it is a transient, for control of parcelling
         return Objects.equals(mWifiInfo, that.mWifiInfo) && mSubId == that.mSubId;
     }
 
@@ -105,17 +139,59 @@
         return 0;
     }
 
+    @Override
+    @NonNull
+    public TransportInfo makeCopy(long redactions) {
+        return new VcnTransportInfo(
+                mWifiInfo == null ? null : mWifiInfo.makeCopy(redactions), mSubId, redactions);
+    }
+
+    @Override
+    public long getApplicableRedactions() {
+        long redactions = REDACT_FOR_NETWORK_SETTINGS;
+
+        // Add additional wifi redactions if necessary
+        if (mWifiInfo != null) {
+            redactions |= mWifiInfo.getApplicableRedactions();
+        }
+
+        return redactions;
+    }
+
+    private boolean shouldParcelNetworkSettingsFields() {
+        return (mRedactions & NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS) == 0;
+    }
+
     /** {@inheritDoc} */
     @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {}
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeInt(shouldParcelNetworkSettingsFields() ? mSubId : INVALID_SUBSCRIPTION_ID);
+        dest.writeParcelable(
+                shouldParcelNetworkSettingsFields() ? (Parcelable) mWifiInfo : null, flags);
+    }
+
+    @Override
+    public String toString() {
+        return "VcnTransportInfo { mWifiInfo = " + mWifiInfo + ", mSubId = " + mSubId + " }";
+    }
 
     /** Implement the Parcelable interface */
     public static final @NonNull Creator<VcnTransportInfo> CREATOR =
             new Creator<VcnTransportInfo>() {
                 public VcnTransportInfo createFromParcel(Parcel in) {
-                    // return null instead of a default VcnTransportInfo to avoid leaking
-                    // information about this being a VCN Network (instead of macro cellular, etc)
-                    return null;
+                    final int subId = in.readInt();
+                    final WifiInfo wifiInfo = in.readParcelable(null);
+
+                    // If all fields are their null values, return null TransportInfo to avoid
+                    // leaking information about this being a VCN Network (instead of macro
+                    // cellular, etc)
+                    if (wifiInfo == null && subId == INVALID_SUBSCRIPTION_ID) {
+                        return null;
+                    }
+
+                    // Prevent further forwarding by redacting everything in future parcels from
+                    // this VcnTransportInfo
+                    return new VcnTransportInfo(wifiInfo, subId, REDACT_ALL);
                 }
 
                 public VcnTransportInfo[] newArray(int size) {
diff --git a/core/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtils.java b/core/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtils.java
index 8950c4b..09f5283 100644
--- a/core/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtils.java
+++ b/core/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtils.java
@@ -78,6 +78,7 @@
         IKE_OPTIONS.add(IkeSessionParams.IKE_OPTION_ACCEPT_ANY_REMOTE_ID);
         IKE_OPTIONS.add(IkeSessionParams.IKE_OPTION_EAP_ONLY_AUTH);
         IKE_OPTIONS.add(IkeSessionParams.IKE_OPTION_MOBIKE);
+        IKE_OPTIONS.add(IkeSessionParams.IKE_OPTION_FORCE_PORT_4500);
     }
 
     /** Serializes an IkeSessionParams to a PersistableBundle. */
@@ -124,6 +125,8 @@
         result.putInt(DPD_DELAY_SEC_KEY, params.getDpdDelaySeconds());
         result.putInt(NATT_KEEPALIVE_DELAY_SEC_KEY, params.getNattKeepAliveDelaySeconds());
 
+        // TODO: b/185941731 Make sure IkeSessionParamsUtils is automatically updated when a new
+        // IKE_OPTION is defined in IKE module and added in the IkeSessionParams
         final List<Integer> enabledIkeOptions = new ArrayList<>();
         for (int option : IKE_OPTIONS) {
             if (params.hasIkeOption(option)) {
diff --git a/core/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtils.java b/core/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtils.java
new file mode 100644
index 0000000..4bc5b49
--- /dev/null
+++ b/core/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtils.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.net.vcn.persistablebundleutils;
+
+import android.annotation.NonNull;
+import android.net.ipsec.ike.IkeSessionParams;
+import android.net.ipsec.ike.IkeTunnelConnectionParams;
+import android.net.ipsec.ike.TunnelModeChildSessionParams;
+import android.os.PersistableBundle;
+
+import java.util.Objects;
+
+/**
+ * Utility class to convert Tunnel Connection Params to/from PersistableBundle
+ *
+ * @hide
+ */
+public final class TunnelConnectionParamsUtils {
+    private static final int EXPECTED_BUNDLE_KEY_CNT = 1;
+
+    private static final String PARAMS_TYPE_IKE = "IKE";
+
+    /** Serializes an IkeTunnelConnectionParams to a PersistableBundle. */
+    @NonNull
+    public static PersistableBundle toPersistableBundle(@NonNull IkeTunnelConnectionParams params) {
+        final PersistableBundle result = new PersistableBundle();
+
+        result.putPersistableBundle(
+                PARAMS_TYPE_IKE,
+                IkeTunnelConnectionParamsUtils.serializeIkeParams(
+                        (IkeTunnelConnectionParams) params));
+        return result;
+    }
+
+    /** Constructs an IkeTunnelConnectionParams by deserializing a PersistableBundle. */
+    @NonNull
+    public static IkeTunnelConnectionParams fromPersistableBundle(@NonNull PersistableBundle in) {
+        Objects.requireNonNull(in, "PersistableBundle was null");
+
+        if (in.keySet().size() != EXPECTED_BUNDLE_KEY_CNT) {
+            throw new IllegalArgumentException(
+                    String.format(
+                            "Expect PersistableBundle to have %d element but found: %d",
+                            EXPECTED_BUNDLE_KEY_CNT, in.keySet()));
+        }
+
+        if (in.get(PARAMS_TYPE_IKE) != null) {
+            return IkeTunnelConnectionParamsUtils.deserializeIkeParams(
+                    in.getPersistableBundle(PARAMS_TYPE_IKE));
+        }
+
+        throw new IllegalArgumentException(
+                "Invalid Tunnel Connection Params type " + in.keySet().iterator().next());
+    }
+
+    private static final class IkeTunnelConnectionParamsUtils {
+        private static final String IKE_PARAMS_KEY = "IKE_PARAMS_KEY";
+        private static final String CHILD_PARAMS_KEY = "CHILD_PARAMS_KEY";
+
+        @NonNull
+        public static PersistableBundle serializeIkeParams(
+                @NonNull IkeTunnelConnectionParams ikeParams) {
+            final PersistableBundle result = new PersistableBundle();
+
+            result.putPersistableBundle(
+                    IKE_PARAMS_KEY,
+                    IkeSessionParamsUtils.toPersistableBundle(ikeParams.getIkeSessionParams()));
+            result.putPersistableBundle(
+                    CHILD_PARAMS_KEY,
+                    TunnelModeChildSessionParamsUtils.toPersistableBundle(
+                            ikeParams.getTunnelModeChildSessionParams()));
+            return result;
+        }
+
+        @NonNull
+        public static IkeTunnelConnectionParams deserializeIkeParams(
+                @NonNull PersistableBundle in) {
+            final PersistableBundle ikeBundle = in.getPersistableBundle(IKE_PARAMS_KEY);
+            final PersistableBundle childBundle = in.getPersistableBundle(CHILD_PARAMS_KEY);
+            Objects.requireNonNull(ikeBundle, "IkeSessionParams was null");
+            Objects.requireNonNull(ikeBundle, "TunnelModeChildSessionParams was null");
+
+            final IkeSessionParams ikeParams =
+                    IkeSessionParamsUtils.fromPersistableBundle(ikeBundle);
+            final TunnelModeChildSessionParams childParams =
+                    TunnelModeChildSessionParamsUtils.fromPersistableBundle(childBundle);
+            return new IkeTunnelConnectionParams(ikeParams, childParams);
+        }
+    }
+}
diff --git a/core/java/android/nfc/NfcControllerAlwaysOnListener.java b/core/java/android/nfc/NfcControllerAlwaysOnListener.java
index 96707bb..6ae58fd 100644
--- a/core/java/android/nfc/NfcControllerAlwaysOnListener.java
+++ b/core/java/android/nfc/NfcControllerAlwaysOnListener.java
@@ -52,6 +52,14 @@
      */
     public void register(@NonNull Executor executor,
             @NonNull ControllerAlwaysOnListener listener) {
+        try {
+            if (!mAdapter.isControllerAlwaysOnSupported()) {
+                return;
+            }
+        } catch (RemoteException e) {
+            Log.w(TAG, "Failed to register");
+            return;
+        }
         synchronized (this) {
             if (mListenerMap.containsKey(listener)) {
                 return;
@@ -75,6 +83,14 @@
      * @param listener user implementation of the {@link ControllerAlwaysOnListener}
      */
     public void unregister(@NonNull ControllerAlwaysOnListener listener) {
+        try {
+            if (!mAdapter.isControllerAlwaysOnSupported()) {
+                return;
+            }
+        } catch (RemoteException e) {
+            Log.w(TAG, "Failed to unregister");
+            return;
+        }
         synchronized (this) {
             if (!mListenerMap.containsKey(listener)) {
                 return;
diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java
index ba63ba4..32ca92c 100644
--- a/core/java/android/os/BatteryConsumer.java
+++ b/core/java/android/os/BatteryConsumer.java
@@ -85,54 +85,6 @@
     public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999;
 
     /**
-     * Time usage component, describing the particular part of the system
-     * that was used for the corresponding amount of time.
-     *
-     * @hide
-     */
-    @IntDef(prefix = {"TIME_COMPONENT_"}, value = {
-            TIME_COMPONENT_SCREEN,
-            TIME_COMPONENT_CPU,
-            TIME_COMPONENT_CPU_FOREGROUND,
-            TIME_COMPONENT_BLUETOOTH,
-            TIME_COMPONENT_CAMERA,
-            TIME_COMPONENT_FLASHLIGHT,
-            TIME_COMPONENT_MOBILE_RADIO,
-            TIME_COMPONENT_SENSORS,
-            TIME_COMPONENT_GNSS,
-            TIME_COMPONENT_WIFI,
-            TIME_COMPONENT_WAKELOCK,
-            TIME_COMPONENT_MEMORY,
-            TIME_COMPONENT_PHONE,
-            TIME_COMPONENT_IDLE,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public static @interface TimeComponent {
-    }
-
-    public static final int TIME_COMPONENT_SCREEN = 0;
-    public static final int TIME_COMPONENT_CPU = 1;
-    public static final int TIME_COMPONENT_CPU_FOREGROUND = 2;
-    public static final int TIME_COMPONENT_BLUETOOTH = 3;
-    public static final int TIME_COMPONENT_CAMERA = 4;
-    public static final int TIME_COMPONENT_AUDIO = 5;
-    public static final int TIME_COMPONENT_VIDEO = 6;
-    public static final int TIME_COMPONENT_FLASHLIGHT = 7;
-    public static final int TIME_COMPONENT_MOBILE_RADIO = 8;
-    public static final int TIME_COMPONENT_SENSORS = 9;
-    public static final int TIME_COMPONENT_GNSS = 10;
-    public static final int TIME_COMPONENT_WIFI = 11;
-    public static final int TIME_COMPONENT_WAKELOCK = 12;
-    public static final int TIME_COMPONENT_MEMORY = 13;
-    public static final int TIME_COMPONENT_PHONE = 14;
-    public static final int TIME_COMPONENT_IDLE = 15;
-
-    public static final int TIME_COMPONENT_COUNT = 16;
-
-    public static final int FIRST_CUSTOM_TIME_COMPONENT_ID = 1000;
-    public static final int LAST_CUSTOM_TIME_COMPONENT_ID = 9999;
-
-    /**
      * Identifiers of models used for power estimation.
      *
      * @hide
@@ -166,7 +118,7 @@
      * Total power consumed by this consumer, in mAh.
      */
     public double getConsumedPower() {
-        return mPowerComponents.getTotalConsumedPower();
+        return mPowerComponents.getConsumedPower();
     }
 
     /**
@@ -221,11 +173,11 @@
      * Returns the amount of time since BatteryStats reset used by the specified component, e.g.
      * CPU, WiFi etc.
      *
-     * @param componentId The ID of the time component, e.g.
-     *                    {@link UidBatteryConsumer#TIME_COMPONENT_CPU}.
+     * @param componentId The ID of the power component, e.g.
+     *                    {@link UidBatteryConsumer#POWER_COMPONENT_CPU}.
      * @return Amount of time in milliseconds.
      */
-    public long getUsageDurationMillis(@TimeComponent int componentId) {
+    public long getUsageDurationMillis(@PowerComponent int componentId) {
         return mPowerComponents.getUsageDurationMillis(componentId);
     }
 
@@ -248,9 +200,9 @@
         final PowerComponents.Builder mPowerComponentsBuilder;
 
         public BaseBuilder(@NonNull String[] customPowerComponentNames,
-                int customTimeComponentCount, boolean includePowerModels) {
+                boolean includePowerModels) {
             mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentNames,
-                    customTimeComponentCount, includePowerModels);
+                    includePowerModels);
         }
 
         /**
@@ -296,13 +248,13 @@
         /**
          * Sets the amount of time used by the specified component, e.g. CPU, WiFi etc.
          *
-         * @param componentId              The ID of the time component, e.g.
-         *                                 {@link UidBatteryConsumer#TIME_COMPONENT_CPU}.
+         * @param componentId              The ID of the power component, e.g.
+         *                                 {@link UidBatteryConsumer#POWER_COMPONENT_CPU}.
          * @param componentUsageTimeMillis Amount of time in microseconds.
          */
         @SuppressWarnings("unchecked")
         @NonNull
-        public T setUsageDurationMillis(@UidBatteryConsumer.TimeComponent int componentId,
+        public T setUsageDurationMillis(@UidBatteryConsumer.PowerComponent int componentId,
                 long componentUsageTimeMillis) {
             mPowerComponentsBuilder.setUsageDurationMillis(componentId, componentUsageTimeMillis);
             return (T) this;
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 043a22b..9ec6938 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -6076,7 +6076,7 @@
                     pw.print(":");
                     for (int it=0; it<types.size(); it++) {
                         pw.print(" ");
-                        pw.print(JobParameters.getLegacyReasonCodeDescription(types.keyAt(it)));
+                        pw.print(JobParameters.getInternalReasonCodeDescription(types.keyAt(it)));
                         pw.print("(");
                         pw.print(types.valueAt(it));
                         pw.print("x)");
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java
index 8ea59ce..efdef62 100644
--- a/core/java/android/os/BatteryUsageStats.java
+++ b/core/java/android/os/BatteryUsageStats.java
@@ -292,7 +292,6 @@
     public static final class Builder {
         @NonNull
         private final String[] mCustomPowerComponentNames;
-        private final int mCustomTimeComponentCount;
         private final boolean mIncludePowerModels;
         private long mStatsStartTimestampMs;
         private int mDischargePercentage;
@@ -309,14 +308,12 @@
         private Parcel mHistoryBuffer;
         private List<BatteryStats.HistoryTag> mHistoryTagPool;
 
-        public Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount) {
-            this(customPowerComponentNames, customTimeComponentCount, false);
+        public Builder(@NonNull String[] customPowerComponentNames) {
+            this(customPowerComponentNames, false);
         }
 
-        public Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
-                boolean includePowerModels) {
+        public Builder(@NonNull String[] customPowerComponentNames,  boolean includePowerModels) {
             mCustomPowerComponentNames = customPowerComponentNames;
-            mCustomTimeComponentCount = customTimeComponentCount;
             mIncludePowerModels = includePowerModels;
         }
 
@@ -399,7 +396,7 @@
             UidBatteryConsumer.Builder builder = mUidBatteryConsumerBuilders.get(uid);
             if (builder == null) {
                 builder = new UidBatteryConsumer.Builder(mCustomPowerComponentNames,
-                        mCustomTimeComponentCount, mIncludePowerModels, batteryStatsUid);
+                        mIncludePowerModels, batteryStatsUid);
                 mUidBatteryConsumerBuilders.put(uid, builder);
             }
             return builder;
@@ -415,7 +412,7 @@
             SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
             if (builder == null) {
                 builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentNames,
-                        mCustomTimeComponentCount, mIncludePowerModels, drainType);
+                        mIncludePowerModels, drainType);
                 mSystemBatteryConsumerBuilders.put(drainType, builder);
             }
             return builder;
@@ -430,7 +427,7 @@
             UserBatteryConsumer.Builder builder = mUserBatteryConsumerBuilders.get(userId);
             if (builder == null) {
                 builder = new UserBatteryConsumer.Builder(mCustomPowerComponentNames,
-                        mCustomTimeComponentCount, mIncludePowerModels, userId);
+                        mIncludePowerModels, userId);
                 mUserBatteryConsumerBuilders.put(userId, builder);
             }
             return builder;
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index 34f2c10..9a81942 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -100,7 +100,7 @@
     boolean isProfile(int userId);
     boolean isManagedProfile(int userId);
     boolean isCloneProfile(int userId);
-    boolean sharesMediaWithParent(int userId);
+    boolean isMediaSharedWithParent(int userId);
     boolean isDemoUser(int userId);
     boolean isPreCreated(int userId);
     UserInfo createProfileForUserEvenWhenDisallowedWithThrow(in String name, in String userType, int flags,
diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java
index a0a41f4..47a2edc 100644
--- a/core/java/android/os/PowerComponents.java
+++ b/core/java/android/os/PowerComponents.java
@@ -26,12 +26,10 @@
 class PowerComponents {
     private static final int CUSTOM_POWER_COMPONENT_OFFSET = BatteryConsumer.POWER_COMPONENT_COUNT
             - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID;
-    private static final int CUSTOM_TIME_COMPONENT_OFFSET = BatteryConsumer.TIME_COMPONENT_COUNT
-            - BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID;
 
-    private final double mTotalConsumedPowerMah;
+    private final double mConsumedPowerMah;
     private final double[] mPowerComponentsMah;
-    private final long[] mTimeComponentsMs;
+    private final long[] mUsageDurationsMs;
     private final int mCustomPowerComponentCount;
     private final byte[] mPowerModels;
     // Not written to Parcel and must be explicitly restored during the parent object's unparceling
@@ -41,16 +39,16 @@
         mCustomPowerComponentNames = builder.mCustomPowerComponentNames;
         mCustomPowerComponentCount = mCustomPowerComponentNames.length;
         mPowerComponentsMah = builder.mPowerComponentsMah;
-        mTimeComponentsMs = builder.mTimeComponentsMs;
-        mTotalConsumedPowerMah = builder.getTotalPower();
+        mUsageDurationsMs = builder.mUsageDurationsMs;
+        mConsumedPowerMah = builder.getTotalPower();
         mPowerModels = builder.mPowerModels;
     }
 
     PowerComponents(@NonNull Parcel source) {
-        mTotalConsumedPowerMah = source.readDouble();
+        mConsumedPowerMah = source.readDouble();
         mCustomPowerComponentCount = source.readInt();
         mPowerComponentsMah = source.createDoubleArray();
-        mTimeComponentsMs = source.createLongArray();
+        mUsageDurationsMs = source.createLongArray();
         if (source.readBoolean()) {
             mPowerModels = new byte[BatteryConsumer.POWER_COMPONENT_COUNT];
             source.readByteArray(mPowerModels);
@@ -61,10 +59,10 @@
 
     /** Writes contents to Parcel */
     void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeDouble(mTotalConsumedPowerMah);
+        dest.writeDouble(mConsumedPowerMah);
         dest.writeInt(mCustomPowerComponentCount);
         dest.writeDoubleArray(mPowerComponentsMah);
-        dest.writeLongArray(mTimeComponentsMs);
+        dest.writeLongArray(mUsageDurationsMs);
         if (mPowerModels != null) {
             dest.writeBoolean(true);
             dest.writeByteArray(mPowerModels);
@@ -76,8 +74,8 @@
     /**
      * Total power consumed by this consumer, in mAh.
      */
-    public double getTotalConsumedPower() {
-        return mTotalConsumedPowerMah;
+    public double getConsumedPower() {
+        return mConsumedPowerMah;
     }
 
     /**
@@ -152,17 +150,17 @@
     /**
      * Returns the amount of time used by the specified component, e.g. CPU, WiFi etc.
      *
-     * @param componentId The ID of the time component, e.g.
-     *                    {@link BatteryConsumer#TIME_COMPONENT_CPU}.
+     * @param componentId The ID of the power component, e.g.
+     *                    {@link BatteryConsumer#POWER_COMPONENT_CPU}.
      * @return Amount of time in milliseconds.
      */
-    public long getUsageDurationMillis(@BatteryConsumer.TimeComponent int componentId) {
-        if (componentId >= BatteryConsumer.TIME_COMPONENT_COUNT) {
+    public long getUsageDurationMillis(@BatteryConsumer.PowerComponent int componentId) {
+        if (componentId >= BatteryConsumer.POWER_COMPONENT_COUNT) {
             throw new IllegalArgumentException(
-                    "Unsupported time component ID: " + componentId);
+                    "Unsupported power component ID: " + componentId);
         }
         try {
-            return mTimeComponentsMs[componentId];
+            return mUsageDurationsMs[componentId];
         } catch (ArrayIndexOutOfBoundsException e) {
             throw new IllegalArgumentException("Unsupported power component ID: " + componentId);
         }
@@ -175,15 +173,15 @@
      * @return Amount of time in milliseconds.
      */
     public long getUsageDurationForCustomComponentMillis(int componentId) {
-        if (componentId < BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID) {
+        if (componentId < BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID) {
             throw new IllegalArgumentException(
-                    "Unsupported custom time component ID: " + componentId);
+                    "Unsupported custom power component ID: " + componentId);
         }
         try {
-            return mTimeComponentsMs[CUSTOM_TIME_COMPONENT_OFFSET + componentId];
+            return mUsageDurationsMs[CUSTOM_POWER_COMPONENT_OFFSET + componentId];
         } catch (ArrayIndexOutOfBoundsException e) {
             throw new IllegalArgumentException(
-                    "Unsupported custom time component ID: " + componentId);
+                    "Unsupported custom power component ID: " + componentId);
         }
     }
 
@@ -192,13 +190,13 @@
     }
 
     /**
-     * Returns the largest usage duration among all time components.
+     * Returns the largest usage duration among all power components.
      */
     public long getMaxComponentUsageDurationMillis() {
         long max = 0;
-        for (int i = mTimeComponentsMs.length - 1; i >= 0; i--) {
-            if (mTimeComponentsMs[i] > max) {
-                max = mTimeComponentsMs[i];
+        for (int i = mUsageDurationsMs.length - 1; i >= 0; i--) {
+            if (mUsageDurationsMs[i] > max) {
+                max = mUsageDurationsMs[i];
             }
         }
         return max;
@@ -210,17 +208,15 @@
     static final class Builder {
         private final double[] mPowerComponentsMah;
         private final String[] mCustomPowerComponentNames;
-        private final long[] mTimeComponentsMs;
+        private final long[] mUsageDurationsMs;
         private final byte[] mPowerModels;
 
-        Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
-                boolean includePowerModels) {
+        Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels) {
             mCustomPowerComponentNames = customPowerComponentNames;
             int powerComponentCount =
                     BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentNames.length;
             mPowerComponentsMah = new double[powerComponentCount];
-            mTimeComponentsMs =
-                    new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount];
+            mUsageDurationsMs = new long[powerComponentCount];
             if (includePowerModels) {
                 mPowerModels = new byte[BatteryConsumer.POWER_COMPONENT_COUNT];
             } else {
@@ -281,22 +277,22 @@
         /**
          * Sets the amount of time used by the specified component, e.g. CPU, WiFi etc.
          *
-         * @param componentId                  The ID of the time component, e.g.
-         *                                     {@link BatteryConsumer#TIME_COMPONENT_CPU}.
+         * @param componentId                  The ID of the power component, e.g.
+         *                                     {@link BatteryConsumer#POWER_COMPONENT_CPU}.
          * @param componentUsageDurationMillis Amount of time in milliseconds.
          */
         @NonNull
-        public Builder setUsageDurationMillis(@BatteryConsumer.TimeComponent int componentId,
+        public Builder setUsageDurationMillis(@BatteryConsumer.PowerComponent int componentId,
                 long componentUsageDurationMillis) {
-            if (componentId >= BatteryConsumer.TIME_COMPONENT_COUNT) {
+            if (componentId >= BatteryConsumer.POWER_COMPONENT_COUNT) {
                 throw new IllegalArgumentException(
-                        "Unsupported time component ID: " + componentId);
+                        "Unsupported power component ID: " + componentId);
             }
             try {
-                mTimeComponentsMs[componentId] = componentUsageDurationMillis;
+                mUsageDurationsMs[componentId] = componentUsageDurationMillis;
             } catch (ArrayIndexOutOfBoundsException e) {
                 throw new IllegalArgumentException(
-                        "Unsupported time component ID: " + componentId);
+                        "Unsupported power component ID: " + componentId);
             }
             return this;
         }
@@ -310,16 +306,16 @@
         @NonNull
         public Builder setUsageDurationForCustomComponentMillis(int componentId,
                 long componentUsageDurationMillis) {
-            if (componentId < BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID) {
+            if (componentId < BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID) {
                 throw new IllegalArgumentException(
-                        "Unsupported custom time component ID: " + componentId);
+                        "Unsupported custom power component ID: " + componentId);
             }
             try {
-                mTimeComponentsMs[CUSTOM_TIME_COMPONENT_OFFSET + componentId] =
+                mUsageDurationsMs[CUSTOM_POWER_COMPONENT_OFFSET + componentId] =
                         componentUsageDurationMillis;
             } catch (ArrayIndexOutOfBoundsException e) {
                 throw new IllegalArgumentException(
-                        "Unsupported custom time component ID: " + componentId);
+                        "Unsupported custom power component ID: " + componentId);
             }
             return this;
         }
@@ -328,8 +324,8 @@
             for (int i = mPowerComponentsMah.length - 1; i >= 0; i--) {
                 mPowerComponentsMah[i] += other.mPowerComponentsMah[i];
             }
-            for (int i = mTimeComponentsMs.length - 1; i >= 0; i--) {
-                mTimeComponentsMs[i] += other.mTimeComponentsMs[i];
+            for (int i = mUsageDurationsMs.length - 1; i >= 0; i--) {
+                mUsageDurationsMs[i] += other.mUsageDurationsMs[i];
             }
         }
 
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index b474d7c..051447f 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -1423,8 +1423,8 @@
     private boolean requestLskf(String packageName, IntentSender sender) throws IOException {
         try {
             return mService.requestLskf(packageName, sender);
-        } catch (RemoteException e) {
-            throw new IOException("could request LSKF capture");
+        } catch (RemoteException | SecurityException e) {
+            throw new IOException("could not request LSKF capture", e);
         }
     }
 
@@ -1437,8 +1437,8 @@
     private boolean clearLskf(String packageName) throws IOException {
         try {
             return mService.clearLskf(packageName);
-        } catch (RemoteException e) {
-            throw new IOException("could not clear LSKF");
+        } catch (RemoteException | SecurityException e) {
+            throw new IOException("could not clear LSKF", e);
         }
     }
 
@@ -1452,8 +1452,8 @@
     private boolean isLskfCaptured(String packageName) throws IOException {
         try {
             return mService.isLskfCaptured(packageName);
-        } catch (RemoteException e) {
-            throw new IOException("could not get LSKF capture state");
+        } catch (RemoteException | SecurityException e) {
+            throw new IOException("could not get LSKF capture state", e);
         }
     }
 
@@ -1465,12 +1465,11 @@
             boolean slotSwitch) throws IOException {
         try {
             return mService.rebootWithLskf(packageName, reason, slotSwitch);
-        } catch (RemoteException e) {
-            throw new IOException("could not reboot for update");
+        } catch (RemoteException | SecurityException e) {
+            throw new IOException("could not reboot for update", e);
         }
     }
 
-
     /**
      * Calls the recovery system service to reboot and apply update. This is the legacy API and
      * expects a slot switch for A/B devices.
@@ -1480,8 +1479,8 @@
             String reason) throws IOException {
         try {
             return mService.rebootWithLskfAssumeSlotSwitch(packageName, reason);
-        } catch (RemoteException e) {
-            throw new IOException("could not reboot for update");
+        } catch (RemoteException | RuntimeException e) {
+            throw new IOException("could not reboot for update", e);
         }
     }
 
diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java
index 60acc57..755c35f 100644
--- a/core/java/android/os/ServiceManagerNative.java
+++ b/core/java/android/os/ServiceManagerNative.java
@@ -94,6 +94,10 @@
         return mServiceManager.getDeclaredInstances(iface);
     }
 
+    public String updatableViaApex(String name) throws RemoteException {
+        return mServiceManager.updatableViaApex(name);
+    }
+
     public void registerClientCallback(String name, IBinder service, IClientCallback cb)
             throws RemoteException {
         throw new RemoteException();
diff --git a/core/java/android/os/SystemBatteryConsumer.java b/core/java/android/os/SystemBatteryConsumer.java
index 1327978..7618339 100644
--- a/core/java/android/os/SystemBatteryConsumer.java
+++ b/core/java/android/os/SystemBatteryConsumer.java
@@ -147,9 +147,9 @@
         private double mPowerConsumedByAppsMah;
         private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
 
-        Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
+        Builder(@NonNull String[] customPowerComponentNames,
                 boolean includePowerModels, @DrainType int drainType) {
-            super(customPowerComponentNames, customTimeComponentCount, includePowerModels);
+            super(customPowerComponentNames, includePowerModels);
             mDrainType = drainType;
         }
 
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index 92e9603..b1fb570 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -139,9 +139,9 @@
         public long mTimeInBackgroundMs;
         private boolean mExcludeFromBatteryUsageStats;
 
-        public Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
+        public Builder(@NonNull String[] customPowerComponentNames,
                 boolean includePowerModels, @NonNull BatteryStats.Uid batteryStatsUid) {
-            super(customPowerComponentNames, customTimeComponentCount, includePowerModels);
+            super(customPowerComponentNames, includePowerModels);
             mBatteryStatsUid = batteryStatsUid;
             mUid = batteryStatsUid.getUid();
         }
diff --git a/core/java/android/os/UserBatteryConsumer.java b/core/java/android/os/UserBatteryConsumer.java
index de0a707..d0d0d38 100644
--- a/core/java/android/os/UserBatteryConsumer.java
+++ b/core/java/android/os/UserBatteryConsumer.java
@@ -77,9 +77,9 @@
         private final int mUserId;
         private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
 
-        Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
-                boolean includePowerModels, int userId) {
-            super(customPowerComponentNames, customTimeComponentCount, includePowerModels);
+        Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels,
+                int userId) {
+            super(customPowerComponentNames, includePowerModels);
             mUserId = userId;
         }
 
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index d4de4fa..b8ad068 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -4124,9 +4124,9 @@
             Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true)
     @UserHandleAware
     @SuppressAutoDoc
-    public boolean sharesMediaWithParent() {
+    public boolean isMediaSharedWithParent() {
         try {
-            return mService.sharesMediaWithParent(mUserId);
+            return mService.isMediaSharedWithParent(mUserId);
         } catch (RemoteException re) {
             throw re.rethrowFromSystemServer();
         }
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index c78bf8c..781800d 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -749,14 +749,10 @@
          * A haptic effect that simulates downwards movement with gravity. Often
          * followed by extra energy of hitting and reverberation to augment
          * physicality.
-         *
-         * @hide Not confident enough to expose publicly yet
          */
         public static final int PRIMITIVE_THUD = 2;
         /**
          * A haptic effect that simulates spinning momentum.
-         *
-         * @hide Not confident enough to expose publicly yet
          */
         public static final int PRIMITIVE_SPIN = 3;
         /**
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 2876775..95962c8 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -552,6 +552,30 @@
     }
 
     /**
+     * Query the estimated durations of the given primitives.
+     *
+     * <p>The returned array will be the same length as the query array and the value at a given
+     * index will contain the duration in milliseconds of the effect at the same index in the
+     * querying array.
+     *
+     * <p>The duration will be positive for primitives that are supported and zero for the
+     * unsupported ones, in correspondence with {@link #arePrimitivesSupported(int...)}.
+     *
+     * @param primitiveIds Which primitives to query for.
+     * @return The duration of each primitive, with zeroes for primitives that are not supported.
+     */
+    @NonNull
+    public int[] getPrimitiveDurations(
+            @NonNull @VibrationEffect.Composition.PrimitiveType int... primitiveIds) {
+        VibratorInfo info = getInfo();
+        int[] durations = new int[primitiveIds.length];
+        for (int i = 0; i < primitiveIds.length; i++) {
+            durations[i] = info.getPrimitiveDuration(primitiveIds[i]);
+        }
+        return durations;
+    }
+
+    /**
      * Turn the vibrator off.
      */
     @RequiresPermission(android.Manifest.permission.VIBRATE)
diff --git a/core/java/android/os/VibratorInfo.java b/core/java/android/os/VibratorInfo.java
index c7d66f0..597df08 100644
--- a/core/java/android/os/VibratorInfo.java
+++ b/core/java/android/os/VibratorInfo.java
@@ -25,6 +25,7 @@
 import android.util.MathUtils;
 import android.util.Range;
 import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -51,7 +52,7 @@
     @Nullable
     private final SparseBooleanArray mSupportedBraking;
     @Nullable
-    private final SparseBooleanArray mSupportedPrimitives;
+    private final SparseIntArray mSupportedPrimitives;
     private final float mQFactor;
     private final FrequencyMapping mFrequencyMapping;
 
@@ -60,19 +61,37 @@
         mCapabilities = in.readLong();
         mSupportedEffects = in.readSparseBooleanArray();
         mSupportedBraking = in.readSparseBooleanArray();
-        mSupportedPrimitives = in.readSparseBooleanArray();
+        mSupportedPrimitives = in.readSparseIntArray();
         mQFactor = in.readFloat();
         mFrequencyMapping = in.readParcelable(VibratorInfo.class.getClassLoader());
     }
 
-    /** @hide */
+    /**
+     * Default constructor.
+     *
+     * @param id                  The vibrator id.
+     * @param capabilities        All capability flags of the vibrator, defined in IVibrator.CAP_*.
+     * @param supportedEffects    All supported predefined effects, enum values from {@link
+     *                            android.hardware.vibrator.Effect}.
+     * @param supportedBraking    All supported braking types, enum values from {@link Braking}.
+     * @param supportedPrimitives All supported primitive effects, enum values from {@link
+     *                            android.hardware.vibrator.CompositePrimitive}.
+     * @param primitiveDurations  A mapping of primitive durations, where indexes are enum values
+     *                            from {@link android.hardware.vibrator.CompositePrimitive} and the
+     *                            values are estimated durations in milliseconds.
+     * @param qFactor             The vibrator quality factor.
+     * @param frequencyMapping    The description of the vibrator supported frequencies and max
+     *                            amplitude mappings.
+     * @hide
+     */
     public VibratorInfo(int id, long capabilities, int[] supportedEffects, int[] supportedBraking,
-            int[] supportedPrimitives, float qFactor, @NonNull FrequencyMapping frequencyMapping) {
+            int[] supportedPrimitives, int[] primitiveDurations, float qFactor,
+            @NonNull FrequencyMapping frequencyMapping) {
         mId = id;
         mCapabilities = capabilities;
         mSupportedEffects = toSparseBooleanArray(supportedEffects);
         mSupportedBraking = toSparseBooleanArray(supportedBraking);
-        mSupportedPrimitives = toSparseBooleanArray(supportedPrimitives);
+        mSupportedPrimitives = toSparseIntArray(supportedPrimitives, primitiveDurations);
         mQFactor = qFactor;
         mFrequencyMapping = frequencyMapping;
     }
@@ -100,7 +119,7 @@
         dest.writeLong(mCapabilities);
         dest.writeSparseBooleanArray(mSupportedEffects);
         dest.writeSparseBooleanArray(mSupportedBraking);
-        dest.writeSparseBooleanArray(mSupportedPrimitives);
+        dest.writeSparseIntArray(mSupportedPrimitives);
         dest.writeFloat(mQFactor);
         dest.writeParcelable(mFrequencyMapping, flags);
     }
@@ -119,18 +138,41 @@
             return false;
         }
         VibratorInfo that = (VibratorInfo) o;
+        if (mSupportedPrimitives == null || that.mSupportedPrimitives == null) {
+            if (mSupportedPrimitives != that.mSupportedPrimitives) {
+                return false;
+            }
+        } else {
+            if (mSupportedPrimitives.size() != that.mSupportedPrimitives.size()) {
+                return false;
+            }
+            for (int i = 0; i < mSupportedPrimitives.size(); i++) {
+                if (mSupportedPrimitives.keyAt(i) != that.mSupportedPrimitives.keyAt(i)) {
+                    return false;
+                }
+                if (mSupportedPrimitives.valueAt(i) != that.mSupportedPrimitives.valueAt(i)) {
+                    return false;
+                }
+            }
+        }
         return mId == that.mId && mCapabilities == that.mCapabilities
                 && Objects.equals(mSupportedEffects, that.mSupportedEffects)
                 && Objects.equals(mSupportedBraking, that.mSupportedBraking)
-                && Objects.equals(mSupportedPrimitives, that.mSupportedPrimitives)
                 && Objects.equals(mQFactor, that.mQFactor)
                 && Objects.equals(mFrequencyMapping, that.mFrequencyMapping);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
-                mSupportedPrimitives, mQFactor, mFrequencyMapping);
+        int hashCode = Objects.hash(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
+                mQFactor, mFrequencyMapping);
+        if (mSupportedPrimitives != null) {
+            for (int i = 0; i < mSupportedPrimitives.size(); i++) {
+                hashCode = 31 * hashCode + mSupportedPrimitives.keyAt(i);
+                hashCode = 31 * hashCode + mSupportedPrimitives.valueAt(i);
+            }
+        }
+        return hashCode;
     }
 
     @Override
@@ -206,7 +248,19 @@
     public boolean isPrimitiveSupported(
             @VibrationEffect.Composition.PrimitiveType int primitiveId) {
         return hasCapability(IVibrator.CAP_COMPOSE_EFFECTS) && mSupportedPrimitives != null
-                && mSupportedPrimitives.get(primitiveId);
+                && (mSupportedPrimitives.indexOfKey(primitiveId) >= 0);
+    }
+
+    /**
+     * Query the estimated duration of given primitive.
+     *
+     * @param primitiveId Which primitives to query for.
+     * @return The duration in milliseconds estimated for the primitive, or zero if primitive not
+     * supported.
+     */
+    public int getPrimitiveDuration(
+            @VibrationEffect.Composition.PrimitiveType int primitiveId) {
+        return mSupportedPrimitives != null ? mSupportedPrimitives.get(primitiveId) : 0;
     }
 
     /**
@@ -364,14 +418,37 @@
         return names;
     }
 
+    /**
+     * Create a {@link SparseBooleanArray} from given {@code supportedKeys} where each key is mapped
+     * to {@code true}.
+     */
     @Nullable
-    private static SparseBooleanArray toSparseBooleanArray(int[] values) {
-        if (values == null) {
+    private static SparseBooleanArray toSparseBooleanArray(int[] supportedKeys) {
+        if (supportedKeys == null) {
             return null;
         }
         SparseBooleanArray array = new SparseBooleanArray();
-        for (int value : values) {
-            array.put(value, true);
+        for (int key : supportedKeys) {
+            array.put(key, true);
+        }
+        return array;
+    }
+
+    /**
+     * Create a {@link SparseIntArray} from given {@code supportedKeys} where each key is mapped
+     * to the value indexed by it.
+     *
+     * <p>If {@code values} is null or does not contain a given key as a index, then zero is stored
+     * to the sparse array so it can still be used to query the supported keys.
+     */
+    @Nullable
+    private static SparseIntArray toSparseIntArray(int[] supportedKeys, int[] values) {
+        if (supportedKeys == null) {
+            return null;
+        }
+        SparseIntArray array = new SparseIntArray();
+        for (int key : supportedKeys) {
+            array.put(key, (values == null || key >= values.length) ? 0 : values[key]);
         }
         return array;
     }
@@ -419,7 +496,20 @@
                     in.createFloatArray());
         }
 
-        /** @hide */
+        /**
+         * Default constructor.
+         *
+         * @param minFrequencyHz        Minimum supported frequency, in hertz.
+         * @param resonantFrequencyHz   The vibrator resonant frequency, in hertz.
+         * @param frequencyResolutionHz The frequency resolution, in hertz, used by the max
+         *                              amplitudes mapping.
+         * @param suggestedSafeRangeHz  The suggested range, in hertz, for the safe relative
+         *                              frequency range represented by [-1, 1].
+         * @param maxAmplitudes         The max amplitude supported by each supported frequency,
+         *                              starting at minimum frequency with jumps of frequency
+         *                              resolution.
+         * @hide
+         */
         public FrequencyMapping(float minFrequencyHz, float resonantFrequencyHz,
                 float frequencyResolutionHz, float suggestedSafeRangeHz, float[] maxAmplitudes) {
             mMinFrequencyHz = minFrequencyHz;
@@ -547,8 +637,10 @@
 
         @Override
         public int hashCode() {
-            return Objects.hash(mMinFrequencyHz, mFrequencyResolutionHz, mFrequencyResolutionHz,
-                    mSuggestedSafeRangeHz, mMaxAmplitudes);
+            int hashCode = Objects.hash(mMinFrequencyHz, mFrequencyResolutionHz,
+                    mFrequencyResolutionHz, mSuggestedSafeRangeHz);
+            hashCode = 31 * hashCode + Arrays.hashCode(mMaxAmplitudes);
+            return hashCode;
         }
 
         @Override
@@ -587,6 +679,7 @@
         private int[] mSupportedEffects = null;
         private int[] mSupportedBraking = null;
         private int[] mSupportedPrimitives = null;
+        private int[] mPrimitiveDurations = new int[0];
         private float mQFactor = Float.NaN;
         private FrequencyMapping mFrequencyMapping =
                 new FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, Float.NaN, null);
@@ -627,6 +720,16 @@
             return this;
         }
 
+        /** Configure the duration of a {@link android.hardware.vibrator.CompositePrimitive}. */
+        @NonNull
+        public Builder setPrimitiveDuration(int primitiveId, int duration) {
+            if (mPrimitiveDurations.length <= primitiveId) {
+                mPrimitiveDurations = Arrays.copyOf(mPrimitiveDurations, primitiveId + 1);
+            }
+            mPrimitiveDurations[primitiveId] = duration;
+            return this;
+        }
+
         /** Configure the vibrator quality factor. */
         @NonNull
         public Builder setQFactor(float qFactor) {
@@ -645,7 +748,7 @@
         @NonNull
         public VibratorInfo build() {
             return new VibratorInfo(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
-                    mSupportedPrimitives, mQFactor, mFrequencyMapping);
+                    mSupportedPrimitives, mPrimitiveDurations, mQFactor, mFrequencyMapping);
         }
     }
 
diff --git a/core/java/android/os/incremental/IIncrementalService.aidl b/core/java/android/os/incremental/IIncrementalService.aidl
index ba6fc6e..c68f878 100644
--- a/core/java/android/os/incremental/IIncrementalService.aidl
+++ b/core/java/android/os/incremental/IIncrementalService.aidl
@@ -163,20 +163,31 @@
     boolean unregisterLoadingProgressListener(int storageId);
 
     /**
-     * Register storage health status listener.
-     */
-    boolean registerStorageHealthListener(int storageId, in StorageHealthCheckParams params, in IStorageHealthListener listener);
-
-    /**
-     * Register storage health status listener.
-     */
-    void unregisterStorageHealthListener(int storageId);
-
-    /**
      * Metrics key for the duration in milliseconds between now and the oldest pending read. The value is a long.
      */
     const @utf8InCpp String METRICS_MILLIS_SINCE_OLDEST_PENDING_READ = "millisSinceOldestPendingRead";
     /**
+     * Metrics key for whether read logs are enabled. The value is a boolean.
+     */
+    const @utf8InCpp String METRICS_READ_LOGS_ENABLED = "readLogsEnabled";
+    /**
+     * Metrics key for the storage health status. The value is an int.
+     */
+    const @utf8InCpp String METRICS_STORAGE_HEALTH_STATUS_CODE = "storageHealthStatusCode";
+    /**
+     * Metrics key for the data loader status. The value is an int.
+     */
+    const @utf8InCpp String METRICS_DATA_LOADER_STATUS_CODE = "dataLoaderStatusCode";
+    /**
+     * Metrics key for duration since last data loader binding attempt. The value is a long.
+     */
+    const @utf8InCpp String METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND = "millisSinceLastDataLoaderBind";
+    /**
+     * Metrics key for delay in milliseconds to retry data loader binding. The value is a long.
+     */
+    const @utf8InCpp String METRICS_DATA_LOADER_BIND_DELAY_MILLIS = "dataLoaderBindDelayMillis";
+
+    /**
      * Return a bundle containing the requested metrics keys and their values.
      */
     PersistableBundle getMetrics(int storageId);
diff --git a/core/java/android/os/incremental/IStorageHealthListener.aidl b/core/java/android/os/incremental/IStorageHealthListener.aidl
index c71e73f..dc533a0 100644
--- a/core/java/android/os/incremental/IStorageHealthListener.aidl
+++ b/core/java/android/os/incremental/IStorageHealthListener.aidl
@@ -29,12 +29,6 @@
     /** There are reads pending for params.unhealthyTimeoutMs,
     *   marking storage as unhealthy due to unknown issues. */
     const int HEALTH_STATUS_UNHEALTHY = 3;
-    /** There are reads pending for params.unhealthyTimeoutMs,
-     *  due to data transportation issues. */
-    const int HEALTH_STATUS_UNHEALTHY_TRANSPORT = 4;
-    /** There are reads pending for params.unhealthyTimeoutMs,
-     *  due to limited storage space. */
-    const int HEALTH_STATUS_UNHEALTHY_STORAGE = 5;
 
     /** Health status callback. */
     void onHealthStatus(in int storageId, in int status);
diff --git a/core/java/android/os/incremental/IncrementalManager.java b/core/java/android/os/incremental/IncrementalManager.java
index 7fb9ae0..9c8ee56 100644
--- a/core/java/android/os/incremental/IncrementalManager.java
+++ b/core/java/android/os/incremental/IncrementalManager.java
@@ -294,7 +294,6 @@
                 return;
             }
             mLoadingProgressCallbacks.cleanUpCallbacks(storage);
-            unregisterHealthListener(codePath);
             storage.unBind(codePath);
         } catch (IOException e) {
             Slog.w(TAG, "Failed to remove code path", e);
@@ -397,38 +396,6 @@
     }
 
     /**
-     * Specify the health check params and listener for listening to Incremental Storage health
-     * status changes. Notice that this will overwrite the previously registered listener.
-     * @param codePath Path of the installed package. This path is on an Incremental Storage.
-     * @param healthCheckParams The params for health state change timeouts.
-     * @param listener To report health status change.
-     * @return True if listener was successfully registered.
-     */
-    public boolean registerHealthListener(@NonNull String codePath,
-            @NonNull StorageHealthCheckParams healthCheckParams,
-            @NonNull IStorageHealthListener.Stub listener) {
-        final IncrementalStorage storage = openStorage(codePath);
-        if (storage == null) {
-            // storage does not exist, package not installed
-            return false;
-        }
-        return storage.registerStorageHealthListener(healthCheckParams, listener);
-    }
-
-    /**
-     * Stop listening to health status changes on an Incremental Storage.
-     * @param codePath Path of the installed package. This path is on an Incremental Storage.
-     */
-    public void unregisterHealthListener(@NonNull String codePath) {
-        final IncrementalStorage storage = openStorage(codePath);
-        if (storage == null) {
-            // storage does not exist, package not installed
-            return;
-        }
-        storage.unregisterStorageHealthListener();
-    }
-
-    /**
      * Returns the metrics of an Incremental Storage.
      */
     public IncrementalMetrics getMetrics(@NonNull String codePath) {
diff --git a/core/java/android/os/incremental/IncrementalMetrics.java b/core/java/android/os/incremental/IncrementalMetrics.java
index 44dea1b..98eb431 100644
--- a/core/java/android/os/incremental/IncrementalMetrics.java
+++ b/core/java/android/os/incremental/IncrementalMetrics.java
@@ -36,4 +36,39 @@
     public long getMillisSinceOldestPendingRead() {
         return mData.getLong(IIncrementalService.METRICS_MILLIS_SINCE_OLDEST_PENDING_READ, -1);
     }
+
+    /**
+     * @return Whether read logs are enabled
+     */
+    public boolean getReadLogsEnabled() {
+        return mData.getBoolean(IIncrementalService.METRICS_READ_LOGS_ENABLED, false);
+    }
+
+    /**
+     * @return storage health status code. @see android.os.incremental.IStorageHealthListener
+     */
+    public int getStorageHealthStatusCode() {
+        return mData.getInt(IIncrementalService.METRICS_STORAGE_HEALTH_STATUS_CODE, -1);
+    }
+
+    /**
+     * @return data loader status code. @see android.content.pm.IDataLoaderStatusListener
+     */
+    public int getDataLoaderStatusCode() {
+        return mData.getInt(IIncrementalService.METRICS_DATA_LOADER_STATUS_CODE, -1);
+    }
+
+    /**
+     * @return duration since last data loader binding attempt
+     */
+    public long getMillisSinceLastDataLoaderBind() {
+        return mData.getLong(IIncrementalService.METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND, -1);
+    }
+
+    /**
+     * @return delay in milliseconds to retry data loader binding
+     */
+    public long getDataLoaderBindDelayMillis() {
+        return mData.getLong(IIncrementalService.METRICS_DATA_LOADER_BIND_DELAY_MILLIS, -1);
+    }
 }
diff --git a/core/java/android/os/incremental/IncrementalStorage.java b/core/java/android/os/incremental/IncrementalStorage.java
index c19e29f..4d46325 100644
--- a/core/java/android/os/incremental/IncrementalStorage.java
+++ b/core/java/android/os/incremental/IncrementalStorage.java
@@ -589,33 +589,6 @@
     }
 
     /**
-     * Register to listen to the status changes of the storage health.
-     * @param healthCheckParams Params to specify status change timeouts.
-     * @param listener To report health status change from Incremental Service to the caller.
-     */
-    public boolean registerStorageHealthListener(StorageHealthCheckParams healthCheckParams,
-            IStorageHealthListener listener) {
-        try {
-            return mService.registerStorageHealthListener(mId, healthCheckParams, listener);
-        } catch (RemoteException e) {
-            e.rethrowFromSystemServer();
-            return false;
-        }
-    }
-
-    /**
-     * Stops listening to the status changes of the storage health.
-     */
-    public void unregisterStorageHealthListener() {
-        try {
-            mService.unregisterStorageHealthListener(mId);
-        } catch (RemoteException e) {
-            e.rethrowFromSystemServer();
-            return;
-        }
-    }
-
-    /**
      * Returns the metrics of the current storage.
      * {@see IIncrementalService} for metrics keys.
      */
diff --git a/core/java/android/permission/ILegacyPermissionManager.aidl b/core/java/android/permission/ILegacyPermissionManager.aidl
index 3bd4bf5..f1f0836 100644
--- a/core/java/android/permission/ILegacyPermissionManager.aidl
+++ b/core/java/android/permission/ILegacyPermissionManager.aidl
@@ -30,7 +30,11 @@
  * @hide
  */
 interface ILegacyPermissionManager {
-    int checkDeviceIdentifierAccess(String packageName, String callingFeatureId, String message, int pid, int uid);
+    int checkDeviceIdentifierAccess(String packageName, String message, String callingFeatureId,
+            int pid, int uid);
+
+    int checkPhoneNumberAccess(String packageName, String message, String callingFeatureId,
+            int pid, int uid);
 
     void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId);
 
diff --git a/core/java/android/permission/LegacyPermissionManager.java b/core/java/android/permission/LegacyPermissionManager.java
index b66dd82..a4fa11b 100644
--- a/core/java/android/permission/LegacyPermissionManager.java
+++ b/core/java/android/permission/LegacyPermissionManager.java
@@ -90,6 +90,36 @@
     }
 
     /**
+     * Checks whether the package with the given pid/uid can read the device phone number.
+     *
+     * @param packageName      the name of the package to be checked for phone number access
+     * @param message          the message to be used for logging during phone number access
+     *                         verification
+     * @param callingFeatureId the feature in the package
+     * @param pid              the process id of the package to be checked
+     * @param uid              the uid of the package to be checked
+     * @return <ul>
+     *     <li>{@link PackageManager#PERMISSION_GRANTED} if the package is allowed phone number
+     *     access</li>
+     *     <li>{@link android.app.AppOpsManager#MODE_IGNORED} if the package does not have phone
+     *     number access but for appcompat reasons this should be a silent failure (ie return empty
+     *     or null data)</li>
+     *     <li>{@link PackageManager#PERMISSION_DENIED} if the package does not have phone number
+     *     access</li>
+     * </ul>
+     * @hide
+     */
+    public int checkPhoneNumberAccess(@Nullable String packageName, @Nullable String message,
+            @Nullable String callingFeatureId, int pid, int uid) {
+        try {
+            return mLegacyPermissionManager.checkPhoneNumberAccess(packageName, message,
+                    callingFeatureId, pid, uid);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Grant default permissions to currently active LUI app
      * @param packageName The package name for the LUI app
      * @param user The user handle
diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java
index 05eb23a..ca132e9 100644
--- a/core/java/android/permission/PermissionControllerManager.java
+++ b/core/java/android/permission/PermissionControllerManager.java
@@ -45,7 +45,6 @@
 import android.os.Process;
 import android.os.UserHandle;
 import android.util.ArrayMap;
-import android.util.ArraySet;
 import android.util.Log;
 import android.util.Pair;
 
@@ -67,7 +66,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -724,44 +722,70 @@
     }
 
     /**
-     * Get the platform permissions which belong to a particular permission group
+     * Get the platform permissions which belong to a particular permission group.
      *
      * @param permissionGroupName The permission group whose permissions are desired
-     * @return A list of the platform permissions in the group, or empty if the group is not a valid
-     * platform group.
+     * @param executor Executor on which to invoke the callback
+     * @param callback A callback which will receive a list of the platform permissions in the
+     *                 group, or empty if the group is not a valid platform group, or there
+     *                 was an exception.
      */
-    public @NonNull Set<String> getPlatformPermissionsForGroup(
-            @NonNull String permissionGroupName) {
-        try {
-            return new ArraySet<>(mRemoteService.postAsync(service -> {
-                AndroidFuture<List<String>> future = new AndroidFuture<>();
-                service.getPlatformPermissionsForGroup(permissionGroupName, future);
-                return future;
-            }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
-        } catch (Exception e) {
-            Log.e(TAG, "Failed to get permissions of " + permissionGroupName, e);
-            return null;
-        }
+    @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING)
+    public void getPlatformPermissionsForGroup(@NonNull String permissionGroupName,
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull Consumer<List<String>> callback) {
+        enforceSomePermissionsGrantedToSelf(
+                Manifest.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING);
+        mRemoteService.postAsync(service -> {
+            AndroidFuture<List<String>> future = new AndroidFuture<>();
+            service.getPlatformPermissionsForGroup(permissionGroupName, future);
+            return future;
+        }).whenCompleteAsync((result, err) -> {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                if (err != null) {
+                    Log.e(TAG, "Failed to get permissions of " + permissionGroupName, err);
+                    callback.accept(new ArrayList<>());
+                } else {
+                    callback.accept(result);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }, executor);
     }
 
     /**
-     * Get the platform group of a particular permission, if the permission is a platform permission
+     * Get the platform group of a particular permission, if the permission is a platform
+     * permission.
      *
      * @param permissionName The permission name whose group is desired
-     * @return The name of the permission group this permission belongs to, or null if it has no
-     * group, or is not a platform permission
+     * @param executor Executor on which to invoke the callback
+     * @param callback A callback which will receive the name of the permission group this
+     *                 permission belongs to, or null if it has no group, is not a platform
+     *                 permission, or there was an exception.
      */
-    public @Nullable String getGroupOfPlatformPermission(
-            @NonNull String permissionName) {
-        try {
-            return mRemoteService.postAsync(service -> {
-                AndroidFuture<String> future = new AndroidFuture<>();
-                service.getGroupOfPlatformPermission(permissionName, future);
-                return future;
-            }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
-        } catch (Exception e) {
-            Log.e(TAG, "Failed to get group of " + permissionName, e);
-            return null;
-        }
+    @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING)
+    public void getGroupOfPlatformPermission(@NonNull String permissionName,
+            @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<String> callback) {
+        enforceSomePermissionsGrantedToSelf(
+                Manifest.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING);
+        mRemoteService.postAsync(service -> {
+            AndroidFuture<String> future = new AndroidFuture<>();
+            service.getGroupOfPlatformPermission(permissionName, future);
+            return future;
+        }).whenCompleteAsync((result, err) -> {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                if (err != null) {
+                    Log.e(TAG, "Failed to get group of " + permissionName, err);
+                    callback.accept(null);
+                } else {
+                    callback.accept(result);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }, executor);
     }
 }
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index 934e642..b2c1e7a 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -635,6 +635,50 @@
         public static final MediaSize NA_FOOLSCAP =
                 new MediaSize("NA_FOOLSCAP", "android",
                         R.string.mediasize_na_foolscap, 8000, 13000);
+        /** North America ANSI C media size: 17" x 22" (432mm x 559mm) */
+        public static final @NonNull MediaSize ANSI_C =
+                new MediaSize("ANSI_C", "android",
+                        R.string.mediasize_na_ansi_c, 17000, 22000);
+        /** North America ANSI D media size: 22" x 34" (559mm x 864mm) */
+        public static final @NonNull MediaSize ANSI_D =
+                new MediaSize("ANSI_D", "android",
+                        R.string.mediasize_na_ansi_d, 22000, 34000);
+        /** North America ANSI E media size: 34" x 44" (864mm x 1118mm) */
+        public static final @NonNull MediaSize ANSI_E =
+                new MediaSize("ANSI_E", "android",
+                        R.string.mediasize_na_ansi_e, 34000, 44000);
+        /** North America ANSI F media size: 28" x 40" (711mm x 1016mm) */
+        public static final @NonNull MediaSize ANSI_F =
+                new MediaSize("ANSI_F", "android",
+                        R.string.mediasize_na_ansi_f, 28000, 40000);
+        /** North America Arch A media size: 9" x 12" (229mm x 305mm) */
+        public static final @NonNull MediaSize NA_ARCH_A =
+                new MediaSize("NA_ARCH_A", "android",
+                        R.string.mediasize_na_arch_a, 9000, 12000);
+        /** North America Arch B media size: 12" x 18" (305mm x 457mm) */
+        public static final @NonNull MediaSize NA_ARCH_B =
+                new MediaSize("NA_ARCH_B", "android",
+                        R.string.mediasize_na_arch_b, 12000, 18000);
+        /** North America Arch C media size: 18" x 24" (457mm x 610mm) */
+        public static final @NonNull MediaSize NA_ARCH_C =
+                new MediaSize("NA_ARCH_C", "android",
+                        R.string.mediasize_na_arch_c, 18000, 24000);
+        /** North America Arch D media size: 24" x 36" (610mm x 914mm) */
+        public static final @NonNull MediaSize NA_ARCH_D =
+                new MediaSize("NA_ARCH_D", "android",
+                        R.string.mediasize_na_arch_d, 24000, 36000);
+        /** North America Arch E media size: 36" x 48" (914mm x 1219mm) */
+        public static final @NonNull MediaSize NA_ARCH_E =
+                new MediaSize("NA_ARCH_E", "android",
+                        R.string.mediasize_na_arch_e, 36000, 48000);
+        /** North America Arch E1 media size: 30" x 42" (762mm x 1067mm) */
+        public static final @NonNull MediaSize NA_ARCH_E1 =
+                new MediaSize("NA_ARCH_E1", "android",
+                        R.string.mediasize_na_arch_e1, 30000, 42000);
+        /** North America Super B media size: 13" x 19" (330mm x 483mm) */
+        public static final @NonNull MediaSize NA_SUPER_B =
+                new MediaSize("NA_SUPER_B", "android",
+                        R.string.mediasize_na_super_b, 13000, 19000);
 
         // Chinese
 
@@ -792,6 +836,10 @@
         public static final MediaSize JPN_YOU4 =
                 new MediaSize("JPN_YOU4", "android",
                         R.string.mediasize_japanese_you4, 4134, 9252);
+        /** Japanese Photo L media size: 89mm x 127mm (3.5 x 5") */
+        public static final @NonNull MediaSize OE_PHOTO_L =
+                new MediaSize("OE_PHOTO_L", "android",
+                        R.string.mediasize_japanese_l, 3500, 5000);
 
         private final @NonNull String mId;
         /**@hide */
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 2616a667..2992076 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -83,6 +83,7 @@
 import android.util.Log;
 import android.util.MemoryIntArray;
 import android.view.Display;
+import android.view.Window;
 import android.view.WindowManager.LayoutParams;
 
 import com.android.internal.annotations.GuardedBy;
@@ -4658,19 +4659,20 @@
         public static final String AUTO_TIME_ZONE = Global.AUTO_TIME_ZONE;
 
         /**
-         * Display times as 12 or 24 hours
-         *   12
-         *   24
+         * Display the user's times, e.g. in the status bar, as 12 or 24 hours.
+         * <ul>
+         *    <li>24 = 24 hour</li>
+         *    <li>12 = 12 hour</li>
+         *    <li>[unset] = use the device locale's default</li>
+         * </ul>
          */
         @Readable
         public static final String TIME_12_24 = "time_12_24";
 
         /**
-         * Date format string
-         *   mm/dd/yyyy
-         *   dd/mm/yyyy
-         *   yyyy/mm/dd
+         * @deprecated No longer used. Use {@link #TIME_12_24} instead.
          */
+        @Deprecated
         @Readable
         public static final String DATE_FORMAT = "date_format";
 
@@ -6605,7 +6607,6 @@
          *
          * @hide
          */
-        @Readable
         public static final String ALWAYS_ON_VPN_APP = "always_on_vpn_app";
 
         /**
@@ -8514,6 +8515,12 @@
                 "swipe_bottom_to_notification_enabled";
 
         /**
+         * Controls whether One-Handed mode is currently activated.
+         * @hide
+         */
+        public static final String ONE_HANDED_MODE_ACTIVATED = "one_handed_mode_activated";
+
+        /**
          * For user preference if One-Handed Mode enabled.
          * @hide
          */
@@ -8629,7 +8636,6 @@
          */
         @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
         @TestApi
-        @Readable
         public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component";
 
         /**
@@ -9428,9 +9434,12 @@
          * 0 indicates disabled and 1 indicates enabled. A non existent value should be treated as
          * enabled.
          *
+         * @deprecated Controls are migrated to Quick Settings, rendering this unnecessary and will
+         *             be removed in a future release.
          * @hide
          */
         @Readable
+        @Deprecated
         public static final String CONTROLS_ENABLED = "controls_enabled";
 
         /**
@@ -9498,6 +9507,18 @@
                 = "bubble_important_conversations";
 
         /**
+         * When enabled, notifications able to bubble will display an affordance allowing the user
+         * to bubble them.
+         * The value is boolean (1 to enable or 0 to disable).
+         *
+         * @hide
+         */
+        @TestApi
+        @SuppressLint("NoSettingsProvider")
+        @Readable
+        public static final String NOTIFICATION_BUBBLES = "notification_bubbles";
+
+        /**
          * Whether notifications are dismissed by a right-to-left swipe (instead of a left-to-right
          * swipe).
          *
@@ -9968,6 +9989,7 @@
             CLONE_TO_MANAGED_PROFILE.add(LOCATION_CHANGER);
             CLONE_TO_MANAGED_PROFILE.add(LOCATION_MODE);
             CLONE_TO_MANAGED_PROFILE.add(SHOW_IME_WITH_HARD_KEYBOARD);
+            CLONE_TO_MANAGED_PROFILE.add(NOTIFICATION_BUBBLES);
         }
 
         /** @hide */
@@ -10061,7 +10083,9 @@
          * Whether the notification bubbles are globally enabled
          * The value is boolean (1 or 0).
          * @hide
+         * @deprecated moved to secure settings.
          */
+        @Deprecated
         @TestApi
         @Readable
         public static final String NOTIFICATION_BUBBLES = "notification_bubbles";
@@ -10227,15 +10251,16 @@
         public static final int WIFI_SLEEP_POLICY_NEVER = 2;
 
         /**
-         * Value to specify if the user prefers the date, time and time zone
-         * to be automatically fetched from the network (NITZ). 1=yes, 0=no
+         * Value to specify if the device's UTC system clock should be set automatically, e.g. using
+         * telephony signals like NITZ, or other sources like GNSS or NTP. 1=yes, 0=no (manual)
          */
         @Readable
         public static final String AUTO_TIME = "auto_time";
 
         /**
-         * Value to specify if the user prefers the time zone
-         * to be automatically fetched from the network (NITZ). 1=yes, 0=no
+         * Value to specify if the device's time zone system property should be set automatically,
+         * e.g. using telephony signals like MCC and NITZ, or other mechanisms like the location.
+         * 1=yes, 0=no (manual).
          */
         @Readable
         public static final String AUTO_TIME_ZONE = "auto_time_zone";
@@ -13352,6 +13377,19 @@
         public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
 
         /**
+         * Setting to disable cross-window blurs. This includes window blur behind, (see
+         *  {@link LayoutParams#setBlurBehindRadius}) and window background blur (see
+         *  {@link Window#setBackgroundBlurRadius}).
+         *
+         * The value is a boolean (1 or 0).
+         * @hide
+         */
+        @TestApi
+        @Readable
+        @SuppressLint("NoSettingsProvider")
+        public static final String DISABLE_WINDOW_BLURS = "disable_window_blurs";
+
+        /**
          * Scaling factor for activity transition animations.
          *
          * The value is a float. Setting to 0.0f will disable window animations.
@@ -14810,7 +14848,7 @@
             MOVED_TO_SECURE.add(Global.ZEN_SETTINGS_SUGGESTION_VIEWED);
             MOVED_TO_SECURE.add(Global.CHARGING_SOUNDS_ENABLED);
             MOVED_TO_SECURE.add(Global.CHARGING_VIBRATION_ENABLED);
-
+            MOVED_TO_SECURE.add(Global.NOTIFICATION_BUBBLES);
         }
 
         /** @hide */
diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java
index 5a89cdf..0b11aeb 100644
--- a/core/java/android/security/keymaster/KeymasterDefs.java
+++ b/core/java/android/security/keymaster/KeymasterDefs.java
@@ -66,9 +66,6 @@
     public static final int KM_TAG_CALLER_NONCE = Tag.CALLER_NONCE; // KM_BOOL | 7;
     public static final int KM_TAG_MIN_MAC_LENGTH = Tag.MIN_MAC_LENGTH; // KM_UINT | 8;
 
-    public static final int KM_TAG_BLOB_USAGE_REQUIREMENTS =
-            Tag.BLOB_USAGE_REQUIREMENTS; // KM_ENUM | 705;
-
     public static final int KM_TAG_RSA_PUBLIC_EXPONENT = Tag.RSA_PUBLIC_EXPONENT; // KM_ULONG | 200;
     public static final int KM_TAG_INCLUDE_UNIQUE_ID = Tag.INCLUDE_UNIQUE_ID; // KM_BOOL | 202;
 
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index 6147c58..87c0d9d 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -445,6 +445,14 @@
          * <p>For a given field, either a {@link AutofillValue value} or content can be filled, but
          * not both. Furthermore, when filling content, only a single field can be filled.
          *
+         * <p>The provided {@link ClipData} can contain content URIs (e.g. a URI for an image).
+         * The augmented autofill provider setting the content here must itself have at least
+         * read permissions to any passed content URIs. If the user accepts the suggestion backed
+         * by the content URI(s), the platform will automatically grant read URI permissions to
+         * the app being autofilled, just before passing the content URI(s) to it. The granted
+         * permissions will be transient and tied to the lifecycle of the activity being filled
+         * (when the activity finishes, permissions will automatically be revoked by the platform).
+         *
          * @param id id returned by
          * {@link android.app.assist.AssistStructure.ViewNode#getAutofillId()}.
          * @param content content to be autofilled. Pass {@code null} if you do not have the content
diff --git a/core/java/android/service/autofill/FillEventHistory.java b/core/java/android/service/autofill/FillEventHistory.java
index f226528..7a8f6f4 100644
--- a/core/java/android/service/autofill/FillEventHistory.java
+++ b/core/java/android/service/autofill/FillEventHistory.java
@@ -245,35 +245,35 @@
         @interface EventIds{}
 
         /** No reason for save dialog. */
-        public static final int NO_SAVE_REASON_NONE = 0;
+        public static final int NO_SAVE_UI_REASON_NONE = 0;
 
         /** The SaveInfo associated with the FillResponse is null. */
-        public static final int NO_SAVE_REASON_NO_SAVE_INFO = 1;
+        public static final int NO_SAVE_UI_REASON_NO_SAVE_INFO = 1;
 
         /** The service asked to delay save. */
-        public static final int NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG = 2;
+        public static final int NO_SAVE_UI_REASON_WITH_DELAY_SAVE_FLAG = 2;
 
         /** There was empty value for required ids. */
-        public static final int NO_SAVE_REASON_HAS_EMPTY_REQUIRED = 3;
+        public static final int NO_SAVE_UI_REASON_HAS_EMPTY_REQUIRED = 3;
 
         /** No value has been changed. */
-        public static final int NO_SAVE_REASON_NO_VALUE_CHANGED = 4;
+        public static final int NO_SAVE_UI_REASON_NO_VALUE_CHANGED = 4;
 
         /** Fields failed validation. */
-        public static final int NO_SAVE_REASON_FIELD_VALIDATION_FAILED = 5;
+        public static final int NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED = 5;
 
         /** All fields matched contents of datasets. */
-        public static final int NO_SAVE_REASON_DATASET_MATCH = 6;
+        public static final int NO_SAVE_UI_REASON_DATASET_MATCH = 6;
 
         /** @hide */
-        @IntDef(prefix = { "NO_SAVE_REASON_" }, value = {
-                NO_SAVE_REASON_NONE,
-                NO_SAVE_REASON_NO_SAVE_INFO,
-                NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG,
-                NO_SAVE_REASON_HAS_EMPTY_REQUIRED,
-                NO_SAVE_REASON_NO_VALUE_CHANGED,
-                NO_SAVE_REASON_FIELD_VALIDATION_FAILED,
-                NO_SAVE_REASON_DATASET_MATCH
+        @IntDef(prefix = { "NO_SAVE_UI_REASON_" }, value = {
+                NO_SAVE_UI_REASON_NONE,
+                NO_SAVE_UI_REASON_NO_SAVE_INFO,
+                NO_SAVE_UI_REASON_WITH_DELAY_SAVE_FLAG,
+                NO_SAVE_UI_REASON_HAS_EMPTY_REQUIRED,
+                NO_SAVE_UI_REASON_NO_VALUE_CHANGED,
+                NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED,
+                NO_SAVE_UI_REASON_DATASET_MATCH
         })
         @Retention(RetentionPolicy.SOURCE)
         public @interface NoSaveReason{}
@@ -488,11 +488,12 @@
          * Returns the reason why a save dialog was not shown.
          *
          * <p><b>Note: </b>Only set on events of type {@link #TYPE_CONTEXT_COMMITTED}. For the other
-         * event types, the reason is set to NO_SAVE_REASON_NONE.
+         * event types, the reason is set to NO_SAVE_UI_REASON_NONE.
          *
          * @return The reason why a save dialog was not shown.
          */
-        public int getNoSaveReason() {
+        @NoSaveReason
+        public int getNoSaveUiReason() {
             return mSaveDialogNotShowReason;
         }
 
@@ -533,7 +534,7 @@
             this(eventType, datasetId, clientState, selectedDatasetIds, ignoredDatasetIds,
                     changedFieldIds, changedDatasetIds, manuallyFilledFieldIds,
                     manuallyFilledDatasetIds, detectedFieldIds, detectedFieldClassifications,
-                    NO_SAVE_REASON_NONE);
+                    NO_SAVE_UI_REASON_NONE);
         }
 
         /**
@@ -599,7 +600,7 @@
             mDetectedFieldClassifications = detectedFieldClassifications;
 
             mSaveDialogNotShowReason = Preconditions.checkArgumentInRange(saveDialogNotShowReason,
-                    NO_SAVE_REASON_NONE, NO_SAVE_REASON_DATASET_MATCH,
+                    NO_SAVE_UI_REASON_NONE, NO_SAVE_UI_REASON_DATASET_MATCH,
                     "saveDialogNotShowReason");
         }
 
diff --git a/core/java/android/service/rotationresolver/RotationResolverService.java b/core/java/android/service/rotationresolver/RotationResolverService.java
index 604dd0a..0932901 100644
--- a/core/java/android/service/rotationresolver/RotationResolverService.java
+++ b/core/java/android/service/rotationresolver/RotationResolverService.java
@@ -136,9 +136,6 @@
     @MainThread
     private void resolveRotation(IRotationResolverCallback callback,
             RotationResolutionRequest request, ICancellationSignal transport) {
-        // TODO(b/175334753): The current behavior of preempted failures is based on the design we
-        //  had in Smart OS exploration. We should revisit it once we have implemented the whole
-        //  feature and tested on devices.
         if (mPendingCallback != null
                 && (mCancellationSignal == null || !mCancellationSignal.isCanceled())) {
             reportFailures(callback, ROTATION_RESULT_FAILURE_PREEMPTED);
diff --git a/core/java/android/service/translation/ITranslationCallback.aidl b/core/java/android/service/translation/ITranslationCallback.aidl
index 893c9d0..c7e63a0 100644
--- a/core/java/android/service/translation/ITranslationCallback.aidl
+++ b/core/java/android/service/translation/ITranslationCallback.aidl
@@ -25,5 +25,4 @@
  */
 oneway interface ITranslationCallback {
     void onTranslationResponse(in TranslationResponse translationResponse);
-    void onError();
 }
diff --git a/core/java/android/service/translation/ITranslationService.aidl b/core/java/android/service/translation/ITranslationService.aidl
index 297f00a4..e9dd2c3b 100644
--- a/core/java/android/service/translation/ITranslationService.aidl
+++ b/core/java/android/service/translation/ITranslationService.aidl
@@ -16,6 +16,7 @@
 
 package android.service.translation;
 
+import android.os.IBinder;
 import android.os.ResultReceiver;
 import android.view.translation.TranslationContext;
 import com.android.internal.os.IResultReceiver;
@@ -30,7 +31,7 @@
  * @hide
  */
 oneway interface ITranslationService {
-    void onConnected();
+    void onConnected(in IBinder callback);
     void onDisconnected();
     void onCreateTranslationSession(in TranslationContext translationContext, int sessionId,
          in IResultReceiver receiver);
diff --git a/core/java/android/service/translation/OnTranslationResultCallbackWrapper.java b/core/java/android/service/translation/OnTranslationResultCallbackWrapper.java
index 10a2aa2..f585155 100644
--- a/core/java/android/service/translation/OnTranslationResultCallbackWrapper.java
+++ b/core/java/android/service/translation/OnTranslationResultCallbackWrapper.java
@@ -66,22 +66,13 @@
         }
     }
 
+    /**
+     * @deprecated use {@link #onTranslationSuccess} with error response instead.
+     */
     @Override
+    @Deprecated
     public void onError() {
-        assertNotCalled();
-        if (mCalled.getAndSet(true)) {
-            throw new IllegalStateException("Already called");
-        }
-
-        try {
-            mCallback.onError();
-        } catch (RemoteException e) {
-            if (e instanceof DeadObjectException) {
-                Log.w(TAG, "Process is dead, ignore.");
-                return;
-            }
-            throw e.rethrowAsRuntimeException();
-        }
+        // no-op.
     }
 
     private void assertNotCalled() {
diff --git a/core/java/android/service/translation/TranslationService.java b/core/java/android/service/translation/TranslationService.java
index b79e692..e7234cc 100644
--- a/core/java/android/service/translation/TranslationService.java
+++ b/core/java/android/service/translation/TranslationService.java
@@ -16,6 +16,8 @@
 
 package android.service.translation;
 
+import static android.view.translation.TranslationManager.STATUS_SYNC_CALL_FAIL;
+import static android.view.translation.TranslationManager.STATUS_SYNC_CALL_SUCCESS;
 import static android.view.translation.Translator.EXTRA_SERVICE_BINDER;
 import static android.view.translation.Translator.EXTRA_SESSION_ID;
 
@@ -39,6 +41,7 @@
 import android.util.ArraySet;
 import android.util.Log;
 import android.view.translation.ITranslationDirectManager;
+import android.view.translation.ITranslationServiceCallback;
 import android.view.translation.TranslationCapability;
 import android.view.translation.TranslationContext;
 import android.view.translation.TranslationManager;
@@ -48,6 +51,7 @@
 
 import com.android.internal.os.IResultReceiver;
 
+import java.util.Objects;
 import java.util.Set;
 import java.util.function.Consumer;
 
@@ -82,15 +86,17 @@
     public static final String SERVICE_META_DATA = "android.translation_service";
 
     private Handler mHandler;
+    private ITranslationServiceCallback mCallback;
+
 
     /**
      * Binder to receive calls from system server.
      */
     private final ITranslationService mInterface = new ITranslationService.Stub() {
         @Override
-        public void onConnected() {
-            mHandler.sendMessage(obtainMessage(TranslationService::onConnected,
-                    TranslationService.this));
+        public void onConnected(IBinder callback) {
+            mHandler.sendMessage(obtainMessage(TranslationService::handleOnConnected,
+                    TranslationService.this, callback));
         }
 
         @Override
@@ -141,7 +147,9 @@
 
         /**
          * TODO: implement javadoc
+         * @deprecated use {@link #onTranslationSuccess} with an error response instead.
          */
+        @Deprecated
         void onError();
     }
 
@@ -207,13 +215,33 @@
     }
 
     /**
-     * TODO: fill in javadoc.
+     * Called to notify the service that a session was created
+     * (see {@link android.view.translation.Translator}).
      *
-     * @param translationContext
-     * @param sessionId
+     * <p>The service must call {@code callback.accept()} to acknowledge whether the session is
+     * supported and created successfully. If the translation context is not supported, the service
+     * should call back with {@code false}.</p>
+     *
+     * @param translationContext the {@link TranslationContext} of the session being created.
+     * @param sessionId the int id of the session.
+     * @param callback {@link Consumer} to notify whether the session was successfully created.
      */
     // TODO(b/176464808): the session id won't be unique cross client/server process. Need to find
     // solution to make it's safe.
+    // TODO: make abstract once aiai is implemented.
+    public void onCreateTranslationSession(@NonNull TranslationContext translationContext,
+            int sessionId, @NonNull Consumer<Boolean> callback) {
+        onCreateTranslationSession(translationContext, sessionId);
+        callback.accept(true);
+    }
+
+    /**
+     * TODO: fill in javadoc.
+     *
+     * @deprecated use {@link #onCreateTranslationSession(TranslationContext, int, Consumer)}
+     * instead.
+     */
+    @Deprecated
     public abstract void onCreateTranslationSession(@NonNull TranslationContext translationContext,
             int sessionId);
 
@@ -251,21 +279,58 @@
             @TranslationSpec.DataFormat int targetFormat,
             @NonNull Consumer<Set<TranslationCapability>> callback);
 
-    // TODO(b/176464808): Need to handle client dying case
+    /**
+     * Called by the service to notify an update in existing {@link TranslationCapability}s.
+     *
+     * @param capability the updated {@link TranslationCapability} with its new states and flags.
+     */
+    public final void updateTranslationCapability(@NonNull TranslationCapability capability) {
+        Objects.requireNonNull(capability, "translation capability should not be null");
 
-    // TODO(b/176464808): Need to handle the failure case. e.g. if the context is not supported.
+        final ITranslationServiceCallback callback = mCallback;
+        if (callback == null) {
+            Log.w(TAG, "updateTranslationCapability(): no server callback");
+            return;
+        }
+
+        try {
+            callback.updateTranslationCapability(capability);
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+        }
+    }
+
+    private void handleOnConnected(@NonNull IBinder callback) {
+        mCallback = ITranslationServiceCallback.Stub.asInterface(callback);
+        onConnected();
+    }
+
+    // TODO(b/176464808): Need to handle client dying case
 
     private void handleOnCreateTranslationSession(@NonNull TranslationContext translationContext,
             int sessionId, IResultReceiver resultReceiver) {
-        try {
-            final Bundle extras = new Bundle();
-            extras.putBinder(EXTRA_SERVICE_BINDER, mClientInterface.asBinder());
-            extras.putInt(EXTRA_SESSION_ID, sessionId);
-            resultReceiver.send(0, extras);
-        } catch (RemoteException e) {
-            Log.w(TAG, "RemoteException sending client interface: " + e);
-        }
-        onCreateTranslationSession(translationContext, sessionId);
+        onCreateTranslationSession(translationContext, sessionId,
+                new Consumer<Boolean>() {
+                    @Override
+                    public void accept(Boolean created) {
+                        try {
+                            if (!created) {
+                                Log.w(TAG, "handleOnCreateTranslationSession(): context="
+                                        + translationContext + " not supported by service.");
+                                resultReceiver.send(STATUS_SYNC_CALL_FAIL, null);
+                                return;
+                            }
+
+                            final Bundle extras = new Bundle();
+                            extras.putBinder(EXTRA_SERVICE_BINDER, mClientInterface.asBinder());
+                            extras.putInt(EXTRA_SESSION_ID, sessionId);
+                            resultReceiver.send(STATUS_SYNC_CALL_SUCCESS, extras);
+                        } catch (RemoteException e) {
+                            Log.w(TAG, "RemoteException sending client interface: " + e);
+                        }
+                    }
+                });
+
     }
 
     private void handleOnTranslationCapabilitiesRequest(
@@ -280,7 +345,7 @@
                         final Bundle bundle = new Bundle();
                         bundle.putParcelableArray(TranslationManager.EXTRA_CAPABILITIES,
                                 capabilities.toArray(new TranslationCapability[0]));
-                        resultReceiver.send(TranslationManager.STATUS_SYNC_CALL_SUCCESS, bundle);
+                        resultReceiver.send(STATUS_SYNC_CALL_SUCCESS, bundle);
                     }
                 });
     }
diff --git a/core/java/android/service/voice/AbstractHotwordDetector.java b/core/java/android/service/voice/AbstractHotwordDetector.java
index e4eefc4..4896748 100644
--- a/core/java/android/service/voice/AbstractHotwordDetector.java
+++ b/core/java/android/service/voice/AbstractHotwordDetector.java
@@ -26,8 +26,10 @@
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
 import android.os.RemoteException;
+import android.os.SharedMemory;
 import android.util.Slog;
 
+import com.android.internal.app.IHotwordRecognitionStatusCallback;
 import com.android.internal.app.IVoiceInteractionManagerService;
 
 /** Base implementation of {@link HotwordDetector}. */
@@ -35,6 +37,8 @@
     private static final String TAG = AbstractHotwordDetector.class.getSimpleName();
     private static final boolean DEBUG = false;
 
+    protected final Object mLock = new Object();
+
     private final IVoiceInteractionManagerService mManagerService;
     private final Handler mHandler;
     private final HotwordDetector.Callback mCallback;
@@ -79,6 +83,43 @@
         return true;
     }
 
+    /**
+     * Set configuration and pass read-only data to hotword detection service.
+     *
+     * @param options Application configuration data to provide to the
+     * {@link HotwordDetectionService}. PersistableBundle does not allow any remotable objects or
+     * other contents that can be used to communicate with other processes.
+     * @param sharedMemory The unrestricted data blob to provide to the
+     * {@link HotwordDetectionService}. Use this to provide the hotword models data or other
+     * such data to the trusted process.
+     *
+     * @throws IllegalStateException if this AlwaysOnHotwordDetector wasn't specified to use a
+     * {@link HotwordDetectionService} when it was created. In addition, if this
+     * AlwaysOnHotwordDetector is in an invalid or error state.
+     */
+    @Override
+    public void updateState(@Nullable PersistableBundle options,
+            @Nullable SharedMemory sharedMemory) {
+        if (DEBUG) {
+            Slog.d(TAG, "updateState()");
+        }
+        synchronized (mLock) {
+            updateStateLocked(options, sharedMemory, null /* callback */);
+        }
+    }
+
+    protected void updateStateLocked(@Nullable PersistableBundle options,
+            @Nullable SharedMemory sharedMemory, IHotwordRecognitionStatusCallback callback) {
+        if (DEBUG) {
+            Slog.d(TAG, "updateStateLocked()");
+        }
+        try {
+            mManagerService.updateState(options, sharedMemory, callback);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     private static class BinderCallback
             extends IMicrophoneHotwordDetectionVoiceInteractionCallback.Stub {
         private final Handler mHandler;
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index 8ca0e7c..bacc6ec 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -24,6 +24,7 @@
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.app.ActivityThread;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
@@ -49,6 +50,7 @@
 import android.os.RemoteException;
 import android.os.SharedMemory;
 import android.service.voice.HotwordDetectionService.InitializationStatus;
+import android.util.Log;
 import android.util.Slog;
 
 import com.android.internal.app.IHotwordRecognitionStatusCallback;
@@ -276,7 +278,6 @@
     private final IVoiceInteractionSoundTriggerSession mSoundTriggerSession;
     private final SoundTriggerListener mInternalCallback;
     private final Callback mExternalCallback;
-    private final Object mLock = new Object();
     private final Handler mHandler;
     private final IBinder mBinder = new Binder();
     private final int mTargetSdkVersion;
@@ -348,7 +349,7 @@
         private final HotwordDetectedResult mHotwordDetectedResult;
         private final ParcelFileDescriptor mAudioStream;
 
-        private EventPayload(boolean triggerAvailable, boolean captureAvailable,
+        EventPayload(boolean triggerAvailable, boolean captureAvailable,
                 AudioFormat audioFormat, int captureSession, byte[] data) {
             this(triggerAvailable, captureAvailable, audioFormat, captureSession, data, null,
                     null);
@@ -534,6 +535,15 @@
          */
         public void onHotwordDetectionServiceInitialized(@InitializationStatus int status) {
         }
+
+        /**
+         * Called with the {@link HotwordDetectionService} is restarted.
+         *
+         * Clients are expected to call {@link HotwordDetector#updateState} to share the state with
+         * the newly created service.
+         */
+        public void onHotwordDetectionServiceRestarted() {
+        }
     }
 
     /**
@@ -584,24 +594,15 @@
     }
 
     /**
-     * Set configuration and pass read-only data to hotword detection service.
-     *
-     * @param options Application configuration data to provide to the
-     * {@link HotwordDetectionService}. PersistableBundle does not allow any remotable objects or
-     * other contents that can be used to communicate with other processes.
-     * @param sharedMemory The unrestricted data blob to provide to the
-     * {@link HotwordDetectionService}. Use this to provide the hotword models data or other
-     * such data to the trusted process.
+     * {@inheritDoc}
      *
      * @throws IllegalStateException if this AlwaysOnHotwordDetector wasn't specified to use a
      * {@link HotwordDetectionService} when it was created. In addition, if this
      * AlwaysOnHotwordDetector is in an invalid or error state.
      */
+    @Override
     public final void updateState(@Nullable PersistableBundle options,
             @Nullable SharedMemory sharedMemory) {
-        if (DBG) {
-            Slog.d(TAG, "updateState()");
-        }
         synchronized (mLock) {
             if (!mSupportHotwordDetectionService) {
                 throw new IllegalStateException(
@@ -611,19 +612,36 @@
                 throw new IllegalStateException(
                         "updateState called on an invalid detector or error state");
             }
-            updateStateLocked(options, sharedMemory, null /* callback */);
         }
+
+        super.updateState(options, sharedMemory);
     }
 
-    private void updateStateLocked(@Nullable PersistableBundle options,
-            @Nullable SharedMemory sharedMemory, IHotwordRecognitionStatusCallback callback) {
-        if (DBG) {
-            Slog.d(TAG, "updateStateLocked()");
-        }
-        try {
-            mModelManagementService.updateState(options, sharedMemory, callback);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
+    /**
+     * Test API to simulate to trigger hardware recognition event for test.
+     *
+     * @hide
+     */
+    @TestApi
+    @RequiresPermission(allOf = {RECORD_AUDIO, CAPTURE_AUDIO_HOTWORD})
+    public void triggerHardwareRecognitionEventForTest(int status, int soundModelHandle,
+            boolean captureAvailable, int captureSession, int captureDelayMs, int capturePreambleMs,
+            boolean triggerInData, @NonNull AudioFormat captureFormat, @Nullable byte[] data) {
+        Log.d(TAG, "triggerHardwareRecognitionEventForTest()");
+        synchronized (mLock) {
+            if (mAvailability == STATE_INVALID || mAvailability == STATE_ERROR) {
+                throw new IllegalStateException("triggerHardwareRecognitionEventForTest called on"
+                        + " an invalid detector or error state");
+            }
+            try {
+                mModelManagementService.triggerHardwareRecognitionEventForTest(
+                        new KeyphraseRecognitionEvent(status, soundModelHandle, captureAvailable,
+                                captureSession, captureDelayMs, capturePreambleMs, triggerInData,
+                                captureFormat, data, null /* keyphraseExtras */),
+                        mInternalCallback);
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
         }
     }
 
diff --git a/core/java/android/service/voice/HotwordDetectedResult.java b/core/java/android/service/voice/HotwordDetectedResult.java
index f5d796f..e50de1c 100644
--- a/core/java/android/service/voice/HotwordDetectedResult.java
+++ b/core/java/android/service/voice/HotwordDetectedResult.java
@@ -21,6 +21,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.media.MediaSyncEvent;
 import android.os.Parcelable;
 import android.os.PersistableBundle;
 
@@ -53,9 +54,17 @@
     }
 
     /**
+     * A {@code MediaSyncEvent} that allows the {@link HotwordDetector} to recapture the audio
+     * that contains the hotword trigger. This must be obtained using
+     * {@link android.media.AudioRecord#shareAudioHistory(String, long)}.
+     * <p>
+     * This can be {@code null} if reprocessing the hotword trigger isn't required.
+     */
+    @Nullable
+    private MediaSyncEvent mMediaSyncEvent = null;
+
+    /**
      * Byte offset in the audio stream when the trigger event happened.
-     *
-     * <p>If unset, the most recent bytes in the audio stream will be used.
      */
     private final int mByteOffset;
     private static int defaultByteOffset() {
@@ -84,7 +93,7 @@
 
     /**
      * Returns the maximum values of {@link #getScore} and {@link #getPersonalizedScore}.
-     *
+     * <p>
      * The float value should be calculated as {@code getScore() / getMaxScore()}.
      */
     public static int getMaxScore() {
@@ -159,6 +168,7 @@
     @DataClass.Generated.Member
     /* package-private */ HotwordDetectedResult(
             @HotwordDetector.HotwordConfidenceLevelValue int confidenceLevel,
+            @Nullable MediaSyncEvent mediaSyncEvent,
             int byteOffset,
             int score,
             int personalizedScore,
@@ -167,6 +177,7 @@
         this.mConfidenceLevel = confidenceLevel;
         com.android.internal.util.AnnotationValidations.validate(
                 HotwordDetector.HotwordConfidenceLevelValue.class, null, mConfidenceLevel);
+        this.mMediaSyncEvent = mediaSyncEvent;
         this.mByteOffset = byteOffset;
         this.mScore = score;
         this.mPersonalizedScore = personalizedScore;
@@ -187,9 +198,19 @@
     }
 
     /**
+     * A {@code MediaSyncEvent} that allows the {@link HotwordDetector} to recapture the audio
+     * that contains the hotword trigger. This must be obtained using
+     * {@link android.media.AudioRecord#shareAudioHistory(String, long)}.
+     * <p>
+     * This can be {@code null} if reprocessing the hotword trigger isn't required.
+     */
+    @DataClass.Generated.Member
+    public @Nullable MediaSyncEvent getMediaSyncEvent() {
+        return mMediaSyncEvent;
+    }
+
+    /**
      * Byte offset in the audio stream when the trigger event happened.
-     *
-     * <p>If unset, the most recent bytes in the audio stream will be used.
      */
     @DataClass.Generated.Member
     public int getByteOffset() {
@@ -237,6 +258,9 @@
      *
      * <p>The use of this method is discouraged, and support for it will be removed in future
      * versions of Android.
+     *
+     * <p>This is a PersistableBundle so it doesn't allow any remotable objects or other contents
+     * that can be used to communicate with other processes.
      */
     @DataClass.Generated.Member
     public @NonNull PersistableBundle getExtras() {
@@ -251,6 +275,7 @@
 
         return "HotwordDetectedResult { " +
                 "confidenceLevel = " + mConfidenceLevel + ", " +
+                "mediaSyncEvent = " + mMediaSyncEvent + ", " +
                 "byteOffset = " + mByteOffset + ", " +
                 "score = " + mScore + ", " +
                 "personalizedScore = " + mPersonalizedScore + ", " +
@@ -273,6 +298,7 @@
         //noinspection PointlessBooleanExpression
         return true
                 && mConfidenceLevel == that.mConfidenceLevel
+                && java.util.Objects.equals(mMediaSyncEvent, that.mMediaSyncEvent)
                 && mByteOffset == that.mByteOffset
                 && mScore == that.mScore
                 && mPersonalizedScore == that.mPersonalizedScore
@@ -288,6 +314,7 @@
 
         int _hash = 1;
         _hash = 31 * _hash + mConfidenceLevel;
+        _hash = 31 * _hash + java.util.Objects.hashCode(mMediaSyncEvent);
         _hash = 31 * _hash + mByteOffset;
         _hash = 31 * _hash + mScore;
         _hash = 31 * _hash + mPersonalizedScore;
@@ -302,7 +329,11 @@
         // You can override field parcelling by defining methods like:
         // void parcelFieldName(Parcel dest, int flags) { ... }
 
+        byte flg = 0;
+        if (mMediaSyncEvent != null) flg |= 0x2;
+        dest.writeByte(flg);
         dest.writeInt(mConfidenceLevel);
+        if (mMediaSyncEvent != null) dest.writeTypedObject(mMediaSyncEvent, flags);
         dest.writeInt(mByteOffset);
         dest.writeInt(mScore);
         dest.writeInt(mPersonalizedScore);
@@ -321,7 +352,9 @@
         // You can override field unparcelling by defining methods like:
         // static FieldType unparcelFieldName(Parcel in) { ... }
 
+        byte flg = in.readByte();
         int confidenceLevel = in.readInt();
+        MediaSyncEvent mediaSyncEvent = (flg & 0x2) == 0 ? null : (MediaSyncEvent) in.readTypedObject(MediaSyncEvent.CREATOR);
         int byteOffset = in.readInt();
         int score = in.readInt();
         int personalizedScore = in.readInt();
@@ -331,6 +364,7 @@
         this.mConfidenceLevel = confidenceLevel;
         com.android.internal.util.AnnotationValidations.validate(
                 HotwordDetector.HotwordConfidenceLevelValue.class, null, mConfidenceLevel);
+        this.mMediaSyncEvent = mediaSyncEvent;
         this.mByteOffset = byteOffset;
         this.mScore = score;
         this.mPersonalizedScore = personalizedScore;
@@ -364,6 +398,7 @@
     public static final class Builder {
 
         private @HotwordDetector.HotwordConfidenceLevelValue int mConfidenceLevel;
+        private @Nullable MediaSyncEvent mMediaSyncEvent;
         private int mByteOffset;
         private int mScore;
         private int mPersonalizedScore;
@@ -387,14 +422,27 @@
         }
 
         /**
+         * A {@code MediaSyncEvent} that allows the {@link HotwordDetector} to recapture the audio
+         * that contains the hotword trigger. This must be obtained using
+         * {@link android.media.AudioRecord#shareAudioHistory(String, long)}.
+         * <p>
+         * This can be {@code null} if reprocessing the hotword trigger isn't required.
+         */
+        @DataClass.Generated.Member
+        public @NonNull Builder setMediaSyncEvent(@NonNull MediaSyncEvent value) {
+            checkNotUsed();
+            mBuilderFieldsSet |= 0x2;
+            mMediaSyncEvent = value;
+            return this;
+        }
+
+        /**
          * Byte offset in the audio stream when the trigger event happened.
-         *
-         * <p>If unset, the most recent bytes in the audio stream will be used.
          */
         @DataClass.Generated.Member
         public @NonNull Builder setByteOffset(int value) {
             checkNotUsed();
-            mBuilderFieldsSet |= 0x2;
+            mBuilderFieldsSet |= 0x4;
             mByteOffset = value;
             return this;
         }
@@ -407,7 +455,7 @@
         @DataClass.Generated.Member
         public @NonNull Builder setScore(int value) {
             checkNotUsed();
-            mBuilderFieldsSet |= 0x4;
+            mBuilderFieldsSet |= 0x8;
             mScore = value;
             return this;
         }
@@ -420,7 +468,7 @@
         @DataClass.Generated.Member
         public @NonNull Builder setPersonalizedScore(int value) {
             checkNotUsed();
-            mBuilderFieldsSet |= 0x8;
+            mBuilderFieldsSet |= 0x10;
             mPersonalizedScore = value;
             return this;
         }
@@ -433,7 +481,7 @@
         @DataClass.Generated.Member
         public @NonNull Builder setHotwordPhraseId(int value) {
             checkNotUsed();
-            mBuilderFieldsSet |= 0x10;
+            mBuilderFieldsSet |= 0x20;
             mHotwordPhraseId = value;
             return this;
         }
@@ -449,11 +497,14 @@
          *
          * <p>The use of this method is discouraged, and support for it will be removed in future
          * versions of Android.
+         *
+         * <p>This is a PersistableBundle so it doesn't allow any remotable objects or other contents
+         * that can be used to communicate with other processes.
          */
         @DataClass.Generated.Member
         public @NonNull Builder setExtras(@NonNull PersistableBundle value) {
             checkNotUsed();
-            mBuilderFieldsSet |= 0x20;
+            mBuilderFieldsSet |= 0x40;
             mExtras = value;
             return this;
         }
@@ -461,28 +512,32 @@
         /** Builds the instance. This builder should not be touched after calling this! */
         public @NonNull HotwordDetectedResult build() {
             checkNotUsed();
-            mBuilderFieldsSet |= 0x40; // Mark builder used
+            mBuilderFieldsSet |= 0x80; // Mark builder used
 
             if ((mBuilderFieldsSet & 0x1) == 0) {
                 mConfidenceLevel = defaultConfidenceLevel();
             }
             if ((mBuilderFieldsSet & 0x2) == 0) {
-                mByteOffset = defaultByteOffset();
+                mMediaSyncEvent = null;
             }
             if ((mBuilderFieldsSet & 0x4) == 0) {
-                mScore = defaultScore();
+                mByteOffset = defaultByteOffset();
             }
             if ((mBuilderFieldsSet & 0x8) == 0) {
-                mPersonalizedScore = defaultPersonalizedScore();
+                mScore = defaultScore();
             }
             if ((mBuilderFieldsSet & 0x10) == 0) {
-                mHotwordPhraseId = defaultHotwordPhraseId();
+                mPersonalizedScore = defaultPersonalizedScore();
             }
             if ((mBuilderFieldsSet & 0x20) == 0) {
+                mHotwordPhraseId = defaultHotwordPhraseId();
+            }
+            if ((mBuilderFieldsSet & 0x40) == 0) {
                 mExtras = defaultExtras();
             }
             HotwordDetectedResult o = new HotwordDetectedResult(
                     mConfidenceLevel,
+                    mMediaSyncEvent,
                     mByteOffset,
                     mScore,
                     mPersonalizedScore,
@@ -492,7 +547,7 @@
         }
 
         private void checkNotUsed() {
-            if ((mBuilderFieldsSet & 0x40) != 0) {
+            if ((mBuilderFieldsSet & 0x80) != 0) {
                 throw new IllegalStateException(
                         "This Builder should not be reused. Use a new Builder instance instead");
             }
@@ -500,10 +555,10 @@
     }
 
     @DataClass.Generated(
-            time = 1616965644404L,
+            time = 1619059352684L,
             codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/service/voice/HotwordDetectedResult.java",
-            inputSignatures = "public static final  int BYTE_OFFSET_UNSET\nprivate final @android.service.voice.HotwordDetector.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate final  int mByteOffset\nprivate final  int mScore\nprivate final  int mPersonalizedScore\nprivate final  int mHotwordPhraseId\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static  int defaultConfidenceLevel()\nprivate static  int defaultByteOffset()\nprivate static  int defaultScore()\nprivate static  int defaultPersonalizedScore()\npublic static  int getMaxScore()\nprivate static  int defaultHotwordPhraseId()\npublic static  int getMaxHotwordPhraseId()\nprivate static  android.os.PersistableBundle defaultExtras()\npublic static  int getMaxBundleSize()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
+            inputSignatures = "public static final  int BYTE_OFFSET_UNSET\nprivate final @android.service.voice.HotwordDetector.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate final  int mByteOffset\nprivate final  int mScore\nprivate final  int mPersonalizedScore\nprivate final  int mHotwordPhraseId\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static  int defaultConfidenceLevel()\nprivate static  int defaultByteOffset()\nprivate static  int defaultScore()\nprivate static  int defaultPersonalizedScore()\npublic static  int getMaxScore()\nprivate static  int defaultHotwordPhraseId()\npublic static  int getMaxHotwordPhraseId()\nprivate static  android.os.PersistableBundle defaultExtras()\npublic static  int getMaxBundleSize()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/service/voice/HotwordDetectionService.java b/core/java/android/service/voice/HotwordDetectionService.java
index ea854e8..7e0117d 100644
--- a/core/java/android/service/voice/HotwordDetectionService.java
+++ b/core/java/android/service/voice/HotwordDetectionService.java
@@ -30,6 +30,7 @@
 import android.content.ContentCaptureOptions;
 import android.content.Context;
 import android.content.Intent;
+import android.hardware.soundtrigger.SoundTrigger;
 import android.media.AudioFormat;
 import android.os.Bundle;
 import android.os.Handler;
@@ -133,7 +134,7 @@
     private final IHotwordDetectionService mInterface = new IHotwordDetectionService.Stub() {
         @Override
         public void detectFromDspSource(
-                ParcelFileDescriptor audioStream,
+                SoundTrigger.KeyphraseRecognitionEvent event,
                 AudioFormat audioFormat,
                 long timeoutMillis,
                 IDspHotwordDetectionCallback callback)
@@ -143,8 +144,9 @@
             }
             mHandler.sendMessage(obtainMessage(HotwordDetectionService::onDetect,
                     HotwordDetectionService.this,
-                    audioStream,
-                    audioFormat,
+                    new AlwaysOnHotwordDetector.EventPayload(
+                            event.triggerInData, event.captureAvailable,
+                            event.captureFormat, event.captureSession, event.data),
                     timeoutMillis,
                     new Callback(callback)));
         }
@@ -178,8 +180,6 @@
                     mHandler.sendMessage(obtainMessage(
                             HotwordDetectionService::onDetect,
                             HotwordDetectionService.this,
-                            audioStream,
-                            audioFormat,
                             new Callback(callback)));
                     break;
                 case AUDIO_SOURCE_EXTERNAL:
@@ -246,13 +246,42 @@
      *                      the application fails to abide by the timeout, system will close the
      *                      microphone and cancel the operation.
      * @param callback The callback to use for responding to the detection request.
+     * @deprecated Implement
+     * {@link #onDetect(AlwaysOnHotwordDetector.EventPayload, long, Callback)} instead.
+     *
+     * @hide
+     */
+    @Deprecated
+    @SystemApi
+    public void onDetect(
+            @NonNull ParcelFileDescriptor audioStream,
+            @NonNull AudioFormat audioFormat,
+            @DurationMillisLong long timeoutMillis,
+            @NonNull Callback callback) {
+        // TODO: Add a helpful error message.
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Called when the device hardware (such as a DSP) detected the hotword, to request second stage
+     * validation before handing over the audio to the {@link AlwaysOnHotwordDetector}.
+     * <p>
+     * After {@code callback} is invoked or {@code timeoutMillis} has passed, and invokes the
+     * appropriate {@link AlwaysOnHotwordDetector.Callback callback}.
+     *
+     * @param eventPayload Payload data for the hardware detection event. This may contain the
+     *                     trigger audio, if requested when calling
+     *                     {@link AlwaysOnHotwordDetector#startRecognition(int)}.
+     * @param timeoutMillis Timeout in milliseconds for the operation to invoke the callback. If
+     *                      the application fails to abide by the timeout, system will close the
+     *                      microphone and cancel the operation.
+     * @param callback The callback to use for responding to the detection request.
      *
      * @hide
      */
     @SystemApi
     public void onDetect(
-            @NonNull ParcelFileDescriptor audioStream,
-            @NonNull AudioFormat audioFormat,
+            @NonNull AlwaysOnHotwordDetector.EventPayload eventPayload,
             @DurationMillisLong long timeoutMillis,
             @NonNull Callback callback) {
         // TODO: Add a helpful error message.
@@ -305,7 +334,9 @@
      * @param audioFormat Format of the supplied audio
      * @param callback The callback to use for responding to the detection request.
      * {@link Callback#onRejected(HotwordRejectedResult) callback.onRejected} cannot be used here.
+     * @deprecated Implement {@link #onDetect(Callback)} instead.
      */
+    @Deprecated
     public void onDetect(
             @NonNull ParcelFileDescriptor audioStream,
             @NonNull AudioFormat audioFormat,
@@ -316,6 +347,22 @@
 
     /**
      * Called when the {@link VoiceInteractionService} requests that this service
+     * {@link HotwordDetector#startRecognition() start} hotword recognition on audio coming directly
+     * from the device microphone.
+     * <p>
+     * On successful detection of a hotword, call
+     * {@link Callback#onDetected(HotwordDetectedResult)}.
+     *
+     * @param callback The callback to use for responding to the detection request.
+     * {@link Callback#onRejected(HotwordRejectedResult) callback.onRejected} cannot be used here.
+     */
+    public void onDetect(@NonNull Callback callback) {
+        // TODO: Add a helpful error message.
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Called when the {@link VoiceInteractionService} requests that this service
      * {@link HotwordDetector#startRecognition(ParcelFileDescriptor, AudioFormat,
      * PersistableBundle)} run} hotword recognition on audio coming from an external connected
      * microphone.
diff --git a/core/java/android/service/voice/HotwordDetector.java b/core/java/android/service/voice/HotwordDetector.java
index f4e5dda..2fb4dbc 100644
--- a/core/java/android/service/voice/HotwordDetector.java
+++ b/core/java/android/service/voice/HotwordDetector.java
@@ -27,6 +27,7 @@
 import android.media.AudioFormat;
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
+import android.os.SharedMemory;
 import android.service.voice.HotwordDetectionService.InitializationStatus;
 
 /**
@@ -106,6 +107,21 @@
             @Nullable PersistableBundle options);
 
     /**
+     * Set configuration and pass read-only data to hotword detection service.
+     *
+     * @param options Application configuration data to provide to the
+     * {@link HotwordDetectionService}. PersistableBundle does not allow any remotable objects or
+     * other contents that can be used to communicate with other processes.
+     * @param sharedMemory The unrestricted data blob to provide to the
+     * {@link HotwordDetectionService}. Use this to provide the hotword models data or other
+     * such data to the trusted process.
+     *
+     * @throws IllegalStateException if this HotwordDetector wasn't specified to use a
+     * {@link HotwordDetectionService} when it was created.
+     */
+    void updateState(@Nullable PersistableBundle options, @Nullable SharedMemory sharedMemory);
+
+    /**
      * The callback to notify of detection events.
      */
     interface Callback {
@@ -153,5 +169,13 @@
          * @param status Info about initialization state of {@link HotwordDetectionService}.
          */
         void onHotwordDetectionServiceInitialized(@InitializationStatus int status);
+
+        /**
+         * Called with the {@link HotwordDetectionService} is restarted.
+         *
+         * Clients are expected to call {@link HotwordDetector#updateState} to share the state with
+         * the newly created service.
+         */
+        void onHotwordDetectionServiceRestarted();
     }
 }
diff --git a/core/java/android/service/voice/IHotwordDetectionService.aidl b/core/java/android/service/voice/IHotwordDetectionService.aidl
index 2ffe787..7ba0098 100644
--- a/core/java/android/service/voice/IHotwordDetectionService.aidl
+++ b/core/java/android/service/voice/IHotwordDetectionService.aidl
@@ -16,6 +16,8 @@
 
 package android.service.voice;
 
+import android.content.ContentCaptureOptions;
+import android.hardware.soundtrigger.SoundTrigger;
 import android.media.AudioFormat;
 import android.os.IRemoteCallback;
 import android.os.ParcelFileDescriptor;
@@ -23,7 +25,6 @@
 import android.os.SharedMemory;
 import android.service.voice.IDspHotwordDetectionCallback;
 import android.view.contentcapture.IContentCaptureManager;
-import android.content.ContentCaptureOptions;
 
 /**
  * Provide the interface to communicate with hotword detection service.
@@ -32,7 +33,7 @@
  */
 oneway interface IHotwordDetectionService {
     void detectFromDspSource(
-        in ParcelFileDescriptor audioStream,
+        in SoundTrigger.KeyphraseRecognitionEvent event,
         in AudioFormat audioFormat,
         long timeoutMillis,
         in IDspHotwordDetectionCallback callback);
diff --git a/core/java/android/service/voice/SoftwareHotwordDetector.java b/core/java/android/service/voice/SoftwareHotwordDetector.java
index 376596b..87037f4 100644
--- a/core/java/android/service/voice/SoftwareHotwordDetector.java
+++ b/core/java/android/service/voice/SoftwareHotwordDetector.java
@@ -51,7 +51,6 @@
     private final HotwordDetector.Callback mCallback;
     private final AudioFormat mAudioFormat;
     private final Handler mHandler;
-    private final Object mLock = new Object();
 
     SoftwareHotwordDetector(
             IVoiceInteractionManagerService managerService,
@@ -65,12 +64,7 @@
         mAudioFormat = audioFormat;
         mCallback = callback;
         mHandler = new Handler(Looper.getMainLooper());
-
-        try {
-            mManagerService.updateState(options, sharedMemory, null /* callback */);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
+        updateStateLocked(options, sharedMemory, null /* callback */);
     }
 
     @RequiresPermission(RECORD_AUDIO)
diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java
index 2a25227..b5c838b 100644
--- a/core/java/android/service/voice/VoiceInteractionService.java
+++ b/core/java/android/service/voice/VoiceInteractionService.java
@@ -420,9 +420,13 @@
      *
      * @see #createAlwaysOnHotwordDetector(String, Locale, PersistableBundle, SharedMemory,
      * AlwaysOnHotwordDetector.Callback)
+     * @deprecated Use
+     * {@link #createHotwordDetector(PersistableBundle, SharedMemory, HotwordDetector.Callback)}
+     * instead.
      *
      * @hide
      */
+    @Deprecated
     @SystemApi
     @RequiresPermission(Manifest.permission.MANAGE_HOTWORD_DETECTION)
     @NonNull
@@ -445,6 +449,58 @@
     }
 
     /**
+     * Creates a {@link HotwordDetector} and initializes the application's
+     * {@link HotwordDetectionService} using {@code options} and {code sharedMemory}.
+     *
+     * <p>To be able to call this, you need to set android:hotwordDetectionService in the
+     * android.voice_interaction metadata file to a valid hotword detection service, and set
+     * android:isolatedProcess="true" in the hotword detection service's declaration. Otherwise,
+     * this throws an {@link IllegalStateException}.
+     *
+     * <p>This instance must be retained and used by the client.
+     * Calling this a second time invalidates the previously created hotword detector
+     * which can no longer be used to manage recognition.
+     *
+     * <p>Using this has a noticeable impact on battery, since the microphone is kept open
+     * for the lifetime of the recognition {@link HotwordDetector#startRecognition() session}. On
+     * devices where hardware filtering is available (such as through a DSP), it's highly
+     * recommended to use {@link #createAlwaysOnHotwordDetector} instead.
+     *
+     * @param options Application configuration data to be provided to the
+     * {@link HotwordDetectionService}. PersistableBundle does not allow any remotable objects or
+     * other contents that can be used to communicate with other processes.
+     * @param sharedMemory The unrestricted data blob to be provided to the
+     * {@link HotwordDetectionService}. Use this to provide hotword models or other such data to the
+     * sandboxed process.
+     * @param callback The callback to notify of detection events.
+     * @return A hotword detector for the given audio format.
+     *
+     * @see #createAlwaysOnHotwordDetector(String, Locale, PersistableBundle, SharedMemory,
+     * AlwaysOnHotwordDetector.Callback)
+     *
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(Manifest.permission.MANAGE_HOTWORD_DETECTION)
+    @NonNull
+    public final HotwordDetector createHotwordDetector(
+            @Nullable PersistableBundle options,
+            @Nullable SharedMemory sharedMemory,
+            @NonNull HotwordDetector.Callback callback) {
+        if (mSystemService == null) {
+            throw new IllegalStateException("Not available until onReady() is called");
+        }
+        synchronized (mLock) {
+            // Allow only one concurrent recognition via the APIs.
+            safelyShutdownHotwordDetector();
+            mSoftwareHotwordDetector =
+                    new SoftwareHotwordDetector(
+                            mSystemService, null, options, sharedMemory, callback);
+        }
+        return mSoftwareHotwordDetector;
+    }
+
+    /**
      * Creates an {@link KeyphraseModelManager} to use for enrolling voice models outside of the
      * pre-bundled system voice models.
      * @hide
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 87fb611..53bde36 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -254,6 +254,7 @@
         private int mDisplayState;
 
         SurfaceControl mSurfaceControl = new SurfaceControl();
+        SurfaceControl mBbqSurfaceControl;
         BLASTBufferQueue mBlastBufferQueue;
 
         final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
@@ -976,6 +977,15 @@
                             View.VISIBLE, 0, -1, mWinFrames, mMergedConfiguration, mSurfaceControl,
                             mInsetsState, mTempControls, mSurfaceSize);
                     if (mSurfaceControl.isValid()) {
+                        if (mBbqSurfaceControl == null) {
+                            mBbqSurfaceControl = new SurfaceControl.Builder()
+                                    .setName("Wallpaper BBQ wrapper")
+                                    .setHidden(false)
+                                    .setBLASTLayer()
+                                    .setParent(mSurfaceControl)
+                                    .setCallsite("Wallpaper#relayout")
+                                    .build();
+                        }
                         Surface blastSurface = getOrCreateBLASTSurface(mSurfaceSize.x,
                                 mSurfaceSize.y, mFormat);
                         // If blastSurface == null that means it hasn't changed since the last
@@ -987,11 +997,6 @@
                     }
                     if (!mLastSurfaceSize.equals(mSurfaceSize)) {
                         mLastSurfaceSize.set(mSurfaceSize.x, mSurfaceSize.y);
-                        if (mSurfaceControl != null && mSurfaceControl.isValid()) {
-                            SurfaceControl.Transaction t = new SurfaceControl.Transaction();
-                            t.setBufferSize(mSurfaceControl, mSurfaceSize.x, mSurfaceSize.y);
-                            t.apply();
-                        }
                     }
 
                     if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface
@@ -1830,6 +1835,14 @@
                 } catch (RemoteException e) {
                 }
                 mSurfaceHolder.mSurface.release();
+                if (mBlastBufferQueue != null) {
+                    mBlastBufferQueue.destroy();
+                    mBlastBufferQueue = null;
+                }
+                if (mBbqSurfaceControl != null) {
+                    new SurfaceControl.Transaction().remove(mBbqSurfaceControl).apply();
+                    mBbqSurfaceControl = null;
+                }
                 mCreated = false;
             }
         }
@@ -1854,13 +1867,13 @@
         private Surface getOrCreateBLASTSurface(int width, int height, int format) {
             Surface ret = null;
             if (mBlastBufferQueue == null) {
-                mBlastBufferQueue = new BLASTBufferQueue("Wallpaper", mSurfaceControl, width,
-                        height, format);
+                mBlastBufferQueue = new BLASTBufferQueue("Wallpaper", mBbqSurfaceControl,
+                        width, height, format);
                 // We only return the Surface the first time, as otherwise
                 // it hasn't changed and there is no need to update.
                 ret = mBlastBufferQueue.createSurface();
             } else {
-                mBlastBufferQueue.update(mSurfaceControl, width, height, format);
+                mBlastBufferQueue.update(mBbqSurfaceControl, width, height, format);
             }
 
             return ret;
diff --git a/core/java/android/speech/IRecognitionService.aidl b/core/java/android/speech/IRecognitionService.aidl
index 9a5e534..cc349c8 100644
--- a/core/java/android/speech/IRecognitionService.aidl
+++ b/core/java/android/speech/IRecognitionService.aidl
@@ -58,7 +58,6 @@
      * Cancels the speech recognition.
      *
      * @param listener to receive callbacks, note that this must be non-null
-     * @param packageName the package name calling this API
      */
     void cancel(in IRecognitionListener listener, boolean isShutdown);
 }
diff --git a/core/java/android/speech/RecognitionListener.java b/core/java/android/speech/RecognitionListener.java
index 07bd9ea..c94b60f 100644
--- a/core/java/android/speech/RecognitionListener.java
+++ b/core/java/android/speech/RecognitionListener.java
@@ -62,7 +62,8 @@
     /**
      * A network or recognition error occurred.
      * 
-     * @param error code is defined in {@link SpeechRecognizer}
+     * @param error code is defined in {@link SpeechRecognizer}. Implementations need to handle any
+     *              integer error constant to be passed here beyond constants prefixed with ERROR_.
      */
     void onError(@SpeechRecognizer.RecognitionError int error);
 
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index ad670c8..bb48757 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -34,7 +34,6 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
-import android.os.Process;
 import android.os.RemoteException;
 import android.util.Log;
 
@@ -66,7 +65,12 @@
     private static final String TAG = "RecognitionService";
 
     /** Debugging flag */
-    private static final boolean DBG = false;
+    private static final boolean DBG = true;
+
+    private static final String RECORD_AUDIO_APP_OP =
+            AppOpsManager.permissionToOp(Manifest.permission.RECORD_AUDIO);
+    private static final int RECORD_AUDIO_APP_OP_CODE =
+            AppOpsManager.permissionToOpCode(Manifest.permission.RECORD_AUDIO);
 
     /** Binder of the recognition service */
     private RecognitionServiceBinder mBinder = new RecognitionServiceBinder(this);
@@ -97,7 +101,7 @@
                     dispatchStopListening((IRecognitionListener) msg.obj);
                     break;
                 case MSG_CANCEL:
-                    dispatchCancel((IRecognitionListener) msg.obj, msg.arg1 == 1);
+                    dispatchCancel((IRecognitionListener) msg.obj);
                     break;
                 case MSG_RESET:
                     dispatchClearCallback();
@@ -108,18 +112,20 @@
 
     private void dispatchStartListening(Intent intent, final IRecognitionListener listener,
             @NonNull AttributionSource attributionSource) {
-        if (mCurrentCallback == null) {
-            if (DBG) Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder());
-            mCurrentCallback = new Callback(listener, attributionSource);
+        try {
+            if (mCurrentCallback == null) {
+                if (DBG) {
+                    Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder());
+                }
+                mCurrentCallback = new Callback(listener, attributionSource);
 
-            RecognitionService.this.onStartListening(intent, mCurrentCallback);
-        } else {
-            try {
+                RecognitionService.this.onStartListening(intent, mCurrentCallback);
+            } else {
                 listener.onError(SpeechRecognizer.ERROR_RECOGNIZER_BUSY);
-            } catch (RemoteException e) {
-                Log.d(TAG, "onError call from startListening failed");
+                Log.i(TAG, "concurrent startListening received - ignoring this call");
             }
-            Log.i(TAG, "concurrent startListening received - ignoring this call");
+        } catch (RemoteException e) {
+            Log.d(TAG, "onError call from startListening failed");
         }
     }
 
@@ -139,16 +145,13 @@
         }
     }
 
-    private void dispatchCancel(IRecognitionListener listener, boolean shutDown) {
+    private void dispatchCancel(IRecognitionListener listener) {
         if (mCurrentCallback == null) {
             if (DBG) Log.d(TAG, "cancel called with no preceding startListening - ignoring");
         } else if (mCurrentCallback.mListener.asBinder() != listener.asBinder()) {
             Log.w(TAG, "cancel called by client who did not call startListening - ignoring");
         } else { // the correct state
             RecognitionService.this.onCancel(mCurrentCallback);
-            if (shutDown) {
-                mCurrentCallback.finishRecordAudioOpAttributionToCallerIfNeeded();
-            }
             mCurrentCallback = null;
             if (DBG) Log.d(TAG, "canceling - setting mCurrentCallback to null");
         }
@@ -173,47 +176,6 @@
     }
 
     /**
-     * Checks whether the caller has sufficient permissions
-     * 
-     * @param listener to send the error message to in case of error
-     * @param forDataDelivery If the permission check is for delivering the sensitive data.
-     * @param packageName the package name of the caller
-     * @param featureId The feature in the package
-     * @return {@code true} if the caller has enough permissions, {@code false} otherwise
-     */
-    private boolean checkPermissions(IRecognitionListener listener, boolean forDataDelivery,
-            @NonNull String packageName, @Nullable String featureId) {
-        if (DBG) Log.d(TAG, "checkPermissions");
-
-        final int callingUid = Binder.getCallingUid();
-        if (callingUid == Process.SYSTEM_UID) {
-            // Assuming system has verified permissions of the caller.
-            return true;
-        }
-
-        if (forDataDelivery) {
-            if (PermissionChecker.checkCallingOrSelfPermissionForDataDelivery(this,
-                    android.Manifest.permission.RECORD_AUDIO, packageName, featureId,
-                    null /*message*/) == PermissionChecker.PERMISSION_GRANTED) {
-                return true;
-            }
-        } else {
-            if (PermissionChecker.checkCallingOrSelfPermissionForPreflight(this,
-                    android.Manifest.permission.RECORD_AUDIO)
-                            == PermissionChecker.PERMISSION_GRANTED) {
-                return true;
-            }
-        }
-        try {
-            Log.e(TAG, "call for recognition service without RECORD_AUDIO permissions");
-            listener.onError(SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS);
-        } catch (RemoteException re) {
-            Log.e(TAG, "sending ERROR_INSUFFICIENT_PERMISSIONS message failed", re);
-        }
-        return false;
-    }
-
-    /**
      * Notifies the service that it should start listening for speech.
      * 
      * @param recognizerIntent contains parameters for the recognition to be performed. The intent
@@ -281,7 +243,6 @@
          *        single channel audio stream. The sample rate is implementation dependent.
          */
         public void bufferReceived(byte[] buffer) throws RemoteException {
-            startRecordAudioOpAttributionToCallerIfNeeded();
             mListener.onBufferReceived(buffer);
         }
 
@@ -314,7 +275,6 @@
          *        {@link SpeechRecognizer#RESULTS_RECOGNITION} as a parameter
          */
         public void partialResults(Bundle partialResults) throws RemoteException {
-            startRecordAudioOpAttributionToCallerIfNeeded();
             mListener.onPartialResults(partialResults);
         }
 
@@ -336,7 +296,6 @@
          *        {@link SpeechRecognizer#RESULTS_RECOGNITION} as a parameter
          */
         public void results(Bundle results) throws RemoteException {
-            startRecordAudioOpAttributionToCallerIfNeeded();
             Message.obtain(mHandler, MSG_RESET).sendToTarget();
             mListener.onResults(results);
         }
@@ -366,9 +325,6 @@
          * and passing this identity to {@link
          * android.content.ContextParams.Builder#setNextAttributionSource(AttributionSource)}.
          *
-         *
-         *
-         *
          * @return The permission identity of the calling app.
          *
          * @see android.content.ContextParams.Builder#setNextAttributionSource(
@@ -379,40 +335,55 @@
             return mCallingAttributionSource;
         }
 
-        private void startRecordAudioOpAttributionToCallerIfNeeded() throws RemoteException {
-            if (!isProxyingRecordAudioToCaller()) {
-                final int result = PermissionChecker.checkPermissionAndStartDataDelivery(
-                        RecognitionService.this, Manifest.permission.RECORD_AUDIO,
-                        getAttributionContextForCaller().getAttributionSource(),
-                        /*message*/ null);
-                if (result == PermissionChecker.PERMISSION_GRANTED) {
-                    return;
-                }
-                error(SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS);
+        boolean maybeStartAttribution() {
+            if (DBG) {
+                Log.i(TAG, "Starting attribution");
             }
-        }
 
-        private @NonNull Context getAttributionContextForCaller() {
-            if (mAttributionContext == null) {
+            if (DBG && isProxyingRecordAudioToCaller()) {
+                Log.i(TAG, "Proxying already in progress, not starting the attribution");
+            }
+
+            if (!isProxyingRecordAudioToCaller()) {
                 mAttributionContext = createContext(new ContextParams.Builder()
                         .setNextAttributionSource(mCallingAttributionSource)
                         .build());
+
+                final int result = PermissionChecker.checkPermissionAndStartDataDelivery(
+                        RecognitionService.this,
+                        Manifest.permission.RECORD_AUDIO,
+                        mAttributionContext.getAttributionSource(),
+                        /*message*/ null);
+
+                return result == PermissionChecker.PERMISSION_GRANTED;
             }
-            return mAttributionContext;
+            return false;
         }
 
-        void finishRecordAudioOpAttributionToCallerIfNeeded() {
+        void maybeFinishAttribution() {
+            if (DBG) {
+                Log.i(TAG, "Finishing attribution");
+            }
+
+            if (DBG && !isProxyingRecordAudioToCaller()) {
+                Log.i(TAG, "Not proxying currently, not finishing the attribution");
+            }
+
             if (isProxyingRecordAudioToCaller()) {
-                final String op = AppOpsManager.permissionToOp(Manifest.permission.RECORD_AUDIO);
-                PermissionChecker.finishDataDelivery(RecognitionService.this,
-                        op, getAttributionContextForCaller().getAttributionSource());
+                PermissionChecker.finishDataDelivery(
+                        RecognitionService.this,
+                        RECORD_AUDIO_APP_OP,
+                        mAttributionContext.getAttributionSource());
+
+                mAttributionContext = null;
             }
         }
 
         private boolean isProxyingRecordAudioToCaller() {
-            final int op = AppOpsManager.permissionToOpCode(Manifest.permission.RECORD_AUDIO);
             final AppOpsManager appOpsManager = getSystemService(AppOpsManager.class);
-            return appOpsManager.isProxying(op, getAttributionTag(),
+            return appOpsManager.isProxying(
+                    RECORD_AUDIO_APP_OP_CODE,
+                    getAttributionTag(),
                     mCallingAttributionSource.getUid(),
                     mCallingAttributionSource.getPackageName());
         }
@@ -423,7 +394,7 @@
         private final WeakReference<RecognitionService> mServiceRef;
 
         public RecognitionServiceBinder(RecognitionService service) {
-            mServiceRef = new WeakReference<RecognitionService>(service);
+            mServiceRef = new WeakReference<>(service);
         }
 
         @Override
@@ -445,8 +416,8 @@
             if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder());
             final RecognitionService service = mServiceRef.get();
             if (service != null) {
-                service.mHandler.sendMessage(Message.obtain(service.mHandler,
-                        MSG_STOP_LISTENING, listener));
+                service.mHandler.sendMessage(
+                        Message.obtain(service.mHandler, MSG_STOP_LISTENING, listener));
             }
         }
 
@@ -455,8 +426,8 @@
             if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder());
             final RecognitionService service = mServiceRef.get();
             if (service != null) {
-                service.mHandler.sendMessage(Message.obtain(service.mHandler,
-                        MSG_CANCEL, isShutdown ? 1 : 0, 0, listener));
+                service.mHandler.sendMessage(
+                        Message.obtain(service.mHandler, MSG_CANCEL, listener));
             }
         }
 
diff --git a/core/java/android/speech/RecognizerIntent.java b/core/java/android/speech/RecognizerIntent.java
index 3b5a6d5..3183f15 100644
--- a/core/java/android/speech/RecognizerIntent.java
+++ b/core/java/android/speech/RecognizerIntent.java
@@ -16,8 +16,6 @@
 
 package android.speech;
 
-import java.util.ArrayList;
-
 import android.app.Activity;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
@@ -28,6 +26,8 @@
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 
+import java.util.ArrayList;
+
 /**
  * Constants for supporting speech recognition through starting an {@link Intent}
  */
@@ -39,7 +39,14 @@
      * is set by anyone but the system process, it should be overridden by the voice search
      * implementation.
      */
-    public final static String EXTRA_CALLING_PACKAGE = "calling_package";
+    public static final String EXTRA_CALLING_PACKAGE = "calling_package";
+
+    /**
+     * The extra key used in an intent which is providing an already opened audio source for the
+     * RecognitionService to use. Data should be a URI to an audio resource.
+     */
+    public static final String EXTRA_AUDIO_INJECT_SOURCE =
+            "android.speech.extra.AUDIO_INJECT_SOURCE";
 
     private RecognizerIntent() {
         // Not for instantiating.
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index 00ff687..537dffc 100755
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -268,7 +268,8 @@
         DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(locale);
         boolean allowDuplicateFields = !CompatChanges.isChangeEnabled(
                 DISALLOW_DUPLICATE_FIELD_IN_SKELETON);
-        return dtpg.getBestPattern(skeleton, allowDuplicateFields);
+        return dtpg.getBestPattern(skeleton, DateTimePatternGenerator.MATCH_NO_OPTIONS,
+                allowDuplicateFields);
     }
 
     /**
diff --git a/core/java/android/util/PackageUtils.java b/core/java/android/util/PackageUtils.java
index 8061bf3..ff04825 100644
--- a/core/java/android/util/PackageUtils.java
+++ b/core/java/android/util/PackageUtils.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.pm.Signature;
+import android.text.TextUtils;
 
 import libcore.util.HexEncoding;
 
@@ -39,18 +40,27 @@
     }
 
     /**
+     * @see #computeSignaturesSha256Digests(Signature[], String)
+     */
+    public static @NonNull String[] computeSignaturesSha256Digests(
+            @NonNull Signature[] signatures) {
+        return computeSignaturesSha256Digests(signatures, null);
+    }
+
+    /**
      * Computes the SHA256 digests of a list of signatures. Items in the
      * resulting array of hashes correspond to the signatures in the
      * input array.
      * @param signatures The signatures.
+     * @param separator Separator between each pair of characters, such as a colon, or null to omit.
      * @return The digest array.
      */
     public static @NonNull String[] computeSignaturesSha256Digests(
-            @NonNull Signature[] signatures) {
+            @NonNull Signature[] signatures, @Nullable String separator) {
         final int signatureCount = signatures.length;
         final String[] digests = new String[signatureCount];
         for (int i = 0; i < signatureCount; i++) {
-            digests[i] = computeSha256Digest(signatures[i].toByteArray());
+            digests[i] = computeSha256Digest(signatures[i].toByteArray(), separator);
         }
         return digests;
     }
@@ -66,11 +76,11 @@
             @NonNull Signature[] signatures) {
         // Shortcut for optimization - most apps singed by a single cert
         if (signatures.length == 1) {
-            return computeSha256Digest(signatures[0].toByteArray());
+            return computeSha256Digest(signatures[0].toByteArray(), null);
         }
 
         // Make sure these are sorted to handle reversed certificates
-        final String[] sha256Digests = computeSignaturesSha256Digests(signatures);
+        final String[] sha256Digests = computeSignaturesSha256Digests(signatures, null);
         return computeSignaturesSha256Digest(sha256Digests);
     }
 
@@ -99,7 +109,7 @@
                 /* ignore - can't happen */
             }
         }
-        return computeSha256Digest(bytes.toByteArray());
+        return computeSha256Digest(bytes.toByteArray(), null);
     }
 
     /**
@@ -122,15 +132,34 @@
     }
 
     /**
-     * Computes the SHA256 digest of some data.
-     * @param data The data.
-     * @return The digest or null if an error occurs.
+     * @see #computeSha256Digest(byte[], String)
      */
     public static @Nullable String computeSha256Digest(@NonNull byte[] data) {
+        return computeSha256Digest(data, null);
+    }
+    /**
+     * Computes the SHA256 digest of some data.
+     * @param data The data.
+     * @param separator Separator between each pair of characters, such as a colon, or null to omit.
+     * @return The digest or null if an error occurs.
+     */
+    public static @Nullable String computeSha256Digest(@NonNull byte[] data,
+            @Nullable String separator) {
         byte[] sha256DigestBytes = computeSha256DigestBytes(data);
         if (sha256DigestBytes == null) {
             return null;
         }
-        return HexEncoding.encodeToString(sha256DigestBytes, true /* uppercase */);
+
+        if (separator == null) {
+            return HexEncoding.encodeToString(sha256DigestBytes, true /* uppercase */);
+        }
+
+        int length = sha256DigestBytes.length;
+        String[] pieces = new String[length];
+        for (int index = 0; index < length; index++) {
+            pieces[index] = HexEncoding.encodeToString(sha256DigestBytes[index], true);
+        }
+
+        return TextUtils.join(separator, pieces);
     }
 }
diff --git a/core/java/android/uwb/AdapterState.aidl b/core/java/android/uwb/AdapterState.aidl
new file mode 100644
index 0000000..991f64a
--- /dev/null
+++ b/core/java/android/uwb/AdapterState.aidl
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.uwb;
+
+/**
+ * @hide
+ */
+@Backing(type="int")
+enum AdapterState {
+ /**
+   * The state when UWB is disabled.
+   */
+  STATE_DISABLED,
+
+  /**
+   * The state when UWB is enabled but has no active sessions.
+   */
+  STATE_ENABLED_INACTIVE,
+
+  /**
+   * The state when UWB is enabled and has active sessions.
+   */
+  STATE_ENABLED_ACTIVE,
+}
\ No newline at end of file
diff --git a/core/java/android/uwb/AdapterStateListener.java b/core/java/android/uwb/AdapterStateListener.java
index 8875af3..91847f7 100644
--- a/core/java/android/uwb/AdapterStateListener.java
+++ b/core/java/android/uwb/AdapterStateListener.java
@@ -21,6 +21,7 @@
 import android.os.RemoteException;
 import android.util.Log;
 import android.uwb.UwbManager.AdapterStateCallback;
+import android.uwb.UwbManager.AdapterStateCallback.State;
 import android.uwb.UwbManager.AdapterStateCallback.StateChangedReason;
 
 import java.util.HashMap;
@@ -40,7 +41,8 @@
 
     @StateChangedReason
     private int mAdapterStateChangeReason = AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN;
-    private boolean mAdapterEnabledState = false;
+    @State
+    private int mAdapterState = AdapterStateCallback.STATE_DISABLED;
 
     public AdapterStateListener(@NonNull IUwbAdapter adapter) {
         mAdapter = adapter;
@@ -66,8 +68,7 @@
                     mIsRegistered = true;
                 } catch (RemoteException e) {
                     Log.w(TAG, "Failed to register adapter state callback");
-                    executor.execute(() -> callback.onStateChanged(false,
-                            AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN));
+                    throw e.rethrowFromSystemServer();
                 }
             } else {
                 sendCurrentState(callback);
@@ -93,12 +94,49 @@
                     mAdapter.unregisterAdapterStateCallbacks(this);
                 } catch (RemoteException e) {
                     Log.w(TAG, "Failed to unregister AdapterStateCallback with service");
+                    throw e.rethrowFromSystemServer();
                 }
                 mIsRegistered = false;
             }
         }
     }
 
+    /**
+     * Sets the adapter enabled state
+     *
+     * @param isEnabled value of new adapter state
+     */
+    public void setEnabled(boolean isEnabled) {
+        synchronized (this) {
+            if (!mIsRegistered) {
+                return;
+            } else {
+                try {
+                    mAdapter.setEnabled(isEnabled);
+                } catch (RemoteException e) {
+                    Log.w(TAG, "Failed to set adapter state");
+                    throw e.rethrowFromSystemServer();
+                }
+            }
+        }
+    }
+
+    /**
+     * Gets the adapter enabled state
+     *
+     * @return integer representing adapter enabled state
+     */
+    public int getAdapterState() {
+        synchronized (this) {
+            try {
+                return mAdapter.getAdapterState();
+            } catch (RemoteException e) {
+                Log.w(TAG, "Failed to get adapter state");
+                throw e.rethrowFromSystemServer();
+            }
+        }
+    }
+
     private void sendCurrentState(@NonNull AdapterStateCallback callback) {
         synchronized (this) {
             Executor executor = mCallbackMap.get(callback);
@@ -106,7 +144,7 @@
             final long identity = Binder.clearCallingIdentity();
             try {
                 executor.execute(() -> callback.onStateChanged(
-                        mAdapterEnabledState, mAdapterStateChangeReason));
+                        mAdapterState, mAdapterStateChangeReason));
             } finally {
                 Binder.restoreCallingIdentity(identity);
             }
@@ -114,12 +152,13 @@
     }
 
     @Override
-    public void onAdapterStateChanged(boolean isEnabled, int reason) {
+    public void onAdapterStateChanged(int state, int reason) {
         synchronized (this) {
             @StateChangedReason int localReason =
                     convertToStateChangedReason(reason);
-            mAdapterEnabledState = isEnabled;
+            @State int localState = convertToState(state);
             mAdapterStateChangeReason = localReason;
+            mAdapterState = localState;
             for (AdapterStateCallback cb : mCallbackMap.keySet()) {
                 sendCurrentState(cb);
             }
@@ -146,4 +185,18 @@
                 return AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN;
         }
     }
+
+    private static @State int convertToState(@AdapterState int state) {
+        switch (state) {
+            case AdapterState.STATE_ENABLED_INACTIVE:
+                return AdapterStateCallback.STATE_ENABLED_INACTIVE;
+
+            case AdapterState.STATE_ENABLED_ACTIVE:
+                return AdapterStateCallback.STATE_ENABLED_ACTIVE;
+
+            case AdapterState.STATE_DISABLED:
+            default:
+                return AdapterStateCallback.STATE_DISABLED;
+        }
+    }
 }
diff --git a/core/java/android/uwb/IUwbAdapter.aidl b/core/java/android/uwb/IUwbAdapter.aidl
index 30da248..d879350 100644
--- a/core/java/android/uwb/IUwbAdapter.aidl
+++ b/core/java/android/uwb/IUwbAdapter.aidl
@@ -16,6 +16,7 @@
 
 package android.uwb;
 
+import android.content.AttributionSource;
 import android.os.PersistableBundle;
 import android.uwb.IUwbAdapterStateCallbacks;
 import android.uwb.IUwbRangingCallbacks;
@@ -77,11 +78,13 @@
    * If the provided sessionHandle is already open for the calling client, then
    * #onRangingOpenFailed must be called and the new session must not be opened.
    *
+   * @param attributionSource AttributionSource to use for permission enforcement.
    * @param sessionHandle the session handle to open ranging for
    * @param rangingCallbacks the callbacks used to deliver ranging information
    * @param parameters the configuration to use for ranging
    */
-  void openRanging(in SessionHandle sessionHandle,
+  void openRanging(in AttributionSource attributionSource,
+                   in SessionHandle sessionHandle,
                    in IUwbRangingCallbacks rangingCallbacks,
                    in PersistableBundle parameters);
 
@@ -145,6 +148,31 @@
    */
   void closeRanging(in SessionHandle sessionHandle);
 
+   /**
+     * Disables or enables UWB for a user
+     *
+     * The provided callback's IUwbAdapterStateCallbacks#onAdapterStateChanged
+     * function must be called immediately following state change.
+     *
+     * @param enabled value representing intent to disable or enable UWB. If
+     * true, any subsequent calls to #openRanging will be allowed. If false,
+     * all active ranging sessions will be closed and subsequent calls to
+     * #openRanging will be disallowed.
+     */
+    void setEnabled(boolean enabled);
+
+   /**
+    * Returns the current enabled/disabled UWB state.
+    *
+    * Possible values are:
+    * IUwbAdapterState#STATE_DISABLED
+    * IUwbAdapterState#STATE_ENABLED_ACTIVE
+    * IUwbAdapterState#STATE_ENABLED_INACTIVE
+    *
+    * @return value representing enabled/disabled UWB state.
+    */
+   int getAdapterState();
+
   /**
    * The maximum allowed time to open a ranging session.
    */
diff --git a/core/java/android/uwb/IUwbAdapterStateCallbacks.aidl b/core/java/android/uwb/IUwbAdapterStateCallbacks.aidl
index d928eab..d3b34c6 100644
--- a/core/java/android/uwb/IUwbAdapterStateCallbacks.aidl
+++ b/core/java/android/uwb/IUwbAdapterStateCallbacks.aidl
@@ -17,16 +17,17 @@
 package android.uwb;
 
 import android.uwb.StateChangeReason;
+import android.uwb.AdapterState;
 
 /**
  * @hide
  */
 interface IUwbAdapterStateCallbacks {
   /**
-   * Called whenever the adapter state changes
-   *
-   * @param isEnabled true if the adapter is enabled, false otherwise
-   * @param reason the reason that the state has changed
-   */
-  void onAdapterStateChanged(boolean isEnabled, StateChangeReason reason);
+     * Called whenever the adapter state changes
+     *
+     * @param state UWB state; enabled_active, enabled_inactive, or disabled.
+     * @param reason the reason that the state has changed
+     */
+    void onAdapterStateChanged(AdapterState state, StateChangeReason reason);
 }
\ No newline at end of file
diff --git a/core/java/android/uwb/IUwbRangingCallbacks.aidl b/core/java/android/uwb/IUwbRangingCallbacks.aidl
index f15debb..555bafe 100644
--- a/core/java/android/uwb/IUwbRangingCallbacks.aidl
+++ b/core/java/android/uwb/IUwbRangingCallbacks.aidl
@@ -24,7 +24,7 @@
 /**
  * @hide
  */
-interface IUwbRangingCallbacks {
+oneway interface IUwbRangingCallbacks {
   /**
    * Called when the ranging session has been opened
    *
diff --git a/core/java/android/uwb/RangingManager.java b/core/java/android/uwb/RangingManager.java
index ff8b912..6bba796 100644
--- a/core/java/android/uwb/RangingManager.java
+++ b/core/java/android/uwb/RangingManager.java
@@ -63,8 +63,7 @@
                     new RangingSession(executor, callbacks, mAdapter, sessionHandle);
             mRangingSessionTable.put(sessionHandle, session);
             try {
-                // TODO: Pass in the attributionSource to the service.
-                mAdapter.openRanging(sessionHandle, this, params);
+                mAdapter.openRanging(attributionSource, sessionHandle, this, params);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
diff --git a/core/java/android/uwb/UwbManager.java b/core/java/android/uwb/UwbManager.java
index 95024b3..f7406ae 100644
--- a/core/java/android/uwb/UwbManager.java
+++ b/core/java/android/uwb/UwbManager.java
@@ -71,6 +71,16 @@
         @interface StateChangedReason {}
 
         /**
+         * @hide
+         */
+        @Retention(RetentionPolicy.SOURCE)
+        @IntDef(value = {
+                STATE_ENABLED_INACTIVE,
+                STATE_ENABLED_ACTIVE,
+                STATE_DISABLED})
+        @interface State {}
+
+        /**
          * Indicates that the state change was due to opening of first UWB session
          */
         int STATE_CHANGED_REASON_SESSION_STARTED = 0;
@@ -96,22 +106,41 @@
         int STATE_CHANGED_REASON_ERROR_UNKNOWN = 4;
 
         /**
+         * Indicates that UWB is disabled on device
+         */
+        int STATE_DISABLED = 0;
+        /**
+         * Indicates that UWB is enabled on device but has no active ranging sessions
+         */
+        int STATE_ENABLED_INACTIVE = 1;
+
+        /**
+         * Indicates that UWB is enabled and has active ranging session
+         */
+        int STATE_ENABLED_ACTIVE = 2;
+
+        /**
          * Invoked when underlying UWB adapter's state is changed
          * <p>Invoked with the adapter's current state after registering an
          * {@link AdapterStateCallback} using
          * {@link UwbManager#registerAdapterStateCallback(Executor, AdapterStateCallback)}.
          *
-         * <p>Possible values for the state to change are
+         * <p>Possible reasons for the state to change are
          * {@link #STATE_CHANGED_REASON_SESSION_STARTED},
          * {@link #STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED},
          * {@link #STATE_CHANGED_REASON_SYSTEM_POLICY},
          * {@link #STATE_CHANGED_REASON_SYSTEM_BOOT},
          * {@link #STATE_CHANGED_REASON_ERROR_UNKNOWN}.
          *
-         * @param isEnabled true when UWB adapter is enabled, false when it is disabled
+         * <p>Possible values for the UWB state are
+         * {@link #STATE_ENABLED_INACTIVE},
+         * {@link #STATE_ENABLED_ACTIVE},
+         * {@link #STATE_DISABLED}.
+         *
+         * @param state the UWB state; inactive, active or disabled
          * @param reason the reason for the state change
          */
-        void onStateChanged(boolean isEnabled, @StateChangedReason int reason);
+        void onStateChanged(@State int state, @StateChangedReason int reason);
     }
 
     /**
@@ -149,7 +178,7 @@
      * <p>The provided callback will be invoked by the given {@link Executor}.
      *
      * <p>When first registering a callback, the callbacks's
-     * {@link AdapterStateCallback#onStateChanged(boolean, int)} is immediately invoked to indicate
+     * {@link AdapterStateCallback#onStateChanged(int, int)} is immediately invoked to indicate
      * the current state of the underlying UWB adapter with the most recent
      * {@link AdapterStateCallback.StateChangedReason} that caused the change.
      *
@@ -248,4 +277,32 @@
         return mRangingManager.openSession(
                 mContext.getAttributionSource(), parameters, executor, callbacks);
     }
+
+    /**
+     * Returns the current enabled/disabled state for UWB.
+     *
+     * Possible values are:
+     * AdapterStateCallback#STATE_DISABLED
+     * AdapterStateCallback#STATE_ENABLED_INACTIVE
+     * AdapterStateCallback#STATE_ENABLED_ACTIVE
+     *
+     * @return value representing current enabled/disabled state for UWB.
+     * @hide
+     */
+    public @AdapterStateCallback.State int getAdapterState() {
+        return mAdapterStateListener.getAdapterState();
+    }
+
+    /**
+     * Disables or enables UWB for a user
+     *
+     * @param enabled value representing intent to disable or enable UWB. If true any subsequent
+     * calls to IUwbAdapter#openRanging will be allowed. If false, all active ranging sessions will
+     * be closed and subsequent calls to IUwbAdapter#openRanging will be disallowed.
+     *
+     * @hide
+     */
+    public void setUwbEnabled(boolean enabled) {
+        mAdapterStateListener.setEnabled(enabled);
+    }
 }
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index c87db65..9cb0d1f 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -17,6 +17,7 @@
 package android.view;
 
 import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_MODE;
+import static android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS;
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
@@ -36,6 +37,7 @@
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.Rect;
+import android.hardware.display.BrightnessInfo;
 import android.hardware.display.DeviceProductInfo;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayManagerGlobal;
@@ -730,6 +732,15 @@
     }
 
     /**
+     * @return Brightness information about the display.
+     * @hide
+     */
+    @RequiresPermission(CONTROL_DISPLAY_BRIGHTNESS)
+    public @Nullable BrightnessInfo getBrightnessInfo() {
+        return mGlobal.getBrightnessInfo(mDisplayId);
+    }
+
+    /**
      * Gets the size of the display, in pixels.
      * Value returned by this method does not necessarily represent the actual raw size
      * (native resolution) of the display.
diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl
index 1706799..7125232 100644
--- a/core/java/android/view/IRecentsAnimationController.aidl
+++ b/core/java/android/view/IRecentsAnimationController.aidl
@@ -19,7 +19,6 @@
 import android.app.ActivityManager;
 import android.view.IRemoteAnimationFinishedCallback;
 import android.graphics.GraphicBuffer;
-import android.graphics.Rect;
 import android.window.PictureInPictureSurfaceTransaction;
 import android.window.TaskSnapshot;
 
@@ -39,14 +38,13 @@
     TaskSnapshot screenshotTask(int taskId);
 
     /**
-     * Sets the final bounds on a Task. This is used by Launcher to notify the system that
-     * animating Activity to PiP has completed and the associated task surface should be updated
-     * accordingly. This should be called before `finish`
+     * Sets the final surface transaction on a Task. This is used by Launcher to notify the system
+     * that animating Activity to PiP has completed and the associated task surface should be
+     * updated accordingly. This should be called before `finish`
      * @param taskId for which the leash should be updated
-     * @param destinationBounds bounds of the final PiP window
      * @param finishTransaction leash operations for the final transform.
      */
-     void setFinishTaskBounds(int taskId, in Rect destinationBounds,
+     void setFinishTaskTransaction(int taskId,
              in PictureInPictureSurfaceTransaction finishTransaction);
 
     /**
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 88406ff..cd82489 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -857,7 +857,5 @@
      */
     void unregisterCrossWindowBlurEnabledListener(ICrossWindowBlurEnabledListener listener);
 
-    void setForceCrossWindowBlurDisabled(boolean disable);
-
     boolean isTaskSnapshotSupported();
 }
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index c201e3b..def9ca4 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -541,9 +541,6 @@
 
     private final SparseArray<InsetsSourceControl> mTmpControlArray = new SparseArray<>();
     private final ArrayList<RunningAnimation> mRunningAnimations = new ArrayList<>();
-    private final ArrayList<WindowInsetsAnimation> mTmpRunningAnims = new ArrayList<>();
-    private final List<WindowInsetsAnimation> mUnmodifiableTmpRunningAnims =
-            Collections.unmodifiableList(mTmpRunningAnims);
     private final ArrayList<InsetsAnimationControlImpl> mTmpFinishedControls = new ArrayList<>();
     private final ArraySet<InsetsSourceConsumer> mRequestedVisibilityChanged = new ArraySet<>();
     private WindowInsets mLastInsets;
@@ -601,9 +598,8 @@
                 return;
             }
 
-            mTmpFinishedControls.clear();
-            mTmpRunningAnims.clear();
-            InsetsState state = new InsetsState(mState, true /* copySources */);
+            final List<WindowInsetsAnimation> runningAnimations = new ArrayList<>();
+            final InsetsState state = new InsetsState(mState, true /* copySources */);
             for (int i = mRunningAnimations.size() - 1; i >= 0; i--) {
                 RunningAnimation runningAnimation = mRunningAnimations.get(i);
                 if (DEBUG) Log.d(TAG, "Running animation type: " + runningAnimation.type);
@@ -615,7 +611,7 @@
                     // if it gets finished within applyChangeInsets we still dispatch it to
                     // onProgress.
                     if (runningAnimation.startDispatched) {
-                        mTmpRunningAnims.add(control.getAnimation());
+                        runningAnimations.add(control.getAnimation());
                     }
 
                     if (control.applyChangeInsets(state)) {
@@ -628,9 +624,10 @@
                     mLastInsets.isRound(), mLastInsets.shouldAlwaysConsumeSystemBars(),
                     mLastLegacySoftInputMode, mLastLegacyWindowFlags, mLastLegacySystemUiFlags,
                     mWindowType, mLastWindowingMode, null /* typeSideMap */);
-            mHost.dispatchWindowInsetsAnimationProgress(insets, mUnmodifiableTmpRunningAnims);
+            mHost.dispatchWindowInsetsAnimationProgress(insets,
+                    Collections.unmodifiableList(runningAnimations));
             if (DEBUG) {
-                for (WindowInsetsAnimation anim : mUnmodifiableTmpRunningAnims) {
+                for (WindowInsetsAnimation anim : runningAnimations) {
                     Log.d(TAG, String.format("Running animation type: %d, progress: %f",
                             anim.getTypeMask(), anim.getInterpolatedFraction()));
                 }
@@ -639,6 +636,7 @@
             for (int i = mTmpFinishedControls.size() - 1; i >= 0; i--) {
                 dispatchAnimationEnd(mTmpFinishedControls.get(i).getAnimation());
             }
+            mTmpFinishedControls.clear();
         };
     }
 
@@ -1441,7 +1439,7 @@
     }
 
     void dump(String prefix, PrintWriter pw) {
-        pw.println(prefix); pw.println("InsetsController:");
+        pw.print(prefix); pw.println("InsetsController:");
         mState.dump(prefix + "  ", pw);
     }
 
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index 8e50fed..ee33541 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -46,6 +46,7 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
 import java.util.function.Supplier;
 
 /**
@@ -120,7 +121,11 @@
             ImeTracing.getInstance().triggerClientDump("InsetsSourceConsumer#setControl",
                     mController.getHost().getInputMethodManager(), null /* icProto */);
         }
-        if (mSourceControl == control) {
+        if (Objects.equals(mSourceControl, control)) {
+            if (mSourceControl != null && mSourceControl != control) {
+                mSourceControl.release(SurfaceControl::release);
+                mSourceControl = control;
+            }
             return;
         }
         SurfaceControl oldLeash = mSourceControl != null ? mSourceControl.getLeash() : null;
@@ -179,7 +184,9 @@
                 if (oldLeash == null || newLeash == null || !oldLeash.isSameSurface(newLeash)) {
                     applyHiddenToControl();
                 }
-                if (!requestedVisible && !mIsAnimationPending) {
+
+                // Remove the surface that owned by last control when it lost.
+                if (!requestedVisible && !mIsAnimationPending && lastControl == null) {
                     removeSurface();
                 }
             }
diff --git a/core/java/android/view/InsetsSourceControl.java b/core/java/android/view/InsetsSourceControl.java
index 9256bef..85ff93b 100644
--- a/core/java/android/view/InsetsSourceControl.java
+++ b/core/java/android/view/InsetsSourceControl.java
@@ -152,6 +152,34 @@
         }
     }
 
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        final InsetsSourceControl that = (InsetsSourceControl) o;
+        final SurfaceControl thatLeash = that.mLeash;
+        return mType == that.mType
+                && ((mLeash == thatLeash)
+                        || (mLeash != null && thatLeash != null && mLeash.isSameSurface(thatLeash)))
+                && mSurfacePosition.equals(that.mSurfacePosition)
+                && mInsetsHint.equals(that.mInsetsHint)
+                && mSkipAnimationOnce == that.mSkipAnimationOnce;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = mType;
+        result = 31 * result + (mLeash != null ? mLeash.hashCode() : 0);
+        result = 31 * result + mSurfacePosition.hashCode();
+        result = 31 * result + mInsetsHint.hashCode();
+        result = 31 * result + (mSkipAnimationOnce ? 1 : 0);
+        return result;
+    }
+
     public void dump(String prefix, PrintWriter pw) {
         pw.print(prefix);
         pw.print("InsetsSourceControl type="); pw.print(InsetsState.typeToString(mType));
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index dea32cd..31ca8e1 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -2674,7 +2674,7 @@
      * @see #AXIS_X
      */
     public final float getRawX() {
-        Compatibility.reportChange(APP_USES_RAW_INPUT_COORDS);
+        Compatibility.reportUnconditionalChange(APP_USES_RAW_INPUT_COORDS);
         return nativeGetRawAxisValue(mNativePtr, AXIS_X, 0, HISTORY_CURRENT);
     }
 
@@ -2688,7 +2688,7 @@
      * @see #AXIS_Y
      */
     public final float getRawY() {
-        Compatibility.reportChange(APP_USES_RAW_INPUT_COORDS);
+        Compatibility.reportUnconditionalChange(APP_USES_RAW_INPUT_COORDS);
         return nativeGetRawAxisValue(mNativePtr, AXIS_Y, 0, HISTORY_CURRENT);
     }
 
@@ -2705,7 +2705,7 @@
      * @see #AXIS_X
      */
     public float getRawX(int pointerIndex) {
-        Compatibility.reportChange(APP_USES_RAW_INPUT_COORDS);
+        Compatibility.reportUnconditionalChange(APP_USES_RAW_INPUT_COORDS);
         return nativeGetRawAxisValue(mNativePtr, AXIS_X, pointerIndex, HISTORY_CURRENT);
     }
 
@@ -2722,7 +2722,7 @@
      * @see #AXIS_Y
      */
     public float getRawY(int pointerIndex) {
-        Compatibility.reportChange(APP_USES_RAW_INPUT_COORDS);
+        Compatibility.reportUnconditionalChange(APP_USES_RAW_INPUT_COORDS);
         return nativeGetRawAxisValue(mNativePtr, AXIS_Y, pointerIndex, HISTORY_CURRENT);
     }
 
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index aa3c9d6..ff2d2eb 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -936,18 +936,21 @@
      * @param frameRate The intended frame rate of this surface, in frames per second. 0
      * is a special value that indicates the app will accept the system's choice for the
      * display frame rate, which is the default behavior if this function isn't
-     * called. The frameRate param does <em>not</em> need to be a valid refresh rate for
-     * this device's display - e.g., it's fine to pass 30fps to a device that can only run
+     * called. The <code>frameRate</code> parameter does <em>not</em> need to be a valid refresh
+     * rate for this device's display - e.g., it's fine to pass 30fps to a device that can only run
      * the display at 60fps.
      *
      * @param compatibility The frame rate compatibility of this surface. The
      * compatibility value may influence the system's choice of display frame rate.
+     * This parameter is ignored when <code>frameRate</code> is 0.
      *
-     * @param changeFrameRateStrategy Whether display refresh rate transitions should be seamless. A
-     * seamless transition is one that doesn't have any visual interruptions, such as a black
-     * screen for a second or two.
+     * @param changeFrameRateStrategy Whether display refresh rate transitions caused by this
+     * surface should be seamless. A seamless transition is one that doesn't have any visual
+     * interruptions, such as a black screen for a second or two. This parameter is ignored when
+     * <code>frameRate</code> is 0.
      *
-     * @throws IllegalArgumentException If frameRate or compatibility are invalid.
+     * @throws IllegalArgumentException If <code>frameRate</code>, <code>compatibility</code> or
+     * <code>changeFrameRateStrategy</code> are invalid.
      */
     public void setFrameRate(@FloatRange(from = 0.0) float frameRate,
             @FrameRateCompatibility int compatibility,
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 83669fa..ac70dff 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -1085,8 +1085,8 @@
                 throw new IllegalStateException(
                         "Only buffer layers can set a valid buffer size.");
             }
-            boolean isBqLayer = isBufferQueueLayer();
-            if (isBqLayer) {
+
+            if ((mFlags & FX_SURFACE_MASK) == FX_SURFACE_NORMAL) {
                 setBLASTLayer();
             }
 
@@ -1310,10 +1310,6 @@
             return  (mFlags & FX_SURFACE_EFFECT) == FX_SURFACE_EFFECT;
         }
 
-        private boolean isBufferQueueLayer() {
-            return (mFlags & FX_SURFACE_NORMAL) == FX_SURFACE_NORMAL;
-        }
-
         /**
          * @hide
          */
@@ -3302,20 +3298,26 @@
          * because the system may change the display refresh rate, calls to this function may result
          * in changes to Choreographer callback timings, and changes to the time interval at which
          * the system releases buffers back to the application.
+         * <p>
+         * Note that this only has an effect for surfaces presented on the display. If this
+         * surface is consumed by something other than the system compositor, e.g. a media
+         * codec, this call has no effect.
          *
          * @param sc The SurfaceControl to specify the frame rate of.
          * @param frameRate The intended frame rate for this surface, in frames per second. 0 is a
          *                  special value that indicates the app will accept the system's choice for
          *                  the display frame rate, which is the default behavior if this function
-         *                  isn't called. The frameRate param does <em>not</em> need to be a valid
-         *                  refresh rate for this device's display - e.g., it's fine to pass 30fps
-         *                  to a device that can only run the display at 60fps.
+         *                  isn't called. The <code>frameRate</code> param does <em>not</em> need
+         *                  to be a valid refresh rate for this device's display - e.g., it's fine
+         *                  to pass 30fps to a device that can only run the display at 60fps.
          * @param compatibility The frame rate compatibility of this surface. The compatibility
          *                      value may influence the system's choice of display frame rate.
-         * @param changeFrameRateStrategy Whether display refresh rate transitions should be
-         *                                seamless. A seamless transition is one that doesn't have
-         *                                any visual interruptions, such as a black screen for a
-         *                                second or two.
+         *                      This parameter is ignored when <code>frameRate</code> is 0.
+         * @param changeFrameRateStrategy Whether display refresh rate transitions caused by this
+         *                                surface should be seamless. A seamless transition is one
+         *                                that doesn't have any visual interruptions, such as a
+         *                                black screen for a second or two. This parameter is
+         *                                ignored when <code>frameRate</code> is 0.
          * @return This transaction object.
          */
         @NonNull
diff --git a/core/java/android/view/SyncRtSurfaceTransactionApplier.java b/core/java/android/view/SyncRtSurfaceTransactionApplier.java
index acbcbfa..162c71b 100644
--- a/core/java/android/view/SyncRtSurfaceTransactionApplier.java
+++ b/core/java/android/view/SyncRtSurfaceTransactionApplier.java
@@ -191,7 +191,7 @@
              * @return this Builder
              */
             public Builder withMatrix(Matrix matrix) {
-                this.matrix = matrix;
+                this.matrix = new Matrix(matrix);
                 flags |= FLAG_MATRIX;
                 return this;
             }
@@ -201,7 +201,7 @@
              * @return this Builder
              */
             public Builder withWindowCrop(Rect windowCrop) {
-                this.windowCrop = windowCrop;
+                this.windowCrop = new Rect(windowCrop);
                 flags |= FLAG_WINDOW_CROP;
                 return this;
             }
@@ -272,8 +272,8 @@
             this.flags = params;
             this.surface = surface;
             this.alpha = alpha;
-            this.matrix = new Matrix(matrix);
-            this.windowCrop = new Rect(windowCrop);
+            this.matrix = matrix;
+            this.windowCrop = windowCrop;
             this.layer = layer;
             this.cornerRadius = cornerRadius;
             this.backgroundBlurRadius = backgroundBlurRadius;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a757295..11fac05 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -1494,7 +1494,7 @@
     public static final int SCROLL_CAPTURE_HINT_AUTO = 0;
 
     /**
-     * Explicitly exclcude this view as a potential scroll capture target. The system will not
+     * Explicitly exclude 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.
      *
@@ -4003,6 +4003,16 @@
 
     /**
      * @hide
+     *
+     * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked
+     * out of the public fields to keep the undefined bits out of the developer's way.
+     *
+     * Flag to disable the ongoing call chip.
+     */
+    public static final int STATUS_BAR_DISABLE_ONGOING_CALL_CHIP = 0x04000000;
+
+    /**
+     * @hide
      */
     public static final int PUBLIC_STATUS_BAR_VISIBILITY_MASK = 0x00003FF7;
 
@@ -4227,7 +4237,10 @@
                     name = "STATUS_BAR_DISABLE_RECENT"),
             @ViewDebug.FlagToString(mask = STATUS_BAR_DISABLE_SEARCH,
                     equals = STATUS_BAR_DISABLE_SEARCH,
-                    name = "STATUS_BAR_DISABLE_SEARCH")
+                    name = "STATUS_BAR_DISABLE_SEARCH"),
+            @ViewDebug.FlagToString(mask = STATUS_BAR_DISABLE_ONGOING_CALL_CHIP,
+                    equals = STATUS_BAR_DISABLE_ONGOING_CALL_CHIP,
+                    name = "STATUS_BAR_DISABLE_ONGOING_CALL_CHIP")
     }, formatToHexString = true)
     @SystemUiVisibility
     int mSystemUiVisibility;
@@ -4256,6 +4269,7 @@
             STATUS_BAR_DISABLE_CLOCK,
             STATUS_BAR_DISABLE_RECENT,
             STATUS_BAR_DISABLE_SEARCH,
+            STATUS_BAR_DISABLE_ONGOING_CALL_CHIP,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface SystemUiVisibility {}
@@ -5260,6 +5274,10 @@
     @Nullable
     private ViewTranslationCallback mViewTranslationCallback;
 
+    @Nullable
+
+    private ViewTranslationResponse mViewTranslationResponse;
+
     /**
      * Simple constructor to use when creating a view from code.
      *
@@ -26005,6 +26023,7 @@
      *
      * @attr ref android.R.styleable#View_minWidth
      */
+    @RemotableViewMethod
     public void setMinimumWidth(int minWidth) {
         mMinWidth = minWidth;
         requestLayout();
@@ -26114,7 +26133,7 @@
     }
 
     /**
-     * This is used by the RootView to perform an optimization when
+     * This is used by the ViewRoot to perform an optimization when
      * the view hierarchy contains one or several SurfaceView.
      * SurfaceView is always considered transparent, but its children are not,
      * therefore all View objects remove themselves from the global transparent
@@ -26126,10 +26145,8 @@
      * point is opaque, regardless of the transparent region; returns false
      * if it is possible for underlying windows to be seen behind the view.
      *
-     * {@hide}
      */
-    @UnsupportedAppUsage
-    public boolean gatherTransparentRegion(Region region) {
+    public boolean gatherTransparentRegion(@Nullable Region region) {
         final AttachInfo attachInfo = mAttachInfo;
         if (region != null && attachInfo != null) {
             final int pflags = mPrivateFlags;
@@ -30143,6 +30160,10 @@
      */
     public void setScrollCaptureHint(@ScrollCaptureHint int hint) {
         mPrivateFlags4 &= ~PFLAG4_SCROLL_CAPTURE_HINT_MASK;
+        // Since include/exclude are mutually exclusive, exclude takes precedence.
+        if ((hint & SCROLL_CAPTURE_HINT_EXCLUDE) != 0) {
+            hint &= ~SCROLL_CAPTURE_HINT_INCLUDE;
+        }
         mPrivateFlags4 |= ((hint << PFLAG4_SCROLL_CAPTURE_HINT_SHIFT)
                 & PFLAG4_SCROLL_CAPTURE_HINT_MASK);
     }
@@ -30765,57 +30786,50 @@
     }
 
     /**
-     * Returns a {@link ViewTranslationRequest} which represents the content to be translated.
-     *
-     * <p>The default implementation does nothing and returns null.</p>
-     *
-     * @param supportedFormats the supported translation formats. For now, the only possible value
-     * is the {@link android.view.translation.TranslationSpec#DATA_FORMAT_TEXT}.
-     * @return the {@link ViewTranslationRequest} which contains the information to be translated or
-     * {@code null} if this View doesn't support translation.
-     * The {@link AutofillId} must be set on the returned value.
-     */
-    @Nullable
-    public ViewTranslationRequest onCreateTranslationRequest(
-            @NonNull @DataFormat int[] supportedFormats) {
-        return null;
-    }
-
-    /**
-     * Returns a {@link ViewTranslationRequest} list which represents the content to be translated
-     * in the virtual view. This is called if this view returned a virtual view structure
-     * from {@link #onProvideContentCaptureStructure} and the system determined that those virtual
-     * views were relevant for translation.
+     * Collects a {@link ViewTranslationRequest} which represents the content to be translated in
+     * the view.
      *
      * <p>The default implementation does nothing.</p>
      *
-     * @param virtualChildIds the virtual child ids which represents the child views in the virtual
+     * @param supportedFormats the supported translation formats. For now, the only possible value
+     * is the {@link android.view.translation.TranslationSpec#DATA_FORMAT_TEXT}.
+     * @param requestsCollector a {@link ViewTranslationRequest} collector that can be used to
+     * collect the information to be translated in the view. The {@code requestsCollector} only
+     * accepts one request; an IllegalStateException is thrown if more than one
+     * {@link ViewTranslationRequest} is submitted to it. The {@link AutofillId} must be set on the
+     * {@link ViewTranslationRequest}.
+     */
+    public void onCreateViewTranslationRequest(@NonNull @DataFormat int[] supportedFormats,
+            @NonNull Consumer<ViewTranslationRequest> requestsCollector) {
+    }
+
+    /**
+     * Collects {@link ViewTranslationRequest}s which represents the content to be translated
+     * for the virtual views in the host view. This is called if this view returned a virtual
+     * view structure from {@link #onProvideContentCaptureStructure} and the system determined that
+     * those virtual views were relevant for translation.
+     *
+     * <p>The default implementation does nothing.</p>
+     *
+     * @param virtualIds the virtual view ids which represents the virtual views in the host
      * view.
      * @param supportedFormats the supported translation formats. For now, the only possible value
      * is the {@link android.view.translation.TranslationSpec#DATA_FORMAT_TEXT}.
      * @param requestsCollector a {@link ViewTranslationRequest} collector that can be called
-     * multiple times to collect the information to be translated in the virtual view. One
+     * multiple times to collect the information to be translated in the host view. One
      * {@link ViewTranslationRequest} per virtual child. The {@link ViewTranslationRequest} must
      * contains the {@link AutofillId} corresponding to the virtualChildIds. Do not keep this
      * Consumer after the method returns.
      */
     @SuppressLint("NullableCollection")
-    public void onCreateTranslationRequests(@NonNull long[] virtualChildIds,
+    public void onCreateVirtualViewTranslationRequests(@NonNull long[] virtualIds,
             @NonNull @DataFormat int[] supportedFormats,
             @NonNull Consumer<ViewTranslationRequest> requestsCollector) {
         // no-op
     }
 
     /**
-     * Returns a {@link ViewTranslationCallback} that is used to display/hide the translated
-     * information. If the View supports displaying translated content, it should implement
-     * {@link ViewTranslationCallback}.
-     *
-     * <p>The default implementation returns null if developers don't set the customized
-     * {@link ViewTranslationCallback} by {@link #setViewTranslationCallback} </p>
-     *
-     * @return a {@link ViewTranslationCallback} that is used to control how to display the
-     * translated information or {@code null} if this View doesn't support translation.
+     * @hide
      */
     @Nullable
     public ViewTranslationCallback getViewTranslationCallback() {
@@ -30835,30 +30849,52 @@
     }
 
     /**
-     * Called when the content from {@link View#onCreateTranslationRequest} had been translated by
-     * the TranslationService.
+     * Clear the {@link ViewTranslationCallback} from this view.
+     */
+    public void clearViewTranslationCallback() {
+        mViewTranslationCallback = null;
+    }
+
+    /**
+     * Returns the {@link ViewTranslationResponse} associated with this view. The response will be
+     * set when the translation is done then {@link #onViewTranslationResponse} is called. The
+     * {@link ViewTranslationCallback} can use to get {@link ViewTranslationResponse} to display the
+     * translated information.
      *
-     * <p> The default implementation does nothing.</p>
+     * @return a {@link ViewTranslationResponse} that contains the translated information associated
+     * with this view or {@code null} if this View doesn't have the translation.
+     */
+    @Nullable
+    public ViewTranslationResponse getViewTranslationResponse() {
+        return mViewTranslationResponse;
+    }
+
+    /**
+     * Called when the content from {@link View#onCreateViewTranslationRequest} had been translated
+     * by the TranslationService.
+     *
+     * <p> The default implementation will set the ViewTranslationResponse that can be get from
+     * {@link View#getViewTranslationResponse}. </p>
      *
      * @param response a {@link ViewTranslationResponse} that contains the translated information
      * which can be shown in the view.
      */
-    public void onTranslationResponse(@NonNull ViewTranslationResponse response) {
-        // no-op
+    public void onViewTranslationResponse(@NonNull ViewTranslationResponse response) {
+        mViewTranslationResponse = response;
     }
 
     /**
-     * Called when the content from {@link View#onCreateTranslationRequest} had been translated by
-     * the TranslationService.
+     * Called when the content from {@link View#onCreateVirtualViewTranslationRequests} had been
+     * translated by the TranslationService.
      *
      * <p> The default implementation does nothing.</p>
      *
      * @param response a {@link ViewTranslationResponse} SparseArray for the request that send by
-     * {@link View#onCreateTranslationRequests} that contains the translated information which can
-     * be shown in the view. The key of SparseArray is
-     * the virtual child ids.
+     * {@link View#onCreateVirtualViewTranslationRequests} that contains the translated information
+     * which can be shown in the view. The key of SparseArray is the virtual child ids.
      */
-    public void onTranslationResponse(@NonNull LongSparseArray<ViewTranslationResponse> response) {
+    public void onVirtualViewTranslationResponses(
+            @NonNull LongSparseArray<ViewTranslationResponse> response) {
         // no-op
     }
 
@@ -30866,16 +30902,18 @@
      * Dispatch to collect the {@link ViewTranslationRequest}s for translation purpose by traversing
      * the hierarchy when the app requests ui translation. Typically, this method should only be
      * overridden by subclasses that provide a view hierarchy (such as {@link ViewGroup}). Other
-     * classes should override {@link View#onCreateTranslationRequest}. When requested to start the
-     * ui translation, the system will call this method to traverse the view hierarchy to call
-     * {@link View#onCreateTranslationRequest} to build {@link ViewTranslationRequest}s and create a
+     * classes should override {@link View#onCreateViewTranslationRequest} for normal view or
+     * override {@link View#onVirtualViewTranslationResponses} for view contains virtual children.
+     * When requested to start the ui translation, the system will call this method to traverse the
+     * view hierarchy to collect {@link ViewTranslationRequest}s and create a
      * {@link android.view.translation.Translator} to translate the requests. All the
      * {@link ViewTranslationRequest}s must be added when the traversal is done.
      *
-     * <p> The default implementation calls {@link View#onCreateTranslationRequest} to build
-     * {@link ViewTranslationRequest} if the view should be translated. The view is marked as having
-     * {@link #setHasTransientState(boolean) transient state} so that recycling of views doesn't
-     * prevent the system from attaching the response to it.</p>
+     * <p> The default implementation calls {@link View#onCreateViewTranslationRequest} for normal
+     * view or calls {@link View#onVirtualViewTranslationResponses} for view contains virtual
+     * children to build {@link ViewTranslationRequest} if the view should be translated.
+     * The view is marked as having {@link #setHasTransientState(boolean) transient state} so that
+     * recycling of views doesn't prevent the system from attaching the response to it.</p>
      *
      * @param viewIds a map for the view's {@link AutofillId} and its virtual child ids or
      * {@code null} if the view doesn't have virtual child that should be translated. The virtual
@@ -30888,27 +30926,47 @@
      */
     public void dispatchRequestTranslation(@NonNull Map<AutofillId, long[]> viewIds,
             @NonNull @DataFormat int[] supportedFormats,
-            @Nullable TranslationCapability capability,
+            @NonNull TranslationCapability capability,
             @NonNull List<ViewTranslationRequest> requests) {
         AutofillId autofillId = getAutofillId();
         if (viewIds.containsKey(autofillId)) {
             if (viewIds.get(autofillId) == null) {
-                ViewTranslationRequest request = onCreateTranslationRequest(supportedFormats);
-                if (request != null && request.getKeys().size() > 0) {
-                    requests.add(request);
-                    if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) {
-                        Log.v(CONTENT_CAPTURE_LOG_TAG, "Calling setHasTransientState(true) for "
-                                + autofillId);
-                    }
-                    // TODO: Add a default ViewTranslationCallback for View that resets this in
-                    // onClearTranslation(). Also update the javadoc for this method to mention
-                    // that.
-                    setHasTransientState(true);
-                }
+                // TODO: avoiding the allocation per view
+                onCreateViewTranslationRequest(supportedFormats,
+                        new ViewTranslationRequestConsumer(requests));
             } else {
-                onCreateTranslationRequests(viewIds.get(autofillId), supportedFormats, request -> {
-                    requests.add(request);
-                });
+                onCreateVirtualViewTranslationRequests(viewIds.get(autofillId), supportedFormats,
+                        request -> {
+                            requests.add(request);
+                        });
+            }
+        }
+    }
+
+    private class ViewTranslationRequestConsumer implements Consumer<ViewTranslationRequest> {
+        private final List<ViewTranslationRequest> mRequests;
+        private boolean mCalled;
+
+        ViewTranslationRequestConsumer(List<ViewTranslationRequest> requests) {
+            mRequests = requests;
+        }
+
+        @Override
+        public void accept(ViewTranslationRequest request) {
+            if (mCalled) {
+                throw new IllegalStateException("The translation Consumer is not reusable.");
+            }
+            mCalled = true;
+            if (request != null && request.getKeys().size() > 0) {
+                mRequests.add(request);
+                if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) {
+                    Log.v(CONTENT_CAPTURE_LOG_TAG, "Calling setHasTransientState(true) for "
+                            + getAutofillId());
+                }
+                // TODO: Add a default ViewTranslationCallback for View that resets this in
+                // onClearTranslation(). Also update the javadoc for this method to mention
+                // that.
+                setHasTransientState(true);
             }
         }
     }
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 01cb0a6..538b888 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -1459,8 +1459,8 @@
         PropertyInfo<ExportedProperty, ?>[] properties = sExportProperties.get(klass);
 
         if (properties == null) {
-            properties = convertToPropertyInfos(klass.getDeclaredMethodsUnchecked(false),
-                    klass.getDeclaredFieldsUnchecked(false), ExportedProperty.class);
+            properties = convertToPropertyInfos(klass.getDeclaredMethods(),
+                    klass.getDeclaredFields(), ExportedProperty.class);
             map.put(klass, properties);
         }
         return properties;
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 04e2cde..a02281b 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -7490,12 +7490,9 @@
             @NonNull Rect localVisibleRect, @NonNull Point windowOffset,
             @NonNull Consumer<ScrollCaptureTarget> targets) {
 
-        // copy local visible rect for modification and dispatch
-        final Rect rect = getTempRect();
-        rect.set(localVisibleRect);
-
-        if (getClipToPadding()) {
-            rect.inset(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom);
+        if (getClipToPadding() && !localVisibleRect.intersect(mPaddingLeft, mPaddingTop,
+                    (mRight - mLeft)  - mPaddingRight, (mBottom - mTop) - mPaddingBottom)) {
+            return;
         }
 
         // Dispatch to self first.
@@ -7506,6 +7503,7 @@
             return;
         }
 
+        final Rect tmpRect = getTempRect();
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
             View child = getChildAt(i);
@@ -7518,8 +7516,7 @@
             // If the resulting rectangle is not empty, the request is forwarded to the child.
 
             // copy local visible rect for modification and dispatch
-            final Rect childVisibleRect = getTempRect();
-            childVisibleRect.set(localVisibleRect);
+            tmpRect.set(localVisibleRect);
 
             // transform to child coords
             final Point childWindowOffset = getTempPoint();
@@ -7528,20 +7525,18 @@
             final int dx = child.mLeft - mScrollX;
             final int dy = child.mTop - mScrollY;
 
-            childVisibleRect.offset(-dx, -dy);
+            tmpRect.offset(-dx, -dy);
             childWindowOffset.offset(dx, dy);
 
             boolean rectIsVisible = true;
 
             // Clip to child bounds
             if (getClipChildren()) {
-                rectIsVisible = childVisibleRect.intersect(0, 0, child.getWidth(),
-                        child.getHeight());
+                rectIsVisible = tmpRect.intersect(0, 0, child.getWidth(), child.getHeight());
             }
 
-            // Clip to child padding.
             if (rectIsVisible) {
-                child.dispatchScrollCaptureSearch(childVisibleRect, childWindowOffset, targets);
+                child.dispatchScrollCaptureSearch(tmpRect, childWindowOffset, targets);
             }
         }
     }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 3cfda57..0958f3f 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2787,8 +2787,8 @@
                 if (!mPendingMergedConfiguration.equals(mLastReportedMergedConfiguration)) {
                     if (DEBUG_CONFIGURATION) Log.v(mTag, "Visible with new config: "
                             + mPendingMergedConfiguration.getMergedConfiguration());
-                    performConfigurationChange(mPendingMergedConfiguration, !mFirst,
-                            INVALID_DISPLAY /* same display */);
+                    performConfigurationChange(new MergedConfiguration(mPendingMergedConfiguration),
+                            !mFirst, INVALID_DISPLAY /* same display */);
                     updatedConfiguration = true;
                 }
 
@@ -2854,7 +2854,6 @@
                             return;
                         }
                     }
-                    notifySurfaceCreated();
                 } else if (surfaceDestroyed) {
                     // If the surface has been removed, then reset the scroll
                     // positions.
@@ -2894,10 +2893,6 @@
                     }
                 }
 
-                if (!surfaceCreated && surfaceReplaced) {
-                    notifySurfaceReplaced();
-                }
-
                 if (mDragResizing != dragResizing) {
                     if (dragResizing) {
                         mResizeMode = freeformResizing
@@ -3110,7 +3105,14 @@
             }
         }
 
-        if (surfaceDestroyed) {
+        // These callbacks will trigger SurfaceView SurfaceHolder.Callbacks and must be invoked
+        // after the measure pass. If its invoked before the measure pass and the app modifies
+        // the view hierarchy in the callbacks, we could leave the views in a broken state.
+        if (surfaceCreated) {
+            notifySurfaceCreated();
+        } else if (surfaceReplaced) {
+            notifySurfaceReplaced();
+        } else if (surfaceDestroyed)  {
             notifySurfaceDestroyed();
         }
 
@@ -5189,6 +5191,17 @@
 
         @Override
         public void handleMessage(Message msg) {
+            if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
+                Trace.traceBegin(Trace.TRACE_TAG_VIEW, getMessageName(msg));
+            }
+            try {
+                handleMessageImpl(msg);
+            } finally {
+                Trace.traceEnd(Trace.TRACE_TAG_VIEW);
+            }
+        }
+
+        private void handleMessageImpl(Message msg) {
             switch (msg.what) {
                 case MSG_INVALIDATE:
                     ((View) msg.obj).invalidate();
@@ -5330,8 +5343,8 @@
                     mPendingMergedConfiguration.setConfiguration(config,
                             mLastReportedMergedConfiguration.getOverrideConfiguration());
 
-                    performConfigurationChange(mPendingMergedConfiguration, false /* force */,
-                            INVALID_DISPLAY /* same display */);
+                    performConfigurationChange(new MergedConfiguration(mPendingMergedConfiguration),
+                            false /* force */, INVALID_DISPLAY /* same display */);
                 } break;
                 case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
                     setAccessibilityFocus(null, null);
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 60516eb..c32ab3a 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -908,20 +908,6 @@
     }
 
     /**
-     * Disables cross-window blurs device-wide. This includes window blur behind
-     * (see {@link LayoutParams#setBlurBehindRadius}) and window background blur
-     * (see {@link Window#setBackgroundBlurRadius}).
-     *
-     * @param disable specifies whether to disable the blur. Note that calling this
-     *                with 'disable=false' will not enable blurs if there is something
-     *                else disabling blurs.
-     * @hide
-     */
-    @TestApi
-    default void setForceCrossWindowBlurDisabled(boolean disable) {
-    }
-
-    /**
      * @hide
      */
     static String transitTypeToString(@TransitionType int type) {
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index 07eeb03..f8009919 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -328,15 +328,6 @@
     }
 
     @Override
-    public void setForceCrossWindowBlurDisabled(boolean disable) {
-        try {
-            WindowManagerGlobal.getWindowManagerService()
-                .setForceCrossWindowBlurDisabled(disable);
-        } catch (RemoteException e) {
-        }
-    }
-
-    @Override
     public boolean isTaskSnapshotSupported() {
         try {
             return WindowManagerGlobal.getWindowManagerService().isTaskSnapshotSupported();
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index df67740..272dfac 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -972,6 +972,14 @@
             finalizeAndCacheAccessibilityNodeInfos(
                     infos, connectionIdWaitingForPrefetchResultCopy, false,
                     packageNamesForNextPrefetchResultCopy);
+            if (mAccessibilityManager != null
+                    && mAccessibilityManager.isAccessibilityTracingEnabled()) {
+                logTrace(getConnection(connectionIdWaitingForPrefetchResultCopy),
+                        "setPrefetchAccessibilityNodeInfoResult",
+                        "InteractionId:" + interactionId + ";Result: " + infos
+                                + ";connectionId=" + connectionIdWaitingForPrefetchResultCopy,
+                        Binder.getCallingUid());
+            }
         } else if (DEBUG) {
             Log.w(LOG_TAG, "Prefetching for interaction with id " + interactionId + " dropped "
                     + infos.size() + " nodes");
@@ -1212,7 +1220,8 @@
     }
 
     private void logTrace(
-            IAccessibilityServiceConnection connection, String method, String params) {
+            IAccessibilityServiceConnection connection, String method, String params,
+            int callingUid) {
         try {
             Bundle b = new Bundle();
             ArrayList<StackTraceElement> callStack = new ArrayList<StackTraceElement>(
@@ -1220,9 +1229,14 @@
             b.putSerializable(CALL_STACK, callStack);
             connection.logTrace(SystemClock.elapsedRealtimeNanos(),
                     LOG_TAG + ".callback for " + method, params, Process.myPid(),
-                    Thread.currentThread().getId(), mCallingUid, b);
+                    Thread.currentThread().getId(), callingUid, b);
         } catch (RemoteException e) {
             Log.e(LOG_TAG, "Failed to log trace. " + e);
         }
     }
+
+    private void logTrace(
+            IAccessibilityServiceConnection connection, String method, String params) {
+        logTrace(connection, method, params, mCallingUid);
+    }
 }
diff --git a/core/java/android/view/animation/LayoutAnimationController.java b/core/java/android/view/animation/LayoutAnimationController.java
index 7fa49c1..e2b7519 100644
--- a/core/java/android/view/animation/LayoutAnimationController.java
+++ b/core/java/android/view/animation/LayoutAnimationController.java
@@ -27,8 +27,8 @@
 import java.util.Random;
 
 /**
- * A layout animation controller is used to animated a layout's, or a view
- * group's, children. Each child uses the same animation but for every one of
+ * A layout animation controller is used to animate the children of a layout or a view
+ * group. Each child uses the same animation but for every one of
  * them, the animation starts at a different time. A layout animation controller
  * is used by {@link android.view.ViewGroup} to compute the delay by which each
  * child's animation start must be offset. The delay is computed by using
diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java
index ce01469..ac45541 100644
--- a/core/java/android/view/contentcapture/ContentCaptureEvent.java
+++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java
@@ -428,10 +428,11 @@
         }
         if (mNode != null) {
             final String className = mNode.getClassName();
-            if (mNode != null) {
-                string.append(", class=").append(className);
-            }
+            string.append(", class=").append(className);
             string.append(", id=").append(mNode.getAutofillId());
+            if (mNode.getText() != null) {
+                string.append(", text=").append(getSanitizedString(mNode.getText()));
+            }
         }
         if (mText != null) {
             string.append(", text=").append(getSanitizedString(mText));
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index d6292ca..20a0b0b 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -93,6 +93,7 @@
 import com.android.internal.inputmethod.InputMethodDebug;
 import com.android.internal.inputmethod.InputMethodPrivilegedOperationsRegistry;
 import com.android.internal.inputmethod.ResultCallbacks;
+import com.android.internal.inputmethod.SoftInputShowHideReason;
 import com.android.internal.inputmethod.StartInputFlags;
 import com.android.internal.inputmethod.StartInputReason;
 import com.android.internal.inputmethod.UnbindReason;
@@ -266,6 +267,14 @@
     private static final int NOT_A_SUBTYPE_ID = -1;
 
     /**
+     * {@code true} to try to avoid blocking apps' UI thread by sending
+     * {@link StartInputReason#WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION} and
+     * {@link StartInputReason#WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION} in a truly asynchronous
+     * way. {@code false} to go back to the previous synchronous semantics.
+     */
+    private static final boolean USE_REPORT_WINDOW_GAINED_FOCUS_ASYNC = true;
+
+    /**
      * A constant that represents Voice IME.
      *
      * @see InputMethodSubtype#getMode()
@@ -689,20 +698,29 @@
                         Log.v(TAG, "Reporting focus gain, without startInput"
                                 + ", nextFocusIsServedView=" + nextFocusHasConnection);
                     }
-                    final int startInputReason =
-                            nextFocusHasConnection ? WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
-                                    : WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
-                    final Completable.InputBindResult value = Completable.createInputBindResult();
-                    mService.startInputOrWindowGainedFocus(
-                            startInputReason, mClient,
-                            focusedView.getWindowToken(), startInputFlags, softInputMode,
-                            windowFlags,
-                            null,
-                            null,
-                            0 /* missingMethodFlags */,
-                            mCurRootView.mContext.getApplicationInfo().targetSdkVersion,
-                            ResultCallbacks.of(value));
-                    Completable.getResult(value); // ignore the result
+
+                    if (USE_REPORT_WINDOW_GAINED_FOCUS_ASYNC) {
+                        mService.reportWindowGainedFocusAsync(
+                                nextFocusHasConnection, mClient, focusedView.getWindowToken(),
+                                startInputFlags, softInputMode, windowFlags,
+                                mCurRootView.mContext.getApplicationInfo().targetSdkVersion);
+                    } else {
+                        final int startInputReason = nextFocusHasConnection
+                                ? WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
+                                : WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
+                        final Completable.InputBindResult value =
+                                Completable.createInputBindResult();
+                        mService.startInputOrWindowGainedFocus(
+                                startInputReason, mClient,
+                                focusedView.getWindowToken(), startInputFlags, softInputMode,
+                                windowFlags,
+                                null,
+                                null,
+                                0 /* missingMethodFlags */,
+                                mCurRootView.mContext.getApplicationInfo().targetSdkVersion,
+                                ResultCallbacks.of(value));
+                        Completable.getResult(value); // ignore the result
+                    }
                 } catch (RemoteException e) {
                     throw e.rethrowFromSystemServer();
                 }
@@ -1087,6 +1105,11 @@
         public void setImeTraceEnabled(boolean enabled) {
             ImeTracing.getInstance().setEnabled(enabled);
         }
+
+        @Override
+        public void throwExceptionFromSystem(String message) {
+            throw new RuntimeException(message);
+        }
     };
 
     final InputConnection mDummyInputConnection = new BaseInputConnection(this, false);
@@ -1383,7 +1406,8 @@
      */
     @Deprecated
     public void showStatusIcon(IBinder imeToken, String packageName, @DrawableRes int iconId) {
-        InputMethodPrivilegedOperationsRegistry.get(imeToken).updateStatusIcon(packageName, iconId);
+        InputMethodPrivilegedOperationsRegistry.get(
+                imeToken).updateStatusIconAsync(packageName, iconId);
     }
 
     /**
@@ -1393,7 +1417,7 @@
      */
     @Deprecated
     public void hideStatusIcon(IBinder imeToken) {
-        InputMethodPrivilegedOperationsRegistry.get(imeToken).updateStatusIcon(null, 0);
+        InputMethodPrivilegedOperationsRegistry.get(imeToken).updateStatusIconAsync(null, 0);
     }
 
     /**
@@ -1674,6 +1698,11 @@
      * {@link #RESULT_HIDDEN}.
      */
     public boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver) {
+        return showSoftInput(view, flags, resultReceiver, SoftInputShowHideReason.SHOW_SOFT_INPUT);
+    }
+
+    private boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver,
+            @SoftInputShowHideReason int reason) {
         ImeTracing.getInstance().triggerClientDump("InputMethodManager#showSoftInput", this,
                 null /* icProto */);
         // Re-dispatch if there is a context mismatch.
@@ -1690,13 +1719,15 @@
             }
 
             try {
-                Log.d(TAG, "showSoftInput() view=" + view + " flags=" + flags);
+                Log.d(TAG, "showSoftInput() view=" + view + " flags=" + flags + " reason="
+                        + InputMethodDebug.softInputDisplayReasonToString(reason));
                 final Completable.Boolean value = Completable.createBoolean();
                 mService.showSoftInput(
                         mClient,
                         view.getWindowToken(),
                         flags,
                         resultReceiver,
+                        reason,
                         ResultCallbacks.of(value));
                 return Completable.getResult(value);
             } catch (RemoteException e) {
@@ -1731,6 +1762,7 @@
                         mCurRootView.getView().getWindowToken(),
                         flags,
                         resultReceiver,
+                        SoftInputShowHideReason.SHOW_SOFT_INPUT,
                         ResultCallbacks.of(value));
                 Completable.getResult(value); // ignore the result
             } catch (RemoteException e) {
@@ -1795,6 +1827,12 @@
      */
     public boolean hideSoftInputFromWindow(IBinder windowToken, int flags,
             ResultReceiver resultReceiver) {
+        return hideSoftInputFromWindow(windowToken, flags, resultReceiver,
+                SoftInputShowHideReason.HIDE_SOFT_INPUT);
+    }
+
+    private boolean hideSoftInputFromWindow(IBinder windowToken, int flags,
+            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) {
         ImeTracing.getInstance().triggerClientDump("InputMethodManager#hideSoftInputFromWindow",
                 this, null /* icProto */);
         checkFocus();
@@ -1806,8 +1844,8 @@
 
             try {
                 final Completable.Boolean value = Completable.createBoolean();
-                mService.hideSoftInput(
-                        mClient, windowToken, flags, resultReceiver, ResultCallbacks.of(value));
+                mService.hideSoftInput(mClient, windowToken, flags, resultReceiver, reason,
+                        ResultCallbacks.of(value));
                 return Completable.getResult(value);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
@@ -1827,7 +1865,14 @@
      * @param hideFlags Provides additional operating flags.  May be
      * 0 or have the {@link #HIDE_IMPLICIT_ONLY},
      * {@link #HIDE_NOT_ALWAYS} bit set.
-     **/
+     *
+     * @deprecated Use {@link #showSoftInput(View, int)} or
+     * {@link #hideSoftInputFromWindow(IBinder, int)} explicitly instead.
+     * In particular during focus changes, the current visibility of the IME is not
+     * well defined. Starting in {@link Build.VERSION_CODES#S Android S}, this only
+     * has an effect if the calling app is the current IME focus.
+     */
+    @Deprecated
     public void toggleSoftInputFromWindow(IBinder windowToken, int showFlags, int hideFlags) {
         ImeTracing.getInstance().triggerClientDump(
                 "InputMethodManager#toggleSoftInputFromWindow", InputMethodManager.this,
@@ -1837,9 +1882,7 @@
             if (servedView == null || servedView.getWindowToken() != windowToken) {
                 return;
             }
-            if (mCurrentInputMethodSession != null) {
-                mCurrentInputMethodSession.toggleSoftInput(showFlags, hideFlags);
-            }
+            toggleSoftInput(showFlags, hideFlags);
         }
     }
 
@@ -1854,13 +1897,29 @@
      * @param hideFlags Provides additional operating flags.  May be
      * 0 or have the {@link #HIDE_IMPLICIT_ONLY},
      * {@link #HIDE_NOT_ALWAYS} bit set.
+     *
+     * @deprecated Use {@link #showSoftInput(View, int)} or
+     * {@link #hideSoftInputFromWindow(IBinder, int)} explicitly instead.
+     * In particular during focus changes, the current visibility of the IME is not
+     * well defined. Starting in {@link Build.VERSION_CODES#S Android S}, this only
+     * has an effect if the calling app is the current IME focus.
      */
+    @Deprecated
     public void toggleSoftInput(int showFlags, int hideFlags) {
         ImeTracing.getInstance().triggerClientDump(
                 "InputMethodManager#toggleSoftInput", InputMethodManager.this,
                 null /* icProto */);
-        if (mCurrentInputMethodSession != null) {
-            mCurrentInputMethodSession.toggleSoftInput(showFlags, hideFlags);
+        synchronized (mH) {
+            final View view = getServedViewLocked();
+            if (mImeInsetsConsumer != null && view != null) {
+                if (mImeInsetsConsumer.isRequestedVisible()) {
+                    hideSoftInputFromWindow(view.getWindowToken(), hideFlags, null,
+                            SoftInputShowHideReason.HIDE_TOGGLE_SOFT_INPUT);
+                } else {
+                    showSoftInput(view, showFlags, null,
+                            SoftInputShowHideReason.SHOW_TOGGLE_SOFT_INPUT);
+                }
+            }
         }
     }
 
@@ -2144,6 +2203,7 @@
                         mCurRootView.getView().getWindowToken(),
                         HIDE_NOT_ALWAYS,
                         null,
+                        SoftInputShowHideReason.HIDE_SOFT_INPUT,
                         ResultCallbacks.of(value));
                 Completable.getResult(value); // ignore the result
             } catch (RemoteException e) {
diff --git a/core/java/android/view/inputmethod/InputMethodSession.java b/core/java/android/view/inputmethod/InputMethodSession.java
index 0d688ff..52c1cd4 100644
--- a/core/java/android/view/inputmethod/InputMethodSession.java
+++ b/core/java/android/view/inputmethod/InputMethodSession.java
@@ -17,6 +17,8 @@
 package android.view.inputmethod;
 
 import android.graphics.Rect;
+import android.inputmethodservice.InputMethodService;
+import android.os.Build;
 import android.os.Bundle;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
@@ -172,7 +174,13 @@
      * @param hideFlags Provides additional operating flags.  May be
      * 0 or have the {@link  InputMethodManager#HIDE_IMPLICIT_ONLY},
      * {@link  InputMethodManager#HIDE_NOT_ALWAYS} bit set.
+     *
+     * @deprecated Starting in {@link Build.VERSION_CODES#S} the system no longer invokes this
+     * method, instead it explicitly shows or hides the IME. An {@code InputMethodService}
+     * wishing to toggle its own visibility should instead invoke {@link
+     * InputMethodService#requestShowSelf} or {@link InputMethodService#requestHideSelf}
      */
+    @Deprecated
     public void toggleSoftInput(int showFlags, int hideFlags);
 
     /**
diff --git a/core/java/android/view/inputmethod/InputMethodSessionWrapper.java b/core/java/android/view/inputmethod/InputMethodSessionWrapper.java
index c4a3773..ef1814b 100644
--- a/core/java/android/view/inputmethod/InputMethodSessionWrapper.java
+++ b/core/java/android/view/inputmethod/InputMethodSessionWrapper.java
@@ -96,15 +96,6 @@
     }
 
     @AnyThread
-    void toggleSoftInput(int showFlags, int hideFlags) {
-        try {
-            mSession.toggleSoftInput(showFlags, hideFlags);
-        } catch (RemoteException e) {
-            Log.w(TAG, "IME died", e);
-        }
-    }
-
-    @AnyThread
     void appPrivateCommand(String action, Bundle data) {
         try {
             mSession.appPrivateCommand(action, data);
diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java
index a449cf1..6cfb938 100644
--- a/core/java/android/view/textservice/SpellCheckerSession.java
+++ b/core/java/android/view/textservice/SpellCheckerSession.java
@@ -17,10 +17,13 @@
 package android.view.textservice;
 
 import android.annotation.BinderThread;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.os.Binder;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Message;
@@ -37,6 +40,7 @@
 import dalvik.system.CloseGuard;
 
 import java.util.LinkedList;
+import java.util.Locale;
 import java.util.Queue;
 import java.util.concurrent.Executor;
 
@@ -525,6 +529,161 @@
         }
     }
 
+    /** Parameters used to create a {@link SpellCheckerSession}. */
+    public static class SpellCheckerSessionParams {
+        @Nullable
+        private final Locale mLocale;
+        private final boolean mShouldReferToSpellCheckerLanguageSettings;
+        private final @SuggestionsInfo.ResultAttrs int mSupportedAttributes;
+        private final Bundle mExtras;
+
+        private SpellCheckerSessionParams(Locale locale,
+                boolean referToSpellCheckerLanguageSettings, int supportedAttributes,
+                Bundle extras) {
+            mLocale = locale;
+            mShouldReferToSpellCheckerLanguageSettings = referToSpellCheckerLanguageSettings;
+            mSupportedAttributes = supportedAttributes;
+            mExtras = extras;
+        }
+
+        /**
+         * Returns the locale in which the spell checker should operate.
+         *
+         * @see android.service.textservice.SpellCheckerService.Session#getLocale()
+         */
+        @SuppressLint("UseIcu")
+        @Nullable
+        public Locale getLocale() {
+            return mLocale;
+        }
+
+        /**
+         * Returns true if the user's spell checker language settings should be used to determine
+         * the spell checker locale.
+         */
+        public boolean shouldReferToSpellCheckerLanguageSettings() {
+            return mShouldReferToSpellCheckerLanguageSettings;
+        }
+
+        /**
+         * Returns a bitmask of {@link SuggestionsInfo} attributes that the spell checker can set
+         * in {@link SuggestionsInfo} it returns.
+         *
+         * @see android.service.textservice.SpellCheckerService.Session#getSupportedAttributes()
+         */
+        public @SuggestionsInfo.ResultAttrs int getSupportedAttributes() {
+            return mSupportedAttributes;
+        }
+
+        /**
+         * Returns a bundle containing extra parameters for the spell checker.
+         *
+         * <p>This bundle can be used to pass implementation-specific parameters to the
+         * {@link android.service.textservice.SpellCheckerService} implementation.
+         *
+         * @see android.service.textservice.SpellCheckerService.Session#getBundle()
+         */
+        @NonNull
+        public Bundle getExtras() {
+            return mExtras;
+        }
+
+        /** Builder of {@link SpellCheckerSessionParams}. */
+        public static final class Builder {
+            @Nullable
+            private Locale mLocale;
+            private boolean mShouldReferToSpellCheckerLanguageSettings = false;
+            private @SuggestionsInfo.ResultAttrs int mSupportedAttributes = 0;
+            private Bundle mExtras = Bundle.EMPTY;
+
+            /** Constructs a {@code Builder}. */
+            public Builder() {
+            }
+
+            /**
+             * Returns constructed {@link SpellCheckerSession} instance.
+             *
+             * <p>Before calling this method, either {@link #setLocale(Locale)} should be called
+             * with a non-null locale or
+             * {@link #setShouldReferToSpellCheckerLanguageSettings(boolean)} should be called with
+             * {@code true}.
+             */
+            @NonNull
+            public SpellCheckerSessionParams build() {
+                if (mLocale == null && !mShouldReferToSpellCheckerLanguageSettings) {
+                    throw new IllegalArgumentException("mLocale should not be null if "
+                            + " mShouldReferToSpellCheckerLanguageSettings is false.");
+                }
+                return new SpellCheckerSessionParams(mLocale,
+                        mShouldReferToSpellCheckerLanguageSettings, mSupportedAttributes, mExtras);
+            }
+
+            /**
+             * Sets the locale in which the spell checker should operate.
+             *
+             * @see android.service.textservice.SpellCheckerService.Session#getLocale()
+             */
+            @NonNull
+            public Builder setLocale(@SuppressLint("UseIcu") @Nullable Locale locale) {
+                mLocale = locale;
+                return this;
+            }
+
+            /**
+             * Sets whether or not the user's spell checker language settings should be used to
+             * determine spell checker locale.
+             *
+             * <p>If {@code shouldReferToSpellCheckerLanguageSettings} is true, the exact way of
+             * determining spell checker locale differs based on {@code locale} specified in
+             * {@link #setLocale(Locale)}.
+             * If {@code shouldReferToSpellCheckerLanguageSettings} is true and {@code locale} is
+             * null, the locale specified in Settings will be used. If
+             * {@code shouldReferToSpellCheckerLanguageSettings} is true and {@code locale} is not
+             * null, {@link SpellCheckerSession} can be created only when the locale specified in
+             * Settings is the same as {@code locale}. Exceptionally, if
+             * {@code shouldReferToSpellCheckerLanguageSettings} is true and {@code locale} is
+             * language only (e.g. "en"), the specified locale in Settings (e.g. "en_US") will be
+             * used.
+             *
+             * @see #setLocale(Locale)
+             */
+            @NonNull
+            public Builder setShouldReferToSpellCheckerLanguageSettings(
+                    boolean shouldReferToSpellCheckerLanguageSettings) {
+                mShouldReferToSpellCheckerLanguageSettings =
+                        shouldReferToSpellCheckerLanguageSettings;
+                return this;
+            }
+
+            /**
+             * Sets a bitmask of {@link SuggestionsInfo} attributes that the spell checker can set
+             * in {@link SuggestionsInfo} it returns.
+             *
+             * @see android.service.textservice.SpellCheckerService.Session#getSupportedAttributes()
+             */
+            @NonNull
+            public Builder setSupportedAttributes(
+                    @SuggestionsInfo.ResultAttrs int supportedAttributes) {
+                mSupportedAttributes = supportedAttributes;
+                return this;
+            }
+
+            /**
+             * Sets a bundle containing extra parameters for the spell checker.
+             *
+             * <p>This bundle can be used to pass implementation-specific parameters to the
+             * {@link android.service.textservice.SpellCheckerService} implementation.
+             *
+             * @see android.service.textservice.SpellCheckerService.Session#getBundle()
+             */
+            @NonNull
+            public Builder setExtras(@NonNull Bundle extras) {
+                mExtras = extras;
+                return this;
+            }
+        }
+    }
+
     /**
      * Callback for getting results from text services
      */
diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java
index bf91cca..ae927cf 100644
--- a/core/java/android/view/textservice/TextServicesManager.java
+++ b/core/java/android/view/textservice/TextServicesManager.java
@@ -19,7 +19,6 @@
 import android.annotation.CallbackExecutor;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SuppressLint;
 import android.annotation.SystemService;
 import android.annotation.UserIdInt;
 import android.compat.annotation.UnsupportedAppUsage;
@@ -35,6 +34,7 @@
 import android.util.Log;
 import android.view.inputmethod.InputMethodManager;
 import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener;
+import android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams;
 
 import com.android.internal.textservice.ISpellCheckerSessionListener;
 import com.android.internal.textservice.ITextServicesManager;
@@ -166,15 +166,17 @@
      * {@link SuggestionsInfo#RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS} will be passed to the spell
      * checker as supported attributes.
      *
-     * @see #newSpellCheckerSession(Locale, boolean, int, Bundle, Executor,
-     *      SpellCheckerSessionListener)
-     * @param bundle A bundle to pass to the spell checker.
-     * @param locale The locale for the spell checker.
-     * @param listener A spell checker session lister for getting results from the spell checker.
-     *                 The listener will be called on the calling thread.
-     * @param referToSpellCheckerLanguageSettings If true, the session for one of enabled
-     *                                            languages in settings will be used.
-     * @return A spell checker session from the spell checker.
+     * @param locale the locale for the spell checker. If {@code locale} is null and
+     * referToSpellCheckerLanguageSettings is true, the locale specified in Settings will be
+     * returned. If {@code locale} is not null and referToSpellCheckerLanguageSettings is true,
+     * the locale specified in Settings will be returned only when it is same as {@code locale}.
+     * Exceptionally, when referToSpellCheckerLanguageSettings is true and {@code locale} is
+     * only language (e.g. "en"), the specified locale in Settings (e.g. "en_US") will be
+     * selected.
+     * @param listener a spell checker session lister for getting results from the spell checker.
+     * @param referToSpellCheckerLanguageSettings if true, the session for one of enabled
+     * languages in settings will be returned.
+     * @return a spell checker session of the spell checker
      */
     @Nullable
     public SpellCheckerSession newSpellCheckerSession(@Nullable Bundle bundle,
@@ -186,51 +188,40 @@
         int supportedAttributes = SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY
                 | SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO
                 | SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS;
+        SpellCheckerSessionParams.Builder paramsBuilder = new SpellCheckerSessionParams.Builder()
+                .setLocale(locale)
+                .setShouldReferToSpellCheckerLanguageSettings(referToSpellCheckerLanguageSettings)
+                .setSupportedAttributes(supportedAttributes);
+        if (bundle != null) {
+            paramsBuilder.setExtras(bundle);
+        }
         // Using the implicit looper to preserve the old behavior.
         Executor executor = new HandlerExecutor(new Handler());
-        return newSpellCheckerSession(locale, referToSpellCheckerLanguageSettings,
-                supportedAttributes, bundle, executor, listener);
+        return newSpellCheckerSession(paramsBuilder.build(), executor, listener);
     }
 
     /**
      * Get a spell checker session from the spell checker.
      *
-     * <p>If {@code locale} is null and {@code referToSpellCheckerLanguageSettings} is true, the
-     * locale specified in Settings will be used. If {@code locale} is not null and
-     * {@code referToSpellCheckerLanguageSettings} is true, the locale specified in Settings will be
-     * returned only when it is same as {@code locale}.
-     * Exceptionally, when {@code referToSpellCheckerLanguageSettings} is true and {@code locale} is
-     * language only (e.g. "en"), the specified locale in Settings (e.g. "en_US") will be
-     * selected.
-     *
-     * @param locale The locale for the spell checker.
-     * @param referToSpellCheckerLanguageSettings If true, the session for one of enabled
-     *                                            languages in settings will be used.
-     * @param supportedAttributes A union of {@link SuggestionsInfo} attributes that the spell
-     *                            checker can set in the spell checking results.
-     * @param bundle A bundle for passing implementation-specific extra parameters for the spell
-     *               checker. You can check the current spell checker package by
-     *               {@link #getCurrentSpellCheckerInfo()}.
-     * @param executor An executor to call the listener on.
-     * @param listener A spell checker session lister for getting results from a spell checker.
+     * @param params The parameters passed to the spell checker.
+     * @param executor The executor on which {@code listener} will be called back.
+     * @param listener a spell checker session lister for getting results from the spell checker.
      * @return The spell checker session of the spell checker.
      */
     @Nullable
     public SpellCheckerSession newSpellCheckerSession(
-            @SuppressLint("UseIcu") @Nullable Locale locale,
-            boolean referToSpellCheckerLanguageSettings,
-            @SuggestionsInfo.ResultAttrs int supportedAttributes,
-            @Nullable Bundle bundle,
+            @NonNull SpellCheckerSessionParams params,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull SpellCheckerSessionListener listener) {
         Objects.requireNonNull(executor);
         Objects.requireNonNull(listener);
-        if (!referToSpellCheckerLanguageSettings && locale == null) {
+        Locale locale = params.getLocale();
+        if (!params.shouldReferToSpellCheckerLanguageSettings() && locale == null) {
             throw new IllegalArgumentException("Locale should not be null if you don't refer"
                     + " settings.");
         }
 
-        if (referToSpellCheckerLanguageSettings && !isSpellCheckerEnabled()) {
+        if (params.shouldReferToSpellCheckerLanguageSettings() && !isSpellCheckerEnabled()) {
             return null;
         }
 
@@ -244,7 +235,7 @@
             return null;
         }
         SpellCheckerSubtype subtypeInUse = null;
-        if (referToSpellCheckerLanguageSettings) {
+        if (params.shouldReferToSpellCheckerLanguageSettings()) {
             subtypeInUse = getCurrentSpellCheckerSubtype(true);
             if (subtypeInUse == null) {
                 return null;
@@ -278,7 +269,8 @@
         try {
             mService.getSpellCheckerService(mUserId, sci.getId(), subtypeInUse.getLocale(),
                     session.getTextServicesSessionListener(),
-                    session.getSpellCheckerSessionListener(), bundle, supportedAttributes);
+                    session.getSpellCheckerSessionListener(),
+                    params.getExtras(), params.getSupportedAttributes());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/view/translation/ITranslationManager.aidl b/core/java/android/view/translation/ITranslationManager.aidl
index 9c53f46..5fbf228 100644
--- a/core/java/android/view/translation/ITranslationManager.aidl
+++ b/core/java/android/view/translation/ITranslationManager.aidl
@@ -22,6 +22,7 @@
 import android.view.autofill.AutofillId;
 import android.view.translation.TranslationContext;
 import android.view.translation.TranslationSpec;
+import android.view.translation.UiTranslationSpec;
 import com.android.internal.os.IResultReceiver;
 
 import java.util.List;
@@ -34,15 +35,14 @@
 oneway interface ITranslationManager {
     void onTranslationCapabilitiesRequest(int sourceFormat, int destFormat,
          in ResultReceiver receiver, int userId);
+    void registerTranslationCapabilityCallback(in IRemoteCallback callback, int userId);
+    void unregisterTranslationCapabilityCallback(in IRemoteCallback callback, int userId);
     void onSessionCreated(in TranslationContext translationContext,
          int sessionId, in IResultReceiver receiver, int userId);
 
     void updateUiTranslationState(int state, in TranslationSpec sourceSpec,
          in TranslationSpec targetSpec, in List<AutofillId> viewIds, IBinder token, int taskId,
-         int userId);
-    // deprecated
-    void updateUiTranslationStateByTaskId(int state, in TranslationSpec sourceSpec,
-         in TranslationSpec targetSpec, in List<AutofillId> viewIds, int taskId, int userId);
+         in UiTranslationSpec uiTranslationSpec, int userId);
 
     void registerUiTranslationStateCallback(in IRemoteCallback callback, int userId);
     void unregisterUiTranslationStateCallback(in IRemoteCallback callback, int userId);
diff --git a/telephony/java/android/telephony/CarrierBandwidth.aidl b/core/java/android/view/translation/ITranslationServiceCallback.aidl
similarity index 61%
copy from telephony/java/android/telephony/CarrierBandwidth.aidl
copy to core/java/android/view/translation/ITranslationServiceCallback.aidl
index d0861b8..eb89b49 100644
--- a/telephony/java/android/telephony/CarrierBandwidth.aidl
+++ b/core/java/android/view/translation/ITranslationServiceCallback.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,5 +13,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.telephony;
-parcelable CarrierBandwidth;
\ No newline at end of file
+
+package android.view.translation;
+
+import android.view.translation.TranslationCapability;
+
+/**
+ * Interface from the Translation service to the system.
+ *
+ * @hide
+ */
+oneway interface ITranslationServiceCallback {
+    void updateTranslationCapability(in TranslationCapability capability);
+}
diff --git a/core/java/android/view/translation/TranslationCapability.java b/core/java/android/view/translation/TranslationCapability.java
index 28b2113..0bea121 100644
--- a/core/java/android/view/translation/TranslationCapability.java
+++ b/core/java/android/view/translation/TranslationCapability.java
@@ -48,6 +48,16 @@
      * TODO: fill in javadoc
      */
     public static final @ModelState int STATE_ON_DEVICE = 3;
+    /**
+     * The translation service does not support translation between the source and target specs.
+     *
+     * <p>Note: This state is not returned from calling
+     * {@link TranslationManager#getOnDeviceTranslationCapabilities}. This state will only appear as
+     * part of capability updates from
+     * {@link TranslationManager#addOnDeviceTranslationCapabilityUpdateListener} if existing support
+     * was dropped.</p>
+     */
+    public static final @ModelState int STATE_NOT_AVAILABLE = 4;
 
     /**
      * The state of translation readiness between {@code mSourceSpec} and {@code mTargetSpec}.
@@ -103,7 +113,7 @@
 
 
 
-    // Code below generated by codegen v1.0.22.
+    // Code below generated by codegen v1.0.23.
     //
     // DO NOT MODIFY!
     // CHECKSTYLE:OFF Generated code
@@ -120,7 +130,8 @@
     @IntDef(prefix = "STATE_", value = {
         STATE_AVAILABLE_TO_DOWNLOAD,
         STATE_DOWNLOADING,
-        STATE_ON_DEVICE
+        STATE_ON_DEVICE,
+        STATE_NOT_AVAILABLE
     })
     @Retention(RetentionPolicy.SOURCE)
     @DataClass.Generated.Member
@@ -136,6 +147,8 @@
                     return "STATE_DOWNLOADING";
             case STATE_ON_DEVICE:
                     return "STATE_ON_DEVICE";
+            case STATE_NOT_AVAILABLE:
+                    return "STATE_NOT_AVAILABLE";
             default: return Integer.toHexString(value);
         }
     }
@@ -238,12 +251,14 @@
 
         if (!(mState == STATE_AVAILABLE_TO_DOWNLOAD)
                 && !(mState == STATE_DOWNLOADING)
-                && !(mState == STATE_ON_DEVICE)) {
+                && !(mState == STATE_ON_DEVICE)
+                && !(mState == STATE_NOT_AVAILABLE)) {
             throw new java.lang.IllegalArgumentException(
                     "state was " + mState + " but must be one of: "
                             + "STATE_AVAILABLE_TO_DOWNLOAD(" + STATE_AVAILABLE_TO_DOWNLOAD + "), "
                             + "STATE_DOWNLOADING(" + STATE_DOWNLOADING + "), "
-                            + "STATE_ON_DEVICE(" + STATE_ON_DEVICE + ")");
+                            + "STATE_ON_DEVICE(" + STATE_ON_DEVICE + "), "
+                            + "STATE_NOT_AVAILABLE(" + STATE_NOT_AVAILABLE + ")");
         }
 
         this.mSourceSpec = sourceSpec;
@@ -275,10 +290,10 @@
     };
 
     @DataClass.Generated(
-            time = 1616438309593L,
-            codegenVersion = "1.0.22",
+            time = 1619119609557L,
+            codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/view/translation/TranslationCapability.java",
-            inputSignatures = "public static final @android.view.translation.TranslationCapability.ModelState int STATE_AVAILABLE_TO_DOWNLOAD\npublic static final @android.view.translation.TranslationCapability.ModelState int STATE_DOWNLOADING\npublic static final @android.view.translation.TranslationCapability.ModelState int STATE_ON_DEVICE\nprivate final @android.view.translation.TranslationCapability.ModelState int mState\nprivate final @android.annotation.NonNull android.view.translation.TranslationSpec mSourceSpec\nprivate final @android.annotation.NonNull android.view.translation.TranslationSpec mTargetSpec\nprivate final  boolean mUiTranslationEnabled\nprivate final @android.view.translation.TranslationContext.TranslationFlag int mSupportedTranslationFlags\nclass TranslationCapability extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstDefs=true, genToString=true, genConstructor=false)")
+            inputSignatures = "public static final @android.view.translation.TranslationCapability.ModelState int STATE_AVAILABLE_TO_DOWNLOAD\npublic static final @android.view.translation.TranslationCapability.ModelState int STATE_DOWNLOADING\npublic static final @android.view.translation.TranslationCapability.ModelState int STATE_ON_DEVICE\npublic static final @android.view.translation.TranslationCapability.ModelState int STATE_NOT_AVAILABLE\nprivate final @android.view.translation.TranslationCapability.ModelState int mState\nprivate final @android.annotation.NonNull android.view.translation.TranslationSpec mSourceSpec\nprivate final @android.annotation.NonNull android.view.translation.TranslationSpec mTargetSpec\nprivate final  boolean mUiTranslationEnabled\nprivate final @android.view.translation.TranslationContext.TranslationFlag int mSupportedTranslationFlags\nclass TranslationCapability extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstDefs=true, genToString=true, genConstructor=false)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/view/translation/TranslationManager.java b/core/java/android/view/translation/TranslationManager.java
index b61eab9..20d817d 100644
--- a/core/java/android/view/translation/TranslationManager.java
+++ b/core/java/android/view/translation/TranslationManager.java
@@ -16,14 +16,19 @@
 
 package android.view.translation;
 
+import android.annotation.CallbackExecutor;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemService;
 import android.annotation.WorkerThread;
 import android.app.PendingIntent;
 import android.content.Context;
+import android.os.Binder;
+import android.os.Bundle;
 import android.os.Handler;
+import android.os.IRemoteCallback;
 import android.os.Looper;
+import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.SynchronousResultReceiver;
 import android.util.ArrayMap;
@@ -37,11 +42,14 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
 
 /**
  * The {@link TranslationManager} class provides ways for apps to integrate and use the
@@ -76,11 +84,14 @@
      */
     public static final String EXTRA_CAPABILITIES = "translation_capabilities";
 
-    // TODO: implement update listeners and propagate updates.
     @GuardedBy("mLock")
     private final ArrayMap<Pair<Integer, Integer>, ArrayList<PendingIntent>>
             mTranslationCapabilityUpdateListeners = new ArrayMap<>();
 
+    @GuardedBy("mLock")
+    private final Map<Consumer<TranslationCapability>, IRemoteCallback> mCapabilityCallbacks =
+            new ArrayMap<>();
+
     private static final Random ID_GENERATOR = new Random();
     private final Object mLock = new Object();
 
@@ -89,10 +100,6 @@
 
     private final ITranslationManager mService;
 
-    @Nullable
-    @GuardedBy("mLock")
-    private ITranslationDirectManager mDirectServiceBinder;
-
     @NonNull
     @GuardedBy("mLock")
     private final SparseArray<Translator> mTranslators = new SparseArray<>();
@@ -120,11 +127,72 @@
     /**
      * Creates an on-device Translator for natural language translation.
      *
+     * @param translationContext {@link TranslationContext} containing the specs for creating the
+     *                                                     Translator.
+     * @param executor Executor to run callback operations
+     * @param callback {@link Consumer} to receive the translator. A {@code null} value is returned
+     *                                 if the service could not create the translator.
+     */
+    public void createOnDeviceTranslator(@NonNull TranslationContext translationContext,
+            @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Translator> callback) {
+        Objects.requireNonNull(translationContext, "translationContext cannot be null");
+        Objects.requireNonNull(executor, "executor cannot be null");
+        Objects.requireNonNull(callback, "callback cannot be null");
+
+        synchronized (mLock) {
+            // TODO(b/176464808): Disallow multiple Translator now, it will throw
+            //  IllegalStateException. Need to discuss if we can allow multiple Translators.
+            if (mTranslatorIds.containsKey(translationContext)) {
+                executor.execute(() -> callback.accept(
+                        mTranslators.get(mTranslatorIds.get(translationContext))));
+                return;
+            }
+
+            int translatorId;
+            do {
+                translatorId = Math.abs(ID_GENERATOR.nextInt());
+            } while (translatorId == 0 || mTranslators.indexOfKey(translatorId) >= 0);
+            final int tId = translatorId;
+
+            new Translator(mContext, translationContext, translatorId, this, mHandler, mService,
+                    new Consumer<Translator>() {
+                        @Override
+                        public void accept(Translator translator) {
+                            if (translator == null) {
+                                final long token = Binder.clearCallingIdentity();
+                                try {
+                                    executor.execute(() -> callback.accept(null));
+                                } finally {
+                                    Binder.restoreCallingIdentity(token);
+                                }
+                                return;
+                            }
+
+                            mTranslators.put(tId, translator);
+                            mTranslatorIds.put(translationContext, tId);
+                            final long token = Binder.clearCallingIdentity();
+                            try {
+                                executor.execute(() -> callback.accept(translator));
+                            } finally {
+                                Binder.restoreCallingIdentity(token);
+                            }
+                        }
+                    });
+        }
+    }
+
+    /**
+     * Creates an on-device Translator for natural language translation.
+     *
      * <p><strong>NOTE: </strong>Call on a worker thread.
      *
+     * @deprecated use {@link #createOnDeviceTranslator(TranslationContext, Executor, Consumer)}
+     * instead.
+     *
      * @param translationContext {@link TranslationContext} containing the specs for creating the
      *                                                     Translator.
      */
+    @Deprecated
     @Nullable
     @WorkerThread
     public Translator createOnDeviceTranslator(@NonNull TranslationContext translationContext) {
@@ -200,8 +268,14 @@
             if (result.resultCode != STATUS_SYNC_CALL_SUCCESS) {
                 return Collections.emptySet();
             }
-            return new ArraySet<>(
-                    (TranslationCapability[]) result.bundle.getParcelableArray(EXTRA_CAPABILITIES));
+            Parcelable[] parcelables = result.bundle.getParcelableArray(EXTRA_CAPABILITIES);
+            ArraySet<TranslationCapability> capabilities = new ArraySet();
+            for (Parcelable obj : parcelables) {
+                if (obj instanceof TranslationCapability) {
+                    capabilities.add((TranslationCapability) obj);
+                }
+            }
+            return capabilities;
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         } catch (TimeoutException e) {
@@ -221,17 +295,43 @@
     }
 
     /**
-     * Registers a {@link PendingIntent} to listen for updates on states of on-device
+     * Adds a {@link TranslationCapability} Consumer to listen for updates on states of on-device
      * {@link TranslationCapability}s.
      *
-     * <p>IMPORTANT: the pending intent must be called to start a service, or a broadcast if it is
-     * an explicit intent.</p>
-     *
-     * @param sourceFormat data format for the input data to be translated.
-     * @param targetFormat data format for the expected translated output data.
-     * @param pendingIntent the pending intent to invoke when updates are received.
+     * @param capabilityListener a {@link TranslationCapability} Consumer to receive the updated
+     * {@link TranslationCapability} from the on-device translation service.
      */
     public void addOnDeviceTranslationCapabilityUpdateListener(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull Consumer<TranslationCapability> capabilityListener) {
+        Objects.requireNonNull(executor, "executor should not be null");
+        Objects.requireNonNull(capabilityListener, "capability listener should not be null");
+
+        synchronized (mLock) {
+            if (mCapabilityCallbacks.containsKey(capabilityListener)) {
+                Log.w(TAG, "addOnDeviceTranslationCapabilityUpdateListener: the listener for "
+                        + capabilityListener + " already registered; ignoring.");
+                return;
+            }
+            final IRemoteCallback remoteCallback = new TranslationCapabilityRemoteCallback(executor,
+                    capabilityListener);
+            try {
+                mService.registerTranslationCapabilityCallback(remoteCallback,
+                        mContext.getUserId());
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+            mCapabilityCallbacks.put(capabilityListener, remoteCallback);
+        }
+    }
+
+
+    /**
+     * @deprecated Use {@link TranslationManager#addOnDeviceTranslationCapabilityUpdateListener(
+     * java.util.concurrent.Executor, java.util.function.Consumer)}
+     */
+    @Deprecated
+    public void addOnDeviceTranslationCapabilityUpdateListener(
             @TranslationSpec.DataFormat int sourceFormat,
             @TranslationSpec.DataFormat int targetFormat,
             @NonNull PendingIntent pendingIntent) {
@@ -245,8 +345,8 @@
     }
 
     /**
-     * @deprecated Use {@link #addOnDeviceTranslationCapabilityUpdateListener(int, int,
-     *  PendingIntent)}
+     * @deprecated Use {@link TranslationManager#addOnDeviceTranslationCapabilityUpdateListener(
+     * java.util.concurrent.Executor, java.util.function.Consumer)}
      */
     @Deprecated
     public void addTranslationCapabilityUpdateListener(
@@ -257,14 +357,38 @@
     }
 
     /**
-     * Unregisters a {@link PendingIntent} to listen for updates on states of on-device
-     * {@link TranslationCapability}s.
+     * Removes a {@link TranslationCapability} Consumer to listen for updates on states of
+     * on-device {@link TranslationCapability}s.
      *
-     * @param sourceFormat data format for the input data to be translated.
-     * @param targetFormat data format for the expected translated output data.
-     * @param pendingIntent the pending intent to unregister
+     * @param capabilityListener the {@link TranslationCapability} Consumer to unregister
      */
     public void removeOnDeviceTranslationCapabilityUpdateListener(
+            @NonNull Consumer<TranslationCapability> capabilityListener) {
+        Objects.requireNonNull(capabilityListener, "capability callback should not be null");
+
+        synchronized (mLock) {
+            final IRemoteCallback remoteCallback = mCapabilityCallbacks.get(capabilityListener);
+            if (remoteCallback == null) {
+                Log.w(TAG, "removeOnDeviceTranslationCapabilityUpdateListener: the capability "
+                        + "listener not found; ignoring.");
+                return;
+            }
+            try {
+                mService.unregisterTranslationCapabilityCallback(remoteCallback,
+                        mContext.getUserId());
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+            mCapabilityCallbacks.remove(capabilityListener);
+        }
+    }
+
+    /**
+     * @deprecated Use {@link #removeOnDeviceTranslationCapabilityUpdateListener(
+     * java.util.function.Consumer)}.
+     */
+    @Deprecated
+    public void removeOnDeviceTranslationCapabilityUpdateListener(
             @TranslationSpec.DataFormat int sourceFormat,
             @TranslationSpec.DataFormat int targetFormat,
             @NonNull PendingIntent pendingIntent) {
@@ -289,8 +413,8 @@
     }
 
     /**
-     * @deprecated Use {@link #removeOnDeviceTranslationCapabilityUpdateListener(int, int,
-     *  PendingIntent)}
+     * @deprecated Use {@link #removeOnDeviceTranslationCapabilityUpdateListener(
+     * java.util.function.Consumer)}.
      */
     @Deprecated
     public void removeTranslationCapabilityUpdateListener(
@@ -301,8 +425,6 @@
                 sourceFormat, targetFormat, pendingIntent);
     }
 
-    //TODO: Add method to propagate updates to mTCapabilityUpdateListeners
-
     /**
      * Returns an immutable PendingIntent which can be used to launch an activity to view/edit
      * on-device translation settings.
@@ -353,4 +475,28 @@
             return sAvailableRequestId;
         }
     }
+
+    private static class TranslationCapabilityRemoteCallback extends
+            IRemoteCallback.Stub {
+        private final Executor mExecutor;
+        private final Consumer<TranslationCapability> mListener;
+
+        TranslationCapabilityRemoteCallback(Executor executor,
+                Consumer<TranslationCapability> listener) {
+            mExecutor = executor;
+            mListener = listener;
+        }
+
+        @Override
+        public void sendResult(Bundle bundle) {
+            Binder.withCleanCallingIdentity(
+                    () -> mExecutor.execute(() -> onTranslationCapabilityUpdate(bundle)));
+        }
+
+        private void onTranslationCapabilityUpdate(Bundle bundle) {
+            TranslationCapability capability =
+                    (TranslationCapability) bundle.getParcelable(EXTRA_CAPABILITIES);
+            mListener.accept(capability);
+        }
+    }
 }
diff --git a/core/java/android/view/translation/TranslationSpec.java b/core/java/android/view/translation/TranslationSpec.java
index 16418a7..4d2ea49 100644
--- a/core/java/android/view/translation/TranslationSpec.java
+++ b/core/java/android/view/translation/TranslationSpec.java
@@ -17,18 +17,22 @@
 package android.view.translation;
 
 import android.annotation.NonNull;
+import android.icu.util.ULocale;
 import android.os.Parcel;
 import android.os.Parcelable;
 
 import com.android.internal.util.DataClass;
 
+import java.util.Objects;
+
 /**
  * Specs and additional info for the translation data.
  *
  * <p>This spec help specify information such as the language/locale for the translation, as well
  * as the data format for the translation (text, audio, etc.)</p>
  */
-@DataClass(genEqualsHashCode = true, genHiddenConstDefs = true, genToString = true)
+@DataClass(genEqualsHashCode = true, genHiddenConstDefs = true, genToString = true,
+        genConstructor = false)
 public final class TranslationSpec implements Parcelable {
 
     /** Data format for translation is text. */
@@ -43,15 +47,52 @@
     public @interface DataFormat {}
 
     /**
-     * String representation of language codes e.g. "en", "es", etc.
+     * @deprecated use {@code mLocale} instead.
      */
+    @Deprecated
     private final @NonNull String mLanguage;
 
+    /**
+     * {@link ULocale} representing locale information of this spec.
+     */
+    private final @NonNull ULocale mLocale;
+
     private final @DataFormat int mDataFormat;
 
+    void parcelLocale(Parcel dest, int flags) {
+        dest.writeSerializable(mLocale);
+    }
+
+    static ULocale unparcelLocale(Parcel in) {
+        return (ULocale) in.readSerializable();
+    }
+
+    /**
+     * @deprecated use {@link #TranslationSpec(ULocale, int)} instead.
+     */
+    @Deprecated
+    public TranslationSpec(@NonNull String language, @DataFormat int dataFormat) {
+        mLanguage = language;
+        mDataFormat = dataFormat;
+        mLocale = new ULocale.Builder().setLanguage(language).build();
+    }
+
+    /**
+     * Constructs a translation spec with the given locale and data format.
+     *
+     * @param locale locale of the associated translation data.
+     * @param dataFormat data format of the associated translation data.
+     */
+    public TranslationSpec(@NonNull ULocale locale, @DataFormat int dataFormat) {
+        Objects.requireNonNull(locale);
+        mLanguage = locale.getLanguage();
+        mLocale = locale;
+        mDataFormat = dataFormat;
+    }
 
 
-    // Code below generated by codegen v1.0.22.
+
+    // Code below generated by codegen v1.0.23.
     //
     // DO NOT MODIFY!
     // CHECKSTYLE:OFF Generated code
@@ -65,31 +106,19 @@
 
 
     /**
-     * Creates a new TranslationSpec.
-     *
-     * @param language
-     *   String representation of language codes e.g. "en", "es", etc.
+     * @deprecated use {@code mLocale} instead.
      */
     @DataClass.Generated.Member
-    public TranslationSpec(
-            @NonNull String language,
-            @DataFormat int dataFormat) {
-        this.mLanguage = language;
-        com.android.internal.util.AnnotationValidations.validate(
-                NonNull.class, null, mLanguage);
-        this.mDataFormat = dataFormat;
-        com.android.internal.util.AnnotationValidations.validate(
-                DataFormat.class, null, mDataFormat);
-
-        // onConstructed(); // You can define this method to get a callback
+    public @Deprecated @NonNull String getLanguage() {
+        return mLanguage;
     }
 
     /**
-     * String representation of language codes e.g. "en", "es", etc.
+     * {@link ULocale} representing locale information of this spec.
      */
     @DataClass.Generated.Member
-    public @NonNull String getLanguage() {
-        return mLanguage;
+    public @NonNull ULocale getLocale() {
+        return mLocale;
     }
 
     @DataClass.Generated.Member
@@ -105,6 +134,7 @@
 
         return "TranslationSpec { " +
                 "language = " + mLanguage + ", " +
+                "locale = " + mLocale + ", " +
                 "dataFormat = " + mDataFormat +
         " }";
     }
@@ -122,7 +152,8 @@
         TranslationSpec that = (TranslationSpec) o;
         //noinspection PointlessBooleanExpression
         return true
-                && java.util.Objects.equals(mLanguage, that.mLanguage)
+                && Objects.equals(mLanguage, that.mLanguage)
+                && Objects.equals(mLocale, that.mLocale)
                 && mDataFormat == that.mDataFormat;
     }
 
@@ -133,7 +164,8 @@
         // int fieldNameHashCode() { ... }
 
         int _hash = 1;
-        _hash = 31 * _hash + java.util.Objects.hashCode(mLanguage);
+        _hash = 31 * _hash + Objects.hashCode(mLanguage);
+        _hash = 31 * _hash + Objects.hashCode(mLocale);
         _hash = 31 * _hash + mDataFormat;
         return _hash;
     }
@@ -145,6 +177,7 @@
         // void parcelFieldName(Parcel dest, int flags) { ... }
 
         dest.writeString(mLanguage);
+        parcelLocale(dest, flags);
         dest.writeInt(mDataFormat);
     }
 
@@ -160,11 +193,17 @@
         // static FieldType unparcelFieldName(Parcel in) { ... }
 
         String language = in.readString();
+        ULocale locale = unparcelLocale(in);
         int dataFormat = in.readInt();
 
         this.mLanguage = language;
         com.android.internal.util.AnnotationValidations.validate(
+                Deprecated.class, null, mLanguage);
+        com.android.internal.util.AnnotationValidations.validate(
                 NonNull.class, null, mLanguage);
+        this.mLocale = locale;
+        com.android.internal.util.AnnotationValidations.validate(
+                NonNull.class, null, mLocale);
         this.mDataFormat = dataFormat;
         com.android.internal.util.AnnotationValidations.validate(
                 DataFormat.class, null, mDataFormat);
@@ -187,10 +226,10 @@
     };
 
     @DataClass.Generated(
-            time = 1614326090637L,
-            codegenVersion = "1.0.22",
+            time = 1618968175733L,
+            codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/view/translation/TranslationSpec.java",
-            inputSignatures = "public static final  int DATA_FORMAT_TEXT\nprivate final @android.annotation.NonNull java.lang.String mLanguage\nprivate final @android.view.translation.TranslationSpec.DataFormat int mDataFormat\nclass TranslationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genHiddenConstDefs=true, genToString=true)")
+            inputSignatures = "public static final  int DATA_FORMAT_TEXT\nprivate final @java.lang.Deprecated @android.annotation.NonNull java.lang.String mLanguage\nprivate final @android.annotation.NonNull android.icu.util.ULocale mLocale\nprivate final @android.view.translation.TranslationSpec.DataFormat int mDataFormat\n  void parcelLocale(android.os.Parcel,int)\nstatic  android.icu.util.ULocale unparcelLocale(android.os.Parcel)\nclass TranslationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genHiddenConstDefs=true, genToString=true, genConstructor=false)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/view/translation/Translator.java b/core/java/android/view/translation/Translator.java
index 188d562..b0d95b3 100644
--- a/core/java/android/view/translation/Translator.java
+++ b/core/java/android/view/translation/Translator.java
@@ -101,10 +101,18 @@
     public static final String EXTRA_SESSION_ID = "sessionId";
 
     static class ServiceBinderReceiver extends IResultReceiver.Stub {
+        // TODO: refactor how translator is instantiated after removing deprecated createTranslator.
         private final WeakReference<Translator> mTranslator;
         private final CountDownLatch mLatch = new CountDownLatch(1);
         private int mSessionId;
 
+        private Consumer<Translator> mCallback;
+
+        ServiceBinderReceiver(Translator translator, Consumer<Translator> callback) {
+            mTranslator = new WeakReference<>(translator);
+            mCallback = callback;
+        }
+
         ServiceBinderReceiver(Translator translator) {
             mTranslator = new WeakReference<>(translator);
         }
@@ -126,6 +134,9 @@
         public void send(int resultCode, Bundle resultData) {
             if (resultCode == STATUS_SYNC_CALL_FAIL) {
                 mLatch.countDown();
+                if (mCallback != null) {
+                    mCallback.accept(null);
+                }
                 return;
             }
             mSessionId = resultData.getInt(EXTRA_SESSION_ID);
@@ -146,6 +157,9 @@
             }
             translator.setServiceBinder(binder);
             mLatch.countDown();
+            if (mCallback != null) {
+                mCallback.accept(translator);
+            }
         }
 
         // TODO(b/176464808): maybe make SyncResultReceiver.TimeoutException constructor public
@@ -165,6 +179,32 @@
     public Translator(@NonNull Context context,
             @NonNull TranslationContext translationContext, int sessionId,
             @NonNull TranslationManager translationManager, @NonNull Handler handler,
+            @Nullable ITranslationManager systemServerBinder,
+            @NonNull Consumer<Translator> callback) {
+        mContext = context;
+        mTranslationContext = translationContext;
+        mId = sessionId;
+        mManager = translationManager;
+        mHandler = handler;
+        mSystemServerBinder = systemServerBinder;
+        mServiceBinderReceiver = new ServiceBinderReceiver(this, callback);
+
+        try {
+            mSystemServerBinder.onSessionCreated(mTranslationContext, mId,
+                    mServiceBinderReceiver, mContext.getUserId());
+        } catch (RemoteException e) {
+            Log.w(TAG, "RemoteException calling startSession(): " + e);
+        }
+    }
+
+    /**
+     * Create the Translator.
+     *
+     * @hide
+     */
+    public Translator(@NonNull Context context,
+            @NonNull TranslationContext translationContext, int sessionId,
+            @NonNull TranslationManager translationManager, @NonNull Handler handler,
             @Nullable ITranslationManager systemServerBinder) {
         mContext = context;
         mTranslationContext = translationContext;
@@ -231,9 +271,8 @@
      *
      * @throws IllegalStateException if this Translator session was destroyed when called.
      *
-     * @deprecated use {@link #translate(TranslationRequest, CancellationSignal,
+     * @removed use {@link #translate(TranslationRequest, CancellationSignal,
      *             Executor, Consumer)} instead.
-     * @hide
      */
     @Deprecated
     @Nullable
@@ -379,24 +418,5 @@
                 }
             }
         }
-
-        @Override
-        public void onError() throws RemoteException {
-            final Consumer<TranslationResponse>  callback = mCallback.get();
-            final Runnable runnable = () -> callback.accept(
-                    new TranslationResponse.Builder(
-                            TranslationResponse.TRANSLATION_STATUS_UNKNOWN_ERROR)
-                            .build());
-
-            if (callback != null) {
-                final Executor executor = mExecutor.get();
-                final long token = Binder.clearCallingIdentity();
-                try {
-                    executor.execute(runnable);
-                } finally {
-                    restoreCallingIdentity(token);
-                }
-            }
-        }
     }
 }
diff --git a/core/java/android/view/translation/UiTranslationController.java b/core/java/android/view/translation/UiTranslationController.java
index b6d3d09..0425572 100644
--- a/core/java/android/view/translation/UiTranslationController.java
+++ b/core/java/android/view/translation/UiTranslationController.java
@@ -315,7 +315,7 @@
                         }
                         return;
                     }
-                    view.onTranslationResponse(virtualChildResponse);
+                    view.onVirtualViewTranslationResponses(virtualChildResponse);
                     if (view.getViewTranslationCallback() != null) {
                         view.getViewTranslationCallback().onShowTranslation(view);
                     }
@@ -373,8 +373,7 @@
 
                     // TODO: Do this for specific views on request only.
                     callback.enableContentPadding();
-
-                    view.onTranslationResponse(response);
+                    view.onViewTranslationResponse(response);
                     callback.onShowTranslation(view);
                 });
             }
diff --git a/core/java/android/view/translation/UiTranslationManager.java b/core/java/android/view/translation/UiTranslationManager.java
index 130e078..541b494 100644
--- a/core/java/android/view/translation/UiTranslationManager.java
+++ b/core/java/android/view/translation/UiTranslationManager.java
@@ -23,6 +23,7 @@
 import android.annotation.SystemApi;
 import android.app.assist.ActivityId;
 import android.content.Context;
+import android.icu.util.ULocale;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.IRemoteCallback;
@@ -118,39 +119,20 @@
     }
 
     /**
-     * Request ui translation for a given Views.
-     *
-     * NOTE: Please use {@code startTranslation(TranslationSpec, TranslationSpec, List<AutofillId>,
-     * ActivityId)} instead.
-     *
-     * @param sourceSpec {@link TranslationSpec} for the data to be translated.
-     * @param targetSpec {@link TranslationSpec} for the translated data.
-     * @param viewIds A list of the {@link View}'s {@link AutofillId} which needs to be translated
-     * @param taskId the Activity Task id which needs ui translation
-     * @deprecated Use {@code startTranslation(TranslationSpec, TranslationSpec, List<AutofillId>,
-     * ActivityId)} instead.
+     * @deprecated Use {@link #startTranslation(TranslationSpec, TranslationSpec, List, ActivityId,
+     * UiTranslationSpec)} instead.
      *
      * @hide
-     * @removed
      */
-    @Deprecated
     @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION)
+    @Deprecated
     @SystemApi
     public void startTranslation(@NonNull TranslationSpec sourceSpec,
             @NonNull TranslationSpec targetSpec, @NonNull List<AutofillId> viewIds,
-            int taskId) {
-        Objects.requireNonNull(sourceSpec);
-        Objects.requireNonNull(targetSpec);
-        Objects.requireNonNull(viewIds);
-        if (viewIds.size() == 0) {
-            throw new IllegalArgumentException("Invalid empty views: " + viewIds);
-        }
-        try {
-            mService.updateUiTranslationStateByTaskId(STATE_UI_TRANSLATION_STARTED, sourceSpec,
-                    targetSpec, viewIds, taskId, mContext.getUserId());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
+            @NonNull ActivityId activityId) {
+        startTranslation(
+                sourceSpec, targetSpec, viewIds, activityId,
+                new UiTranslationSpec.Builder().setShouldPadContentForCompat(true).build());
     }
 
     /**
@@ -160,9 +142,8 @@
      * @param targetSpec {@link TranslationSpec} for the translated data.
      * @param viewIds A list of the {@link View}'s {@link AutofillId} which needs to be translated
      * @param activityId the identifier for the Activity which needs ui translation
+     * @param uiTranslationSpec configuration for translation of the specified views
      * @throws IllegalArgumentException if the no {@link View}'s {@link AutofillId} in the list
-     * @throws NullPointerException the sourceSpec, targetSpec, viewIds, activityId or
-     *         {@link android.app.assist.ActivityId#getToken()} is {@code null}
      *
      * @hide
      */
@@ -170,45 +151,21 @@
     @SystemApi
     public void startTranslation(@NonNull TranslationSpec sourceSpec,
             @NonNull TranslationSpec targetSpec, @NonNull List<AutofillId> viewIds,
-            @NonNull ActivityId activityId) {
+            @NonNull ActivityId activityId, @NonNull UiTranslationSpec uiTranslationSpec) {
         // TODO(b/177789967): Return result code or find a way to notify the status.
         Objects.requireNonNull(sourceSpec);
         Objects.requireNonNull(targetSpec);
         Objects.requireNonNull(viewIds);
         Objects.requireNonNull(activityId);
         Objects.requireNonNull(activityId.getToken());
+        Objects.requireNonNull(uiTranslationSpec);
         if (viewIds.size() == 0) {
             throw new IllegalArgumentException("Invalid empty views: " + viewIds);
         }
         try {
             mService.updateUiTranslationState(STATE_UI_TRANSLATION_STARTED, sourceSpec,
                     targetSpec, viewIds, activityId.getToken(), activityId.getTaskId(),
-                    mContext.getUserId());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Request to disable the ui translation. It will destroy all the {@link Translator}s and no
-     * longer to show to show the translated text.
-     *
-     * NOTE: Please use {@code finishTranslation(ActivityId)} instead.
-     *
-     * @param taskId the Activity Task id which needs ui translation
-     * @deprecated Use {@code finishTranslation(ActivityId)} instead.
-     *
-     * @hide
-     * @removed
-     *
-     */
-    @Deprecated
-    @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION)
-    @SystemApi
-    public void finishTranslation(int taskId) {
-        try {
-            mService.updateUiTranslationStateByTaskId(STATE_UI_TRANSLATION_FINISHED,
-                    null /* sourceSpec */, null /* targetSpec */, null /* viewIds */, taskId,
+                    uiTranslationSpec,
                     mContext.getUserId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
@@ -233,31 +190,7 @@
             Objects.requireNonNull(activityId.getToken());
             mService.updateUiTranslationState(STATE_UI_TRANSLATION_FINISHED,
                     null /* sourceSpec */, null /* targetSpec */, null /* viewIds */,
-                    activityId.getToken(), activityId.getTaskId(), mContext.getUserId());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Request to pause the current ui translation's {@link Translator} which will switch back to
-     * the original language.
-     *
-     * NOTE: Please use {@code pauseTranslation(ActivityId)} instead.
-     *
-     * @param taskId the Activity Task id which needs ui translation
-     * @deprecated Use {@code pauseTranslation(ActivityId)} instead.
-     *
-     * @hide
-     * @removed
-     */
-    @Deprecated
-    @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION)
-    @SystemApi
-    public void pauseTranslation(int taskId) {
-        try {
-            mService.updateUiTranslationStateByTaskId(STATE_UI_TRANSLATION_PAUSED,
-                    null /* sourceSpec */, null /* targetSpec */, null /* viewIds */, taskId,
+                    activityId.getToken(), activityId.getTaskId(), null /* uiTranslationSpec */,
                     mContext.getUserId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
@@ -282,32 +215,8 @@
             Objects.requireNonNull(activityId.getToken());
             mService.updateUiTranslationState(STATE_UI_TRANSLATION_PAUSED,
                     null /* sourceSpec */, null /* targetSpec */, null /* viewIds */,
-                    activityId.getToken(), activityId.getTaskId(), mContext.getUserId());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Request to resume the paused ui translation's {@link Translator} which will switch to the
-     * translated language if the text had been translated.
-     *
-     * NOTE: Please use {@code resumeTranslation(ActivityId)} instead.
-     *
-     * @param taskId the Activity Task id which needs ui translation
-     * @deprecated Use {@code resumeTranslation(ActivityId)} instead.
-     *
-     * @hide
-     * @removed
-     */
-    @Deprecated
-    @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION)
-    @SystemApi
-    public void resumeTranslation(int taskId) {
-        try {
-            mService.updateUiTranslationStateByTaskId(STATE_UI_TRANSLATION_RESUMED,
-                    null /* sourceSpec */, null /* targetSpec */, null /* viewIds */,
-                    taskId, mContext.getUserId());
+                    activityId.getToken(), activityId.getTaskId(), null /* uiTranslationSpec */,
+                    mContext.getUserId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -331,7 +240,8 @@
             Objects.requireNonNull(activityId.getToken());
             mService.updateUiTranslationState(STATE_UI_TRANSLATION_RESUMED,
                     null /* sourceSpec */, null /* targetSpec */, null /* viewIds */,
-                    activityId.getToken(), activityId.getTaskId(), mContext.getUserId());
+                    activityId.getToken(), activityId.getTaskId(), null /* uiTranslationSpec */,
+                    mContext.getUserId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -423,8 +333,8 @@
                 case STATE_UI_TRANSLATION_STARTED:
                 case STATE_UI_TRANSLATION_RESUMED:
                     mCallback.onStarted(
-                            bundle.getString(EXTRA_SOURCE_LOCALE),
-                            bundle.getString(EXTRA_TARGET_LOCALE));
+                            (ULocale) bundle.getSerializable(EXTRA_SOURCE_LOCALE),
+                            (ULocale) bundle.getSerializable(EXTRA_TARGET_LOCALE));
                     break;
                 case STATE_UI_TRANSLATION_PAUSED:
                     mCallback.onPaused();
diff --git a/telephony/java/android/telephony/ims/RcsConfig.aidl b/core/java/android/view/translation/UiTranslationSpec.aidl
similarity index 82%
copy from telephony/java/android/telephony/ims/RcsConfig.aidl
copy to core/java/android/view/translation/UiTranslationSpec.aidl
index cfd93fb..7fbeb66 100644
--- a/telephony/java/android/telephony/ims/RcsConfig.aidl
+++ b/core/java/android/view/translation/UiTranslationSpec.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,6 +14,6 @@
  * limitations under the License.
  */
 
-package android.telephony.ims;
+package android.view.translation;
 
-parcelable RcsConfig;
+parcelable UiTranslationSpec;
diff --git a/core/java/android/view/translation/UiTranslationSpec.java b/core/java/android/view/translation/UiTranslationSpec.java
new file mode 100644
index 0000000..b43dbce
--- /dev/null
+++ b/core/java/android/view/translation/UiTranslationSpec.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.translation;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.DataClass;
+
+/**
+ * Specifications for configuring UI translation.
+ *
+ * @hide
+ */
+@DataClass(
+        genBuilder = true, genEqualsHashCode = true, genHiddenConstDefs = true, genToString = true)
+@DataClass.Suppress("isShouldPadContentForCompat")
+@SystemApi
+public final class UiTranslationSpec implements Parcelable {
+
+    /**
+     * Whether the original content of the view should be directly modified to include padding that
+     * makes it the same size as the translated content. Defaults to {@code false}.
+     * <p>
+     * For {@link android.widget.TextView}, the system does not directly modify the original text,
+     * rather changes the displayed content using a
+     * {@link android.text.method.TransformationMethod}.
+     * This can cause issues in apps that do not account for TransformationMethods. For example, an
+     * app using DynamicLayout may use the calculated text offsets to operate on the original text,
+     * but this can be problematic when the layout was calculated on translated text with a
+     * different length.
+     * <p>
+     * If this is {@code true}, for a TextView the default implementation will append spaces to the
+     * text to make the length the same as the translated text.
+     */
+    private boolean mShouldPadContentForCompat = false;
+
+    /**
+     * Whether the original content of the view should be directly modified to include padding that
+     * makes it the same size as the translated content.
+     * <p>
+     * For {@link android.widget.TextView}, the system does not directly modify the original text,
+     * rather changes the displayed content using a
+     * {@link android.text.method.TransformationMethod}.
+     * This can cause issues in apps that do not account for TransformationMethods. For example, an
+     * app using DynamicLayout may use the calculated text offsets to operate on the original text,
+     * but this can be problematic when the layout was calculated on translated text with a
+     * different length.
+     * <p>
+     * If this is {@code true}, for a TextView the default implementation will append spaces to the
+     * text to make the length the same as the translated text.
+     */
+    public boolean shouldPadContentForCompat() {
+        return mShouldPadContentForCompat;
+    }
+
+
+
+    // Code below generated by codegen v1.0.23.
+    //
+    // DO NOT MODIFY!
+    // CHECKSTYLE:OFF Generated code
+    //
+    // To regenerate run:
+    // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/view/translation/UiTranslationSpec.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 */ UiTranslationSpec(
+            boolean shouldPadContentForCompat) {
+        this.mShouldPadContentForCompat = shouldPadContentForCompat;
+
+        // onConstructed(); // You can define this method to get a callback
+    }
+
+    @Override
+    @DataClass.Generated.Member
+    public String toString() {
+        // You can override field toString logic by defining methods like:
+        // String fieldNameToString() { ... }
+
+        return "UiTranslationSpec { " +
+                "shouldPadContentForCompat = " + mShouldPadContentForCompat +
+        " }";
+    }
+
+    @Override
+    @DataClass.Generated.Member
+    public boolean equals(@android.annotation.Nullable Object o) {
+        // You can override field equality logic by defining either of the methods like:
+        // boolean fieldNameEquals(UiTranslationSpec other) { ... }
+        // boolean fieldNameEquals(FieldType otherValue) { ... }
+
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        @SuppressWarnings("unchecked")
+        UiTranslationSpec that = (UiTranslationSpec) o;
+        //noinspection PointlessBooleanExpression
+        return true
+                && mShouldPadContentForCompat == that.mShouldPadContentForCompat;
+    }
+
+    @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 + Boolean.hashCode(mShouldPadContentForCompat);
+        return _hash;
+    }
+
+    @Override
+    @DataClass.Generated.Member
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        // You can override field parcelling by defining methods like:
+        // void parcelFieldName(Parcel dest, int flags) { ... }
+
+        byte flg = 0;
+        if (mShouldPadContentForCompat) flg |= 0x1;
+        dest.writeByte(flg);
+    }
+
+    @Override
+    @DataClass.Generated.Member
+    public int describeContents() { return 0; }
+
+    /** @hide */
+    @SuppressWarnings({"unchecked", "RedundantCast"})
+    @DataClass.Generated.Member
+    /* package-private */ UiTranslationSpec(@NonNull Parcel in) {
+        // You can override field unparcelling by defining methods like:
+        // static FieldType unparcelFieldName(Parcel in) { ... }
+
+        byte flg = in.readByte();
+        boolean shouldPadContentForCompat = (flg & 0x1) != 0;
+
+        this.mShouldPadContentForCompat = shouldPadContentForCompat;
+
+        // onConstructed(); // You can define this method to get a callback
+    }
+
+    @DataClass.Generated.Member
+    public static final @NonNull Parcelable.Creator<UiTranslationSpec> CREATOR
+            = new Parcelable.Creator<UiTranslationSpec>() {
+        @Override
+        public UiTranslationSpec[] newArray(int size) {
+            return new UiTranslationSpec[size];
+        }
+
+        @Override
+        public UiTranslationSpec createFromParcel(@NonNull Parcel in) {
+            return new UiTranslationSpec(in);
+        }
+    };
+
+    /**
+     * A builder for {@link UiTranslationSpec}
+     */
+    @SuppressWarnings("WeakerAccess")
+    @DataClass.Generated.Member
+    public static final class Builder {
+
+        private boolean mShouldPadContentForCompat;
+
+        private long mBuilderFieldsSet = 0L;
+
+        public Builder() {
+        }
+
+        /**
+         * Whether the original content of the view should be directly modified to include padding that
+         * makes it the same size as the translated content. Defaults to {@code false}.
+         * <p>
+         * For {@link android.widget.TextView}, the system does not directly modify the original text,
+         * rather changes the displayed content using a
+         * {@link android.text.method.TransformationMethod}.
+         * This can cause issues in apps that do not account for TransformationMethods. For example, an
+         * app using DynamicLayout may use the calculated text offsets to operate on the original text,
+         * but this can be problematic when the layout was calculated on translated text with a
+         * different length.
+         * <p>
+         * If this is {@code true}, for a TextView the default implementation will append spaces to the
+         * text to make the length the same as the translated text.
+         */
+        @DataClass.Generated.Member
+        public @NonNull Builder setShouldPadContentForCompat(boolean value) {
+            checkNotUsed();
+            mBuilderFieldsSet |= 0x1;
+            mShouldPadContentForCompat = value;
+            return this;
+        }
+
+        /** Builds the instance. This builder should not be touched after calling this! */
+        public @NonNull UiTranslationSpec build() {
+            checkNotUsed();
+            mBuilderFieldsSet |= 0x2; // Mark builder used
+
+            if ((mBuilderFieldsSet & 0x1) == 0) {
+                mShouldPadContentForCompat = false;
+            }
+            UiTranslationSpec o = new UiTranslationSpec(
+                    mShouldPadContentForCompat);
+            return o;
+        }
+
+        private void checkNotUsed() {
+            if ((mBuilderFieldsSet & 0x2) != 0) {
+                throw new IllegalStateException(
+                        "This Builder should not be reused. Use a new Builder instance instead");
+            }
+        }
+    }
+
+    @DataClass.Generated(
+            time = 1619034161701L,
+            codegenVersion = "1.0.23",
+            sourceFile = "frameworks/base/core/java/android/view/translation/UiTranslationSpec.java",
+            inputSignatures = "private  boolean mShouldPadContentForCompat\npublic  boolean shouldPadContentForCompat()\nclass UiTranslationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genToString=true)")
+    @Deprecated
+    private void __metadata() {}
+
+
+    //@formatter:on
+    // End of generated code
+
+}
diff --git a/core/java/android/view/translation/UiTranslationStateCallback.java b/core/java/android/view/translation/UiTranslationStateCallback.java
index 1946b70..e60eecd 100644
--- a/core/java/android/view/translation/UiTranslationStateCallback.java
+++ b/core/java/android/view/translation/UiTranslationStateCallback.java
@@ -17,6 +17,7 @@
 package android.view.translation;
 
 import android.annotation.NonNull;
+import android.icu.util.ULocale;
 
 import java.util.concurrent.Executor;
 
@@ -27,13 +28,21 @@
 public interface UiTranslationStateCallback {
 
     /**
+     * @deprecated use {@link #onStarted(ULocale, ULocale)} instead.
+     */
+    @Deprecated
+    void onStarted(@NonNull String sourceLocale, @NonNull String targetLocale);
+
+    /**
      * The system is requesting translation of the UI from {@code sourceLocale} to {@code
      * targetLocale}.
      * <p>
      * This is also called if either the requested {@code sourceLocale} or {@code targetLocale} has
      * changed; or called again after {@link #onPaused()}.
      */
-    void onStarted(@NonNull String sourceLocale, @NonNull String targetLocale);
+    default void onStarted(@NonNull ULocale sourceLocale, @NonNull ULocale targetLocale) {
+        onStarted(sourceLocale.getLanguage(), targetLocale.getLanguage());
+    }
 
     /**
      * The system is requesting that the application temporarily show the UI contents in their
diff --git a/core/java/android/view/translation/ViewTranslationCallback.java b/core/java/android/view/translation/ViewTranslationCallback.java
index 78b4855..1f0723b 100644
--- a/core/java/android/view/translation/ViewTranslationCallback.java
+++ b/core/java/android/view/translation/ViewTranslationCallback.java
@@ -21,23 +21,27 @@
 import android.view.View;
 
 /**
- * Callback for handling the translated information show or hide in the {@link View}. See {@link
- * View#onTranslationResponse} for how to get the translated information.
+ * Callback for handling the translated information show or hide in the {@link View}.
  */
 @UiThread
 public interface ViewTranslationCallback {
     /**
      * Called when the translated text is ready to show or if the user has requested to reshow the
-     * translated content after hiding it. This may be called before the translation results are
-     * returned through the {@link View#onTranslationResponse}.
+     * translated content after hiding it.
+     * <p>
+     * The translated content can be obtained from {@link View#getViewTranslationResponse}. This
+     * method will not be called before {@link View#onViewTranslationResponse} or
+     * {@link View#onVirtualViewTranslationResponses}.
+     *
+     * See {@link View#onViewTranslationResponse} for how to get the translated information.
      *
      * @return {@code true} if the View handles showing the translation.
      */
     boolean onShowTranslation(@NonNull View view);
     /**
      * Called when the user wants to show the original text instead of the translated text. This
-     * may be called before the translation results are returned through the
-     * {@link View#onTranslationResponse}.
+     * method will not be called before {@link View#onViewTranslationResponse} or
+     * {@link View#onViewTranslationResponse}.
      *
      * @return {@code true} if the View handles hiding the translation.
      */
diff --git a/core/java/android/view/translation/ViewTranslationRequest.java b/core/java/android/view/translation/ViewTranslationRequest.java
index 4d8fb99..2913dfa 100644
--- a/core/java/android/view/translation/ViewTranslationRequest.java
+++ b/core/java/android/view/translation/ViewTranslationRequest.java
@@ -118,7 +118,8 @@
          *
          * @param autofillId the {@link AutofillId} of the non-virtual view hosting the virtual view
          * hierarchy associated with this request.
-        * @param virtualChildId the id of the virtual child, relative to the parent.
+        * @param virtualChildId the id of the virtual view in the host view. This id is the same
+         * virtual id provided through content capture.
          */
         public Builder(@NonNull AutofillId autofillId, long virtualChildId) {
             mAutofillId = new AutofillId(autofillId, virtualChildId, AutofillId.NO_SESSION);
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6d4fa65..a1d4822 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2861,16 +2861,17 @@
 
     @Override
     @Nullable
-    public void onCreateTranslationRequests(@NonNull long[] virtualChildIds,
+    public void onCreateVirtualViewTranslationRequests(@NonNull long[] virtualIds,
             @NonNull @DataFormat int[] supportedFormats,
             @NonNull Consumer<ViewTranslationRequest> requestsCollector) {
-        mProvider.getViewDelegate().onCreateTranslationRequests(virtualChildIds, supportedFormats,
-                requestsCollector);
+        mProvider.getViewDelegate().onCreateVirtualViewTranslationRequests(virtualIds,
+                supportedFormats, requestsCollector);
     }
 
     @Override
-    public void onTranslationResponse(@NonNull LongSparseArray<ViewTranslationResponse> response) {
-        mProvider.getViewDelegate().onTranslationResponse(response);
+    public void onVirtualViewTranslationResponses(
+            @NonNull LongSparseArray<ViewTranslationResponse> response) {
+        mProvider.getViewDelegate().onVirtualViewTranslationResponses(response);
     }
 
     /** @hide */
diff --git a/core/java/android/webkit/WebViewDelegate.java b/core/java/android/webkit/WebViewDelegate.java
index c7eac6c..6b49569 100644
--- a/core/java/android/webkit/WebViewDelegate.java
+++ b/core/java/android/webkit/WebViewDelegate.java
@@ -16,6 +16,7 @@
 
 package android.webkit;
 
+import android.annotation.ElapsedRealtimeLong;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
@@ -226,6 +227,7 @@
      * WebViewChromiumFactoryProvider#create method was invoked.
      */
     @NonNull
+    @ElapsedRealtimeLong
     public long[] getTimestamps() {
         return WebViewFactory.getTimestamps();
     }
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index bc2b221..5fc5b29 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -83,16 +83,27 @@
     public @interface Timestamp {
     }
 
+    /** When the overall WebView provider load began. */
     public static final int WEBVIEW_LOAD_START = 0;
+    /** Before creating the WebView APK Context. */
     public static final int CREATE_CONTEXT_START = 1;
+    /** After creating the WebView APK Context. */
     public static final int CREATE_CONTEXT_END = 2;
+    /** Before adding WebView assets to AssetManager. */
     public static final int ADD_ASSETS_START = 3;
+    /** After adding WebView assets to AssetManager. */
     public static final int ADD_ASSETS_END = 4;
+    /** Before creating the WebView ClassLoader. */
     public static final int GET_CLASS_LOADER_START = 5;
+    /** After creating the WebView ClassLoader. */
     public static final int GET_CLASS_LOADER_END = 6;
+    /** Before preloading the WebView native library. */
     public static final int NATIVE_LOAD_START = 7;
+    /** After preloading the WebView native library. */
     public static final int NATIVE_LOAD_END = 8;
+    /** Before looking up the WebView provider class. */
     public static final int PROVIDER_CLASS_FOR_NAME_START = 9;
+    /** After looking up the WebView provider class. */
     public static final int PROVIDER_CLASS_FOR_NAME_END = 10;
     private static final int TIMESTAMPS_SIZE = 11;
 
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index 770a156..8d996ee 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -365,14 +365,14 @@
         }
 
         @SuppressLint("NullableCollection")
-        default void onCreateTranslationRequests(
-                @NonNull @SuppressWarnings("unused") long[] virtualChildIds,
+        default void onCreateVirtualViewTranslationRequests(
+                @NonNull @SuppressWarnings("unused") long[] virtualIds,
                 @NonNull @SuppressWarnings("unused") @DataFormat int[] supportedFormats,
                 @NonNull @SuppressWarnings("unused")
                         Consumer<ViewTranslationRequest> requestsCollector) {
         }
 
-        default void onTranslationResponse(
+        default void onVirtualViewTranslationResponses(
                 @NonNull @SuppressWarnings("unused")
                         LongSparseArray<ViewTranslationResponse> response) {
         }
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index 95a3dc7..4d2d9e8 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -106,13 +106,13 @@
      * The velocity threshold before the spring animation is considered settled.
      * The idea here is that velocity should be less than 0.1 pixel per second.
      */
-    private static final double VELOCITY_THRESHOLD = 0.1;
+    private static final double VELOCITY_THRESHOLD = 0.01;
 
     /**
      * The value threshold before the spring animation is considered close enough to
      * the destination to be settled. This should be around 0.01 pixel.
      */
-    private static final double VALUE_THRESHOLD = 0.01;
+    private static final double VALUE_THRESHOLD = 0.001;
 
     /**
      * The natural frequency of the stretch spring.
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 166411e..e06d5f0 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -259,6 +259,20 @@
     // Used to highlight a word when it is corrected by the IME
     private CorrectionHighlighter mCorrectionHighlighter;
 
+    /**
+     * {@code true} when {@link TextView#setText(CharSequence, TextView.BufferType, boolean, int)}
+     * is being executed and {@link InputMethodManager#restartInput(View)} is scheduled to be
+     * called.
+     *
+     * <p>This is also used to avoid an unnecessary invocation of
+     * {@link InputMethodManager#updateSelection(View, int, int, int, int)} when
+     * {@link InputMethodManager#restartInput(View)} is scheduled to be called already
+     * See bug 186582769 for details.</p>
+     *
+     * <p>TODO(186582769): Come up with better way.</p>
+     */
+    private boolean mHasPendingRestartInputForSetText = false;
+
     InputContentType mInputContentType;
     InputMethodState mInputMethodState;
 
@@ -1825,6 +1839,29 @@
         }
     }
 
+    /**
+     * Called from {@link TextView#setText(CharSequence, TextView.BufferType, boolean, int)} to
+     * schedule {@link InputMethodManager#restartInput(View)}.
+     */
+    void scheduleRestartInputForSetText() {
+        mHasPendingRestartInputForSetText = true;
+    }
+
+    /**
+     * Called from {@link TextView#setText(CharSequence, TextView.BufferType, boolean, int)} to
+     * actually call {@link InputMethodManager#restartInput(View)} if it's scheduled.  Does nothing
+     * otherwise.
+     */
+    void maybeFireScheduledRestartInputForSetText() {
+        if (mHasPendingRestartInputForSetText) {
+            final InputMethodManager imm = getInputMethodManager();
+            if (imm != null) {
+                imm.restartInput(mTextView);
+            }
+            mHasPendingRestartInputForSetText = false;
+        }
+    }
+
     static final int EXTRACT_NOTHING = -2;
     static final int EXTRACT_UNKNOWN = -1;
 
@@ -1958,7 +1995,8 @@
     }
 
     private void sendUpdateSelection() {
-        if (null != mInputMethodState && mInputMethodState.mBatchEditNesting <= 0) {
+        if (null != mInputMethodState && mInputMethodState.mBatchEditNesting <= 0
+                && !mHasPendingRestartInputForSetText) {
             final InputMethodManager imm = getInputMethodManager();
             if (null != imm) {
                 final int selectionStart = mTextView.getSelectionStart();
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index 50773b1..5ca9d13 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -46,6 +46,7 @@
 import android.util.Pair;
 import android.util.Printer;
 import android.view.Gravity;
+import android.view.RemotableViewMethod;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inspector.InspectableProperty;
@@ -412,6 +413,7 @@
      *
      * @attr ref android.R.styleable#GridLayout_rowCount
      */
+    @RemotableViewMethod
     public void setRowCount(int rowCount) {
         mVerticalAxis.setCount(rowCount);
         invalidateStructure();
@@ -446,6 +448,7 @@
      *
      * @attr ref android.R.styleable#GridLayout_columnCount
      */
+    @RemotableViewMethod
     public void setColumnCount(int columnCount) {
         mHorizontalAxis.setCount(columnCount);
         invalidateStructure();
@@ -534,6 +537,7 @@
      *
      * @attr ref android.R.styleable#GridLayout_alignmentMode
      */
+    @RemotableViewMethod
     public void setAlignmentMode(@AlignmentMode int alignmentMode) {
         this.mAlignmentMode = alignmentMode;
         requestLayout();
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index 196d68b..647f69d 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -30,6 +30,7 @@
 import android.util.MathUtils;
 import android.view.Gravity;
 import android.view.KeyEvent;
+import android.view.RemotableViewMethod;
 import android.view.SoundEffectConstants;
 import android.view.View;
 import android.view.ViewDebug;
@@ -2050,6 +2051,7 @@
      *
      * @attr ref android.R.styleable#GridView_gravity
      */
+    @RemotableViewMethod
     public void setGravity(int gravity) {
         if (mGravity != gravity) {
             mGravity = gravity;
@@ -2078,6 +2080,7 @@
      *
      * @attr ref android.R.styleable#GridView_horizontalSpacing
      */
+    @RemotableViewMethod
     public void setHorizontalSpacing(int horizontalSpacing) {
         if (horizontalSpacing != mRequestedHorizontalSpacing) {
             mRequestedHorizontalSpacing = horizontalSpacing;
@@ -2136,6 +2139,7 @@
      *
      * @attr ref android.R.styleable#GridView_verticalSpacing
      */
+    @RemotableViewMethod
     public void setVerticalSpacing(int verticalSpacing) {
         if (verticalSpacing != mVerticalSpacing) {
             mVerticalSpacing = verticalSpacing;
@@ -2165,6 +2169,7 @@
      *
      * @attr ref android.R.styleable#GridView_stretchMode
      */
+    @RemotableViewMethod
     public void setStretchMode(@StretchMode int stretchMode) {
         if (stretchMode != mStretchMode) {
             mStretchMode = stretchMode;
@@ -2191,6 +2196,7 @@
      *
      * @attr ref android.R.styleable#GridView_columnWidth
      */
+    @RemotableViewMethod
     public void setColumnWidth(int columnWidth) {
         if (columnWidth != mRequestedColumnWidth) {
             mRequestedColumnWidth = columnWidth;
@@ -2239,6 +2245,7 @@
      *
      * @attr ref android.R.styleable#GridView_numColumns
      */
+    @RemotableViewMethod
     public void setNumColumns(int numColumns) {
         if (numColumns != mRequestedNumColumns) {
             mRequestedNumColumns = numColumns;
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 18dd799..33890b8 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -939,6 +939,7 @@
         // The surface we allocate for the magnifier content + shadow.
         private final SurfaceSession mSurfaceSession;
         private final SurfaceControl mSurfaceControl;
+        private final SurfaceControl mBbqSurfaceControl;
         private final BLASTBufferQueue mBBQ;
         private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
         private final Surface mSurface;
@@ -1008,11 +1009,19 @@
             mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
                     .setName("magnifier surface")
                     .setFlags(SurfaceControl.HIDDEN)
-                    .setBLASTLayer()
+                    .setContainerLayer()
                     .setParent(parentSurfaceControl)
                     .setCallsite("InternalPopupWindow")
                     .build();
-            mBBQ = new BLASTBufferQueue("magnifier surface", mSurfaceControl,
+            mBbqSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
+                    .setName("magnifier surface bbq wrapper")
+                    .setHidden(false)
+                    .setBLASTLayer()
+                    .setParent(mSurfaceControl)
+                    .setCallsite("InternalPopupWindow")
+                    .build();
+
+            mBBQ = new BLASTBufferQueue("magnifier surface", mBbqSurfaceControl,
                 surfaceWidth, surfaceHeight, PixelFormat.TRANSLUCENT);
             mSurface = mBBQ.createSurface();
 
@@ -1073,7 +1082,7 @@
             }
             if (mContentHeight < contentHeight) {
                 // Grows the surface height as necessary.
-                mBBQ.update(mSurfaceControl, mContentWidth, contentHeight,
+                mBBQ.update(mBbqSurfaceControl, mContentWidth, contentHeight,
                     PixelFormat.TRANSLUCENT);
                 mRenderer.setSurface(mSurface);
 
@@ -1270,7 +1279,10 @@
             mRenderer.destroy();
             mSurface.destroy();
             mBBQ.destroy();
-            new SurfaceControl.Transaction().remove(mSurfaceControl).apply();
+            new SurfaceControl.Transaction()
+                    .remove(mSurfaceControl)
+                    .remove(mBbqSurfaceControl)
+                    .apply();
             mSurfaceSession.kill();
             mHandler.removeCallbacks(mMagnifierUpdater);
             if (mBitmap != null) {
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index b13cfc0..0dbdb8f 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -943,6 +943,13 @@
             View target = root.findViewById(viewId);
             if (target == null) return;
 
+            // Ensure that we are applying to an AppWidget root
+            if (!(rootParent instanceof AppWidgetHostView)) {
+                Log.e(LOG_TAG, "setRemoteAdapter can only be used for "
+                        + "AppWidgets (root id: " + viewId + ")");
+                return;
+            }
+
             if (!(target instanceof AdapterView)) {
                 Log.e(LOG_TAG, "Cannot call setRemoteAdapter on a view which is not "
                         + "an AdapterView (id: " + viewId + ")");
@@ -1008,14 +1015,15 @@
 
             // Ensure that we are applying to an AppWidget root
             if (!(rootParent instanceof AppWidgetHostView)) {
-                Log.e(LOG_TAG, "SetRemoteViewsAdapterIntent action can only be used for " +
-                        "AppWidgets (root id: " + viewId + ")");
+                Log.e(LOG_TAG, "setRemoteAdapter can only be used for "
+                        + "AppWidgets (root id: " + viewId + ")");
                 return;
             }
+
             // Ensure that we are calling setRemoteAdapter on an AdapterView that supports it
             if (!(target instanceof AbsListView) && !(target instanceof AdapterViewAnimator)) {
-                Log.e(LOG_TAG, "Cannot setRemoteViewsAdapter on a view which is not " +
-                        "an AbsListView or AdapterViewAnimator (id: " + viewId + ")");
+                Log.e(LOG_TAG, "Cannot setRemoteAdapter on a view which is not "
+                        + "an AbsListView or AdapterViewAnimator (id: " + viewId + ")");
                 return;
             }
 
@@ -1218,6 +1226,7 @@
         return rect;
     }
 
+    @Nullable
     private static Class<?> getParameterType(int type) {
         switch (type) {
             case BaseReflectionAction.BOOLEAN:
@@ -1259,6 +1268,7 @@
         }
     }
 
+    @Nullable
     private MethodHandle getMethod(View view, String methodName, Class<?> paramType,
             boolean async) {
         MethodArgs result;
@@ -1509,6 +1519,7 @@
             }
         }
 
+        @Nullable
         public Bitmap getBitmapForId(int id) {
             if (id == -1 || id >= mBitmaps.size()) {
                 return null;
@@ -1856,8 +1867,9 @@
             }
         }
 
+        @Nullable
         @Override
-        protected Object getParameterValue(View view) throws ActionException {
+        protected Object getParameterValue(@Nullable View view) throws ActionException {
             return this.value;
         }
 
@@ -1896,32 +1908,53 @@
             dest.writeInt(this.mResId);
         }
 
+        @Nullable
         @Override
-        protected @NonNull Object getParameterValue(View view) throws ActionException {
+        protected Object getParameterValue(@Nullable View view) throws ActionException {
+            if (view == null) return null;
+
             Resources resources = view.getContext().getResources();
             try {
                 switch (this.mResourceType) {
                     case DIMEN_RESOURCE:
-                        if (this.type == BaseReflectionAction.INT) {
-                            return resources.getDimensionPixelSize(this.mResId);
-                        }
-                        return resources.getDimension(this.mResId);
-                    case COLOR_RESOURCE:
-                        switch(this.type) {
+                        switch (this.type) {
                             case BaseReflectionAction.INT:
-                                return view.getContext().getColor(this.mResId);
-                            case BaseReflectionAction.COLOR_STATE_LIST:
-                                return view.getContext().getColorStateList(this.mResId);
+                                return mResId == 0 ? 0 : resources.getDimensionPixelSize(mResId);
+                            case BaseReflectionAction.FLOAT:
+                                return mResId == 0 ? 0f : resources.getDimension(mResId);
                             default:
                                 throw new ActionException(
-                                        "color resources must be used as int or ColorStateList, "
+                                        "dimen resources must be used as INT or FLOAT, "
                                                 + "not " + this.type);
                         }
+                    case COLOR_RESOURCE:
+                        switch (this.type) {
+                            case BaseReflectionAction.INT:
+                                return mResId == 0 ? 0 : view.getContext().getColor(mResId);
+                            case BaseReflectionAction.COLOR_STATE_LIST:
+                                return mResId == 0
+                                        ? null : view.getContext().getColorStateList(mResId);
+                            default:
+                                throw new ActionException(
+                                        "color resources must be used as INT or COLOR_STATE_LIST,"
+                                                + " not " + this.type);
+                        }
                     case STRING_RESOURCE:
-                        return resources.getText(this.mResId);
+                        switch (this.type) {
+                            case BaseReflectionAction.CHAR_SEQUENCE:
+                                return mResId == 0 ? null : resources.getText(mResId);
+                            case BaseReflectionAction.STRING:
+                                return mResId == 0 ? null : resources.getString(mResId);
+                            default:
+                                throw new ActionException(
+                                        "string resources must be used as STRING or CHAR_SEQUENCE,"
+                                                + " not " + this.type);
+                        }
                     default:
                         throw new ActionException("unknown resource type: " + this.mResourceType);
                 }
+            } catch (ActionException ex) {
+                throw ex;
             } catch (Throwable t) {
                 throw new ActionException(t);
             }
@@ -1963,50 +1996,62 @@
         }
 
         @Override
-        protected @NonNull Object getParameterValue(View view) throws ActionException {
+        protected Object getParameterValue(View view) throws ActionException {
+            TypedArray typedArray = view.getContext().obtainStyledAttributes(new int[]{mAttrId});
             try {
-                TypedArray typedArray = view.getContext().obtainStyledAttributes(
-                        new int[]{this.mAttrId});
-                try {
-                    if (typedArray.getType(0) == TypedValue.TYPE_NULL) {
-                        throw new ActionException("Attribute 0x" + Integer.toHexString(this.mAttrId)
-                                + " is not defined");
-                    }
-                    switch (this.mResourceType) {
-                        case DIMEN_RESOURCE:
-                            if (this.type == BaseReflectionAction.INT) {
-                                return typedArray.getDimensionPixelSize(0, 0);
-                            }
-                            return typedArray.getDimension(0, 0);
-                        case COLOR_RESOURCE:
-                            switch (this.type) {
-                                case BaseReflectionAction.INT:
-                                    return typedArray.getColor(0, 0);
-                                case BaseReflectionAction.COLOR_STATE_LIST:
-                                    return typedArray.getColorStateList(0);
-                                default:
-                                    throw new ActionException(
-                                            "Color attribute 0x" + Integer.toHexString(this.mAttrId)
-                                                    + " must be used as int or ColorStateList");
-                            }
-                        case STRING_RESOURCE:
-                            String value = typedArray.getString(0);
-                            if (value == null) {
-                                throw new ActionException("Attribute 0x"
-                                        + Integer.toHexString(this.mAttrId)
-                                        + " is not a defined or is not a string");
-                            }
-                            return value;
-                        default:
-                            // Note: This can only be an implementation error.
-                            throw new ActionException(
-                                    "Unknown resource type: " + this.mResourceType);
-                    }
-                } finally {
-                    typedArray.recycle();
+                // When mAttrId == 0, we will depend on the default values below
+                if (mAttrId != 0 && typedArray.getType(0) == TypedValue.TYPE_NULL) {
+                    throw new ActionException("Attribute 0x" + Integer.toHexString(this.mAttrId)
+                            + " is not defined");
                 }
+                switch (this.mResourceType) {
+                    case DIMEN_RESOURCE:
+                        switch (this.type) {
+                            case BaseReflectionAction.INT:
+                                return typedArray.getDimensionPixelSize(0, 0);
+                            case BaseReflectionAction.FLOAT:
+                                return typedArray.getDimension(0, 0);
+                            default:
+                                throw new ActionException(
+                                        "dimen attribute 0x" + Integer.toHexString(this.mAttrId)
+                                                + " must be used as INT or FLOAT,"
+                                                + " not " + this.type);
+                        }
+                    case COLOR_RESOURCE:
+                        switch (this.type) {
+                            case BaseReflectionAction.INT:
+                                return typedArray.getColor(0, 0);
+                            case BaseReflectionAction.COLOR_STATE_LIST:
+                                return typedArray.getColorStateList(0);
+                            default:
+                                throw new ActionException(
+                                        "color attribute 0x" + Integer.toHexString(this.mAttrId)
+                                                + " must be used as INT or COLOR_STATE_LIST,"
+                                                + " not " + this.type);
+                        }
+                    case STRING_RESOURCE:
+                        switch (this.type) {
+                            case BaseReflectionAction.CHAR_SEQUENCE:
+                                return typedArray.getText(0);
+                            case BaseReflectionAction.STRING:
+                                return typedArray.getString(0);
+                            default:
+                                throw new ActionException(
+                                        "string attribute 0x" + Integer.toHexString(this.mAttrId)
+                                                + " must be used as STRING or CHAR_SEQUENCE,"
+                                                + " not " + this.type);
+                        }
+                    default:
+                        // Note: This can only be an implementation error.
+                        throw new ActionException(
+                                "Unknown resource type: " + this.mResourceType);
+                }
+            } catch (ActionException ex) {
+                throw ex;
             } catch (Throwable t) {
                 throw new ActionException(t);
+            } finally {
+                typedArray.recycle();
             }
         }
 
@@ -2041,8 +2086,11 @@
             dest.writeInt(this.mUnit);
         }
 
+        @Nullable
         @Override
-        protected Object getParameterValue(View view) throws ActionException {
+        protected Object getParameterValue(@Nullable View view) throws ActionException {
+            if (view == null) return null;
+
             DisplayMetrics dm = view.getContext().getResources().getDisplayMetrics();
             try {
                 int data = TypedValue.createComplexDimension(this.mValue, this.mUnit);
@@ -3554,6 +3602,9 @@
         while (remoteViews.hasNext()) {
             RemoteViews view = remoteViews.next();
             SizeF size = view.getIdealSize();
+            if (size == null) {
+                throw new IllegalStateException("Expected RemoteViews to have ideal size");
+            }
             float newViewArea = size.getWidth() * size.getHeight();
             if (smallestView != null && !view.hasSameAppInfo(smallestView.mApplication)) {
                 throw new IllegalArgumentException(
@@ -4511,7 +4562,7 @@
      *
      * @param viewId The id of the view to change
      * @param type The margin being set e.g. {@link #MARGIN_END}
-     * @param attr a dimension attribute to apply to the margin.
+     * @param attr a dimension attribute to apply to the margin, or 0 to clear the margin.
      */
     public void setViewLayoutMarginAttr(@IdRes int viewId, @MarginType int type,
             @AttrRes int attr) {
@@ -4694,6 +4745,8 @@
      * The dimension will be resolved from the resources at the time the {@link RemoteViews} is
      * (re-)applied.
      *
+     * Undefined resources will result in an exception, except 0 which will resolve to 0.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param dimenResource The resource to resolve and pass as argument to the method.
@@ -4728,6 +4781,8 @@
      * The dimension will be resolved from the theme attribute at the time the
      * {@link RemoteViews} is (re-)applied.
      *
+     * Unresolvable attributes will result in an exception, except 0 which will resolve to 0.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param dimenAttr The attribute to resolve and pass as argument to the method.
@@ -4744,6 +4799,8 @@
      * The Color will be resolved from the resources at the time the {@link RemoteViews} is (re-)
      * applied.
      *
+     * Undefined resources will result in an exception, except 0 which will resolve to 0.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param colorResource The resource to resolve and pass as argument to the method.
@@ -4760,6 +4817,8 @@
      * The Color will be resolved from the theme attribute at the time the {@link RemoteViews} is
      * (re-)applied.
      *
+     * Unresolvable attributes will result in an exception, except 0 which will resolve to 0.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param colorAttribute The theme attribute to resolve and pass as argument to the method.
@@ -4838,6 +4897,8 @@
      * The ColorStateList will be resolved from the resources at the time the {@link RemoteViews} is
      * (re-)applied.
      *
+     * Undefined resources will result in an exception, except 0 which will resolve to null.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param colorResource The resource to resolve and pass as argument to the method.
@@ -4855,6 +4916,8 @@
      * The ColorStateList will be resolved from the theme attribute at the time the
      * {@link RemoteViews} is (re-)applied.
      *
+     * Unresolvable attributes will result in an exception, except 0 which will resolve to null.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param colorAttr The theme attribute to resolve and pass as argument to the method.
@@ -4895,6 +4958,8 @@
      * The dimension will be resolved from the resources at the time the {@link RemoteViews} is
      * (re-)applied.
      *
+     * Undefined resources will result in an exception, except 0 which will resolve to 0f.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param dimenResource The resource to resolve and pass as argument to the method.
@@ -4931,6 +4996,8 @@
      * The dimension will be resolved from the theme attribute at the time the {@link RemoteViews}
      * is (re-)applied.
      *
+     * Unresolvable attributes will result in an exception, except 0 which will resolve to 0f.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param dimenAttr The attribute to resolve and pass as argument to the method.
@@ -4992,6 +5059,8 @@
      * The CharSequence will be resolved from the resources at the time the {@link RemoteViews} is
      * (re-)applied.
      *
+     * Undefined resources will result in an exception, except 0 which will resolve to null.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param stringResource The resource to resolve and pass as argument to the method.
@@ -5009,6 +5078,8 @@
      * The CharSequence will be resolved from the theme attribute at the time the
      * {@link RemoteViews} is (re-)applied.
      *
+     * Unresolvable attributes will result in an exception, except 0 which will resolve to null.
+     *
      * @param viewId The id of the view on which to call the method.
      * @param methodName The name of the method to call.
      * @param stringAttribute The attribute to resolve and pass as argument to the method.
@@ -5251,6 +5322,10 @@
         float bestSqDist = Float.MAX_VALUE;
         for (RemoteViews layout : mSizedRemoteViews) {
             SizeF layoutSize = layout.getIdealSize();
+            if (layoutSize == null) {
+                throw new IllegalStateException("Expected RemoteViews to have ideal size");
+            }
+
             if (fitsIn(layoutSize, widgetSize)) {
                 if (bestFit == null) {
                     bestFit = layout;
@@ -5284,7 +5359,7 @@
      */
     public RemoteViews getRemoteViewsToApply(@NonNull Context context,
             @Nullable SizeF widgetSize) {
-        if (!hasSizedRemoteViews()) {
+        if (!hasSizedRemoteViews() || widgetSize == null) {
             // If there isn't multiple remote views, fall back on the previous methods.
             return getRemoteViewsToApply(context);
         }
@@ -5361,7 +5436,7 @@
 
     /** @hide */
     public View apply(Context context, ViewGroup parent, InteractionHandler handler,
-            @NonNull SizeF size, @Nullable ColorResources colorResources) {
+            @Nullable SizeF size, @Nullable ColorResources colorResources) {
         RemoteViews rvToApply = getRemoteViewsToApply(context, size);
 
         View result = inflateView(context, rvToApply, parent, 0, colorResources);
@@ -5373,7 +5448,7 @@
         return inflateView(context, rv, parent, 0, null);
     }
 
-    private View inflateView(Context context, RemoteViews rv, ViewGroup parent,
+    private View inflateView(Context context, RemoteViews rv, @Nullable ViewGroup parent,
             @StyleRes int applyThemeResId, @Nullable ColorResources colorResources) {
         // RemoteViews may be built by an application installed in another
         // user. So build a context that loads resources from that user but
@@ -5389,8 +5464,7 @@
         if (applyThemeResId != 0) {
             inflationContext = new ContextThemeWrapper(inflationContext, applyThemeResId);
         }
-        LayoutInflater inflater = (LayoutInflater)
-                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        LayoutInflater inflater = LayoutInflater.from(context);
 
         // Clone inflater so we load resources from correct context and
         // we don't add a filter to the static version returned by getSystemService.
@@ -5518,6 +5592,7 @@
             mResult = result;
         }
 
+        @Nullable
         @Override
         protected ViewTree doInBackground(Void... params) {
             try {
@@ -5802,6 +5877,7 @@
          * are in an array, the array's entries are 16 bytes each. We use this to work out the
          * location of all the positions of the various resources.
          */
+        @Nullable
         private static byte[] createCompiledResourcesContent(Context context,
                 SparseIntArray colorResources) throws IOException {
             byte[] content;
@@ -5839,6 +5915,7 @@
          *
          * @hide
          */
+        @Nullable
         public static ColorResources create(Context context, SparseIntArray colorMapping) {
             try {
                 byte[] contentBytes = createCompiledResourcesContent(context, colorMapping);
@@ -5962,7 +6039,8 @@
         }
     }
 
-    private static ApplicationInfo getApplicationInfo(String packageName, int userId) {
+    @Nullable
+    private static ApplicationInfo getApplicationInfo(@Nullable String packageName, int userId) {
         if (packageName == null) {
             return null;
         }
@@ -6038,6 +6116,7 @@
             }
         }
 
+        @Nullable
         public ViewTree findViewTreeById(@IdRes int id) {
             if (mRoot.getId() == id) {
                 return this;
@@ -6054,6 +6133,7 @@
             return null;
         }
 
+        @Nullable
         public ViewTree findViewTreeParentOf(ViewTree child) {
             if (mChildren == null) {
                 return null;
@@ -6076,6 +6156,7 @@
             createTree();
         }
 
+        @Nullable
         public <T extends View> T findViewById(@IdRes int id) {
             if (mChildren == null) {
                 return mRoot.findViewById(id);
@@ -6333,6 +6414,8 @@
          */
         @Nullable
         private static AdapterView<?> getAdapterViewAncestor(@Nullable View view) {
+            if (view == null) return null;
+
             View parent = (View) view.getParent();
             // Break the for loop on the first encounter of:
             //    1) an AdapterView,
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index 287c182..7c04b1c 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -28,6 +28,7 @@
 import android.view.textservice.SentenceSuggestionsInfo;
 import android.view.textservice.SpellCheckerSession;
 import android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener;
+import android.view.textservice.SpellCheckerSession.SpellCheckerSessionParams;
 import android.view.textservice.SuggestionsInfo;
 import android.view.textservice.TextInfo;
 import android.view.textservice.TextServicesManager;
@@ -124,10 +125,12 @@
                     | SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO
                     | SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_GRAMMAR_ERROR
                     | SuggestionsInfo.RESULT_ATTR_DONT_SHOW_UI_FOR_SUGGESTIONS;
+            SpellCheckerSessionParams params = new SpellCheckerSessionParams.Builder()
+                    .setLocale(mCurrentLocale)
+                    .setSupportedAttributes(supportedAttributes)
+                    .build();
             mSpellCheckerSession = mTextServicesManager.newSpellCheckerSession(
-                    mCurrentLocale, false, supportedAttributes,
-                    null /* Bundle not currently used by the textServicesManager */,
-                    mTextView.getContext().getMainExecutor(), this);
+                    params, mTextView.getContext().getMainExecutor(), this);
         }
 
         // Restore SpellCheckSpans in pool
@@ -458,7 +461,7 @@
     @Override
     public void onGetSentenceSuggestions(SentenceSuggestionsInfo[] results) {
         final Editable editable = (Editable) mTextView.getText();
-
+        final int sentenceLength = editable.length();
         for (int i = 0; i < results.length; ++i) {
             final SentenceSuggestionsInfo ssi = results[i];
             if (ssi == null) {
@@ -472,6 +475,9 @@
                 }
                 final int offset = ssi.getOffsetAt(j);
                 final int length = ssi.getLengthAt(j);
+                if (offset < 0 || offset + length > sentenceLength) {
+                    continue;
+                }
                 final SpellCheckSpan scs = onGetSuggestionsInternal(
                         suggestionsInfo, offset, length);
                 if (spellCheckSpan == null && scs != null) {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 1953a76..1a37b59 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -6285,11 +6285,10 @@
                 || needEditableForNotification) {
             createEditorIfNeeded();
             mEditor.forgetUndoRedo();
+            mEditor.scheduleRestartInputForSetText();
             Editable t = mEditableFactory.newEditable(text);
             text = t;
             setFilters(t, mFilters);
-            InputMethodManager imm = getInputMethodManager();
-            if (imm != null) imm.restartInput(this);
         } else if (precomputed != null) {
             if (mTextDir == null) {
                 mTextDir = getTextDirectionHeuristic();
@@ -6408,8 +6407,12 @@
             notifyListeningManagersAfterTextChanged();
         }
 
-        // SelectionModifierCursorController depends on textCanBeSelected, which depends on text
-        if (mEditor != null) mEditor.prepareCursorControllers();
+        if (mEditor != null) {
+            // SelectionModifierCursorController depends on textCanBeSelected, which depends on text
+            mEditor.prepareCursorControllers();
+
+            mEditor.maybeFireScheduledRestartInputForSetText();
+        }
     }
 
     /**
@@ -13870,7 +13873,8 @@
     }
 
     /**
-     * Returns a {@link ViewTranslationRequest} which represents the content to be translated.
+     * Collects a {@link ViewTranslationRequest} which represents the content to be translated in
+     * the view.
      *
      * <p>NOTE: When overriding the method, it should not translate the password. If the subclass
      * uses {@link TransformationMethod} to display the translated result, it's also not recommend
@@ -13880,15 +13884,15 @@
      *                         android.view.translation.TranslationSpec#DATA_FORMAT_TEXT}.
      * @return the {@link ViewTranslationRequest} which contains the information to be translated.
      */
-    @Nullable
     @Override
-    public ViewTranslationRequest onCreateTranslationRequest(@NonNull int[] supportedFormats) {
+    public void onCreateViewTranslationRequest(@NonNull int[] supportedFormats,
+            @NonNull Consumer<ViewTranslationRequest> requestsCollector) {
         if (supportedFormats == null || supportedFormats.length == 0) {
             // TODO(b/182433547): remove before S release
             if (UiTranslationController.DEBUG) {
                 Log.w(LOG_TAG, "Do not provide the support translation formats.");
             }
-            return null;
+            return;
         }
         ViewTranslationRequest.Builder requestBuilder =
                 new ViewTranslationRequest.Builder(getAutofillId());
@@ -13899,7 +13903,7 @@
                 if (UiTranslationController.DEBUG) {
                     Log.w(LOG_TAG, "Cannot create translation request for the empty text.");
                 }
-                return null;
+                return;
             }
             boolean isPassword = isAnyPasswordInputType() || hasPasswordTransformationMethod();
             // TODO(b/177214256): support selectable text translation.
@@ -13914,14 +13918,14 @@
                     Log.w(LOG_TAG, "Cannot create translation request. editable = "
                             + isTextEditable() + ", isPassword = " + isPassword + ", selectable = "
                             + isTextSelectable());
+                    return;
                 }
-                return null;
             }
             // TODO(b/176488462): apply the view's important for translation
             requestBuilder.setValue(ViewTranslationRequest.ID_TEXT,
                     TranslationRequestValue.forText(mText));
         }
-        return requestBuilder.build();
+        requestsCollector.accept(requestBuilder.build());
     }
 
     /**
@@ -13932,6 +13936,8 @@
      *
      * @return a {@link ViewTranslationCallback} that is used to control how to display the
      * translated information or {@code null} if this View doesn't support translation.
+     *
+     * @hide
      */
     @Nullable
     @Override
@@ -13948,15 +13954,17 @@
 
     /**
      *
-     * Called when the content from {@link #onCreateTranslationRequest} had been translated by the
-     * TranslationService. The default implementation will replace the current
+     * Called when the content from {@link #onCreateViewTranslationRequest} had been translated by
+     * the TranslationService. The default implementation will replace the current
      * {@link TransformationMethod} to transform the original text to the translated text display.
      *
      * @param response a {@link ViewTranslationResponse} that contains the translated information
      * which can be shown in the view.
      */
     @Override
-    public void onTranslationResponse(@NonNull ViewTranslationResponse response) {
+    public void onViewTranslationResponse(@NonNull ViewTranslationResponse response) {
+        // set ViewTranslationResponse
+        super.onViewTranslationResponse(response);
         // TODO(b/183467275): Use the overridden ViewTranslationCallback instead of our default
         //  implementation if the view has overridden getViewTranslationCallback.
         TextViewTranslationCallback callback =
diff --git a/core/java/android/widget/TextViewTranslationCallback.java b/core/java/android/widget/TextViewTranslationCallback.java
index 73f19a7..0376061 100644
--- a/core/java/android/widget/TextViewTranslationCallback.java
+++ b/core/java/android/widget/TextViewTranslationCallback.java
@@ -79,6 +79,11 @@
     @Override
     public boolean onShowTranslation(@NonNull View view) {
         mIsShowingTranslation = true;
+        if (view.getViewTranslationResponse() == null) {
+            Log.wtf(TAG, "onShowTranslation() shouldn't be called before "
+                    + "onViewTranslationResponse().");
+            return false;
+        }
         if (mTranslationTransformation != null) {
             ((TextView) view).setTransformationMethod(mTranslationTransformation);
         } else {
@@ -86,6 +91,7 @@
                 // TODO(b/182433547): remove before S release
                 Log.w(TAG, "onShowTranslation(): no translated text.");
             }
+            return false;
         }
         return true;
     }
@@ -96,6 +102,11 @@
     @Override
     public boolean onHideTranslation(@NonNull View view) {
         mIsShowingTranslation = false;
+        if (view.getViewTranslationResponse() == null) {
+            Log.wtf(TAG, "onHideTranslation() shouldn't be called before "
+                    + "onViewTranslationResponse().");
+            return false;
+        }
         // Restore to original text content.
         if (mTranslationTransformation != null) {
             ((TextView) view).setTransformationMethod(
@@ -105,6 +116,7 @@
                 // TODO(b/182433547): remove before S release
                 Log.w(TAG, "onHideTranslation(): no translated text.");
             }
+            return false;
         }
         return true;
     }
@@ -124,6 +136,7 @@
                 // TODO(b/182433547): remove before S release
                 Log.w(TAG, "onClearTranslation(): no translated text.");
             }
+            return false;
         }
         return true;
     }
diff --git a/core/java/android/widget/inline/TEST_MAPPING b/core/java/android/widget/inline/TEST_MAPPING
index 0baad5c..26a5569 100644
--- a/core/java/android/widget/inline/TEST_MAPPING
+++ b/core/java/android/widget/inline/TEST_MAPPING
@@ -1,5 +1,5 @@
 {
-  "presubmit": [
+  "presubmit-large": [
     {
       "name": "CtsAutoFillServiceTestCases",
       "options": [
diff --git a/core/java/android/window/IRemoteTransition.aidl b/core/java/android/window/IRemoteTransition.aidl
index e71de70..2efb68a 100644
--- a/core/java/android/window/IRemoteTransition.aidl
+++ b/core/java/android/window/IRemoteTransition.aidl
@@ -40,7 +40,23 @@
     /**
      * Starts a transition animation. Once complete, the implementation should call
      * `finishCallback`.
+     *
+     * @param token An identifier for the transition that should be animated.
      */
-    void startAnimation(in TransitionInfo info, in SurfaceControl.Transaction t,
+    void startAnimation(in IBinder token, in TransitionInfo info, in SurfaceControl.Transaction t,
+            in IRemoteTransitionFinishedCallback finishCallback);
+
+    /**
+     * Attempts to merge a transition animation into the animation that is currently
+     * being played by this remote. If merge is not possible/supported, this should be a no-op.
+     * If it *is* merged, the implementation should call `finishCallback` immediately.
+     *
+     * @param transition An identifier for the transition that wants to be merged.
+     * @param mergeTarget The transition that is currently being animated by this remote.
+     *                    If it can be merged, call `finishCallback`; otherwise, do
+     *                    nothing.
+     */
+    void mergeAnimation(in IBinder transition, in TransitionInfo info,
+            in SurfaceControl.Transaction t, in IBinder mergeTarget,
             in IRemoteTransitionFinishedCallback finishCallback);
 }
diff --git a/core/java/android/window/ITransitionPlayer.aidl b/core/java/android/window/ITransitionPlayer.aidl
index af37fbc..3eca803 100644
--- a/core/java/android/window/ITransitionPlayer.aidl
+++ b/core/java/android/window/ITransitionPlayer.aidl
@@ -47,9 +47,12 @@
      * @param transitionToken An identifying token for the transition that is now ready to animate.
      * @param info A collection of all the changes encapsulated by this transition.
      * @param t A surface transaction containing the surface state prior to animating.
+     * @param finishT A surface transaction that will reset parenting/layering and generally put
+     *                surfaces into their final (post-transition) state. Apply this after playing
+     *                the animation but before calling finish.
      */
     void onTransitionReady(in IBinder transitionToken, in TransitionInfo info,
-            in SurfaceControl.Transaction t);
+            in SurfaceControl.Transaction t, in SurfaceControl.Transaction finishT);
 
     /**
      * Called when something in WMCore requires a transition to play -- for example when an Activity
diff --git a/core/java/android/window/PictureInPictureSurfaceTransaction.java b/core/java/android/window/PictureInPictureSurfaceTransaction.java
index bde91d9..96a8ac8 100644
--- a/core/java/android/window/PictureInPictureSurfaceTransaction.java
+++ b/core/java/android/window/PictureInPictureSurfaceTransaction.java
@@ -16,10 +16,13 @@
 
 package android.window;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.view.SurfaceControl;
 
 import java.util.Objects;
 
@@ -127,6 +130,22 @@
                 + ")";
     }
 
+    /** Applies {@link PictureInPictureSurfaceTransaction} to a given leash. */
+    public static void apply(@NonNull PictureInPictureSurfaceTransaction surfaceTransaction,
+            @NonNull SurfaceControl surfaceControl,
+            @NonNull SurfaceControl.Transaction tx) {
+        final Matrix matrix = new Matrix();
+        matrix.setScale(surfaceTransaction.mScaleX, surfaceTransaction.mScaleY);
+        if (surfaceTransaction.mRotation != 0) {
+            matrix.postRotate(surfaceTransaction.mRotation);
+        }
+        tx.setMatrix(surfaceControl, matrix, new float[9])
+                .setPosition(surfaceControl,
+                        surfaceTransaction.mPositionX, surfaceTransaction.mPositionY)
+                .setWindowCrop(surfaceControl, surfaceTransaction.getWindowCrop())
+                .setCornerRadius(surfaceControl, surfaceTransaction.mCornerRadius);
+    }
+
     public static final @android.annotation.NonNull Creator<PictureInPictureSurfaceTransaction>
             CREATOR =
             new Creator<PictureInPictureSurfaceTransaction>() {
diff --git a/core/java/android/window/SplashScreen.java b/core/java/android/window/SplashScreen.java
index 18f29ae..7d222db 100644
--- a/core/java/android/window/SplashScreen.java
+++ b/core/java/android/window/SplashScreen.java
@@ -17,12 +17,17 @@
 package android.window;
 
 import android.annotation.NonNull;
+import android.annotation.StyleRes;
 import android.annotation.SuppressLint;
 import android.annotation.UiThread;
 import android.app.Activity;
 import android.app.ActivityThread;
+import android.app.AppGlobals;
 import android.content.Context;
+import android.content.res.Resources;
 import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
 import android.util.Singleton;
 import android.util.Slog;
 
@@ -60,6 +65,17 @@
      */
     void clearOnExitAnimationListener();
 
+
+    /**
+     * Overrides the theme used for the {@link SplashScreen}s of this application.
+     * <p>
+     * By default, the {@link SplashScreen} uses the theme set in the manifest. This method
+     * overrides and persists the theme used for the {@link SplashScreen} of this application.
+     * <p>
+     * To reset to the default theme, set this the themeId to {@link Resources#ID_NULL}.
+     */
+    void setSplashScreenTheme(@StyleRes int themeId);
+
     /**
      * Listens for the splash screen exit event.
      */
@@ -84,6 +100,8 @@
      * @hide
      */
     class SplashScreenImpl implements SplashScreen {
+        private static final String TAG = "SplashScreenImpl";
+
         private OnExitAnimationListener mExitAnimationListener;
         private final IBinder mActivityToken;
         private final SplashScreenManagerGlobal mGlobal;
@@ -119,6 +137,29 @@
                 mGlobal.removeImpl(this);
             }
         }
+
+        public void setSplashScreenTheme(@StyleRes int themeId) {
+            if (mActivityToken == null) {
+                Log.w(TAG, "Couldn't persist the starting theme. This instance is not an Activity");
+                return;
+            }
+
+            Activity activity = ActivityThread.currentActivityThread().getActivity(
+                    mActivityToken);
+            if (activity == null) {
+                return;
+            }
+            String themeName = themeId != Resources.ID_NULL
+                    ? activity.getResources().getResourceName(themeId) : null;
+
+            try {
+                AppGlobals.getPackageManager().setSplashScreenTheme(
+                        activity.getComponentName().getPackageName(),
+                        themeName, activity.getUserId());
+            } catch (RemoteException e) {
+                Log.w(TAG, "Couldn't persist the starting theme", e);
+            }
+        }
     }
 
     /**
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index f151527..23b8ee4 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -77,8 +77,11 @@
     /** The container is the recipient of a transferred starting-window */
     public static final int FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT = 1 << 3;
 
+    /** The container has voice session. */
+    public static final int FLAG_IS_VOICE_INTERACTION = 1 << 4;
+
     /** The first unused bit. This can be used by remotes to attach custom flags to this change. */
-    public static final int FLAG_FIRST_CUSTOM = 1 << 4;
+    public static final int FLAG_FIRST_CUSTOM = 1 << 5;
 
     /** @hide */
     @IntDef(prefix = { "FLAG_" }, value = {
@@ -86,7 +89,9 @@
             FLAG_SHOW_WALLPAPER,
             FLAG_IS_WALLPAPER,
             FLAG_TRANSLUCENT,
-            FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT
+            FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT,
+            FLAG_IS_VOICE_INTERACTION,
+            FLAG_FIRST_CUSTOM
     })
     public @interface ChangeFlags {}
 
@@ -249,6 +254,12 @@
         if ((flags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
             sb.append((sb.length() == 0 ? "" : "|") + "STARTING_WINDOW_TRANSFER");
         }
+        if ((flags & FLAG_IS_VOICE_INTERACTION) != 0) {
+            sb.append((sb.length() == 0 ? "" : "|") + "IS_VOICE_INTERACTION");
+        }
+        if ((flags & FLAG_FIRST_CUSTOM) != 0) {
+            sb.append((sb.length() == 0 ? "" : "|") + "FIRST_CUSTOM");
+        }
         return sb.toString();
     }
 
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java
index 26a6f0d..c0af572 100644
--- a/core/java/android/window/WindowContainerTransaction.java
+++ b/core/java/android/window/WindowContainerTransaction.java
@@ -109,8 +109,8 @@
     }
 
     /**
-     * Notify activities within the hierarchy of a container that they have entered picture-in-picture
-     * mode with the given bounds.
+     * Notify {@link com.android.server.wm.PinnedTaskController} that the picture-in-picture task
+     * has finished the enter animation with the given bounds.
      */
     @NonNull
     public WindowContainerTransaction scheduleFinishEnterPip(
@@ -339,6 +339,33 @@
     }
 
     /**
+     * Sets the container as launch adjacent flag root. Task starting with
+     * {@link FLAG_ACTIVITY_LAUNCH_ADJACENT} will be launching to.
+     *
+     * @hide
+     */
+    @NonNull
+    public WindowContainerTransaction setLaunchAdjacentFlagRoot(
+            @NonNull WindowContainerToken container) {
+        mHierarchyOps.add(HierarchyOp.createForSetLaunchAdjacentFlagRoot(container.asBinder(),
+                false /* clearRoot */));
+        return this;
+    }
+
+    /**
+     * Clears launch adjacent flag root for the display area of passing container.
+     *
+     * @hide
+     */
+    @NonNull
+    public WindowContainerTransaction clearLaunchAdjacentFlagRoot(
+            @NonNull WindowContainerToken container) {
+        mHierarchyOps.add(HierarchyOp.createForSetLaunchAdjacentFlagRoot(container.asBinder(),
+                true /* clearRoot */));
+        return this;
+    }
+
+    /**
      * Starts a task by id. The task is expected to already exist (eg. as a recent task).
      * @param taskId Id of task to start.
      * @param options bundle containing ActivityOptions for the task's top activity.
@@ -677,6 +704,7 @@
         public static final int HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT = 3;
         public static final int HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS = 4;
         public static final int HIERARCHY_OP_TYPE_LAUNCH_TASK = 5;
+        public static final int HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT = 6;
 
         // The following key(s) are for use with mLaunchOptions:
         // When launching a task (eg. from recents), this is the taskId to be launched.
@@ -734,6 +762,14 @@
                     fullOptions);
         }
 
+        /** Create a hierarchy op for setting launch adjacent flag root. */
+        public static HierarchyOp createForSetLaunchAdjacentFlagRoot(IBinder container,
+                boolean clearRoot) {
+            return new HierarchyOp(HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT, container, null,
+                    null, null, clearRoot, null);
+        }
+
+
         private HierarchyOp(int type, @Nullable IBinder container, @Nullable IBinder reparent,
                 int[] windowingModes, int[] activityTypes, boolean toTop,
                 @Nullable Bundle launchOptions) {
@@ -829,6 +865,9 @@
                             + " adjacentRoot=" + mReparent + "}";
                 case HIERARCHY_OP_TYPE_LAUNCH_TASK:
                     return "{LaunchTask: " + mLaunchOptions + "}";
+                case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT:
+                    return "{SetAdjacentFlagRoot: container=" + mContainer + " clearRoot=" + mToTop
+                            + "}";
                 default:
                     return "{mType=" + mType + " container=" + mContainer + " reparent=" + mReparent
                             + " mToTop=" + mToTop + " mWindowingMode=" + mWindowingModes
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
index 9d06bb9..f2d91ba 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -203,34 +203,33 @@
 
         final InvisibleToggleAllowListingFeatureTarget magnification =
                 new InvisibleToggleAllowListingFeatureTarget(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);
+                        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 ToggleAllowListingFeatureTarget daltonizer =
                 new ToggleAllowListingFeatureTarget(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);
+                        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 ToggleAllowListingFeatureTarget colorInversion =
                 new ToggleAllowListingFeatureTarget(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);
+                        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);
 
-        // TODO: Update with shortcut icon
         final ToggleAllowListingFeatureTarget reduceBrightColors =
                 new ToggleAllowListingFeatureTarget(context,
                         shortcutType,
@@ -238,7 +237,7 @@
                                 REDUCE_BRIGHT_COLORS_COMPONENT_NAME.flattenToString()),
                         REDUCE_BRIGHT_COLORS_COMPONENT_NAME.flattenToString(),
                         context.getString(R.string.reduce_bright_colors_feature_name),
-                        null,
+                        context.getDrawable(R.drawable.ic_accessibility_reduce_bright_colors),
                         Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED);
 
         targets.add(magnification);
diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
index 5a5e745..dddc08a 100644
--- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
+++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
@@ -261,4 +261,11 @@
         in AudioFormat audioFormat,
         in PersistableBundle options,
         in IMicrophoneHotwordDetectionVoiceInteractionCallback callback);
+
+    /**
+     * Test API to simulate to trigger hardware recognition event for test.
+     */
+    void triggerHardwareRecognitionEventForTest(
+            in SoundTrigger.KeyphraseRecognitionEvent event,
+            in IHotwordRecognitionStatusCallback callback);
 }
diff --git a/core/java/com/android/internal/app/NetInitiatedActivity.java b/core/java/com/android/internal/app/NetInitiatedActivity.java
index 375e503..f34aabb 100644
--- a/core/java/com/android/internal/app/NetInitiatedActivity.java
+++ b/core/java/com/android/internal/app/NetInitiatedActivity.java
@@ -16,6 +16,8 @@
 
 package com.android.internal.app;
 
+import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -69,6 +71,8 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+
         // Set up the "dialog"
         final Intent intent = getIntent();
         final AlertController.AlertParams p = mAlertParams;
diff --git a/core/java/com/android/internal/colorextraction/OWNERS b/core/java/com/android/internal/colorextraction/OWNERS
new file mode 100644
index 0000000..ffade1e
--- /dev/null
+++ b/core/java/com/android/internal/colorextraction/OWNERS
@@ -0,0 +1,3 @@
+dupin@google.com
+cinek@google.com
+jamesoleary@google.com
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
index c7a36ee..06f68e8 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
@@ -81,6 +81,12 @@
     public static final String SCREENSHOT_NOTIFICATION_SMART_ACTIONS_TIMEOUT_MS =
             "screenshot_notification_smart_actions_timeout_ms";
 
+    /**
+     * (int) Timeout value in ms to get Quick Share actions for screenshot notification.
+     */
+    public static final String SCREENSHOT_NOTIFICATION_QUICK_SHARE_ACTIONS_TIMEOUT_MS =
+            "screenshot_notification_quick_share_actions_timeout_ms";
+
     // Flags related to Smart Suggestions - these are read in SmartReplyConstants.
 
     /** (boolean) Whether to enable smart suggestions in notifications. */
@@ -483,6 +489,12 @@
     public static final String HOME_BUTTON_LONG_PRESS_DURATION_MS =
             "home_button_long_press_duration_ms";
 
+    /**
+     * (boolean) Whether shortcut integration over app search service is enabled.
+     */
+    public static final String SHORTCUT_APPSEARCH_INTEGRATION =
+            "shortcut_appsearch_integration";
+
     private SystemUiDeviceConfigFlags() {
     }
 }
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index 9a44c05..7c975e1 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -50,9 +50,6 @@
         sPackageFilt.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
         sPackageFilt.addAction(Intent.ACTION_PACKAGE_RESTARTED);
         sPackageFilt.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
-        sPackageFilt.addAction(Intent.ACTION_PACKAGE_STARTABLE);
-        sPackageFilt.addAction(Intent.ACTION_PACKAGE_UNSTARTABLE);
-        sPackageFilt.addAction(Intent.ACTION_PACKAGE_FULLY_LOADED);
         sPackageFilt.addDataScheme("package");
         sNonDataFilt.addAction(Intent.ACTION_UID_REMOVED);
         sNonDataFilt.addAction(Intent.ACTION_USER_STOPPED);
@@ -464,15 +461,6 @@
             String[] pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
             mSomePackagesChanged = true;
             onPackagesUnsuspended(pkgList);
-        } else if (Intent.ACTION_PACKAGE_STARTABLE.equals(action)
-                || Intent.ACTION_PACKAGE_UNSTARTABLE.equals(action)
-                || Intent.ACTION_PACKAGE_FULLY_LOADED.equals(action)) {
-            String pkg = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
-            int uid = intent.getIntExtra(Intent.EXTRA_UID, 0);
-            mSomePackagesChanged = false;
-            if (pkg != null) {
-                onPackageStateChanged(pkg, uid);
-            }
         }
 
         if (mSomePackagesChanged) {
diff --git a/core/java/com/android/internal/display/BrightnessSynchronizer.java b/core/java/com/android/internal/display/BrightnessSynchronizer.java
index 6776c27..bd90890 100644
--- a/core/java/com/android/internal/display/BrightnessSynchronizer.java
+++ b/core/java/com/android/internal/display/BrightnessSynchronizer.java
@@ -16,11 +16,11 @@
 
 package com.android.internal.display;
 
-
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
@@ -95,7 +95,7 @@
         }
 
         final BrightnessSyncObserver brightnessSyncObserver;
-        brightnessSyncObserver = new BrightnessSyncObserver(mHandler);
+        brightnessSyncObserver = new BrightnessSyncObserver();
         brightnessSyncObserver.startObserving();
 
         final float currentFloatBrightness = getScreenBrightnessFloat();
@@ -232,47 +232,52 @@
         }
     }
 
-    private class BrightnessSyncObserver extends ContentObserver {
-        /**
-         * Creates a content observer.
-         * @param handler The handler to run {@link #onChange} on, or null if none.
-         */
-        BrightnessSyncObserver(Handler handler) {
-            super(handler);
-        }
+    private class BrightnessSyncObserver {
+        private final DisplayListener mListener = new DisplayListener() {
+            @Override
+            public void onDisplayAdded(int displayId) {}
 
-        @Override
-        public void onChange(boolean selfChange) {
-            onChange(selfChange, null);
-        }
+            @Override
+            public void onDisplayRemoved(int displayId) {}
 
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            if (selfChange) {
-                return;
-            }
-            if (BRIGHTNESS_URI.equals(uri)) {
-                int currentBrightness = getScreenBrightnessInt(mContext);
-                mHandler.removeMessages(MSG_UPDATE_FLOAT);
-                mHandler.obtainMessage(MSG_UPDATE_FLOAT, currentBrightness, 0).sendToTarget();
-            } else if (BRIGHTNESS_FLOAT_URI.equals(uri)) {
+            @Override
+            public void onDisplayChanged(int displayId) {
                 float currentFloat = getScreenBrightnessFloat();
                 int toSend = Float.floatToIntBits(currentFloat);
                 mHandler.removeMessages(MSG_UPDATE_INT);
                 mHandler.obtainMessage(MSG_UPDATE_INT, toSend, 0).sendToTarget();
             }
-        }
+        };
+
+        private final ContentObserver mContentObserver = new ContentObserver(mHandler) {
+            @Override
+            public void onChange(boolean selfChange, Uri uri) {
+                if (selfChange) {
+                    return;
+                }
+                if (BRIGHTNESS_URI.equals(uri)) {
+                    int currentBrightness = getScreenBrightnessInt(mContext);
+                    mHandler.removeMessages(MSG_UPDATE_FLOAT);
+                    mHandler.obtainMessage(MSG_UPDATE_FLOAT, currentBrightness, 0).sendToTarget();
+                }
+            }
+        };
 
         public void startObserving() {
             final ContentResolver cr = mContext.getContentResolver();
-            cr.unregisterContentObserver(this);
-            cr.registerContentObserver(BRIGHTNESS_URI, false, this, UserHandle.USER_ALL);
-            cr.registerContentObserver(BRIGHTNESS_FLOAT_URI, false, this, UserHandle.USER_ALL);
+            cr.unregisterContentObserver(mContentObserver);
+            cr.registerContentObserver(BRIGHTNESS_URI, false, mContentObserver,
+                    UserHandle.USER_ALL);
+
+            mDisplayManager.registerDisplayListener(mListener, mHandler,
+                    DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
+                        | DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS);
         }
 
         public void stopObserving() {
             final ContentResolver cr = mContext.getContentResolver();
-            cr.unregisterContentObserver(this);
+            cr.unregisterContentObserver(mContentObserver);
+            mDisplayManager.unregisterDisplayListener(mListener);
         }
     }
 }
diff --git a/core/java/com/android/internal/graphics/OWNERS b/core/java/com/android/internal/graphics/OWNERS
new file mode 100644
index 0000000..5851cbb
--- /dev/null
+++ b/core/java/com/android/internal/graphics/OWNERS
@@ -0,0 +1 @@
+include /graphics/java/android/graphics/OWNERS
\ No newline at end of file
diff --git a/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl b/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
index 4365966..0b8598a 100644
--- a/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
+++ b/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
@@ -33,17 +33,17 @@
     void reportStartInputAsync(in IBinder startInputToken);
     void createInputContentUriToken(in Uri contentUri, in String packageName,
             in IIInputContentUriTokenResultCallback resultCallback);
-    void reportFullscreenMode(boolean fullscreen, in IVoidResultCallback resultCallback);
+    void reportFullscreenModeAsync(boolean fullscreen);
     void setInputMethod(String id, in IVoidResultCallback resultCallback);
     void setInputMethodAndSubtype(String id, in InputMethodSubtype subtype,
             in IVoidResultCallback resultCallback);
     void hideMySoftInput(int flags, in IVoidResultCallback resultCallback);
     void showMySoftInput(int flags, in IVoidResultCallback resultCallback);
-    void updateStatusIcon(String packageName, int iconId, in IVoidResultCallback resultCallback);
+    void updateStatusIconAsync(String packageName, int iconId);
     void switchToPreviousInputMethod(in IBooleanResultCallback resultCallback);
     void switchToNextInputMethod(boolean onlyCurrentIme, in IBooleanResultCallback resultCallback);
     void shouldOfferSwitchingToNextInputMethod(in IBooleanResultCallback resultCallback);
-    void notifyUserAction(in IVoidResultCallback resultCallback);
+    void notifyUserActionAsync();
     void applyImeVisibility(IBinder showOrHideInputToken, boolean setVisible,
             in IVoidResultCallback resultCallback);
 }
diff --git a/core/java/com/android/internal/inputmethod/InputMethodDebug.java b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
index 93374ba..d026ecd 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodDebug.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
@@ -230,6 +230,10 @@
                 return "HIDE_REMOVE_CLIENT";
             case SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY:
                 return "SHOW_RESTORE_IME_VISIBILITY";
+            case SoftInputShowHideReason.SHOW_TOGGLE_SOFT_INPUT:
+                return "SHOW_TOGGLE_SOFT_INPUT";
+            case SoftInputShowHideReason.HIDE_TOGGLE_SOFT_INPUT:
+                return "HIDE_TOGGLE_SOFT_INPUT";
             default:
                 return "Unknown=" + reason;
         }
diff --git a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
index 555488d..345a958 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
@@ -169,43 +169,37 @@
     }
 
     /**
-     * Calls {@link IInputMethodPrivilegedOperations#reportFullscreenMode(boolean,
-     * IVoidResultCallback)}.
+     * Calls {@link IInputMethodPrivilegedOperations#reportFullscreenModeAsync(boolean)}.
      *
      * @param fullscreen {@code true} if the IME enters full screen mode
      */
     @AnyThread
-    public void reportFullscreenMode(boolean fullscreen) {
+    public void reportFullscreenModeAsync(boolean fullscreen) {
         final IInputMethodPrivilegedOperations ops = mOps.getAndWarnIfNull();
         if (ops == null) {
             return;
         }
         try {
-            final Completable.Void value = Completable.createVoid();
-            ops.reportFullscreenMode(fullscreen, ResultCallbacks.of(value));
-            Completable.getResult(value);
+            ops.reportFullscreenModeAsync(fullscreen);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
     }
 
     /**
-     * Calls {@link IInputMethodPrivilegedOperations#updateStatusIcon(String, int,
-     * IVoidResultCallback)}.
+     * Calls {@link IInputMethodPrivilegedOperations#updateStatusIconAsync(String, int)}.
      *
      * @param packageName package name from which the status icon should be loaded
      * @param iconResId resource ID of the icon to be loaded
      */
     @AnyThread
-    public void updateStatusIcon(String packageName, @DrawableRes int iconResId) {
+    public void updateStatusIconAsync(String packageName, @DrawableRes int iconResId) {
         final IInputMethodPrivilegedOperations ops = mOps.getAndWarnIfNull();
         if (ops == null) {
             return;
         }
         try {
-            final Completable.Void value = Completable.createVoid();
-            ops.updateStatusIcon(packageName, iconResId, ResultCallbacks.of(value));
-            Completable.getResult(value);
+            ops.updateStatusIconAsync(packageName, iconResId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -365,18 +359,16 @@
     }
 
     /**
-     * Calls {@link IInputMethodPrivilegedOperations#notifyUserAction(IVoidResultCallback)}
+     * Calls {@link IInputMethodPrivilegedOperations#notifyUserActionAsync()}
      */
     @AnyThread
-    public void notifyUserAction() {
+    public void notifyUserActionAsync() {
         final IInputMethodPrivilegedOperations ops = mOps.getAndWarnIfNull();
         if (ops == null) {
             return;
         }
         try {
-            final Completable.Void value = Completable.createVoid();
-            ops.notifyUserAction(ResultCallbacks.of(value));
-            Completable.getResult(value);
+            ops.notifyUserActionAsync();
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java
index f1cdf2b..755bd5e 100644
--- a/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java
+++ b/core/java/com/android/internal/inputmethod/SoftInputShowHideReason.java
@@ -50,7 +50,9 @@
         SoftInputShowHideReason.HIDE_BUBBLES,
         SoftInputShowHideReason.HIDE_SAME_WINDOW_FOCUSED_WITHOUT_EDITOR,
         SoftInputShowHideReason.HIDE_REMOVE_CLIENT,
-        SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY})
+        SoftInputShowHideReason.SHOW_RESTORE_IME_VISIBILITY,
+        SoftInputShowHideReason.SHOW_TOGGLE_SOFT_INPUT,
+        SoftInputShowHideReason.HIDE_TOGGLE_SOFT_INPUT})
 public @interface SoftInputShowHideReason {
     /** Show soft input by {@link android.view.inputmethod.InputMethodManager#showSoftInput}. */
     int SHOW_SOFT_INPUT = 0;
@@ -174,4 +176,16 @@
      * {@link com.android.server.wm.WindowManagerInternal#shouldRestoreImeVisibility}.
      */
     int SHOW_RESTORE_IME_VISIBILITY = 22;
+
+    /**
+     * Show soft input by
+     * {@link android.view.inputmethod.InputMethodManager#toggleSoftInput(int, int)};
+     */
+    int SHOW_TOGGLE_SOFT_INPUT = 23;
+
+    /**
+     * Hide soft input by
+     * {@link android.view.inputmethod.InputMethodManager#toggleSoftInput(int, int)};
+     */
+    int HIDE_TOGGLE_SOFT_INPUT = 24;
 }
diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java
index 135c076..4d3f774 100644
--- a/core/java/com/android/internal/jank/FrameTracker.java
+++ b/core/java/com/android/internal/jank/FrameTracker.java
@@ -102,6 +102,7 @@
     private boolean mMetricsFinalized;
     private boolean mCancelled = false;
     private FrameTrackerListener mListener;
+    private boolean mTracingStarted = false;
 
     private static class JankInfo {
         long frameVsyncId;
@@ -207,7 +208,15 @@
     public synchronized void begin() {
         mBeginVsyncId = mChoreographer.getVsyncId() + 1;
         mSession.setTimeStamp(System.nanoTime());
-        Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId);
+        mChoreographer.mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, () -> {
+            synchronized (FrameTracker.this) {
+                if (mCancelled || mEndVsyncId != INVALID_ID) {
+                    return;
+                }
+                mTracingStarted = true;
+                Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId);
+            }
+        }, null);
         mRendererWrapper.addObserver(mObserver);
         if (DEBUG) {
             Log.d(TAG, "begin: " + mSession.getName() + ", begin=" + mBeginVsyncId);
@@ -255,7 +264,7 @@
      */
     public synchronized void cancel(@Reasons int reason) {
         // We don't need to end the trace section if it never begun.
-        if (mBeginVsyncId != INVALID_ID) {
+        if (mTracingStarted) {
             Trace.endAsyncSection(mSession.getName(), (int) mBeginVsyncId);
         }
         mCancelled = true;
diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java
index 5ab2a82..0441594 100644
--- a/core/java/com/android/internal/jank/InteractionJankMonitor.java
+++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java
@@ -79,6 +79,12 @@
 
 /**
  * This class let users to begin and end the always on tracing mechanism.
+ *
+ * Enabling for local development:
+ *
+ * adb shell device_config put interaction_jank_monitor enabled true
+ * adb shell device_config put interaction_jank_monitor sampling_interval 1
+ *
  * @hide
  */
 public class InteractionJankMonitor {
diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
index aa416c5..73d962e 100644
--- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
+++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
@@ -53,7 +53,7 @@
         builder.getOrCreateSystemBatteryConsumerBuilder(
                         SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, powerModel)
-                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN, durationMs);
+                .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, durationMs);
     }
 
     /**
diff --git a/core/java/com/android/internal/os/AudioPowerCalculator.java b/core/java/com/android/internal/os/AudioPowerCalculator.java
index 79b331d..9da8191 100644
--- a/core/java/com/android/internal/os/AudioPowerCalculator.java
+++ b/core/java/com/android/internal/os/AudioPowerCalculator.java
@@ -42,7 +42,7 @@
         final long durationMs = mPowerEstimator.calculateDuration(u.getAudioTurnedOnTimer(),
                 rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
         final double powerMah = mPowerEstimator.calculatePower(durationMs);
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO, durationMs)
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah);
     }
 }
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index b05a9f8..02a29085 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -161,7 +161,7 @@
     private static final int MAGIC = 0xBA757475; // 'BATSTATS'
 
     // Current on-disk Parcel version
-    static final int VERSION = 197;
+    static final int VERSION = 198;
 
     // The maximum number of names wakelocks we will keep track of
     // per uid; once the limit is reached, we batch the remaining wakelocks
@@ -12088,7 +12088,7 @@
     /**
      * Distribute Bluetooth energy info and network traffic to apps.
      *
-     * @param info The energy information from the bluetooth controller.
+     * @param info The accumulated energy information from the bluetooth controller.
      */
     public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info,
             final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs) {
@@ -12100,9 +12100,6 @@
             return;
         }
         if (!mOnBatteryInternal || mIgnoreNextExternalStats) {
-            // TODO(174818545): mLastBluetoothActivityInfo is actually extremely suspicious.
-            //  Firstly, the following line was originally missing. But even more so, BESW says that
-            //  info is a delta, not a total, so this entire algorithm requires review.
             mLastBluetoothActivityInfo.set(info);
             return;
         }
@@ -15606,7 +15603,7 @@
         out.writeLong(mNextMaxDailyDeadlineMs);
         out.writeLong(mBatteryTimeToFullSeconds);
 
-        MeasuredEnergyStats.writeSummaryToParcel(mGlobalMeasuredEnergyStats, out, false);
+        MeasuredEnergyStats.writeSummaryToParcel(mGlobalMeasuredEnergyStats, out, false, false);
 
         mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
         mScreenDozeTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
@@ -15931,7 +15928,7 @@
                 out.writeInt(0);
             }
 
-            MeasuredEnergyStats.writeSummaryToParcel(u.mUidMeasuredEnergyStats, out, true);
+            MeasuredEnergyStats.writeSummaryToParcel(u.mUidMeasuredEnergyStats, out, true, true);
 
             final ArrayMap<String, Uid.Wakelock> wakeStats = u.mWakelockStats.getMap();
             int NW = wakeStats.size();
diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
index 9ad7c15..babcea1 100644
--- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
+++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
@@ -124,16 +124,11 @@
         final long realtimeUs = elapsedRealtime() * 1000;
         final long uptimeUs = uptimeMillis() * 1000;
 
-        final String[] customPowerComponentNames = mStats.getCustomEnergyConsumerNames();
-
-        // TODO(b/174186358): read extra time component number from configuration
-        final int customTimeComponentCount = 0;
-
         final boolean includePowerModels = (query.getFlags()
                 & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0;
 
         final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
-                customPowerComponentNames, customTimeComponentCount, includePowerModels);
+                mStats.getCustomEnergyConsumerNames(), includePowerModels);
         batteryUsageStatsBuilder.setStatsStartTimestamp(mStats.getStartClockTime());
 
         SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats();
diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java
index 30a3536..1004e17 100644
--- a/core/java/com/android/internal/os/BinderCallsStats.java
+++ b/core/java/com/android/internal/os/BinderCallsStats.java
@@ -16,18 +16,25 @@
 
 package com.android.internal.os;
 
+import static com.android.internal.os.BinderLatencyProto.Dims.SYSTEM_SERVER;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Process;
 import android.os.SystemClock;
 import android.os.UserHandle;
+import android.provider.Settings;
 import android.text.format.DateFormat;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.IntArray;
+import android.util.KeyValueListParser;
 import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -57,7 +64,7 @@
     public static final boolean DEFAULT_TRACK_SCREEN_INTERACTIVE = false;
     public static final boolean DEFAULT_TRACK_DIRECT_CALLING_UID = true;
     public static final boolean DEFAULT_IGNORE_BATTERY_STATUS = false;
-    public static final boolean DEFAULT_COLLECT_LATENCY_DATA = false;
+    public static final boolean DEFAULT_COLLECT_LATENCY_DATA = true;
     public static final int MAX_BINDER_CALL_STATS_COUNT_DEFAULT = 1500;
     private static final String DEBUG_ENTRY_PREFIX = "__DEBUG_";
 
@@ -157,15 +164,20 @@
             return new Handler(Looper.getMainLooper());
         }
 
-        public BinderLatencyObserver getLatencyObserver() {
-            return new BinderLatencyObserver(new BinderLatencyObserver.Injector());
+        /** Create a latency observer for the specified process. */
+        public BinderLatencyObserver getLatencyObserver(int processSource) {
+            return new BinderLatencyObserver(new BinderLatencyObserver.Injector(), processSource);
         }
     }
 
     public BinderCallsStats(Injector injector) {
+        this(injector, SYSTEM_SERVER);
+    }
+
+    public BinderCallsStats(Injector injector, int processSource) {
         this.mRandom = injector.getRandomGenerator();
         this.mCallStatsObserverHandler = injector.getHandler();
-        this.mLatencyObserver = injector.getLatencyObserver();
+        this.mLatencyObserver = injector.getLatencyObserver(processSource);
     }
 
     public void setDeviceState(@NonNull CachedDeviceState.Readonly deviceState) {
@@ -1074,4 +1086,120 @@
                 ? result
                 : Integer.compare(a.transactionCode, b.transactionCode);
     }
+
+
+    /**
+     * Settings observer for other processes (not system_server).
+     *
+     * We do not want to collect cpu data from other processes so only latency collection should be
+     * possible to enable.
+     */
+    public static class SettingsObserver extends ContentObserver {
+        // Settings for BinderCallsStats.
+        public static final String SETTINGS_ENABLED_KEY = "enabled";
+        public static final String SETTINGS_DETAILED_TRACKING_KEY = "detailed_tracking";
+        public static final String SETTINGS_UPLOAD_DATA_KEY = "upload_data";
+        public static final String SETTINGS_SAMPLING_INTERVAL_KEY = "sampling_interval";
+        public static final String SETTINGS_TRACK_SCREEN_INTERACTIVE_KEY = "track_screen_state";
+        public static final String SETTINGS_TRACK_DIRECT_CALLING_UID_KEY = "track_calling_uid";
+        public static final String SETTINGS_MAX_CALL_STATS_KEY = "max_call_stats_count";
+        public static final String SETTINGS_IGNORE_BATTERY_STATUS_KEY = "ignore_battery_status";
+        // Settings for BinderLatencyObserver.
+        public static final String SETTINGS_COLLECT_LATENCY_DATA_KEY = "collect_Latency_data";
+        public static final String SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY =
+                "latency_observer_sampling_interval";
+        public static final String SETTINGS_LATENCY_OBSERVER_PUSH_INTERVAL_MINUTES_KEY =
+                "latency_observer_push_interval_minutes";
+        public static final String SETTINGS_LATENCY_HISTOGRAM_BUCKET_COUNT_KEY =
+                "latency_histogram_bucket_count";
+        public static final String SETTINGS_LATENCY_HISTOGRAM_FIRST_BUCKET_SIZE_KEY =
+                "latency_histogram_first_bucket_size";
+        public static final String SETTINGS_LATENCY_HISTOGRAM_BUCKET_SCALE_FACTOR_KEY =
+                "latency_histogram_bucket_scale_factor";
+
+        private boolean mEnabled;
+        private final Uri mUri = Settings.Global.getUriFor(Settings.Global.BINDER_CALLS_STATS);
+        private final Context mContext;
+        private final KeyValueListParser mParser = new KeyValueListParser(',');
+        private final BinderCallsStats mBinderCallsStats;
+        private final int mProcessSource;
+
+        public SettingsObserver(Context context, BinderCallsStats binderCallsStats,
+                    int processSource, int userHandle) {
+            super(BackgroundThread.getHandler());
+            mContext = context;
+            context.getContentResolver().registerContentObserver(mUri, false, this,
+                    userHandle);
+            mBinderCallsStats = binderCallsStats;
+            mProcessSource = processSource;
+            // Always kick once to ensure that we match current state
+            onChange();
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri, int userId) {
+            if (mUri.equals(uri)) {
+                onChange();
+            }
+        }
+
+        void onChange() {
+            try {
+                mParser.setString(Settings.Global.getString(mContext.getContentResolver(),
+                        Settings.Global.BINDER_CALLS_STATS));
+            } catch (IllegalArgumentException e) {
+                Slog.e(TAG, "Bad binder call stats settings", e);
+            }
+
+            // Cpu data collection should always be disabled for other processes.
+            mBinderCallsStats.setDetailedTracking(false);
+            mBinderCallsStats.setTrackScreenInteractive(false);
+            mBinderCallsStats.setTrackDirectCallerUid(false);
+
+            mBinderCallsStats.setIgnoreBatteryStatus(
+                    mParser.getBoolean(SETTINGS_IGNORE_BATTERY_STATUS_KEY,
+                            BinderCallsStats.DEFAULT_IGNORE_BATTERY_STATUS));
+            mBinderCallsStats.setCollectLatencyData(
+                    mParser.getBoolean(SETTINGS_COLLECT_LATENCY_DATA_KEY,
+                            BinderCallsStats.DEFAULT_COLLECT_LATENCY_DATA));
+
+            // Binder latency observer settings.
+            configureLatencyObserver(mParser, mBinderCallsStats.getLatencyObserver());
+
+            final boolean enabled =
+                    mParser.getBoolean(SETTINGS_ENABLED_KEY, BinderCallsStats.ENABLED_DEFAULT);
+            if (mEnabled != enabled) {
+                if (enabled) {
+                    Binder.setObserver(mBinderCallsStats);
+                } else {
+                    Binder.setObserver(null);
+                }
+                mEnabled = enabled;
+                mBinderCallsStats.reset();
+                mBinderCallsStats.setAddDebugEntries(enabled);
+                mBinderCallsStats.getLatencyObserver().reset();
+            }
+        }
+
+        /** Configures the binder latency observer related settings. */
+        public static void configureLatencyObserver(
+                    KeyValueListParser mParser, BinderLatencyObserver binderLatencyObserver) {
+            binderLatencyObserver.setSamplingInterval(mParser.getInt(
+                    SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY,
+                    BinderLatencyObserver.PERIODIC_SAMPLING_INTERVAL_DEFAULT));
+            binderLatencyObserver.setHistogramBucketsParams(
+                    mParser.getInt(
+                            SETTINGS_LATENCY_HISTOGRAM_BUCKET_COUNT_KEY,
+                            BinderLatencyObserver.BUCKET_COUNT_DEFAULT),
+                    mParser.getInt(
+                            SETTINGS_LATENCY_HISTOGRAM_FIRST_BUCKET_SIZE_KEY,
+                            BinderLatencyObserver.FIRST_BUCKET_SIZE_DEFAULT),
+                    mParser.getFloat(
+                            SETTINGS_LATENCY_HISTOGRAM_BUCKET_SCALE_FACTOR_KEY,
+                            BinderLatencyObserver.BUCKET_SCALE_FACTOR_DEFAULT));
+            binderLatencyObserver.setPushInterval(mParser.getInt(
+                    SETTINGS_LATENCY_OBSERVER_PUSH_INTERVAL_MINUTES_KEY,
+                    BinderLatencyObserver.STATSD_PUSH_INTERVAL_MINUTES_DEFAULT));
+        }
+    }
 }
diff --git a/core/java/com/android/internal/os/BinderLatencyObserver.java b/core/java/com/android/internal/os/BinderLatencyObserver.java
index 0079801..5fa96bd 100644
--- a/core/java/com/android/internal/os/BinderLatencyObserver.java
+++ b/core/java/com/android/internal/os/BinderLatencyObserver.java
@@ -16,8 +16,6 @@
 
 package com.android.internal.os;
 
-import static com.android.internal.os.BinderLatencyProto.Dims.SYSTEM_SERVER;
-
 import android.annotation.Nullable;
 import android.os.Binder;
 import android.os.Handler;
@@ -68,9 +66,10 @@
     private int mStatsdPushIntervalMinutes = STATSD_PUSH_INTERVAL_MINUTES_DEFAULT;
 
     private final Random mRandom;
-    private BinderLatencyBuckets mLatencyBuckets;
-
     private final Handler mLatencyObserverHandler;
+    private final int mProcessSource;
+
+    private BinderLatencyBuckets mLatencyBuckets;
 
     private Runnable mLatencyObserverRunnable = new Runnable() {
         @Override
@@ -134,7 +133,7 @@
 
         // Write the dims.
         long dimsToken = proto.start(ApiStats.DIMS);
-        proto.write(Dims.PROCESS_SOURCE, SYSTEM_SERVER);
+        proto.write(Dims.PROCESS_SOURCE, mProcessSource);
         proto.write(Dims.SERVICE_CLASS_NAME, dims.getBinderClass().getName());
         proto.write(Dims.SERVICE_METHOD_NAME, transactionName);
         proto.end(dimsToken);
@@ -180,11 +179,12 @@
         }
     }
 
-    public BinderLatencyObserver(Injector injector) {
+    public BinderLatencyObserver(Injector injector, int processSource) {
         mRandom = injector.getRandomGenerator();
         mLatencyObserverHandler = injector.getHandler();
         mLatencyBuckets = new BinderLatencyBuckets(
             mBucketCount, mFirstBucketSize, mBucketScaleFactor);
+        mProcessSource = processSource;
         noteLatencyDelayed();
     }
 
diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
index a418dff..2c32e48 100644
--- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java
+++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
@@ -88,7 +88,7 @@
                     + " power=" + formatCharge(systemPowerMah));
         }
         systemBatteryConsumerBuilder
-                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH,
+                .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
                         systemComponentDurationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
                         Math.max(systemPowerMah, total.powerMah), powerModel)
@@ -105,7 +105,7 @@
         final long durationMs = calculateDuration(activityCounter);
         final double powerMah = calculatePowerMah(powerModel, measuredChargeUC, activityCounter);
 
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH, durationMs)
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerMah, powerModel);
 
         total.durationMs += durationMs;
diff --git a/core/java/com/android/internal/os/CameraPowerCalculator.java b/core/java/com/android/internal/os/CameraPowerCalculator.java
index 6f8e927..e56e7be 100644
--- a/core/java/com/android/internal/os/CameraPowerCalculator.java
+++ b/core/java/com/android/internal/os/CameraPowerCalculator.java
@@ -42,7 +42,7 @@
                 mPowerEstimator.calculateDuration(u.getCameraTurnedOnTimer(), rawRealtimeUs,
                         BatteryStats.STATS_SINCE_CHARGED);
         final double powerMah = mPowerEstimator.calculatePower(durationMs);
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CAMERA, durationMs)
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA, durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA, powerMah);
     }
 
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index 4aafec5..2a55aa9 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -97,9 +97,7 @@
                 result);
 
         app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, result.powerMah, powerModel)
-                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, result.durationMs)
-                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND,
-                        result.durationFgMs)
+                .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CPU, result.durationMs)
                 .setPackageWithHighestDrain(result.packageWithHighestDrain);
     }
 
diff --git a/core/java/com/android/internal/os/FlashlightPowerCalculator.java b/core/java/com/android/internal/os/FlashlightPowerCalculator.java
index 6c29a91..cbe0cde 100644
--- a/core/java/com/android/internal/os/FlashlightPowerCalculator.java
+++ b/core/java/com/android/internal/os/FlashlightPowerCalculator.java
@@ -39,7 +39,7 @@
         final long durationMs = mPowerEstimator.calculateDuration(u.getFlashlightTurnedOnTimer(),
                 rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
         final double powerMah = mPowerEstimator.calculatePower(durationMs);
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_FLASHLIGHT, durationMs)
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, powerMah);
     }
 
diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java
index 0e0870d..7eb4b4a 100644
--- a/core/java/com/android/internal/os/GnssPowerCalculator.java
+++ b/core/java/com/android/internal/os/GnssPowerCalculator.java
@@ -74,7 +74,7 @@
                 powerMah = computePower(durationMs, averageGnssPowerMa);
         }
 
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS, durationMs)
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_GNSS, durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, powerMah, powerModel);
     }
 
diff --git a/core/java/com/android/internal/os/IdlePowerCalculator.java b/core/java/com/android/internal/os/IdlePowerCalculator.java
index 5cb54bd..0c80deb 100644
--- a/core/java/com/android/internal/os/IdlePowerCalculator.java
+++ b/core/java/com/android/internal/os/IdlePowerCalculator.java
@@ -55,7 +55,7 @@
         if (mPowerMah != 0) {
             builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_IDLE)
                     .setConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE, mPowerMah)
-                    .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_IDLE, mDurationMs);
+                    .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE, mDurationMs);
         }
     }
 
diff --git a/core/java/com/android/internal/os/MemoryPowerCalculator.java b/core/java/com/android/internal/os/MemoryPowerCalculator.java
index 9ec40c6..5d5c155 100644
--- a/core/java/com/android/internal/os/MemoryPowerCalculator.java
+++ b/core/java/com/android/internal/os/MemoryPowerCalculator.java
@@ -32,7 +32,7 @@
         final double powerMah = calculatePower(batteryStats, rawRealtimeUs,
                 BatteryStats.STATS_SINCE_CHARGED);
         builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_MEMORY)
-                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MEMORY, durationMs)
+                .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah);
     }
 
diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
index d441d45..4db15a4 100644
--- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
+++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
@@ -107,7 +107,7 @@
         if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) {
             builder.getOrCreateSystemBatteryConsumerBuilder(
                         SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO)
-                    .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO,
+                    .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
                             total.durationMs)
                     .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
                             total.remainingPowerMah + total.totalAppPowerMah,
@@ -128,7 +128,7 @@
                 radioActiveDurationMs, consumptionUC);
         total.totalAppPowerMah += powerMah;
 
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO,
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
                         radioActiveDurationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, powerMah,
                         powerModel);
diff --git a/core/java/com/android/internal/os/PhonePowerCalculator.java b/core/java/com/android/internal/os/PhonePowerCalculator.java
index 6f279d99..2e3bff3 100644
--- a/core/java/com/android/internal/os/PhonePowerCalculator.java
+++ b/core/java/com/android/internal/os/PhonePowerCalculator.java
@@ -46,7 +46,7 @@
         if (phoneOnPower != 0) {
             builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_PHONE)
                     .setConsumedPower(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnPower)
-                    .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_PHONE, phoneOnTimeMs);
+                    .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnTimeMs);
         }
     }
 
diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java
index 0743c89..dc0f719 100644
--- a/core/java/com/android/internal/os/ScreenPowerCalculator.java
+++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java
@@ -81,7 +81,7 @@
                     final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
                     calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.getBatteryStatsUid(),
                             rawRealtimeUs);
-                    app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN,
+                    app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN,
                                     appPowerAndDuration.durationMs)
                             .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
                                     appPowerAndDuration.powerMah, powerModel);
@@ -96,7 +96,7 @@
         }
 
         builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN)
-                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN,
+                .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN,
                         totalPowerAndDuration.durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
                         Math.max(totalPowerAndDuration.powerMah, totalAppPower), powerModel)
@@ -251,7 +251,7 @@
                 final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
                 final long durationMs = activityTimeArray.get(app.getUid(), 0);
                 final double powerMah = totalScreenPowerMah * durationMs / totalActivityTimeMs;
-                app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN, durationMs)
+                app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, durationMs)
                         .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah,
                                 BatteryConsumer.POWER_MODEL_POWER_PROFILE);
             }
diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java
index 78c4fe2..d18b7b1 100644
--- a/core/java/com/android/internal/os/SensorPowerCalculator.java
+++ b/core/java/com/android/internal/os/SensorPowerCalculator.java
@@ -40,7 +40,7 @@
     @Override
     protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
             long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SENSORS,
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SENSORS,
                         calculateDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED))
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS,
                         calculatePowerMah(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED));
diff --git a/core/java/com/android/internal/os/VideoPowerCalculator.java b/core/java/com/android/internal/os/VideoPowerCalculator.java
index 5d6caf5..0cad9a7 100644
--- a/core/java/com/android/internal/os/VideoPowerCalculator.java
+++ b/core/java/com/android/internal/os/VideoPowerCalculator.java
@@ -39,7 +39,7 @@
         final long durationMs = mPowerEstimator.calculateDuration(u.getVideoTurnedOnTimer(),
                 rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
         final double powerMah = mPowerEstimator.calculatePower(durationMs);
-        app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO, durationMs)
+        app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO, durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO, powerMah);
     }
 }
diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java
index 0f4767b..194b6b8 100644
--- a/core/java/com/android/internal/os/WakelockPowerCalculator.java
+++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java
@@ -57,7 +57,7 @@
             final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
             calculateApp(result, app.getBatteryStatsUid(), rawRealtimeUs,
                     BatteryStats.STATS_SINCE_CHARGED);
-            app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WAKELOCK, result.durationMs)
+            app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.durationMs)
                     .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.powerMah);
             totalAppDurationMs += result.durationMs;
 
@@ -74,7 +74,7 @@
         if (osBatteryConsumer != null) {
             calculateRemaining(result, batteryStats, rawRealtimeUs, rawUptimeUs,
                     BatteryStats.STATS_SINCE_CHARGED, osPowerMah, osDurationMs, totalAppDurationMs);
-            osBatteryConsumer.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WAKELOCK,
+            osBatteryConsumer.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK,
                     result.durationMs)
                     .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.powerMah);
         }
diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java
index 11219ec..ef5b147 100644
--- a/core/java/com/android/internal/os/WifiPowerCalculator.java
+++ b/core/java/com/android/internal/os/WifiPowerCalculator.java
@@ -100,7 +100,7 @@
             totalAppDurationMs += powerDurationAndTraffic.durationMs;
             totalAppPowerMah += powerDurationAndTraffic.powerMah;
 
-            app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI,
+            app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
                     powerDurationAndTraffic.durationMs);
             app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
                     powerDurationAndTraffic.powerMah, powerModel);
@@ -118,7 +118,7 @@
                 totalAppDurationMs, totalAppPowerMah, consumptionUC);
 
         systemBatteryConsumerBuilder
-                .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI,
+                .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
                         powerDurationAndTraffic.durationMs)
                 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
                         totalAppPowerMah + powerDurationAndTraffic.powerMah, powerModel)
diff --git a/core/java/com/android/internal/policy/TransitionAnimation.java b/core/java/com/android/internal/policy/TransitionAnimation.java
index 93ba037..60a8d80 100644
--- a/core/java/com/android/internal/policy/TransitionAnimation.java
+++ b/core/java/com/android/internal/policy/TransitionAnimation.java
@@ -21,7 +21,6 @@
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
 import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_CLOSE;
 import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
 import static android.view.WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_CLOSE;
 import static android.view.WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_OPEN;
 import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_CLOSE;
@@ -76,6 +75,8 @@
     /** Fraction of animation at which the recents thumbnail becomes completely transparent */
     private static final float RECENTS_THUMBNAIL_FADEOUT_FRACTION = 0.5f;
 
+    private static final String DEFAULT_PACKAGE = "android";
+
     private final Context mContext;
     private final String mTag;
 
@@ -132,7 +133,8 @@
         windowStyle.recycle();
     }
 
-    public Animation loadKeyguardExitAnimation(int transit, int transitionFlags) {
+    /** Loads keyguard animation by transition flags and check it is on wallpaper or not. */
+    public Animation loadKeyguardExitAnimation(int transitionFlags, boolean onWallpaper) {
         if ((transitionFlags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) != 0) {
             return null;
         }
@@ -140,25 +142,24 @@
                 (transitionFlags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0;
         final boolean subtle =
                 (transitionFlags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) != 0;
-        return createHiddenByKeyguardExit(mContext, mInterpolator,
-                transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER, toShade, subtle);
+        return createHiddenByKeyguardExit(mContext, mInterpolator, onWallpaper, toShade, subtle);
     }
 
     @Nullable
-    public Animation loadKeyguardUnoccludeAnimation(LayoutParams lp) {
-        return loadAnimationRes(lp, com.android.internal.R.anim.wallpaper_open_exit);
+    public Animation loadKeyguardUnoccludeAnimation() {
+        return loadDefaultAnimationRes(com.android.internal.R.anim.wallpaper_open_exit);
     }
 
     @Nullable
-    public Animation loadVoiceActivityOpenAnimation(LayoutParams lp, boolean enter) {
-        return loadAnimationRes(lp, enter
+    public Animation loadVoiceActivityOpenAnimation(boolean enter) {
+        return loadDefaultAnimationRes(enter
                 ? com.android.internal.R.anim.voice_activity_open_enter
                 : com.android.internal.R.anim.voice_activity_open_exit);
     }
 
     @Nullable
-    public Animation loadVoiceActivityExitAnimation(LayoutParams lp, boolean enter) {
-        return loadAnimationRes(lp, enter
+    public Animation loadVoiceActivityExitAnimation(boolean enter) {
+        return loadDefaultAnimationRes(enter
                 ? com.android.internal.R.anim.voice_activity_close_enter
                 : com.android.internal.R.anim.voice_activity_close_exit);
     }
@@ -170,33 +171,19 @@
 
     @Nullable
     public Animation loadCrossProfileAppEnterAnimation() {
-        return loadAnimationRes("android",
+        return loadAnimationRes(DEFAULT_PACKAGE,
                 com.android.internal.R.anim.task_open_enter_cross_profile_apps);
     }
 
     @Nullable
     public Animation loadCrossProfileAppThumbnailEnterAnimation() {
         return loadAnimationRes(
-                "android", com.android.internal.R.anim.cross_profile_apps_thumbnail_enter);
-    }
-
-    /** Load animation by resource Id from specific LayoutParams. */
-    @Nullable
-    private Animation loadAnimationRes(LayoutParams lp, int resId) {
-        Context context = mContext;
-        if (ResourceId.isValid(resId)) {
-            AttributeCache.Entry ent = getCachedAnimations(lp);
-            if (ent != null) {
-                context = ent.context;
-            }
-            return loadAnimationSafely(context, resId, mTag);
-        }
-        return null;
+                DEFAULT_PACKAGE, com.android.internal.R.anim.cross_profile_apps_thumbnail_enter);
     }
 
     /** Load animation by resource Id from specific package. */
     @Nullable
-    private Animation loadAnimationRes(String packageName, int resId) {
+    public Animation loadAnimationRes(String packageName, int resId) {
         if (ResourceId.isValid(resId)) {
             AttributeCache.Entry ent = getCachedAnimations(packageName, resId);
             if (ent != null) {
@@ -209,7 +196,7 @@
     /** Load animation by resource Id from android package. */
     @Nullable
     public Animation loadDefaultAnimationRes(int resId) {
-        return loadAnimationRes("android", resId);
+        return loadAnimationRes(DEFAULT_PACKAGE, resId);
     }
 
     /** Load animation by attribute Id from specific LayoutParams */
@@ -237,7 +224,7 @@
         int resId = Resources.ID_NULL;
         Context context = mContext;
         if (animAttr >= 0) {
-            AttributeCache.Entry ent = getCachedAnimations("android",
+            AttributeCache.Entry ent = getCachedAnimations(DEFAULT_PACKAGE,
                     mDefaultWindowAnimationStyleResId);
             if (ent != null) {
                 context = ent.context;
@@ -261,10 +248,10 @@
             // If this is a system resource, don't try to load it from the
             // application resources.  It is nice to avoid loading application
             // resources if we can.
-            String packageName = lp.packageName != null ? lp.packageName : "android";
+            String packageName = lp.packageName != null ? lp.packageName : DEFAULT_PACKAGE;
             int resId = getAnimationStyleResId(lp);
             if ((resId & 0xFF000000) == 0x01000000) {
-                packageName = "android";
+                packageName = DEFAULT_PACKAGE;
             }
             if (mDebug) {
                 Slog.v(mTag, "Loading animations: picked package=" + packageName);
@@ -283,7 +270,7 @@
         }
         if (packageName != null) {
             if ((resId & 0xFF000000) == 0x01000000) {
-                packageName = "android";
+                packageName = DEFAULT_PACKAGE;
             }
             if (mDebug) {
                 Slog.v(mTag, "Loading animations: picked package="
diff --git a/core/java/com/android/internal/power/MeasuredEnergyStats.java b/core/java/com/android/internal/power/MeasuredEnergyStats.java
index 3153071..42fb3f4 100644
--- a/core/java/com/android/internal/power/MeasuredEnergyStats.java
+++ b/core/java/com/android/internal/power/MeasuredEnergyStats.java
@@ -140,7 +140,7 @@
      */
     private MeasuredEnergyStats(int numIndices) {
         mAccumulatedChargeMicroCoulomb = new long[numIndices];
-        mCustomBucketNames = new String[0];
+        mCustomBucketNames = new String[numIndices - NUMBER_STANDARD_POWER_BUCKETS];
     }
 
     /** Construct from parcel. */
@@ -290,7 +290,7 @@
      * Create a MeasuredEnergyStats object from a summary parcel.
      *
      * Corresponding write performed by
-     * {@link #writeSummaryToParcel(MeasuredEnergyStats, Parcel, boolean)}.
+     * {@link #writeSummaryToParcel(MeasuredEnergyStats, Parcel, boolean, boolean)}.
      *
      * @return a new MeasuredEnergyStats object as described.
      *         Returns null if the parcel indicates there is no data to populate.
@@ -300,9 +300,14 @@
         // Check if any MeasuredEnergyStats exists on the parcel
         if (arraySize == 0) return null;
 
-        final int numCustomBuckets = arraySize - NUMBER_STANDARD_POWER_BUCKETS;
+        final String[] customBucketNames;
+        if (in.readBoolean()) {
+            customBucketNames = in.readStringArray();
+        } else {
+            customBucketNames = new String[0];
+        }
         final MeasuredEnergyStats stats = new MeasuredEnergyStats(
-                new boolean[NUMBER_STANDARD_POWER_BUCKETS], new String[numCustomBuckets]);
+                new boolean[NUMBER_STANDARD_POWER_BUCKETS], customBucketNames);
         stats.readSummaryFromParcel(in, true);
         return stats;
     }
@@ -315,7 +320,7 @@
      * possible (not necessarily supported) standard and custom buckets.
      *
      * Corresponding write performed by
-     * {@link #writeSummaryToParcel(MeasuredEnergyStats, Parcel, boolean)}.
+     * {@link #writeSummaryToParcel(MeasuredEnergyStats, Parcel, boolean, boolean)}.
      *
      * @return a new MeasuredEnergyStats object as described.
      *         Returns null if the stats contain no non-0 information (such as if template is null
@@ -329,6 +334,12 @@
         // Check if any MeasuredEnergyStats exists on the parcel
         if (arraySize == 0) return null;
 
+        boolean includesCustomBucketNames = in.readBoolean();
+        if (includesCustomBucketNames) {
+            // Consume the array of custom bucket names. They are already included in the
+            // template.
+            in.readStringArray();
+        }
         if (template == null) {
             // Nothing supported anymore. Create placeholder object just to consume the parcel data.
             final MeasuredEnergyStats mes = new MeasuredEnergyStats(arraySize);
@@ -370,12 +381,18 @@
      * and {@link #createAndReadSummaryFromParcel(Parcel, MeasuredEnergyStats)}.
      */
     public static void writeSummaryToParcel(@Nullable MeasuredEnergyStats stats,
-            Parcel dest, boolean skipZero) {
+            Parcel dest, boolean skipZero, boolean skipCustomBucketNames) {
         if (stats == null) {
             dest.writeInt(0);
             return;
         }
         dest.writeInt(stats.getNumberOfIndices());
+        if (!skipCustomBucketNames) {
+            dest.writeBoolean(true);
+            dest.writeStringArray(stats.getCustomBucketNames());
+        } else {
+            dest.writeBoolean(false);
+        }
         stats.writeSummaryToParcel(dest, skipZero);
     }
 
diff --git a/core/java/com/android/internal/view/IInputMethodClient.aidl b/core/java/com/android/internal/view/IInputMethodClient.aidl
index 49dbbaa..a61e86b 100644
--- a/core/java/com/android/internal/view/IInputMethodClient.aidl
+++ b/core/java/com/android/internal/view/IInputMethodClient.aidl
@@ -30,4 +30,5 @@
     void reportFullscreenMode(boolean fullscreen);
     void updateActivityViewToScreenMatrix(int bindSequence, in float[] matrixValues);
     void setImeTraceEnabled(boolean enabled);
+    void throwExceptionFromSystem(String message);
 }
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 93cd4e9..3b8f440 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -52,9 +52,9 @@
     oneway void getLastInputMethodSubtype(in IInputMethodSubtypeResultCallback resultCallback);
 
     oneway void showSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
-            in ResultReceiver resultReceiver, in IBooleanResultCallback resultCallback);
+            in ResultReceiver resultReceiver, int reason, in IBooleanResultCallback resultCallback);
     oneway void hideSoftInput(in IInputMethodClient client, IBinder windowToken, int flags,
-            in ResultReceiver resultReceiver, in IBooleanResultCallback resultCallback);
+            in ResultReceiver resultReceiver, int reason, in IBooleanResultCallback resultCallback);
     // If windowToken is null, this just does startInput().  Otherwise this reports that a window
     // has gained focus, and if 'attribute' is non-null then also does startInput.
     // @NonNull
@@ -68,6 +68,12 @@
             int unverifiedTargetSdkVersion,
             in IInputBindResultResultCallback inputBindResult);
 
+    oneway void reportWindowGainedFocusAsync(
+            boolean nextFocusHasConnection, in IInputMethodClient client, in IBinder windowToken,
+            /* @StartInputFlags */ int startInputFlags,
+            /* @android.view.WindowManager.LayoutParams.SoftInputModeFlags */ int softInputMode,
+            int windowFlags, int unverifiedTargetSdkVersion);
+
     oneway void showInputMethodPickerFromClient(in IInputMethodClient client,
             int auxiliarySubtypeMode, in IVoidResultCallback resultCallback);
     oneway void showInputMethodPickerFromSystem(in IInputMethodClient client,
diff --git a/core/java/com/android/internal/view/IInputMethodSession.aidl b/core/java/com/android/internal/view/IInputMethodSession.aidl
index c6afd78..acb4754 100644
--- a/core/java/com/android/internal/view/IInputMethodSession.aidl
+++ b/core/java/com/android/internal/view/IInputMethodSession.aidl
@@ -43,8 +43,6 @@
 
     void appPrivateCommand(String action, in Bundle data);
 
-    void toggleSoftInput(int showFlags, int hideFlags);
-
     void finishSession();
 
     void updateCursorAnchorInfo(in CursorAnchorInfo cursorAnchorInfo);
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java
index bab4e93b..4e96ae7 100644
--- a/core/java/com/android/internal/widget/ConversationLayout.java
+++ b/core/java/com/android/internal/widget/ConversationLayout.java
@@ -128,6 +128,8 @@
     private CharSequence mFallbackChatName;
     private CharSequence mFallbackGroupChatName;
     private CharSequence mConversationTitle;
+    private int mMessageSpacingStandard;
+    private int mMessageSpacingGroup;
     private int mNotificationHeaderExpandedPadding;
     private View mConversationHeader;
     private View mContentContainer;
@@ -241,6 +243,10 @@
         mContentContainer = findViewById(R.id.notification_action_list_margin_target);
         mExpandButtonAndContentContainer = findViewById(R.id.expand_button_and_content_container);
         mExpandButton = findViewById(R.id.expand_button);
+        mMessageSpacingStandard = getResources().getDimensionPixelSize(
+                R.dimen.notification_messaging_spacing);
+        mMessageSpacingGroup = getResources().getDimensionPixelSize(
+                R.dimen.notification_messaging_spacing_conversation_group);
         mNotificationHeaderExpandedPadding = getResources().getDimensionPixelSize(
                 R.dimen.conversation_header_expanded_padding_end);
         mContentMarginEnd = getResources().getDimensionPixelSize(
@@ -699,6 +705,10 @@
     }
 
     private void updatePaddingsBasedOnContentAvailability() {
+        // groups have avatars that need more spacing
+        mMessagingLinearLayout.setSpacing(
+                mIsOneToOne ? mMessageSpacingStandard : mMessageSpacingGroup);
+
         int messagingPadding = mIsOneToOne || mIsCollapsed
                 ? 0
                 // Add some extra padding to the messages, since otherwise it will overlap with the
@@ -1082,15 +1092,18 @@
 
     private void updateExpandButton() {
         int buttonGravity;
-        int containerHeight;
         ViewGroup newContainer;
         if (mIsCollapsed) {
             buttonGravity = Gravity.CENTER;
-            containerHeight = ViewGroup.LayoutParams.WRAP_CONTENT;
+            // NOTE(b/182474419): In order for the touch target of the expand button to be the full
+            // height of the notification, we would want the mExpandButtonContainer's height to be
+            // set to WRAP_CONTENT (or 88dp) when in the collapsed state.  Unfortunately, that
+            // causes an unstable remeasuring infinite loop when the unread count is visible,
+            // causing the layout to occasionally hide the messages.  As an aside, that naive
+            // solution also causes an undesirably large gap between content and smart replies.
             newContainer = mExpandButtonAndContentContainer;
         } else {
             buttonGravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
-            containerHeight = ViewGroup.LayoutParams.MATCH_PARENT;
             newContainer = this;
         }
         mExpandButton.setExpanded(!mIsCollapsed);
@@ -1099,7 +1112,6 @@
         // content when collapsed, but allows the content to flow under it when expanded.
         if (newContainer != mExpandButtonContainer.getParent()) {
             ((ViewGroup) mExpandButtonContainer.getParent()).removeView(mExpandButtonContainer);
-            mExpandButtonContainer.getLayoutParams().height = containerHeight;
             newContainer.addView(mExpandButtonContainer);
         }
 
diff --git a/core/java/com/android/internal/widget/LockSettingsInternal.java b/core/java/com/android/internal/widget/LockSettingsInternal.java
index 940979d..0a2c18f8 100644
--- a/core/java/com/android/internal/widget/LockSettingsInternal.java
+++ b/core/java/com/android/internal/widget/LockSettingsInternal.java
@@ -110,7 +110,7 @@
      * #setRebootEscrowListener}, then {@link #armRebootEscrow()} should be called before
      * rebooting to apply the update.
      */
-    public abstract void prepareRebootEscrow();
+    public abstract boolean prepareRebootEscrow();
 
     /**
      * Registers a listener for when the RebootEscrow HAL has stored its data needed for rebooting
@@ -124,7 +124,7 @@
     /**
      * Requests that any data needed for rebooting is cleared from the RebootEscrow HAL.
      */
-    public abstract void clearRebootEscrow();
+    public abstract boolean clearRebootEscrow();
 
     /**
      * Should be called immediately before rebooting for an update. This depends on {@link
diff --git a/core/java/com/android/internal/widget/MessagingLinearLayout.java b/core/java/com/android/internal/widget/MessagingLinearLayout.java
index 7cfd46c..cb1d387 100644
--- a/core/java/com/android/internal/widget/MessagingLinearLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLinearLayout.java
@@ -17,6 +17,7 @@
 package com.android.internal.widget;
 
 import android.annotation.Nullable;
+import android.annotation.Px;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
@@ -251,6 +252,16 @@
         return super.drawChild(canvas, child, drawingTime);
     }
 
+    /**
+     * Set the spacing to be applied between views.
+     */
+    public void setSpacing(@Px int spacing) {
+        if (mSpacing != spacing) {
+            mSpacing = spacing;
+            requestLayout();
+        }
+    }
+
     @Override
     public LayoutParams generateLayoutParams(AttributeSet attrs) {
         return new LayoutParams(mContext, attrs);
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index db536d3..a9b47aa 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -24,7 +24,6 @@
 import android.content.ComponentName;
 import android.content.pm.FeatureInfo;
 import android.content.pm.PackageManager;
-import android.hardware.SensorPrivacyManager;
 import android.os.Build;
 import android.os.CarrierAssociatedAppEntry;
 import android.os.Environment;
@@ -1245,14 +1244,6 @@
             addFeature(PackageManager.FEATURE_IPSEC_TUNNELS, 0);
         }
 
-        if (SensorPrivacyManager.USE_MICROPHONE_TOGGLE) {
-            addFeature(PackageManager.FEATURE_MICROPHONE_TOGGLE, 0);
-        }
-
-        if (SensorPrivacyManager.USE_CAMERA_TOGGLE) {
-            addFeature(PackageManager.FEATURE_CAMERA_TOGGLE, 0);
-        }
-
         for (String featureName : mUnavailableFeatures) {
             removeFeature(featureName);
         }
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index 413242f..f2ac87e 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -66,4 +66,8 @@
 per-file Android.bp = file:/graphics/java/android/graphics/OWNERS
 per-file AndroidRuntime.cpp = file:/graphics/java/android/graphics/OWNERS
 # Although marked "view" this is mostly graphics stuff
-per-file android_view_* = file:/graphics/java/android/graphics/OWNERS
\ No newline at end of file
+per-file android_view_* = file:/graphics/java/android/graphics/OWNERS
+
+# VINTF
+per-file android_os_VintfObject* = file:platform/system/libvintf:/OWNERS
+per-file android_os_VintfRuntimeInfo* = file:platform/system/libvintf:/OWNERS
diff --git a/core/jni/android_content_res_ApkAssets.cpp b/core/jni/android_content_res_ApkAssets.cpp
index 04528e9..c32951a 100644
--- a/core/jni/android_content_res_ApkAssets.cpp
+++ b/core/jni/android_content_res_ApkAssets.cpp
@@ -16,6 +16,8 @@
 
 #define ATRACE_TAG ATRACE_TAG_RESOURCES
 
+#include <mutex>
+
 #include "signal.h"
 
 #include "android-base/logging.h"
@@ -26,6 +28,7 @@
 #include "utils/misc.h"
 #include "utils/Trace.h"
 
+#include "android_content_res_ApkAssets.h"
 #include "android_util_AssetManager_private.h"
 #include "core_jni_helpers.h"
 #include "jni.h"
@@ -72,6 +75,19 @@
   FORMAT_DIRECTORY = 3,
 };
 
+Guarded<std::unique_ptr<const ApkAssets>>& ApkAssetsFromLong(jlong ptr) {
+    return *reinterpret_cast<Guarded<std::unique_ptr<const ApkAssets>>*>(ptr);
+}
+
+static jlong CreateGuardedApkAssets(std::unique_ptr<const ApkAssets> assets) {
+    auto guarded_assets = new Guarded<std::unique_ptr<const ApkAssets>>(std::move(assets));
+    return reinterpret_cast<jlong>(guarded_assets);
+}
+
+static void DeleteGuardedApkAssets(Guarded<std::unique_ptr<const ApkAssets>>& apk_assets) {
+    delete &apk_assets;
+}
+
 class LoaderAssetsProvider : public AssetsProvider {
  public:
   static std::unique_ptr<AssetsProvider> Create(JNIEnv* env, jobject assets_provider) {
@@ -227,7 +243,7 @@
     jniThrowException(env, "java/io/IOException", error_msg.c_str());
     return 0;
   }
-  return reinterpret_cast<jlong>(apk_assets.release());
+  return CreateGuardedApkAssets(std::move(apk_assets));
 }
 
 static jlong NativeLoadFromFd(JNIEnv* env, jclass /*clazz*/, const format_type_t format,
@@ -279,7 +295,7 @@
     jniThrowException(env, "java/io/IOException", error_msg.c_str());
     return 0;
   }
-  return reinterpret_cast<jlong>(apk_assets.release());
+  return CreateGuardedApkAssets(std::move(apk_assets));
 }
 
 static jlong NativeLoadFromFdOffset(JNIEnv* env, jclass /*clazz*/, const format_type_t format,
@@ -347,12 +363,12 @@
     jniThrowException(env, "java/io/IOException", error_msg.c_str());
     return 0;
   }
-  return reinterpret_cast<jlong>(apk_assets.release());
+  return CreateGuardedApkAssets(std::move(apk_assets));
 }
 
 static jlong NativeLoadEmpty(JNIEnv* env, jclass /*clazz*/, jint flags, jobject assets_provider) {
   auto apk_assets = ApkAssets::Load(LoaderAssetsProvider::Create(env, assets_provider), flags);
-  return reinterpret_cast<jlong>(apk_assets.release());
+  return CreateGuardedApkAssets(std::move(apk_assets));
 }
 
 // STOPSHIP (b/159041693): Revert signal handler when reason for issue is found.
@@ -383,54 +399,60 @@
 }
 
 static void NativeDestroy(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
-  auto apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
-  destroy_info << "{ptr=" << apk_assets;
-  if (apk_assets != nullptr) {
-    destroy_info << ", name='" << apk_assets->GetDebugName() << "'"
-                 << ", idmap=" << apk_assets->GetLoadedIdmap()
-                 << ", {arsc=" << apk_assets->GetLoadedArsc();
-    if (auto arsc = apk_assets->GetLoadedArsc()) {
-      destroy_info << ", strings=" << arsc->GetStringPool()
-                   << ", packages=" << &arsc->GetPackages()
-                   << " [";
-      for (auto& package : arsc->GetPackages()) {
-        destroy_info << "{unique_ptr=" << &package
-                     << ", package=" << package.get() << "},";
-      }
-      destroy_info << "]";
+    {
+        auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+        auto apk_assets = scoped_apk_assets->get();
+        destroy_info << "{ptr=" << apk_assets;
+        if (apk_assets != nullptr) {
+            destroy_info << ", name='" << apk_assets->GetDebugName() << "'"
+                         << ", idmap=" << apk_assets->GetLoadedIdmap()
+                         << ", {arsc=" << apk_assets->GetLoadedArsc();
+            if (auto arsc = apk_assets->GetLoadedArsc()) {
+                destroy_info << ", strings=" << arsc->GetStringPool()
+                             << ", packages=" << &arsc->GetPackages() << " [";
+                for (auto& package : arsc->GetPackages()) {
+                    destroy_info << "{unique_ptr=" << &package << ", package=" << package.get()
+                                 << "},";
+                }
+                destroy_info << "]";
+            }
+            destroy_info << "}";
+        }
+        destroy_info << "}";
     }
-    destroy_info << "}";
-  }
-  destroy_info << "}";
 
-  delete apk_assets;
+    DeleteGuardedApkAssets(ApkAssetsFromLong(ptr));
 
-  // Deleting the apk assets did not lead to a crash.
-  destroy_info.str("");
-  destroy_info.clear();
+    // Deleting the apk assets did not lead to a crash.
+    destroy_info.str("");
+    destroy_info.clear();
 }
 
 static jstring NativeGetAssetPath(JNIEnv* env, jclass /*clazz*/, jlong ptr) {
-  auto apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
-  if (auto path = apk_assets->GetPath()) {
-    return env->NewStringUTF(path->data());
+    auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+    auto apk_assets = scoped_apk_assets->get();
+    if (auto path = apk_assets->GetPath()) {
+        return env->NewStringUTF(path->data());
   }
   return nullptr;
 }
 
 static jstring NativeGetDebugName(JNIEnv* env, jclass /*clazz*/, jlong ptr) {
-  auto apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
-  return env->NewStringUTF(apk_assets->GetDebugName().c_str());
+    auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+    auto apk_assets = scoped_apk_assets->get();
+    return env->NewStringUTF(apk_assets->GetDebugName().c_str());
 }
 
 static jlong NativeGetStringBlock(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
-  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
-  return reinterpret_cast<jlong>(apk_assets->GetLoadedArsc()->GetStringPool());
+    auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+    auto apk_assets = scoped_apk_assets->get();
+    return reinterpret_cast<jlong>(apk_assets->GetLoadedArsc()->GetStringPool());
 }
 
 static jboolean NativeIsUpToDate(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
-  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
-  return apk_assets->IsUpToDate() ? JNI_TRUE : JNI_FALSE;
+    auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+    auto apk_assets = scoped_apk_assets->get();
+    return apk_assets->IsUpToDate() ? JNI_TRUE : JNI_FALSE;
 }
 
 static jlong NativeOpenXml(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring file_name) {
@@ -439,7 +461,8 @@
     return 0;
   }
 
-  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
+  auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+  auto apk_assets = scoped_apk_assets->get();
   std::unique_ptr<Asset> asset = apk_assets->GetAssetsProvider()->Open(
       path_utf8.c_str(),Asset::AccessMode::ACCESS_RANDOM);
   if (asset == nullptr) {
@@ -467,12 +490,13 @@
 
 static jobject NativeGetOverlayableInfo(JNIEnv* env, jclass /*clazz*/, jlong ptr,
                                          jstring overlayable_name) {
-  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
+    auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+    auto apk_assets = scoped_apk_assets->get();
 
-  const auto& packages = apk_assets->GetLoadedArsc()->GetPackages();
-  if (packages.empty()) {
-    jniThrowException(env, "java/io/IOException", "Error reading overlayable from APK");
-    return 0;
+    const auto& packages = apk_assets->GetLoadedArsc()->GetPackages();
+    if (packages.empty()) {
+        jniThrowException(env, "java/io/IOException", "Error reading overlayable from APK");
+        return 0;
   }
 
   // TODO(b/119899133): Convert this to a search for the info rather than assuming it's at index 0
@@ -502,13 +526,14 @@
 }
 
 static jboolean NativeDefinesOverlayable(JNIEnv* env, jclass /*clazz*/, jlong ptr) {
-  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
+    auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
+    auto apk_assets = scoped_apk_assets->get();
 
-  const auto& packages = apk_assets->GetLoadedArsc()->GetPackages();
-  if (packages.empty()) {
-    // Must throw to prevent bypass by returning false
-    jniThrowException(env, "java/io/IOException", "Error reading overlayable from APK");
-    return 0;
+    const auto& packages = apk_assets->GetLoadedArsc()->GetPackages();
+    if (packages.empty()) {
+        // Must throw to prevent bypass by returning false
+        jniThrowException(env, "java/io/IOException", "Error reading overlayable from APK");
+        return 0;
   }
 
   const auto& overlayable_infos = packages[0]->GetOverlayableMap();
diff --git a/core/jni/android_content_res_ApkAssets.h b/core/jni/android_content_res_ApkAssets.h
new file mode 100644
index 0000000..7e525dc
--- /dev/null
+++ b/core/jni/android_content_res_ApkAssets.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_CONTENT_RES_APKASSETS_H
+#define ANDROID_CONTENT_RES_APKASSETS_H
+
+#include "androidfw/ApkAssets.h"
+#include "androidfw/MutexGuard.h"
+
+#include "jni.h"
+
+namespace android {
+
+Guarded<std::unique_ptr<const ApkAssets>>& ApkAssetsFromLong(jlong ptr);
+
+} // namespace android
+
+#endif // ANDROID_CONTENT_RES_APKASSETS_H
diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h
index 7fde92c..0e6b587 100644
--- a/core/jni/android_media_AudioFormat.h
+++ b/core/jni/android_media_AudioFormat.h
@@ -46,6 +46,7 @@
 #define ENCODING_MPEGH_LC_L3 25
 #define ENCODING_MPEGH_LC_L4 26
 #define ENCODING_DTS_UHD 27
+#define ENCODING_DRA 28
 
 #define ENCODING_INVALID    0
 #define ENCODING_DEFAULT    1
@@ -113,6 +114,8 @@
         return AUDIO_FORMAT_MPEGH_LC_L4;
     case ENCODING_DTS_UHD:
         return AUDIO_FORMAT_DTS_UHD;
+    case ENCODING_DRA:
+        return AUDIO_FORMAT_DRA;
     default:
         return AUDIO_FORMAT_INVALID;
     }
@@ -184,6 +187,8 @@
         return ENCODING_MPEGH_LC_L4;
     case AUDIO_FORMAT_DTS_UHD:
         return ENCODING_DTS_UHD;
+    case AUDIO_FORMAT_DRA:
+        return ENCODING_DRA;
     case AUDIO_FORMAT_DEFAULT:
         return ENCODING_DEFAULT;
     default:
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 7d3febb..83dc1e0 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -189,7 +189,8 @@
                                             jobject jaa, jintArray jSampleRate, jint channelMask,
                                             jint channelIndexMask, jint audioFormat,
                                             jint buffSizeInBytes, jintArray jSession,
-                                            jobject jIdentity, jlong nativeRecordInJavaObj) {
+                                            jobject jIdentity, jlong nativeRecordInJavaObj,
+                                            jint sharedAudioHistoryMs) {
     //ALOGV(">> Entering android_media_AudioRecord_setup");
     //ALOGV("sampleRate=%d, audioFormat=%d, channel mask=%x, buffSizeInBytes=%d "
     //     "nativeRecordInJavaObj=0x%llX",
@@ -288,20 +289,18 @@
         lpCallbackData->audioRecord_ref = env->NewGlobalRef(weak_this);
         lpCallbackData->busy = false;
 
-        const status_t status = lpRecorder->set(paa->source,
-            sampleRateInHertz,
-            format,        // word length, PCM
-            localChanMask,
-            frameCount,
-            recorderCallback,// callback_t
-            lpCallbackData,// void* user
-            0,             // notificationFrames,
-            true,          // threadCanCallJava
-            sessionId,
-            AudioRecord::TRANSFER_DEFAULT,
-            flags,
-            -1, -1,        // default uid, pid
-            paa.get());
+        const status_t status =
+                lpRecorder->set(paa->source, sampleRateInHertz,
+                                format, // word length, PCM
+                                localChanMask, frameCount,
+                                recorderCallback, // callback_t
+                                lpCallbackData,   // void* user
+                                0,                // notificationFrames,
+                                true,             // threadCanCallJava
+                                sessionId, AudioRecord::TRANSFER_DEFAULT, flags, -1,
+                                -1, // default uid, pid
+                                paa.get(), AUDIO_PORT_HANDLE_NONE, MIC_DIRECTION_UNSPECIFIED,
+                                MIC_FIELD_DIMENSION_DEFAULT, sharedAudioHistoryMs);
 
         if (status != NO_ERROR) {
             ALOGE("Error creating AudioRecord instance: initialization check failed with status %d.",
@@ -877,6 +876,23 @@
     record->setLogSessionId(logSessionId.c_str());
 }
 
+static jint android_media_AudioRecord_shareAudioHistory(JNIEnv *env, jobject thiz,
+                                                        jstring jSharedPackageName,
+                                                        jlong jSharedStartMs) {
+    sp<AudioRecord> record = getAudioRecord(env, thiz);
+    if (record == nullptr) {
+        jniThrowException(env, "java/lang/IllegalStateException",
+                          "Unable to retrieve AudioRecord pointer for setLogSessionId()");
+    }
+    if (jSharedPackageName == nullptr) {
+        jniThrowException(env, "java/lang/IllegalArgumentException", "package name cannot be null");
+    }
+    ScopedUtfChars nSharedPackageName(env, jSharedPackageName);
+    ALOGV("%s: nSharedPackageName '%s'", __func__, nSharedPackageName.c_str());
+    return nativeToJavaStatus(record->shareAudioHistory(nSharedPackageName.c_str(),
+                                                        static_cast<int64_t>(jSharedStartMs)));
+}
+
 // ----------------------------------------------------------------------------
 static jint android_media_AudioRecord_get_port_id(JNIEnv *env,  jobject thiz) {
     sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz);
@@ -896,7 +912,7 @@
         {"native_start", "(II)I", (void *)android_media_AudioRecord_start},
         {"native_stop", "()V", (void *)android_media_AudioRecord_stop},
         {"native_setup",
-         "(Ljava/lang/Object;Ljava/lang/Object;[IIIII[ILandroid/media/permission/Identity;J)I",
+         "(Ljava/lang/Object;Ljava/lang/Object;[IIIII[ILandroid/media/permission/Identity;JI)I",
          (void *)android_media_AudioRecord_setup},
         {"native_finalize", "()V", (void *)android_media_AudioRecord_finalize},
         {"native_release", "()V", (void *)android_media_AudioRecord_release},
@@ -936,6 +952,8 @@
          (void *)android_media_AudioRecord_set_preferred_microphone_field_dimension},
         {"native_setLogSessionId", "(Ljava/lang/String;)V",
          (void *)android_media_AudioRecord_setLogSessionId},
+        {"native_shareAudioHistory", "(Ljava/lang/String;J)I",
+         (void *)android_media_AudioRecord_shareAudioHistory},
 };
 
 // field names found in android/media/AudioRecord.java
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 7c4c970..5eb1e00 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -1930,7 +1930,11 @@
     audio_port_handle_t handle;
     status_t status = AudioSystem::startAudioSource(&nAudioPortConfig, paa.get(), &handle);
     ALOGV("AudioSystem::startAudioSource() returned %d handle %d", status, handle);
-    return handle > 0 ? handle : nativeToJavaStatus(status);
+    if (status != NO_ERROR) {
+        return nativeToJavaStatus(status);
+    }
+    ALOG_ASSERT(handle > 0, "%s: invalid handle reported on successful call", __func__);
+    return handle;
 }
 
 static jint
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index 25ffbab..4bd33a9 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -40,12 +40,10 @@
 using vintf::HalManifest;
 using vintf::Level;
 using vintf::SchemaType;
-using vintf::VintfObject;
-using vintf::XmlConverter;
-using vintf::Vndk;
-using vintf::gHalManifestConverter;
-using vintf::gCompatibilityMatrixConverter;
 using vintf::to_string;
+using vintf::toXml;
+using vintf::VintfObject;
+using vintf::Vndk;
 
 template<typename V>
 static inline jobjectArray toJavaStringArray(JNIEnv* env, const V& v) {
@@ -58,14 +56,13 @@
     return ret;
 }
 
-template<typename T>
-static void tryAddSchema(const std::shared_ptr<const T>& object, const XmlConverter<T>& converter,
-        const std::string& description,
-        std::vector<std::string>* cStrings) {
+template <typename T>
+static void tryAddSchema(const std::shared_ptr<const T>& object, const std::string& description,
+                         std::vector<std::string>* cStrings) {
     if (object == nullptr) {
         LOG(WARNING) << __FUNCTION__ << "Cannot get " << description;
     } else {
-        cStrings->push_back(converter(*object));
+        cStrings->push_back(toXml(*object));
     }
 }
 
@@ -84,14 +81,12 @@
 {
     std::vector<std::string> cStrings;
 
-    tryAddSchema(VintfObject::GetDeviceHalManifest(), gHalManifestConverter,
-            "device manifest", &cStrings);
-    tryAddSchema(VintfObject::GetFrameworkHalManifest(), gHalManifestConverter,
-            "framework manifest", &cStrings);
-    tryAddSchema(VintfObject::GetDeviceCompatibilityMatrix(), gCompatibilityMatrixConverter,
-            "device compatibility matrix", &cStrings);
-    tryAddSchema(VintfObject::GetFrameworkCompatibilityMatrix(), gCompatibilityMatrixConverter,
-            "framework compatibility matrix", &cStrings);
+    tryAddSchema(VintfObject::GetDeviceHalManifest(), "device manifest", &cStrings);
+    tryAddSchema(VintfObject::GetFrameworkHalManifest(), "framework manifest", &cStrings);
+    tryAddSchema(VintfObject::GetDeviceCompatibilityMatrix(), "device compatibility matrix",
+                 &cStrings);
+    tryAddSchema(VintfObject::GetFrameworkCompatibilityMatrix(), "framework compatibility matrix",
+                 &cStrings);
 
     return toJavaStringArray(env, cStrings);
 }
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index b2c69a0..24f9abf 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -42,6 +42,7 @@
 #include "androidfw/ResourceTypes.h"
 #include "androidfw/ResourceUtils.h"
 
+#include "android_content_res_ApkAssets.h"
 #include "android_util_AssetManager_private.h"
 #include "core_jni_helpers.h"
 #include "jni.h"
@@ -50,9 +51,9 @@
 #include "nativehelper/ScopedStringChars.h"
 #include "nativehelper/ScopedUtfChars.h"
 #include "utils/Log.h"
-#include "utils/misc.h"
 #include "utils/String8.h"
 #include "utils/Trace.h"
+#include "utils/misc.h"
 
 extern "C" int capget(cap_user_header_t hdrp, cap_user_data_t datap);
 extern "C" int capset(cap_user_header_t hdrp, const cap_user_data_t datap);
@@ -307,7 +308,9 @@
     if (env->ExceptionCheck()) {
       return;
     }
-    apk_assets.push_back(reinterpret_cast<const ApkAssets*>(apk_assets_native_ptr));
+
+    auto scoped_assets = ScopedLock(ApkAssetsFromLong(apk_assets_native_ptr));
+    apk_assets.push_back(scoped_assets->get());
   }
 
   ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
diff --git a/core/jni/include/android_runtime/AndroidRuntime.h b/core/jni/include/android_runtime/AndroidRuntime.h
index d86d934..bf2ba77 100644
--- a/core/jni/include/android_runtime/AndroidRuntime.h
+++ b/core/jni/include/android_runtime/AndroidRuntime.h
@@ -19,7 +19,6 @@
 #ifndef _RUNTIME_ANDROID_RUNTIME_H
 #define _RUNTIME_ANDROID_RUNTIME_H
 
-#include <binder/IBinder.h>
 #include <jni.h>
 #include <pthread.h>
 #include <utils/Errors.h>
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 7d68a0d..4c84944 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -642,7 +642,7 @@
         message ReasonCount {
             option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-            optional android.app.job.StopReasonEnum name = 1;
+            optional android.app.job.InternalStopReasonEnum name = 1;
             optional int32 count = 2;
         }
         repeated ReasonCount reason_count = 2;
diff --git a/core/proto/android/providers/OWNERS b/core/proto/android/providers/OWNERS
new file mode 100644
index 0000000..1f5cd9a
--- /dev/null
+++ b/core/proto/android/providers/OWNERS
@@ -0,0 +1 @@
+include /packages/SettingsProvider/OWNERS
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index ad1d252..c3d1596 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -89,14 +89,6 @@
     optional SettingProto assisted_gps_enabled = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
     optional SettingProto audio_safe_volume_state = 15 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
-    message Auto {
-        option (android.msg_privacy).dest = DEST_EXPLICIT;
-
-        optional SettingProto time = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
-        optional SettingProto time_zone = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
-    }
-    optional Auto auto = 16;
-
     reserved 17; // Used to be autofill_compat_mode_allowed_packages
 
     message Autofill {
@@ -253,6 +245,14 @@
     }
     optional Database database = 36;
 
+    message DateTime {
+        option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+        optional SettingProto auto_time = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+        optional SettingProto auto_time_zone = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    }
+    optional DateTime date_time = 16;
+
     message Debug {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
 
@@ -285,6 +285,7 @@
         // Deprecated, use enable_non_resizable_multi_window
         optional SettingProto enable_sizecompat_freeform = 7 [ (android.privacy).dest = DEST_AUTOMATIC, deprecated = true ];
         optional SettingProto enable_non_resizable_multi_window = 8 [ (android.privacy).dest = DEST_AUTOMATIC ];
+        optional SettingProto disable_window_blurs = 9 [ (android.privacy).dest = DEST_AUTOMATIC ];
     }
     optional Development development = 39;
 
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 530cb44..1bba12f 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -217,6 +217,13 @@
     optional SettingProto display_density_forced = 19 [ (android.privacy).dest = DEST_AUTOMATIC ];
     optional SettingProto double_tap_to_wake = 20 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
+    message DateTime {
+        option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+        optional SettingProto location_time_zone_detection_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    }
+    optional DateTime date_time = 90;
+
     message Doze {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
 
@@ -423,6 +430,7 @@
         optional SettingProto one_handed_mode_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
         optional SettingProto one_handed_mode_timeout = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
         optional SettingProto taps_app_to_exit = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
+        optional SettingProto one_handed_mode_activated = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
     }
     optional OneHanded onehanded = 80;
 
@@ -656,5 +664,5 @@
 
     // Please insert fields in alphabetical order and group them into messages
     // if possible (to avoid reaching the method limit).
-    // Next tag = 90;
+    // Next tag = 91;
 }
diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto
index b723b53..f8b5b233 100644
--- a/core/proto/android/providers/settings/system.proto
+++ b/core/proto/android/providers/settings/system.proto
@@ -52,7 +52,8 @@
     }
     optional Bluetooth bluetooth = 4;
 
-    optional SettingProto date_format = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    reserved 5; // date_format is not used
+
     optional SettingProto display_color_mode = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
     message DevOptions {
diff --git a/core/proto/android/server/biometrics.proto b/core/proto/android/server/biometrics.proto
index 4f3ae28..c918dbb 100644
--- a/core/proto/android/server/biometrics.proto
+++ b/core/proto/android/server/biometrics.proto
@@ -120,18 +120,23 @@
 
     optional Modality modality = 2;
 
+    // The current strength (see {@link BiometricManager.Authenticators}) of this sensor, taking any
+    // downgraded strengths into effect. It may be different from the sensor's original strength but
+    // can never be stronger than that.
+    optional int32 current_strength = 3;
+
     // State of the sensor's scheduler.
-    optional BiometricSchedulerProto scheduler = 3;
+    optional BiometricSchedulerProto scheduler = 4;
 
     // User states for this sensor.
-    repeated UserStateProto user_states = 4;
+    repeated UserStateProto user_states = 5;
 
     // True if resetLockout requires a HAT to be verified in the TEE or equivalent.
-    optional bool reset_lockout_requires_hardware_auth_token = 5;
+    optional bool reset_lockout_requires_hardware_auth_token = 6;
 
     // True if a HAT is required (field above) AND a challenge needs to be generated by the
     // biometric TEE (or equivalent), and wrapped within the HAT.
-    optional bool reset_lockout_requires_challenge = 6;
+    optional bool reset_lockout_requires_challenge = 7;
 }
 
 // State of a specific user for a specific sensor.
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 36d48e2..c4ff49c 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -51,7 +51,7 @@
     message JobRestriction {
         option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-        optional .android.app.job.StopReasonEnum reason = 1;
+        optional .android.app.job.InternalStopReasonEnum reason = 1;
         optional bool is_restricting = 2;
     }
 
@@ -856,7 +856,7 @@
         message StopReasonCount {
             option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-            optional .android.app.job.StopReasonEnum reason = 1;
+            optional .android.app.job.InternalStopReasonEnum reason = 1;
             optional int32 count = 2;
         }
         repeated StopReasonCount stop_reasons = 9;
@@ -907,7 +907,7 @@
         optional int32 job_id = 4;
         optional string tag = 5;
         // Only valid for STOP_JOB or STOP_PERIODIC_JOB Events.
-        optional .android.app.job.StopReasonEnum stop_reason = 6;
+        optional .android.app.job.InternalStopReasonEnum stop_reason = 6;
     }
     repeated HistoryEvent history_event = 1;
 }
diff --git a/core/proto/android/service/package.proto b/core/proto/android/service/package.proto
index 5567109..48feb4d 100644
--- a/core/proto/android/service/package.proto
+++ b/core/proto/android/service/package.proto
@@ -125,7 +125,7 @@
     }
 
     message StatesProto {
-        optional bool is_startable = 1;
+        reserved 1;
         optional bool is_loading = 2;
     }
 
@@ -160,7 +160,7 @@
     repeated UserInfoProto users = 9;
     // Where the request to install this package came from,
     optional InstallSourceProto install_source = 10;
-    // Whether the package is startable or is still loading
+    // Whether the package is still loading
     optional StatesProto states = 11;
     // Granted runtime permissions for users.
     repeated UserPermissionsProto user_permissions = 12;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 9d65e71..4dc4bef 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -40,10 +40,9 @@
     <protected-broadcast android:name="android.intent.action.PACKAGE_REPLACED" />
     <protected-broadcast android:name="android.intent.action.MY_PACKAGE_REPLACED" />
     <protected-broadcast android:name="android.intent.action.PACKAGE_REMOVED" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_REMOVED_INTERNAL" />
     <protected-broadcast android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
     <protected-broadcast android:name="android.intent.action.PACKAGE_CHANGED" />
-    <protected-broadcast android:name="android.intent.action.PACKAGE_STARTABLE" />
-    <protected-broadcast android:name="android.intent.action.PACKAGE_UNSTARTABLE" />
     <protected-broadcast android:name="android.intent.action.PACKAGE_FULLY_LOADED" />
     <protected-broadcast android:name="android.intent.action.PACKAGE_ENABLE_ROLLBACK" />
     <protected-broadcast android:name="android.intent.action.CANCEL_ENABLE_ROLLBACK" />
@@ -2334,6 +2333,11 @@
     <permission android:name="android.permission.CAMERA_SEND_SYSTEM_EVENTS"
         android:protectionLevel="signature|privileged" />
 
+    <!-- Allows injecting the external camera to replace the internal camera.
+        @hide -->
+    <permission android:name="android.permission.CAMERA_INJECT_EXTERNAL_CAMERA"
+        android:protectionLevel="signature" />
+
     <!-- =========================================== -->
     <!-- Permissions associated with telephony state -->
     <!-- =========================================== -->
@@ -2710,10 +2714,9 @@
     <permission android:name="android.permission.CREATE_USERS"
         android:protectionLevel="signature" />
 
-    <!-- @SystemApi @hide Allows an application to access data blobs across users.
-         This permission is not available to third party applications. -->
+    <!-- Allows an application to access data blobs across users. -->
     <permission android:name="android.permission.ACCESS_BLOBS_ACROSS_USERS"
-        android:protectionLevel="signature|privileged|development" />
+        android:protectionLevel="signature|privileged|development|role" />
 
     <!-- @hide Allows an application to set the profile owners and the device owner.
          This permission is not available to third party applications.-->
@@ -2844,11 +2847,11 @@
          The app can check whether it has this authorization by calling
          {@link android.provider.Settings#canDrawOverlays
          Settings.canDrawOverlays()}.
-         <p>Protection level: signature|setup|appop|installer|appPredictor|pre23|development -->
+         <p>Protection level: signature|setup|appop|installer|pre23|development -->
     <permission android:name="android.permission.SYSTEM_ALERT_WINDOW"
         android:label="@string/permlab_systemAlertWindow"
         android:description="@string/permdesc_systemAlertWindow"
-        android:protectionLevel="signature|setup|appop|installer|appPredictor|pre23|development" />
+        android:protectionLevel="signature|setup|appop|installer|pre23|development" />
 
     <!-- @SystemApi @hide Allows an application to create windows using the type
          {@link android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY},
@@ -4106,7 +4109,14 @@
          @hide
     -->
     <permission android:name="com.android.permission.USE_INSTALLER_V2"
-        android:protectionLevel="signature|installer" />
+        android:protectionLevel="signature|privileged" />
+
+    <!-- @TestApi Allows a testOnly application to get installed.
+        <p>Not for use by third-party applications.
+        @hide
+    -->
+    <permission android:name="android.permission.INSTALL_TEST_ONLY_PACKAGE"
+                android:protectionLevel="signature" />
 
     <!-- Allows an application to use System Data Loaders.
          <p>Not for use by third-party applications.
@@ -4214,6 +4224,11 @@
     <permission android:name="android.permission.GET_RUNTIME_PERMISSIONS"
                 android:protectionLevel="signature" />
 
+    <!-- @SystemApi Allows the system to read the mapping between permission and permission group.
+        @hide -->
+    <permission android:name="android.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING"
+                android:protectionLevel="signature|privileged" />
+
     <!-- @SystemApi Allows the system to restore runtime permission state. This might grant
     permissions, hence this is a more scoped, less powerful variant of GRANT_RUNTIME_PERMISSIONS.
     Among other restrictions this cannot override user choices.
@@ -5413,7 +5428,7 @@
     <!-- @SystemApi Allows an application to manage the app predictions service.
          @hide  <p>Not for use by third-party applications.</p> -->
     <permission android:name="android.permission.MANAGE_APP_PREDICTIONS"
-        android:protectionLevel="signature|appPredictor|role" />
+        android:protectionLevel="signature|role" />
 
     <!-- @SystemApi Allows an application to manage the search ui service.
      @hide  <p>Not for use by third-party applications.</p> -->
@@ -5448,12 +5463,12 @@
     <!-- @SystemApi Allows to access all app shortcuts.
          @hide -->
     <permission android:name="android.permission.ACCESS_SHORTCUTS"
-        android:protectionLevel="signature|appPredictor|role" />
+        android:protectionLevel="signature|role" />
 
     <!-- @SystemApi Allows unlimited calls to shortcut mutation APIs.
          @hide -->
     <permission android:name="android.permission.UNLIMITED_SHORTCUTS_API_CALLS"
-        android:protectionLevel="signature|appPredictor|role" />
+        android:protectionLevel="signature|role" />
 
     <!-- @SystemApi Allows an application to read the runtime profiles of other apps.
          @hide <p>Not for use by third-party applications. -->
@@ -5578,12 +5593,12 @@
     <!-- @SystemApi Allows sensor privacy to be modified.
          @hide -->
     <permission android:name="android.permission.MANAGE_SENSOR_PRIVACY"
-                android:protectionLevel="signature" />
+                android:protectionLevel="internal|role" />
 
     <!-- @SystemApi Allows sensor privacy changes to be observed.
          @hide -->
     <permission android:name="android.permission.OBSERVE_SENSOR_PRIVACY"
-                android:protectionLevel="signature|installer" />
+                android:protectionLevel="internal|role|installer" />
 
     <!-- @SystemApi Permission that protects the {@link Intent#ACTION_REVIEW_ACCESSIBILITY_SERVICES}
          intent.
@@ -5627,7 +5642,7 @@
                 android:protectionLevel="signature|recents" />
     <!--  Allows the caller to change the associations between input devices and displays.
         Very dangerous! @hide -->
-    <permission android:name="android.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT"
+    <permission android:name="android.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY"
                 android:protectionLevel="signature" />
 
     <!-- Allows query of any normal app on the device, regardless of manifest declarations.
@@ -5661,7 +5676,7 @@
 
     <!-- @hide @SystemApi Allows an application to access locusId events in the usage stats. -->
     <permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS"
-                android:protectionLevel="signature|appPredictor" />
+                android:protectionLevel="signature|role" />
 
     <!-- @hide @SystemApi Allows an application to manage app hibernation state. -->
     <permission android:name="android.permission.MANAGE_APP_HIBERNATION"
@@ -5715,7 +5730,7 @@
          Conversation.
          TODO(b/180412052): STOPSHIP: Define a role so it can be granted to Shell and AiAi. -->
     <permission android:name="android.permission.READ_PEOPLE_DATA"
-                android:protectionLevel="signature|appPredictor|recents"/>
+                android:protectionLevel="signature|recents|role"/>
 
     <!-- @hide @SystemApi Allows a logical component within an application to
          temporarily renounce a set of otherwise granted permissions. -->
@@ -5734,8 +5749,14 @@
     <permission android:name="android.permission.SET_CLIP_SOURCE"
                 android:protectionLevel="signature|recents" />
 
+    <!-- @SystemApi Allows an application to access TV tuned info
+         <p>Not for use by third-party applications.
+         @hide -->
+    <permission android:name="android.permission.ACCESS_TUNED_INFO"
+        android:protectionLevel="signature|privileged|vendorPrivileged" />
+
     <!-- Allows an application to indicate via
-         {@link android.content.pm.PackageInstaller.SessionParams#setRequireUserAction(boolean)}
+         {@link android.content.pm.PackageInstaller.SessionParams#setRequireUserAction(int)}
          that user action should not be required for an app update.
          <p>Protection level: normal
     -->
diff --git a/core/res/res/drawable/ic_accessibility_color_correction.xml b/core/res/res/drawable/ic_accessibility_color_correction.xml
index ed09d57..f1dbfb2 100644
--- a/core/res/res/drawable/ic_accessibility_color_correction.xml
+++ b/core/res/res/drawable/ic_accessibility_color_correction.xml
@@ -1,5 +1,5 @@
 <!--
-    Copyright (C) 2020 The Android Open Source Project
+    Copyright (C) 2021 The Android Open Source Project
 
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
@@ -13,40 +13,12 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector android:height="24dp" android:viewportHeight="192"
-    android:viewportWidth="192" android:width="24dp"
-    xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#00BCD4" android:pathData="M37.14,173.74L8.61,83.77c-1.72,-5.75 0.26,-11.97 4.97,-15.63L87.15,11c5.2,-4.04 12.46,-3.99 17.61,0.12l73.81,58.94c4.63,3.7 6.53,9.88 4.8,15.57l-28.48,88.18c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84C44.53,184 38.97,179.83 37.14,173.74z"/>
-    <path android:fillAlpha="0.2" android:fillColor="#FFFFFF"
-        android:pathData="M13.58,69.14L87.15,12c5.2,-4.04 12.46,-3.99 17.61,0.12l73.81,58.94c3.36,2.68 5.27,6.67 5.41,10.82c0.15,-4.51 -1.79,-8.93 -5.41,-11.82l-73.81,-58.94C99.61,7.01 92.35,6.96 87.15,11L13.58,68.14c-3.71,2.88 -5.72,7.36 -5.56,11.94C8.17,75.85 10.14,71.81 13.58,69.14z" android:strokeAlpha="0.2"/>
-    <path android:fillAlpha="0.2" android:fillColor="#263238"
-        android:pathData="M183.35,84.63l-28.48,88.18c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84c-6.31,0 -11.87,-4.17 -13.7,-10.26L8.61,82.77c-0.36,-1.22 -0.55,-2.46 -0.59,-3.69c-0.06,1.56 0.13,3.14 0.59,4.69l28.53,89.97c1.83,6.09 7.39,10.26 13.7,10.26h90.37c6.28,0 11.82,-4.13 13.67,-10.19l28.48,-88.18c0.48,-1.57 0.67,-3.17 0.61,-4.75C183.92,82.13 183.73,83.39 183.35,84.63z" android:strokeAlpha="0.2"/>
-    <path android:pathData="M60.01,135L60.01,135H60l48.04,49h33.17c6.28,0 11.82,-4.13 13.67,-10.19l18.68,-57.84L129.51,72.2l-0.01,0c0.27,0.27 0.52,0.5 0.77,0.77l0.55,0.55c1.57,1.56 1.57,4.08 -0.04,5.68l-12.56,12.49l6.36,6.3l1.38,1.37l-5.67,5.64l-5.71,-5.68L79.15,135H60.42H60.01z">
-        <aapt:attr name="android:fillColor">
-            <gradient android:endX="155.9627" android:endY="165.1493"
-                android:startX="98.4649" android:startY="107.6516" android:type="linear">
-                <item android:color="#19263238" android:offset="0"/>
-                <item android:color="#00212121" android:offset="1"/>
-            </gradient>
-        </aapt:attr>
-    </path>
-    <path android:fillColor="#0097A7" android:pathData="M68.55,120.35l32.173,-32.173l7.658,7.658l-32.173,32.173z"/>
-    <path android:fillColor="#FFFFFF" android:pathData="M130.83,73.52l-9.42,-9.36c-1.57,-1.56 -4.1,-1.56 -5.67,0l-12.56,12.48L95.42,69l-5.67,5.64l5.71,5.68L60,116.97V135h19.15l35.42,-35.68l5.71,5.68l5.67,-5.64l-7.73,-7.68l12.56,-12.48C132.4,77.6 132.4,75.08 130.83,73.52zM74.98,126.77l-6.43,-6.43l32.17,-32.17l6.43,6.43L74.98,126.77z"/>
-    <path android:fillAlpha="0.1" android:fillColor="#263238"
-        android:pathData="M120.28,105l-5.71,-5.68l-35.42,35.68l-19.15,0l1,1l19.15,0l35.42,-35.68l5.71,5.68l5.68,-5.64l-1,-1z" android:strokeAlpha="0.1"/>
-    <path android:fillAlpha="0.1" android:fillColor="#263238"
-        android:pathData="M90.75,75.64l-0.01,0l4.71,4.68l0.01,0z" android:strokeAlpha="0.1"/>
-    <path android:fillAlpha="0.1" android:fillColor="#263238"
-        android:pathData="M131.83,74.52l-0.97,-0.97c1.54,1.56 1.53,4.06 -0.07,5.65l-12.56,12.48l1,1l12.55,-12.48C133.4,78.6 133.4,76.08 131.83,74.52z" android:strokeAlpha="0.1"/>
-    <path android:fillAlpha="0.1" android:fillColor="#263238"
-        android:pathData="M101.72,89.17l6.67,6.66l0,0l-7.67,-7.66l-32.17,32.17l1,1z" android:strokeAlpha="0.1"/>
-    <path android:pathData="M37.13,173.7L8.62,83.69c-1.7,-5.8 0.3,-12 5,-15.6l73.52,-57.1c5.2,-4 12.5,-4 17.6,0.1l73.82,58.9c4.6,3.7 6.5,9.9 4.8,15.6l-28.51,88.21c-1.8,6.1 -7.4,10.2 -13.7,10.2H50.83C44.53,184 38.93,179.8 37.13,173.7z">
-        <aapt:attr name="android:fillColor">
-            <gradient android:centerX="21.977" android:centerY="23.8809"
-                android:gradientRadius="158.0384" android:type="radial">
-                <item android:color="#19FFFFFF" android:offset="0"/>
-                <item android:color="#00FFFFFF" android:offset="1"/>
-            </gradient>
-        </aapt:attr>
-    </path>
-</vector>
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/accessibility_daltonizer_background" />
+    <foreground>
+        <inset
+            android:drawable="@drawable/ic_accessibility_color_correction_foreground"
+            android:inset="@dimen/accessibility_icon_foreground_padding_ratio" />
+    </foreground>
+</adaptive-icon>
diff --git a/core/res/res/drawable/ic_accessibility_color_correction_foreground.xml b/core/res/res/drawable/ic_accessibility_color_correction_foreground.xml
new file mode 100644
index 0000000..ecb5065
--- /dev/null
+++ b/core/res/res/drawable/ic_accessibility_color_correction_foreground.xml
@@ -0,0 +1,26 @@
+<!--
+    Copyright (C) 2021 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#ffffff"
+        android:fillType="evenOdd"
+        android:pathData="M14.8417,6.6662C14.9562,6.5573 15.0995,6.5 15.2484,6.5C15.3917,6.5 15.5349,6.5573 15.6495,6.6662L16.9901,8.0068C17.2135,8.2302 17.2135,8.5912 16.9844,8.8203L15.1969,10.6078L16.2969,11.7078L15.4891,12.5156L14.6755,11.7021L9.5651,16.8125H6.8438V14.0911L11.9542,8.9807L11.1406,8.1672L11.9484,7.3594L13.0542,8.4537L14.8417,6.6662ZM7.9896,15.6667H9.0896L13.7073,11.049L12.6073,9.949L7.9896,14.5667V15.6667Z" />
+</vector>
\ No newline at end of file
diff --git a/core/res/res/drawable/ic_accessibility_color_inversion.xml b/core/res/res/drawable/ic_accessibility_color_inversion.xml
index d69a169..f855880 100644
--- a/core/res/res/drawable/ic_accessibility_color_inversion.xml
+++ b/core/res/res/drawable/ic_accessibility_color_inversion.xml
@@ -1,5 +1,5 @@
 <!--
-    Copyright (C) 2020 The Android Open Source Project
+    Copyright (C) 2021 The Android Open Source Project
 
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
@@ -13,50 +13,12 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector android:height="24dp" android:viewportHeight="192"
-    android:viewportWidth="192" android:width="24dp"
-    xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#546E7A" android:pathData="M37.14,173.74L8.61,83.77c-1.72,-5.75 0.26,-11.97 4.97,-15.63L87.15,11c5.2,-4.04 12.46,-3.99 17.61,0.12l73.81,58.94c4.63,3.7 6.53,9.88 4.8,15.57l-28.48,88.18c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84C44.53,184 38.97,179.83 37.14,173.74z"/>
-    <path android:fillAlpha="0.2" android:fillColor="#263238"
-        android:pathData="M183.37,84.63l-28.48,88.18c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84c-6.31,0 -11.87,-4.17 -13.7,-10.26L8.61,82.77c-0.36,-1.22 -0.55,-2.46 -0.59,-3.69c-0.06,1.56 0.13,3.14 0.59,4.69l28.53,89.97c1.83,6.09 7.39,10.26 13.7,10.26h90.38c6.28,0 11.82,-4.13 13.67,-10.19l28.48,-88.18c0.48,-1.57 0.67,-3.17 0.61,-4.75C183.94,82.13 183.74,83.39 183.37,84.63z" android:strokeAlpha="0.2"/>
-    <path android:fillAlpha="0.2" android:fillColor="#FFFFFF"
-        android:pathData="M13.58,69.14L87.15,12c5.2,-4.04 12.46,-3.99 17.61,0.12l73.81,58.94c3.36,2.68 5.27,6.67 5.41,10.82c0.15,-4.51 -1.79,-8.93 -5.41,-11.82l-73.81,-58.94C99.61,7.01 92.35,6.96 87.15,11L13.58,68.14c-3.71,2.88 -5.72,7.36 -5.56,11.94C8.17,75.85 10.14,71.81 13.58,69.14z" android:strokeAlpha="0.2"/>
-    <path android:fillAlpha="0.2" android:fillColor="#FFFFFF"
-        android:pathData="M53,130.05l5.03,-4.79L44.16,112c-0.05,0.78 -0.14,1.52 -0.15,2.34C43.62,136.61 61.27,154.56 84,156v-5.31C70.13,149.64 58.56,141.54 53,130.05z" android:strokeAlpha="0.2"/>
-    <path android:fillAlpha="0.2" android:fillColor="#FFFFFF"
-        android:pathData="M109,52v5.31c13.65,1.05 24.67,9.15 30.11,20.64l-4.92,4.79L147.81,96c0.09,-0.78 0.17,-1.53 0.19,-2.34C148.38,71.39 131.36,53.44 109,52z" android:strokeAlpha="0.2"/>
-    <path android:pathData="M154.89,173.81l13.57,-42.02l-46.53,-46.56C125.75,90.5 128,96.98 128,104c0,17.7 -14.3,32 -32,32c-8.64,0 -16.47,-3.42 -22.22,-8.97l0.9,0.91L130.73,184h10.49C147.5,184 153.04,179.87 154.89,173.81z">
-        <aapt:attr name="android:fillColor">
-            <gradient android:endX="153.3523" android:endY="161.6371"
-                android:startX="90.6075" android:startY="98.8923" android:type="linear">
-                <item android:color="#33263238" android:offset="0"/>
-                <item android:color="#05263238" android:offset="1"/>
-            </gradient>
-        </aapt:attr>
-    </path>
-    <path android:pathData="M96,129.6V78.4c-14.11,0 -25.6,11.49 -25.6,25.6S81.89,129.6 96,129.6z">
-        <aapt:attr name="android:fillColor">
-            <gradient android:endX="150.8492" android:endY="164.1401"
-                android:startX="88.1044" android:startY="101.3954" android:type="linear">
-                <item android:color="#33263238" android:offset="0"/>
-                <item android:color="#05263238" android:offset="1"/>
-            </gradient>
-        </aapt:attr>
-    </path>
-    <path android:fillAlpha="0.2" android:fillColor="#263238"
-        android:pathData="M96,136c-17.53,0 -31.72,-14.04 -31.99,-31.5c0,0.17 -0.01,0.33 -0.01,0.5c0,17.7 14.3,32 32,32s32,-14.3 32,-32c0,-0.17 -0.01,-0.33 -0.01,-0.5C127.72,121.96 113.53,136 96,136z" android:strokeAlpha="0.2"/>
-    <path android:fillAlpha="0.2" android:fillColor="#263238"
-        android:pathData="M70.4,104c0,0.17 0.01,0.33 0.01,0.5C70.68,90.62 82.06,79.4 96,79.4v-1C81.89,78.4 70.4,89.88 70.4,104z" android:strokeAlpha="0.2"/>
-    <path android:fillAlpha="0.2" android:fillColor="#FFFFFF"
-        android:pathData="M96,72c-17.7,0 -32,14.3 -32,32s14.3,32 32,32s32,-14.3 32,-32S113.7,72 96,72zM70.4,104c0,-14.11 11.49,-25.6 25.6,-25.6v51.2C81.89,129.6 70.4,118.11 70.4,104z" android:strokeAlpha="0.2"/>
-    <path android:fillColor="#FFFFFF" android:pathData="M96,72c-17.7,0 -32,14.3 -32,32s14.3,32 32,32s32,-14.3 32,-32S113.7,72 96,72zM70.4,104c0,-14.11 11.49,-25.6 25.6,-25.6v51.2C81.89,129.6 70.4,118.11 70.4,104z"/>
-    <path android:pathData="M37.14,173.74L8.61,83.77c-1.72,-5.75 0.26,-11.97 4.97,-15.63L87.15,11c5.2,-4.04 12.46,-3.99 17.61,0.12l73.81,58.94c4.63,3.7 6.53,9.88 4.8,15.57l-28.48,88.18c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84C44.53,184 38.97,179.83 37.14,173.74z">
-        <aapt:attr name="android:fillColor">
-            <gradient android:endX="156.2451" android:endY="171.4516"
-                android:startX="37.0633" android:startY="52.269802" android:type="linear">
-                <item android:color="#19FFFFFF" android:offset="0"/>
-                <item android:color="#00FFFFFF" android:offset="1"/>
-            </gradient>
-        </aapt:attr>
-    </path>
-</vector>
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/accessibility_color_inversion_background" />
+    <foreground>
+        <inset
+            android:drawable="@drawable/ic_accessibility_color_inversion_foreground"
+            android:inset="@dimen/accessibility_icon_foreground_padding_ratio" />
+    </foreground>
+</adaptive-icon>
diff --git a/core/res/res/drawable/ic_accessibility_color_inversion_foreground.xml b/core/res/res/drawable/ic_accessibility_color_inversion_foreground.xml
new file mode 100644
index 0000000..7fc3aa6
--- /dev/null
+++ b/core/res/res/drawable/ic_accessibility_color_inversion_foreground.xml
@@ -0,0 +1,54 @@
+<!--
+    Copyright (C) 2021 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="192"
+    android:viewportHeight="192">
+    <path
+        android:fillAlpha="0.2"
+        android:fillColor="#212121"
+        android:pathData="M96,183L96,183c-48.23,0 -87.72,-39.33 -87.99,-87.5C8.01,95.67 8,95.83 8,96v0c0,48.4 39.6,88 88,88h0c48.4,0 88,-39.6 88,-88v0c0,-0.17 -0.01,-0.33 -0.01,-0.5C183.72,143.67 144.23,183 96,183z" />
+    <path
+        android:fillAlpha="0.2"
+        android:fillColor="#FFFFFF"
+        android:pathData="M184,96c0,-48.4 -39.6,-88 -88,-88h0C47.6,8 8,47.6 8,96v0c0,0.17 0.01,0.33 0.01,0.5C8.28,48.33 47.77,9 96,9h0c48.23,0 87.72,39.33 87.99,87.5C183.99,96.33 184,96.17 184,96L184,96z"
+        android:strokeAlpha="0.2" />
+    <path
+        android:fillAlpha="0.2"
+        android:fillColor="#FFFFFF"
+        android:pathData="M53,122.2l5.03,-4.79l-13.88,-13.26c-0.05,0.78 -0.14,1.52 -0.15,2.34c-0.39,22.27 17.27,40.22 39.99,41.66v-5.31C70.13,141.78 58.56,133.69 53,122.2z"
+        android:strokeAlpha="0.2" />
+    <path
+        android:fillAlpha="0.2"
+        android:fillColor="#FFFFFF"
+        android:pathData="M109,44.15v5.31c13.65,1.05 24.67,9.15 30.11,20.64l-4.92,4.79l13.62,13.26c0.09,-0.78 0.17,-1.53 0.19,-2.34C148.38,63.53 131.36,45.59 109,44.15z"
+        android:strokeAlpha="0.2" />
+    <path
+        android:fillAlpha="0.2"
+        android:fillColor="#263238"
+        android:pathData="M70.4,96.18c0,0.17 0.01,0.33 0.01,0.5c0.27,-13.88 11.64,-25.1 25.59,-25.1v-1C81.89,70.57 70.4,82.06 70.4,96.18z"
+        android:strokeAlpha="0.2" />
+    <path
+        android:fillAlpha="0.2"
+        android:fillColor="#263238"
+        android:pathData="M128,96.67c-0.27,17.47 -14.46,31.5 -31.99,31.5c-8.79,0 -16.75,-3.53 -22.53,-9.26l-0.04,0l5.03,5.04c5.03,3.3 11.05,5.22 17.53,5.22c17.7,0 32,-14.31 32,-32C128.01,97.01 128,96.84 128,96.67z"
+        android:strokeAlpha="0.2" />
+    <path
+        android:fillColor="#FFFFFF"
+        android:pathData="M96,64.16c-17.7,0 -32,14.3 -32,32c0,17.7 14.3,32 32,32c17.7,0 32,-14.3 32,-32C128,78.47 113.7,64.16 96,64.16zM70.4,96.16c0,-14.11 11.49,-25.6 25.6,-25.6v51.2C81.89,121.77 70.4,110.28 70.4,96.16z" />
+</vector>
\ No newline at end of file
diff --git a/core/res/res/drawable/ic_accessibility_magnification.xml b/core/res/res/drawable/ic_accessibility_magnification.xml
index 5dab479..f3b2887 100644
--- a/core/res/res/drawable/ic_accessibility_magnification.xml
+++ b/core/res/res/drawable/ic_accessibility_magnification.xml
@@ -1,5 +1,5 @@
 <!--
-    Copyright (C) 2020 The Android Open Source Project
+    Copyright (C) 2021 The Android Open Source Project
 
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
@@ -13,102 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="192"
-    android:viewportHeight="192">
-  <path
-      android:pathData="M96,104m-24,0a24,24 0,1 1,48 0a24,24 0,1 1,-48 0"
-      android:fillColor="#F50057"/>
-  <path
-      android:pathData="M178.57,70.06l-73.81,-58.94C99.6,7.01 92.35,6.96 87.15,11L13.59,68.14C8.87,71.8 6.9,78.02 8.61,83.77l28.53,89.97c1.83,6.09 7.39,10.26 13.7,10.26h90.38c6.28,0 11.82,-4.13 13.67,-10.19l0.69,-2.13l-34.94,-34.88v-4.7l-0.96,-0.99c-6.33,5.54 -14.61,8.9 -23.68,8.9c-19.89,0 -36.02,-16.12 -36.02,-36.01S76.11,68 96,68s36.01,16.12 36.01,36.01c0,8.68 -3.08,16.65 -8.2,22.87l1.05,1.01h4.7l30.34,30.39l23.47,-72.65C185.1,79.94 183.2,73.76 178.57,70.06z"
-      android:fillColor="#F50057"/>
-  <path
-      android:pathData="M65.25,73c0,0 -16.75,31.96 -9.25,45.1s21.02,29.15 40.01,32.65s32.99,10.5 39.99,14s19.58,6.93 19.58,6.93s-5.34,-9.49 4.32,-13.4c0.73,-3.53 -11.9,-42.35 -11.9,-42.35L127.92,73L81.79,62.25L65.25,73z"
-      android:fillColor="#F50057"/>
-  <path
-      android:pathData="M155.33,171.43l-0.44,1.37c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84c-6.31,0 -11.87,-4.17 -13.7,-10.26L8.61,82.77c-0.36,-1.22 -0.55,-2.46 -0.59,-3.69c-0.06,1.56 0.13,3.14 0.59,4.69l28.53,89.97c1.83,6.09 7.39,10.26 13.7,10.26h90.38c6.28,0 11.82,-4.13 13.67,-10.19l0.69,-2.13L155.33,171.43z"
-      android:strokeAlpha="0.2"
-      android:fillColor="#3E2723"
-      android:fillAlpha="0.2"/>
-  <path
-      android:pathData="M183.37,84.63l-23.71,73.41l0.24,0.24l23.47,-72.66c0.48,-1.57 0.67,-3.17 0.61,-4.75C183.94,82.13 183.74,83.39 183.37,84.63z"
-      android:strokeAlpha="0.2"
-      android:fillColor="#3E2723"
-      android:fillAlpha="0.2"/>
-  <path
-      android:pathData="M155.57,171.67l-34.93,-34.87v-4.7l-0.96,-0.99c-6.33,5.54 -14.61,8.9 -23.68,8.9c-9.81,0 -18.71,-3.93 -25.2,-10.29L125.07,184h16.14c6.28,0 11.81,-4.13 13.67,-10.19L155.57,171.67z">
-    <aapt:attr name="android:fillColor">
-      <gradient
-          android:startY="104.215"
-          android:startX="69.035"
-          android:endY="173.8946"
-          android:endX="138.7146"
-          android:type="linear">
-        <item android:offset="0" android:color="#333E2723"/>
-        <item android:offset="1" android:color="#003E2723"/>
-      </gradient>
-    </aapt:attr>
-  </path>
-  <path
-      android:pathData="M132.01,104.01c0,8.68 -3.08,16.65 -8.2,22.87l1.05,1.01h4.7l30.34,30.39L170,127l-49,-49.03l-0.19,-0.04C127.71,84.49 132.01,93.74 132.01,104.01z">
-    <aapt:attr name="android:fillColor">
-      <gradient
-          android:startY="83.635"
-          android:startX="103.615"
-          android:endY="137.0219"
-          android:endX="157.0018"
-          android:type="linear">
-        <item android:offset="0" android:color="#333E2723"/>
-        <item android:offset="1" android:color="#003E2723"/>
-      </gradient>
-    </aapt:attr>
-  </path>
-  <path
-      android:pathData="M124.27,127.32c4.85,-6.13 7.75,-13.88 7.75,-22.3c0,-0.16 -0.01,-0.31 -0.01,-0.47c-0.12,8.47 -3.17,16.24 -8.19,22.34L124.27,127.32z"
-      android:strokeAlpha="0.2"
-      android:fillColor="#3E2723"
-      android:fillAlpha="0.2"/>
-  <path
-      android:pathData="M96.01,80.01c-13.25,0 -24,10.75 -24,24c0,0.17 0.01,0.33 0.01,0.5c0.27,-13.02 10.91,-23.5 23.99,-23.5s23.72,10.48 23.99,23.5c0,-0.17 0.01,-0.33 0.01,-0.5C120.01,90.76 109.26,80.01 96.01,80.01z"
-      android:strokeAlpha="0.2"
-      android:fillColor="#3E2723"
-      android:fillAlpha="0.2"/>
-  <path
-      android:pathData="M155.58,171.68l-34.93,-34.87l0,1l34.68,34.62z"
-      android:strokeAlpha="0.2"
-      android:fillColor="#3E2723"
-      android:fillAlpha="0.2"/>
-  <path
-      android:pathData="M119.69,131.12c-6.33,5.54 -14.61,8.9 -23.68,8.9c-9.97,0 -19,-4.06 -25.52,-10.61h-0.01l5.59,5.59c5.71,3.8 12.57,6.03 19.94,6.03c9.07,0 17.35,-3.36 23.68,-8.9l0.96,0.99v-1L119.69,131.12z"
-      android:strokeAlpha="0.2"
-      android:fillColor="#3E2723"
-      android:fillAlpha="0.2"/>
-  <path
-      android:pathData="M13.59,69.14L87.15,12c5.2,-4.04 12.45,-3.99 17.61,0.12l73.81,58.94c3.36,2.68 5.27,6.67 5.41,10.82c0.15,-4.51 -1.79,-8.93 -5.41,-11.82l-73.81,-58.94C99.6,7.01 92.35,6.96 87.15,11L13.59,68.14c-3.72,2.88 -5.72,7.36 -5.57,11.94C8.17,75.85 10.14,71.81 13.59,69.14z"
-      android:strokeAlpha="0.2"
-      android:fillColor="#FFFFFF"
-      android:fillAlpha="0.2"/>
-  <path
-      android:pathData="M112,108h-12v12h-8v-12H80v-8h12V88h8v12h12V108z"
-      android:fillColor="#F8BBD0"/>
-  <path
-      android:pathData="M129.57,127.9h-4.7l-1.05,-1.01c5.12,-6.22 8.2,-14.19 8.2,-22.87c0,-19.89 -16.12,-36.01 -36.01,-36.01s-36.02,16.11 -36.02,36s16.13,36.01 36.02,36.01c9.07,0 17.35,-3.36 23.68,-8.9l0.96,0.99v4.7l34.93,34.87l4.33,-13.39L129.57,127.9zM96.01,128.01c-13.25,0 -24,-10.75 -24,-24s10.75,-24 24,-24s24,10.75 24,24S109.26,128.01 96.01,128.01z"
-      android:fillColor="#FFFFFF"/>
-  <path
-      android:pathData="M37.14,173.74L8.61,83.77C6.9,78.02 8.87,71.8 13.59,68.14L87.15,11c5.2,-4.04 12.45,-3.99 17.61,0.12l73.81,58.94c4.63,3.7 6.53,9.88 4.8,15.57l-28.48,88.18c-1.85,6.06 -7.39,10.19 -13.67,10.19H50.84C44.53,184 38.97,179.83 37.14,173.74z">
-    <aapt:attr name="android:fillColor">
-      <gradient
-          android:startY="53.3534"
-          android:startX="38.1466"
-          android:endY="178.712"
-          android:endX="163.5051"
-          android:type="linear">
-        <item android:offset="0" android:color="#19FFFFFF"/>
-        <item android:offset="1" android:color="#00FFFFFF"/>
-      </gradient>
-    </aapt:attr>
-  </path>
-</vector>
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+  <background android:drawable="@color/accessibility_magnification_background" />
+  <foreground>
+    <inset
+        android:drawable="@drawable/ic_accessibility_magnification_foreground"
+        android:inset="@dimen/accessibility_icon_foreground_padding_ratio" />
+  </foreground>
+
+</adaptive-icon>
diff --git a/core/res/res/drawable/ic_accessibility_magnification_foreground.xml b/core/res/res/drawable/ic_accessibility_magnification_foreground.xml
new file mode 100644
index 0000000..7ce1880
--- /dev/null
+++ b/core/res/res/drawable/ic_accessibility_magnification_foreground.xml
@@ -0,0 +1,26 @@
+<!--
+    Copyright (C) 2021 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#ffffff"
+        android:fillType="evenOdd"
+        android:pathData="M17.6942,16.7552L14.0831,13.1441C14.5684,12.4698 14.8646,11.6568 14.8646,10.7682C14.8646,8.5058 13.0307,6.6719 10.7682,6.6719C8.5058,6.6719 6.6719,8.5058 6.6719,10.7682C6.6719,13.0307 8.5058,14.8646 10.7682,14.8646C11.6568,14.8646 12.4698,14.5684 13.1441,14.0831L16.7552,17.6942L17.6942,16.7552ZM10.7682,13.6042C9.199,13.6042 7.9323,12.3374 7.9323,10.7682C7.9323,9.199 9.199,7.9323 10.7682,7.9323C12.3374,7.9323 13.6042,9.199 13.6042,10.7682C13.6042,12.3374 12.3374,13.6042 10.7682,13.6042ZM12.6589,10.138H11.3984V8.8776H10.138V10.138H8.8776V11.3984H10.138V12.6589H11.3984V11.3984H12.6589V10.138Z" />
+</vector>
diff --git a/core/res/res/drawable/ic_accessibility_reduce_bright_colors.xml b/core/res/res/drawable/ic_accessibility_reduce_bright_colors.xml
new file mode 100644
index 0000000..4eab97b
--- /dev/null
+++ b/core/res/res/drawable/ic_accessibility_reduce_bright_colors.xml
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2021 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/accessibility_feature_background" />
+    <foreground>
+        <inset
+            android:drawable="@drawable/ic_accessibility_reduce_bright_colors_foreground"
+            android:inset="@dimen/accessibility_icon_foreground_padding_ratio" />
+    </foreground>
+</adaptive-icon>
diff --git a/core/res/res/drawable/ic_accessibility_reduce_bright_colors_foreground.xml b/core/res/res/drawable/ic_accessibility_reduce_bright_colors_foreground.xml
new file mode 100644
index 0000000..58609da
--- /dev/null
+++ b/core/res/res/drawable/ic_accessibility_reduce_bright_colors_foreground.xml
@@ -0,0 +1,54 @@
+<!--
+    Copyright (C) 2021 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <group android:scaleX="2.97"
+        android:scaleY="2.97"
+        android:translateX="18.36"
+        android:translateY="18.36">
+        <path
+            android:pathData="M17,12.1L15.59,10.69L13.05,13.22V7.05H11.05V13.22L8.51,10.69L7.1,12.1L12.05,17.05L17,12.1Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M2.05,13.05H4.05C4.6,13.05 5.05,12.6 5.05,12.05C5.05,11.5 4.6,11.05 4.05,11.05H2.05C1.5,11.05 1.05,11.5 1.05,12.05C1.05,12.6 1.5,13.05 2.05,13.05Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M20.05,13.05H22.05C22.6,13.05 23.05,12.6 23.05,12.05C23.05,11.5 22.6,11.05 22.05,11.05H20.05C19.5,11.05 19.05,11.5 19.05,12.05C19.05,12.6 19.5,13.05 20.05,13.05Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M11.05,2.05V4.05C11.05,4.6 11.5,5.05 12.05,5.05C12.6,5.05 13.05,4.6 13.05,4.05V2.05C13.05,1.5 12.6,1.05 12.05,1.05C11.5,1.05 11.05,1.5 11.05,2.05Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M11.05,20.05V22.05C11.05,22.6 11.5,23.05 12.05,23.05C12.6,23.05 13.05,22.6 13.05,22.05V20.05C13.05,19.5 12.6,19.05 12.05,19.05C11.5,19.05 11.05,19.5 11.05,20.05Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M6.04,4.63C5.65,4.24 5.01,4.24 4.63,4.63C4.24,5.02 4.24,5.66 4.63,6.04L5.69,7.1C6.08,7.49 6.72,7.49 7.1,7.1C7.49,6.71 7.49,6.07 7.1,5.69L6.04,4.63Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M18.41,17C18.02,16.61 17.38,16.61 17,17C16.61,17.39 16.61,18.03 17,18.41L18.06,19.47C18.45,19.86 19.09,19.86 19.47,19.47C19.86,19.08 19.86,18.44 19.47,18.06L18.41,17Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M19.47,6.04C19.86,5.65 19.86,5.01 19.47,4.63C19.08,4.24 18.44,4.24 18.06,4.63L17,5.69C16.61,6.08 16.61,6.72 17,7.1C17.39,7.49 18.03,7.49 18.41,7.1L19.47,6.04Z"
+            android:fillColor="#ffffff"/>
+        <path
+            android:pathData="M7.1,18.41C7.49,18.02 7.49,17.38 7.1,17C6.71,16.61 6.07,16.61 5.69,17L4.63,18.06C4.24,18.45 4.24,19.09 4.63,19.47C5.02,19.86 5.66,19.86 6.04,19.47L7.1,18.41Z"
+            android:fillColor="#ffffff"/>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 445bac5..210c5bc 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1622,7 +1622,7 @@
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Saai uit"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Koppel aan toestel"</string>
     <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Saai skerm uit na toestel"</string>
-    <string name="media_route_chooser_searching" msgid="6119673534251329535">"Soek tans vir toestelle…"</string>
+    <string name="media_route_chooser_searching" msgid="6119673534251329535">"Soek tans vir toestelle …"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Instellings"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Ontkoppel"</string>
     <string name="media_route_status_scanning" msgid="8045156315309594482">"Skandeer tans..."</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarg"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Onbekende portret"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Onbekende landskap"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Gekanselleer"</string>
@@ -1852,9 +1864,9 @@
     <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="7963058670863485450">"Batterybespaarder skakel Donkertema aan en beperk of skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Ok Google\", af\n\n"<annotation id="url">"Kom meer te wete"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Batterybespaarder skakel Donkertema aan en beperk of skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Ok Google\", af."</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="battery_saver_description_with_learn_more" msgid="750683025714899363">"Batterybespaarder skakel Donkertema aan en beperk of skakel agtergrondaktiwiteit, sommige visuele effekte en sekere kenmerke af.\n\n"<annotation id="url">"Kom meer te wete"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Batterybespaarder skakel Donkertema aan en beperk of skakel agtergrondaktiwiteit, sommige visuele effekte en sekere kenmerke af."</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 voordat 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>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Hierdie kennisgewing is gedegradeer na Stil. Tik om terugvoer te gee."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Hierdie kennisgewing is hoër gegradeer. Tik om terugvoer te gee."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Hierdie kennisgewing is laer gegradeer. Tik om terugvoer te gee."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Probeer verbeterde kennisgewings"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Skakel verbeterde kennisgewings aan sodat jy aanhou om voorgestelde handelinge, antwoorde en meer te ontvang. Android se aanpasbare kennisgewings word nie meer gesteun nie."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Skakel aan"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Nie nou nie"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Verbeterde kennisgewings"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Voorgestelde handelinge en antwoorde word nou deur verbeterde kennisgewings verskaf. Android se aanpasbare kennisgewings word nie meer gesteun nie."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Skakel af"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Kom meer te wete"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Verbeterde kennisgewings kan alle kennisgewinginhoud lees, insluitend persoonlike inligting soos kontakname en boodskappe. Hierdie kenmerk kan ook kennisgewings toemaak of handelingknoppies in kennisgewings gebruik, soos om foonoproepe te beantwoord.\n\nHierdie kenmerk kan ook Prioriteitmodus aan- of afskakel en soortgelyke instellings verander."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Verbeterde kennisgewings het Android se aanpasbare kennisgewings in Android 12 vervang. Hierdie kenmerk wys voorgestelde handelinge en antwoorde, en organiseer jou kennisgewings.\n\nVerbeterde kennisgewings het toegang tot kennisgewinginhoud, insluitend persoonlike inligting soos kontakname en -boodskappe. Hierdie kenmerk kan ook kennisgewings toemaak of daarop antwoord, soos om foonoproepe te beantwoord en Moenie Steur Nie te beheer."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Roetinemodus-inligtingkennisgewing"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery kan afloop voordat dit normaalweg gelaai word"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterybespaarder is geaktiveer om batterylewe te verleng"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 52f0540..d5d06633 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"ሞናርክ"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"ኳርቶ"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"ፉልስካፕ"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"አር ኦ ሲ 8ኬ"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"አር ኦ ሲ 16ኬ"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"ፒ አር ሲ 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"ካሁ"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"ካኩ2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"ዩ4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"የማይታወቅ የቁም"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"የማይታወቅ የወርድ"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ተትቷል"</string>
@@ -1852,8 +1864,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="7963058670863485450">"የባትሪ ኃይል ቆጣቢ የጠቆር ያለ ገጽታን ያበራል እና የጀርባ እንቅስቃሴን፣ አንዳንድ የእይታ ውጤቶችን እና እንደ «Hey Google» ያሉ ባህሪያትን ይገድባል ወይም ያጠፋል።\n\n"<annotation id="url">"የበለጠ ለመረዳት"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"የባትሪ ኃይል ቆጣቢ የጠቆር ያለ ገጽታን ያበራል እና የጀርባ እንቅስቃሴን፣ አንዳንድ የእይታ ውጤቶችን እና እንደ «Hey Google» ያሉ ባህሪያትን ይገድባል ወይም ያጠፋል።"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"የባትሪ ኃይል ቆጣቢ ጠቆር ያለ ገጽታን ያበራል እና የጀርባ እንቅስቃሴን፣ አንዳንድ ምስላዊ ተጽዕኖዎችን እና የተወሰኑ ባህሪያትን ይገድባል ወይም ያጠፋል።\n\n"<annotation id="url">"የበለጠ ለመረዳት"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"የባትሪ ኃይል ቆጣቢ ጠቆር ያለ ገጽታን ያበራል እና የጀርባ እንቅስቃሴን፣ አንዳንድ ምስላዊ ተጽዕኖዎችን እና የተወሰኑ ባህሪያትን ይገድባል ወይም ያጠፋል።"</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"መልስ"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ቪዲዮ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"አትቀበል"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ስልኩን ዝጋ"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ገቢ ጥሪ"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ይህ ማሳወቂያ ወደ ዝምታ ዝቅ ብሏል። ግብረመልስ ለመስጠት መታ ያድርጉ።"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ይህ ማሳወቂያ ከፍተኛ ደረጃ ተሰጥቶታል። ግብረመልስ ለመስጠት መታ ያድርጉ።"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ይህ ማሳወቂያ ዝቅተኛ ደረጃ ተሰጥቶታል። ግብረመልስ ለመስጠት መታ ያድርጉ።"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"የተሻሻሉ ማሳወቂያዎችን ይሞክሩ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"የተጠቆሙ እርምጃዎችን፣ ምላሾችን እና ሌሎችን ማግኘትን ለመቀጠል የተሻሻሉ ማሳወቂያዎችን ያብሩ። የAndroid አስማሚ ማሳወቂያዎች ከአሁን በኋላ አይደገፉም።"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"አብራ"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"አሁን አይደለም"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"የበለጠ ለመረዳት"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"የተሻሻሉ ማሳወቂያዎች እንደ የእውቂያ ስሞች እና መልዕክቶች ያሉ የግል መረጃዎችን ጨምሮ ሁሉንም የማሳወቂያ ይዘቶችን ማንበብ ይችላሉ። ይህ ባህሪ ማሳወቂያዎችን ማሰናከል ወይም እንደ የስልክ ጥሪዎችን ማንሳት በመሳሰሉ ማሳወቂያዎች ውስጥ ባሉ አዝራሮች ላይ እርምጃዎችንም አዝራሮች ላይ እርምጃዎችንም መውሰድ ይችላል።\n\nይህ ባህሪ የቅድሚያ ሁነታን ማብራት ወይም ማጥፋት እና ተዛማጅ ቅንብሮችን መለወጥ ይችላል።"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"የዕለት ተዕለት ሁነታ መረጃ ማሳወቂያዎች"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ባትሪ ከተለመደው ኃይል መሙላት በፊት ሊያልቅ ይችላል"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"የባትሪ ቆጣቢ የባትሪ ዕድሜን ለማራዘም ገብሯል።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index a78c0e3..1b7e8fd 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1861,6 +1861,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"فولسكاب"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1897,6 +1908,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"عمودي غير معروف"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"أفقي غير معروف"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ملغاة"</string>
@@ -1944,8 +1956,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="7963058670863485450">"‏يؤدي استخدام خيار \"توفير شحن البطارية\" إلى تفعيل \"المظهر الداكن\" وتقييد أو إيقاف النشاط في الخلفية وبعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\".\n\n"<annotation id="url">"مزيد من المعلومات"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"‏يؤدي استخدام خيار \"توفير شحن البطارية\" إلى تفعيل \"المظهر الداكن\" وتقييد أو إيقاف النشاط في الخلفية وبعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"يؤدي استخدام خيار \"توفير شحن البطارية\" إلى تفعيل \"المظهر الداكن\" وتقييد أو إيقاف الأنشطة في الخلفية وبعض التأثيرات المرئية وميزات معيّنة.\n\n"<annotation id="url">"مزيد من المعلومات"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"يؤدي استخدام خيار \"توفير شحن البطارية\" إلى تفعيل \"المظهر الداكن\" وتقييد أو إيقاف الأنشطة في الخلفية وبعض التأثيرات المرئية وميزات معيّنة."</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>
@@ -2053,8 +2065,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"ردّ"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"فيديو"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"رفض"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"قطع الاتصال"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"مكالمة واردة"</string>
@@ -2206,12 +2217,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"تم خفض ترتيب هذا الإشعار إلى الوضع \"صامت\". انقر لإرسال ملاحظات وآراء."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"تمت زيادة ترتيب هذا الإشعار. انقر لإرسال ملاحظات وآراء."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"تم خفض ترتيب هذا الإشعار. انقر لإرسال ملاحظات وآراء."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"تجربة الإشعارات المحسّنة"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"‏لمواصلة الحصول على الردود والإجراءات المقترحة والمزيد، عليك تفعيل الإشعارات المحسّنة. لم تعد الإشعارات التكيُّفية لنظام التشغيل Android متاحة."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"تفعيل"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"لاحقًا"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"مزيد من المعلومات"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"يمكن للإشعارات المحسّنة قراءة كل محتوى الإشعارات، بما في ذلك المعلومات الشخصية، مثلاً أسماء جهات الاتصال والرسائل. يمكن لهذه الميزة أيضًا إغلاق الإشعارات أو اتخاذ إجراءات من خلال الأزرار في الإشعارات، مثلاً الردّ على مكالمات الهاتف.\n\nويمكن لهذه الميزة أيضًا تفعيل وضع \"الأولوية\" أو إيقافه وتغيير الإعدادات ذات الصلة."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"إشعار معلومات \"وضع سلسلة الإجراءات\""</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"قد تنفد طاقة البطارية قبل الشحن المعتاد"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"تم تفعيل \"توفير شحن البطارية\" لإطالة عمرها."</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 4d6b0b7..350e981 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1566,7 +1566,7 @@
     <string name="action_menu_overflow_description" msgid="4579536843510088170">"অধিক বিকল্প"</string>
     <string name="action_bar_home_description_format" msgid="5087107531331621803">"%1$s: %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="4346835454749569826">"%1$s, %2$s, %3$s"</string>
-    <string name="storage_internal" msgid="8490227947584914460">"শ্বেয়াৰ কৰা আভ্যন্তৰীণ সঞ্চয়াগাৰ"</string>
+    <string name="storage_internal" msgid="8490227947584914460">"শ্বেয়াৰ কৰা আভ্যন্তৰীণ ষ্ট\'ৰেজ"</string>
     <string name="storage_sd_card" msgid="3404740277075331881">"এছডি কাৰ্ড"</string>
     <string name="storage_sd_card_label" msgid="7526153141147470509">"<xliff:g id="MANUFACTURER">%s</xliff:g> এছডি কাৰ্ড"</string>
     <string name="storage_usb_drive" msgid="448030813201444573">"ইউএছবি ড্ৰাইভ"</string>
@@ -1708,7 +1708,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="reduce_bright_colors_feature_name" msgid="3222994553174604132">"এক্সট্ৰা ডিম"</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>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"ম\'নাৰ্ক"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"কুৱাট্ৰো"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"ফুলস্কেপ"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"অজ্ঞাত প\'ৰ্ট্ৰেইট"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"অজ্ঞাত লেণ্ডস্কেইপ"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"বাতিল কৰা হ’ল"</string>
@@ -1852,9 +1865,11 @@
     <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="7963058670863485450">"বেটাৰী সঞ্চয়কাৰীয়ে গাঢ় থীম অন কৰে আৰু নেপথ্যৰ কাৰ্যকলাপ, কিছুমান ভিজুৱেল ইফেক্ট আৰু “Hey Google”ৰ দৰে সুবিধাসমূহ অফ কৰে অথবা সীমাবদ্ধ কৰে\n\n"<annotation id="url">"অধিক জানক"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"বেটাৰী সঞ্চয়কাৰীয়ে গাঢ় থীম অন কৰে আৰু নেপথ্যৰ কাৰ্যকলাপ, কিছুমান ভিজুৱেল ইফেক্ট আৰু “Hey Google”ৰ দৰে সুবিধাসমূহ অফ কৰে অথবা সীমাবদ্ধ কৰে।"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"ডেটা ব্য়ৱহাৰ মাত্ৰা কম কৰিবৰ বাবে ডেটা সঞ্চয়কাৰীয়ে কিছুমান এপক নেপথ্য়ত ডেটা প্ৰেৰণ বা সংগ্ৰহ কৰাত বাধা প্ৰদান কৰে। আপুনি বৰ্তমান ব্য়ৱহাৰ কৰি থকা এটা এপে ডেটা ব্য়ৱহাৰ কৰিব পাৰে, কিন্তু সঘনাই এই কার্য কৰিব নোৱাৰিব পাৰে। ইয়াৰ অৰ্থ এইয়ে হ\'ব পাৰে যে, উদাহৰণস্বৰূপে, আপুনি নিটিপা পর্যন্ত প্ৰতিচ্ছবিসমূহ দেখুওৱা নহ’ব।"</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
+    <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">
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"উত্তৰ দিয়ক"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ভিডিঅ’"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"প্ৰত্যাখ্যান কৰক"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"কল কাটি দিয়ক"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"অন্তৰ্গামী কল"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"এই জাননীটোৰ গুৰুত্ব নীৰৱলৈ হ্ৰাস কৰা হৈছে। মতামত দিবলৈ টিপক।"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"এই জাননীটোৰ স্থান ওপৰলৈ কৰা হৈছে। মতামত দিবলৈ টিপক।"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"এই জাননীটোৰ স্থান তললৈ কৰা হৈছে। মতামত দিবলৈ টিপক।"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"উন্নত জাননী ব্যৱহাৰ কৰি চাওক"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"পৰামৰ্শ দিয়া কাৰ্য, প্ৰত্যুত্তৰ আৰু বহুতো সুবিধা পাই থাকিবলৈ উন্নত জাননী অন কৰক। Androidৰ অভিযোজিত জাননী আৰু সমৰ্থিত নহয়।"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"অন কৰক"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"এতিয়া নহয়"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"অধিক জানক"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"উন্নত প্ৰত্যুত্তৰে সম্পৰ্কৰ নাম আৰু বাৰ্তাৰ দৰে ব্যক্তিগত তথ্যৰ লগতে আটাইবোৰ জাননীৰ সমল পঢ়িব পাৰে। এই সুবিধাটোৱে জাননী অগ্ৰাহ্য কৰাৰ লগতে জাননীত থকা ফ’ন কলৰ উত্তৰ দিয়াৰ দৰে কাৰ্য বুটামৰ ওপৰত কাৰ্যব্যৱস্থা ল’ব পাৰে।\n\nলগতে, এই সুবিধাটোৱে অগ্ৰাধিকাৰ দিয়া ম’ড অন অথবা অফ কৰিব পাৰে আৰু সম্পৰ্কিত ছেটিং সলনি কৰিব পাৰে।"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ৰুটিন ম’ডৰ তথ্য জাননী"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"চ্চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰি শেষ হ’ব পাৰে"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"বেটাৰিৰ খৰচ কমাবলৈ বেটাৰি সঞ্চয়কাৰী অন কৰা হৈছে"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 69e0400..1bdc646 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -733,11 +733,11 @@
     <string name="policylab_resetPassword" msgid="214556238645096520">"Ekran kilidini dəyişmək"</string>
     <string name="policydesc_resetPassword" msgid="4626419138439341851">"Ekran kilidini dəyişmək"</string>
     <string name="policylab_forceLock" msgid="7360335502968476434">"Ekranı kilidləmək"</string>
-    <string name="policydesc_forceLock" msgid="1008844760853899693">"Ekranın nə vaxt və necə kilidlənməsinə nəzarət edir."</string>
+    <string name="policydesc_forceLock" msgid="1008844760853899693">"Ekranın kilidlənmə vaxtına və üsuluna nəzarət."</string>
     <string name="policylab_wipeData" msgid="1359485247727537311">"Bütün məlumatları silmək"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Planşetin datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin."</string>
     <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Android TV cihazının datasını fabrik sıfırlaması haqqında xəbərdarlıq olmadan silin."</string>
-    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Telefonun datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin"</string>
+    <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Telefondakı bütün məlumatları xəbərdarlıqsız sıfırlayaraq məhv etmək"</string>
     <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"İstifadəçi verilənlərini sil"</string>
     <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Xəbərdarlıq etmədən bu istifadəçinin verilənlərini bu planşetdə silin."</string>
     <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"Bu istifadəçinin datasını xəbərdarlıq olmadan Android TV cihazında silin."</string>
@@ -751,7 +751,7 @@
     <string name="policylab_disableCamera" msgid="5749486347810162018">"Kameraları dekativ edin"</string>
     <string name="policydesc_disableCamera" msgid="3204405908799676104">"Bütün cihaz kameralarının istifadəsini əngəllə."</string>
     <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"Ekran kilidini deaktiv etmək"</string>
-    <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"Bəzi ekran funksiyaları istifadəsinin qarşısını alın."</string>
+    <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"Bəzi ekran funksiyaları istifadəsinin qarşısını almaq."</string>
   <string-array name="phoneTypes">
     <item msgid="8996339953292723951">"Ev"</item>
     <item msgid="7740243458912727194">"Mobil"</item>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Naməlum portret"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Naməlum mənzərə"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Ləğv edildi"</string>
@@ -1846,14 +1858,14 @@
     <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2-ci İş <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3-cü İş <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"Ayırmadan öncə PIN istənilsin"</string>
-    <string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"Ayırmadan öncə kilid modeli istənilsin"</string>
+    <string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"Qrafik açar istənilsin"</string>
     <string name="lock_to_app_unlock_password" msgid="9126722403506560473">"Ayırmadan öncə parol istənilsin"</string>
     <string name="package_installed_device_owner" msgid="7035926868974878525">"Admin tərəfindən quraşdırıldı"</string>
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Admin tərəfindən yeniləndi"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Admin tərəfindən silindi"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Enerjiyə Qənaət funksiyası Qaranlıq temanı aktiv edir və arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər funksiyaları məhdudlaşdırır və ya deaktiv edir\n\n"<annotation id="url">"Ətraflı məlumat"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Enerjiyə Qənaət funksiyası Qaranlıq temanı aktiv edir və arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər funksiyaları məhdudlaşdırır və ya deaktiv edir."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Enerjiyə Qənaət Qaranlıq temanı aktiv edir, arxa fondakı fəaliyyətlər, bəzi vizual effektlər və müəyyən funksiyaları məhdudlaşdırır və ya deaktiv edir.\n\n"<annotation id="url">"Ətraflı məlumat"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Enerjiyə Qənaət Qaranlıq temanı aktiv edir, arxa fondakı fəaliyyətlər, bəzi vizual effektlər və müəyyən funksiyaları məhdudlaşdırır və ya deaktiv edir."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Mobil interneti qənaətlə işlətmək məqsədilə Data Qanaəti bəzi tətbiqlərin fonda data göndərməsinin və qəbulunun qarşısını alır. Hazırda işlətdiyiniz tətbiq nisbətən az müntəzəmliklə data istifadə edə bilər. Örnək olaraq bu, o deməkdir ki, şəkil fayllarına toxunmadıqca onlar açılmayacaq."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Trafikə qənaət edilsin?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivləşdirin"</string>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Bu bildiriş Səssiz rejimə keçirilib. Rəy bildirmək üçün toxunun."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Bu bildiriş yuxarı sıraya keçirilib. Rəy bildirmək üçün toxunun."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Bu bildiriş aşağı sıraya keçirilib. Rəy bildirmək üçün toxunun."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Genişləndirilmiş bildirişləri sınayın"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Təklif olunan əməliyyatlar, cavablar və daha çoxunu almağa davam etmək üçün genişləndirilmiş bildirişləri aktiv edin. Android Adaptiv Bildirişləri artıq dəstəklənmir."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aktiv edin"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"İndi yox"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Ətraflı məlumat"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Genişləndirilmiş bildirişlər, kontakt adları və mesajlar kimi şəxsi məlumatlar daxil olmaqla bütün bildiriş məzmununu oxuya bilər. Bu funksiya həmçinin bildirişləri qapada və ya telefon zənglərinə cavab vermək kimi bildirişlərdəki düymələr üzərində əməliyyatlar edə bilər.\n\nBu funksiya həmçinin Prioritet rejimini aktiv və ya deaktiv edə və əlaqəli ayarları dəyişdirə bilər."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rejim üçün məlumat bildirişi"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batareya həmişəki vaxtdan əvvəl bitə bilər"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Enerjiyə Qənaət rejimi batareya istifadəsinin müddətini artırmaq üçün aktiv edilir"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 5a7e890..450470e 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1795,6 +1795,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1831,6 +1842,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Nepoznata veličina, uspravno"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Nepoznata veličina, vodoravno"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Otkazano je"</string>
@@ -1875,8 +1887,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao je administrator"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao je administrator"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Potvrdi"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizuelne efekte i funkcije, na primer, „Hej Google“.\n\n"<annotation id="url">"Saznajte više"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizuelne efekte i funkcije, na primer, „Hej Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizuelne efekte i određene funkcije.\n\n"<annotation id="url">"Saznajte više"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizuelne efekte i određene funkcije."</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">"Želite da uključite Uštedu podataka?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
@@ -2106,12 +2118,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ovo obaveštenje je degradirano u Nečujno. Dodirnite da biste naveli povratne informacije."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ovo obaveštenje je rangirano više. Dodirnite da biste naveli povratne informacije."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ovo obaveštenje je rangirano niže. Dodirnite da biste naveli povratne informacije."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Probajte poboljšana obaveštenja"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Uključite poboljšana obaveštenja da biste i dalje dobijali preporučene radnje, odgovore i drugo. Prilagodljiva obaveštenja za Android više nisu podržana."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Uključi"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ne sada"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Poboljšana obaveštenja"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Predložene radnje i odgovore sada dobijate pomoću poboljšanih obaveštenja. Prilagodljiva obaveštenja za Android više nisu podržana."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Potvrdi"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Poboljšana obaveštenja mogu da čitaju sadržaj svih obaveštenja, uključujući lične podatke, poput imena kontakata i poruka. Ova funkcija može i da odbacuje obaveštenja ili aktivira dugmad u obaveštenjima, poput javljanja na telefonske pozive.\n\nOva funkcija može i da uključi ili isključi Prioritetni režim i da menja povezana podešavanja."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Poboljšana obaveštenja su zamenila Android prilagodljiva obaveštenja u Android-u 12. Ova funkcija pokazuje predložene radnje i odgovore i organizuje obaveštenja.\n\nPoboljšana obaveštenja mogu da pristupaju sadržaju obaveštenja, uključujući lične informacije poput imena kontakata i poruka. Ova funkcija može i da odbacuje obaveštenja ili da odgovara na njih, na primer, da se javlja na telefonske pozive i kontroliše režim Ne uznemiravaj."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obaveštenje o informacijama Rutinskog režima"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija će se možda isprazniti pre uobičajenog punjenja"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Ušteda baterije je aktivirana da bi se produžilo trajanje baterije"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index bdfab40..f117799 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Невядомы (кніжная арыентацыя)"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Невядомы (альбомная арыентацыя)"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Скасавана"</string>
@@ -1898,8 +1910,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="7963058670863485450">"У рэжыме эканоміі зараду ўключаецца цёмная тэма і абмяжоўваюцца ці выключаюцца дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і функцыі, напрыклад \"Ok Google\"\n\n"<annotation id="url">"Даведацца больш"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"У рэжыме эканоміі зараду ўключаецца цёмная тэма і абмяжоўваюцца ці выключаюцца дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і функцыі, напрыклад \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"У рэжыме эканоміі зараду ўключаецца цёмная тэма і выключаюцца ці абмяжоўваюцца дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і пэўныя функцыі.\n\n"<annotation id="url">"Даведацца больш"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"У рэжыме эканоміі зараду ўключаецца цёмная тэма і выключаюцца ці абмяжоўваюцца дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і пэўныя функцыі."</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>
@@ -1991,8 +2003,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Адказаць"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Відэа"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Адхіліць"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Завяршыць"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Уваходны выклік"</string>
@@ -2140,12 +2151,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Гэта апавяшчэнне пераведзена ў рэжым \"Без гуку\". Націсніце тут і дайце водгук."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Гэта апавяшчэнне ацэнена як важнае. Націсніце тут і дайце водгук."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Гэта апавяшчэнне ацэнена як няважнае. Націсніце тут і дайце водгук."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Палепшаныя апавяшчэнні"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Каб і далей атрымліваць прапановы дзеянняў, адказаў і іншага змесціва, уключыце палепшаныя апавяшчэнні. Адаптыўныя апавяшчэнні Android больш не падтрымліваюцца."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Уключыць"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Не зараз"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Даведацца больш"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Палепшаныя апавяшчэнні маюць доступ да змесціва ўсіх апавяшчэнняў, у тым ліку да асабістай інфармацыі – імён кантактаў і паведамленняў. Гэта функцыя таксама можа адхіляць апавяшчэнні ці актываваць у іх кнопкі дзеянняў, у тым ліку адказваць на тэлефонныя выклікі.\n\nГэта функцыя можа ўключаць і выключаць прыярытэтны рэжым, а таксама змяняць звязаныя налады."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Апавяшчэнне з інфармацыяй пра ўсталяваны рэжым"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Акумулятар можа разрадзіцца хутчэй, чым прыйдзе час звычайнай зарадкі"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Каб павялічыць тэрмін работы акумулятара, уключаны рэжым эканоміі зараду"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 5b8a81c..307f4ab 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Неизвестен вертикален формат"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Неизвестен хоризонтален формат"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Анулирано"</string>
@@ -1852,10 +1864,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="7963058670863485450">"Режимът за запазване на батерията включва тъмната тема и ограничава или изключва активността на заден план, някои визуални ефекти и различни функции, като например „Ok Google“.\n\n"<annotation id="url">"Научете повече"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Режимът за запазване на батерията включва тъмната тема и ограничава или изключва активността на заден план, някои визуални ефекти и различни функции, като например „Ok Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Режимът за запазване на батерията включва тъмната тема и ограничава или изключва активността на заден план, някои визуални ефекти и определени функции.\n\n"<annotation id="url">"Научете повече"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Режимът за запазване на батерията включва тъмната тема и ограничава или изключва активността на заден план, някои визуални ефекти и определени функции."</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>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Това известие бе понижено до беззвучно. Докоснете, за да изпратите отзиви."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Това известие бе класирано по-високо. Докоснете, за да изпратите отзиви."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Това известие бе класирано по-ниско. Докоснете, за да изпратите отзиви."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Изпробвайте подобрен. известия"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"За да продължите да получавате предложени действия, отговори и др., включете функцията за подобрени известия. Адаптивните известия за Android вече не се поддържат."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Включване"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Не сега"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Подобрени известия"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Предложените действия и отговори вече се предоставят от функцията за подобрени известия. Адаптивните известия за Android вече не се поддържат."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Изключване"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Научете повече"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Функцията за подобрени известия може да чете цялото съдържание в дадено известие, включително личната информация, като например имената на контактите и текстовите съобщения. Тя има възможност да отхвърля известията или да предприема действия по бутоните в тях, като например приемане на телефонни обаждания.\n\nСъщо така функцията може да включва или изключва приоритетния режим и да променя сродни настройки."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Адаптивните известия бяха заменени от функцията за подобрени известия в Android 12. Тя показва предложени действия и отговори и организира известията ви.\n\nФункцията може да осъществява достъп до съдържанието в известията, включително личната информация, като например имената на контактите и текстовите съобщения. Тя има възможност да отхвърля известията или да предприема действия в тях, като например приемане на телефонни обаждания или контролиране на режима „Не безпокойте“."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Известие с информация за режима на поредица"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батерията може да се изтощи преди обичайното зареждане"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Режимът за запазване на батерията е активиран с цел удължаване на живота на батерията"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 57f2157..d41bcb9 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -307,7 +307,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">"Calendar"</string>
+    <string name="permgrouplab_calendar" msgid="6426860926123033230">"ক্যালেন্ডার"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"এসএমএসগুলি পাঠাতে এবং দেখতে"</string>
@@ -1622,7 +1622,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>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"অজানা পোর্ট্রেট"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"অজানা ল্যান্ডস্কেপ"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"বাতিল করা হয়েছে"</string>
@@ -1852,8 +1865,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="7963058670863485450">"ব্যাটারি সেভার ডার্ক থিম চালু করে এবং ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট এবং “Ok Google”-এর মতো ফিচার সীমিত করে বা বন্ধ করে দেয়\n\n"<annotation id="url">"আরও জানুন"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"ব্যাটারি সেভার ডার্ক থিম চালু করে এবং ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট এবং “Ok Google”-এর মতো ফিচার সীমিত করে বা বন্ধ করে দেয়।"</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"উত্তর"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ভিডিও"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"বাতিল করুন"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"কল কেটে দেওয়া"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ইনকামিং কল"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"এই বিজ্ঞপ্তির গুরুত্ব কমিয়ে মিউট হিসেবে সেট করা হয়েছে। মতামত জানাতে ট্যাপ করুন।"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"এই বিজ্ঞপ্তির গুরুত্ব বাড়ানো হয়েছে। মতামত জানাতে ট্যাপ করুন।"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"এই বিজ্ঞপ্তির গুরুত্ব কমানো হয়েছে। মতামত জানাতে ট্যাপ করুন।"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"উন্নত নোটিফিকেশন ব্যবহার করুন"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"সাজেস্ট করা অ্যাকশন, উত্তর এবং আরও অনেক কিছু পাওয়া চালিয়ে যেতে, উন্নত নোটিফিকেশন পাওয়ার সুবিধা চালু করুন। Android অ্যাডাপ্টিভ নোটিফিকেশন আর কাজ করবে না।"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"চালু করুন"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"এখন নয়"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"আরও জানুন"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"উন্নত নোটিফিকেশন পরিচিতির নাম এবং মেসেজের মতো ব্যক্তিগত তথ্য ছাড়াও নোটিফিকেশনের সবকটি কন্টেন্ট পড়তে পারবে। এছাড়াও, এই ফিচার নোটিফিকেশন বাতিল করতে পারবে এবং নোটিফিকেশনে থাকা বোতামের সাহায্যে অ্যাকশন নিতে পারবে, যেমন ফোন কলের উত্তর দেওয়া।\n\nএই ফিচার প্রায়োরিটি মোড চালু বা বন্ধ করতে এবং সেই সম্পর্কিত সেটিংস পরিবর্তনও করতে পারবে।"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"রুটিন মোডের তথ্য সংক্রান্ত বিজ্ঞপ্তি"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"সাধারণত যখন চার্জ দেন, তার আগে চার্জ শেষ হয়ে যেতে পারে"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ডিভাইস বেশিক্ষণ চালু রাখতে ব্যাটারি সেভার চালু করা হয়েছে"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 195b8f7..c776cac 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1795,6 +1795,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1831,6 +1842,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Neodređeni uspravni format"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Neodređeni vodoravni format"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Otkazano"</string>
@@ -1875,8 +1887,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao je vaš administrator"</string>
     <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="7963058670863485450">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnosti u pozadini, određene vizuelne efekte i funkcije kao što je \"Ok Google\"\n\n"<annotation id="url">"Saznajte više"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnosti u pozadini, određene vizuelne efekte i funkcije kao što je \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnost u pozadini, određene vizuelne efekte i neke funkcije.\n\n"<annotation id="url">"Saznajte više"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Ušteda baterije uključuje Tamnu temu i ograničava ili isključuje aktivnost u pozadini, određene vizuelne efekte i neke funkcije."</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>
@@ -1960,7 +1972,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Zatvori"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Odgovori"</string>
-    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Videozapis"</string>
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Odbaci"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Prekini vezu"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Dolazni poziv"</string>
@@ -2106,12 +2118,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Značaj ovog obavještenja je umanjen na Nečujno. Dodirnite da pošaljete povratne informacije."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Značaj ovog obavještenja je povećan. Dodirnite da pošaljete povratne informacije."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Značaj ovog obavještenja je umanjen. Dodirnite da pošaljete povratne informacije."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Probajte poboljšana obavještenja"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Da nastavite primati prijedloge radnji, odgovore i još mnogo toga, uključite poboljšana obavještenja. Prilagodljiva obavještenja Androida više nisu podržana."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Uključi"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ne sada"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Poboljšana obavještenja"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Poboljšana obavještenja sada pružaju predložene radnje i odgovore. Prilagodljiva obavještenja Androida više nisu podržana."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Uredu"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Poboljšana obavještenja mogu čitati sav sadržaj obavještenja, uključujući lične informacije kao što su imena kontakata i poruke. Ova funkcija također može odbaciti obavještenja ili poduzeti radnje vezane za dugmad u obavještenjima, kao što je javljanje na telefonske pozive.\n\nOva funkcija također može uključiti ili isključiti način rada Prioriteti i promijeniti srodne postavke."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Poboljšana obavještenja su zamijenila Prilagodljiva obavještenja Androida u verziji Android 12. Ova funkcija prikazuje predložene radnje i odgovore te organizira vaša obavještenja.\n\nPoboljšana obavještenja mogu pristupiti sadržaju obavještenja, uključujući lične informacije kao što su imena kontakata i poruke. Ova funkcija također može odbacivati obavještenja ili odgovarati na njih, npr. može odgovarati na telefonske pozive i kontrolirati funkciju Ne ometaj."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještenje za informacije Rutinskog načina"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Moguće je da će se baterija isprazniti prije uobičajenog punjenja"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Ušteda baterije je aktivirana da bi se produžio vijek trajanja baterije"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 7fd2ede..a581de6 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1268,8 +1268,8 @@
     <string name="new_app_description" msgid="1958903080400806644">"<xliff:g id="OLD_APP">%1$s</xliff:g> es tancarà sense desar els canvis"</string>
     <string name="dump_heap_notification" msgid="5316644945404825032">"<xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de memòria"</string>
     <string name="dump_heap_ready_notification" msgid="2302452262927390268">"L\'abocament de memòria en monticle del procés <xliff:g id="PROC">%1$s</xliff:g> ja està a punt"</string>
-    <string name="dump_heap_notification_detail" msgid="8431586843001054050">"S\'ha recopilat un procés \"heap dump\". Toca per compartir-lo."</string>
-    <string name="dump_heap_title" msgid="4367128917229233901">"Vols compartir el \"heap dump\"?"</string>
+    <string name="dump_heap_notification_detail" msgid="8431586843001054050">"S\'ha recopilat un abocament de memòria en monticle. Toca per compartir-lo."</string>
+    <string name="dump_heap_title" msgid="4367128917229233901">"Vols compartir l\'abocament de memòria en monticle?"</string>
     <string name="dump_heap_text" msgid="1692649033835719336">"El procés <xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de memòria (<xliff:g id="SIZE">%2$s</xliff:g>). Hi ha un abocament de memòria en monticle disponible perquè el comparteixis amb el desenvolupador. Ves amb compte, ja que pot contenir informació personal a la qual el procés pot accedir."</string>
     <string name="dump_heap_system_text" msgid="6805155514925350849">"El procés <xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de memòria (<xliff:g id="SIZE">%2$s</xliff:g>). Hi ha un abocament de memòria en monticle disponible que pots compartir. Ves amb compte, ja que pot contenir informació personal sensible a la qual el procés pot accedir, com ara text que hagis introduït."</string>
     <string name="dump_heap_ready_text" msgid="5849618132123045516">"Hi ha un abocament de memòria en monticle del procés de <xliff:g id="PROC">%1$s</xliff:g> disponible que pots compartir. Ves amb compte, ja que pot contenir informació personal sensible a la qual el procés pot accedir, com ara text que hagis introduït."</string>
@@ -1621,7 +1621,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"Pantalla sense fil"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Emet"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Connexió al dispositiu"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Emet pantalla al dispositiu"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Emet la pantalla al dispositiu"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"S\'estan cercant dispositius…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Configuració"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Desconnecta"</string>
@@ -1695,7 +1695,7 @@
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"El control total és adequat per a les aplicacions que t\'ajuden amb l\'accessibilitat, però no per a la majoria de les aplicacions."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Veure i controlar la pantalla"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Pot llegir tot el contingut de la pantalla i mostrar contingut sobre altres aplicacions."</string>
-    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Mostra i duu a terme accions"</string>
+    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Mostrar i dur a terme accions"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Pot fer un seguiment de les teves interaccions amb una aplicació o un sensor de maquinari, i interaccionar amb aplicacions en nom teu."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Permet"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Denega"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quart"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foli"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Vertical desconegut"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Horitzontal desconegut"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancel·lada"</string>
@@ -1852,8 +1864,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="7963058670863485450">"Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals i funcions com \"Hey Google\".\n\n"<annotation id="url">"Més informació"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals i funcions com \"Hey Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals i determinades funcions.\n\n"<annotation id="url">"Més informació"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Estalvi de bateria activa el tema fosc i limita o desactiva l\'activitat en segon pla, alguns efectes visuals i determinades funcions."</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 l\'Economitzador de dades?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activa"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"El nivell d\'aquesta notificació s\'ha disminuït a Silenci. Toca per proporcionar suggeriments."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Aquesta notificació s\'ha classificat amb un nivell superior. Toca per proporcionar suggeriments."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Aquesta notificació s\'ha classificat amb un nivell inferior. Toca per proporcionar suggeriments."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Prova notificacions millorades"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Per continuar rebent accions suggerides, respostes i més, activa les notificacions millorades. Les notificacions adaptatives d\'Android ja no s\'admeten."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Activa"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ara no"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificacions millorades"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Ara, les accions i respostes suggerides les proporcionen les notificacions millorades. Les notificacions adaptatives d\'Android ja no s\'admeten."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"D\'acord"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactiva"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Més informació"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Les notificacions millorades poden llegir tot el contingut de les notificacions, inclosa la informació personal com els noms dels contactes i els missatges. Aquesta funció també pot ignorar les notificacions o fer accions amb els botons de les notificacions, com ara contestar a trucades.\n\nA més, pot activar i desactivar el mode Prioritat i canviar-ne la configuració."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Les notificacions millorades han substituït les notificacions adaptatives d\'Android a Android 12. Aquesta funció mostra les accions i respostes suggerides, i organitza les teves notificacions.\n\nLes notificacions millorades poden accedir al contingut de les notificacions, inclosa la informació personal com els noms dels contactes i els missatges. Aquesta funció també pot ignorar les notificacions o respondre-hi, com ara contestar trucades o controlar el mode No molestis."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificació d\'informació del mode de rutina"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"És possible que la bateria s\'esgoti abans de la càrrega habitual"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"S\'ha activat l\'estalvi de bateria per prolongar-ne la durada"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 0448954..c562a8f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Neznámý formát na výšku"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Neznámý formát na šířku"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Zrušeno"</string>
@@ -1898,8 +1910,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Aktualizováno administrátorem"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Smazáno administrátorem"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Spořič baterie zapne tmavý motiv a omezí nebo vypne aktivitu na pozadí, některé vizuální efekty a funkce jako „Ok Google“\n\n"<annotation id="url">"Další informace"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Spořič baterie zapne tmavý motiv a omezí nebo vypne aktivitu na pozadí, některé vizuální efekty a funkce jako „Ok Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Spořič baterie zapíná tmavý motiv a omezuje či vypíná aktivitu na pozadí, některé vizuální efekty a některé funkce.\n\n"<annotation id="url">"Další informace"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Spořič baterie zapíná tmavý motiv a omezuje či vypíná aktivitu na pozadí, některé vizuální efekty a některé funkce."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Z důvodu snížení využití dat brání spořič dat některým aplikacím v odesílání nebo příjmu dat na pozadí. Aplikace, kterou právě používáte, data přenášet může, ale může tak činit méně často. V důsledku toho se například obrázky nemusejí zobrazit, dokud na ně neklepnete."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnout Spořič dat?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnout"</string>
@@ -1991,8 +2003,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Zavřít"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Přijmout"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Odmítnout"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Zavěsit"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Příchozí hovor"</string>
@@ -2140,12 +2151,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Toto oznámení bylo ztlumeno. Po klepnutí můžete zadat zpětnou vazbu."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"U tohoto oznámení byla zvýšena priorita. Po klepnutí můžete zadat zpětnou vazbu."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"U tohoto oznámení byla snížena priorita. Po klepnutí můžete zadat zpětnou vazbu."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Vyzkoušejte vylepšená oznámení"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Pokud chcete dál dostávat návrhy akcí, odpovědí a další, zapněte vylepšená oznámení. Adaptivní oznámení systému Android už nejsou podporována."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Zapnout"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Teď ne"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Vylepšená oznámení"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Navrhované akce a odpovědi jsou teď poskytovány prostřednictvím vylepšených oznámení. Adaptivní oznámení systému Android už nejsou podporována."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Vypnout"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Další informace"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Vylepšená oznámení mohou číst veškerý obsah oznámení včetně osobních údajů, jako jsou jména kontaktů a obsah zpráv. Tato funkce také může zavírat oznámení nebo aktivovat tlačítka v oznámeních, například přijímat telefonické hovory.\n\nMůže také zapnout nebo vypnout prioritní režim a změnit související nastavení."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Adaptivní oznámení pro Android byla v systému Android 12 nahrazena vylepšenými oznámeními. Tato funkce ukazuje navrhované akce a odpovědi a uspořádává oznámení.\n\nVylepšená oznámení mají přístup k obsahu oznámení, včetně osobních údajů, jako jsou jména kontaktů a zprávy. Tato funkce také může zavírat oznámení nebo na ně odpovídat, například přijímat telefonní hovory a ovládat režim Nerušit."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informační oznámení režimu sledu činností"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterie se možná vybije před obvyklým časem nabití"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Byl aktivován spořič baterie za účelem prodloužení výdrže"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 55fcea3..9f4f5a0 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -321,8 +321,8 @@
     <string name="permgroupdesc_camera" msgid="7585150538459320326">"tage billeder og optage video"</string>
     <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Enheder i nærheden"</string>
     <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"finde og oprette forbindelse til enheder i nærheder"</string>
-    <string name="permgrouplab_calllog" msgid="7926834372073550288">"Opkaldslister"</string>
-    <string name="permgroupdesc_calllog" msgid="2026996642917801803">"læse og redigere opkaldslisten"</string>
+    <string name="permgrouplab_calllog" msgid="7926834372073550288">"Opkaldshistorik"</string>
+    <string name="permgroupdesc_calllog" msgid="2026996642917801803">"læse og redigere opkaldshistorik"</string>
     <string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string>
     <string name="permgroupdesc_phone" msgid="270048070781478204">"foretage og administrere telefonopkald"</string>
     <string name="permgrouplab_sensors" msgid="9134046949784064495">"Kropssensorer"</string>
@@ -363,10 +363,8 @@
     <string name="permdesc_receiveMms" msgid="958102423732219710">"Tillader, at appen kan modtage og behandle mms-beskeder. Det betyder, at appen kan overvåge eller slette de beskeder, der sendes til din enhed, uden at vise dem til dig."</string>
     <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"Videresend Cell Broadcast-meddelelser"</string>
     <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"Tillader, at appen bindes til Cell Broadcast-modulet, så Cell Broadcast-meddelelser kan videresendes, når de modtages. I nogle områder sendes der Cell Broadcast-underretninger for at advare dig om nødsituationer. Ondsindede apps kan forstyrre effektiviteten eller driften af din enhed, når den modtager en Cell Broadcast-meddelelse om en nødsituation."</string>
-    <!-- no translation found for permlab_manageOngoingCalls (281244770664231782) -->
-    <skip />
-    <!-- no translation found for permdesc_manageOngoingCalls (7003138133829915265) -->
-    <skip />
+    <string name="permlab_manageOngoingCalls" msgid="281244770664231782">"Administrere igangværende opkald"</string>
+    <string name="permdesc_manageOngoingCalls" msgid="7003138133829915265">"Giver appen tilladelse til at se oplysninger om igangværende opkald på din enhed og styre disse opkald."</string>
     <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"læse Cell Broadcast-meddelelser"</string>
     <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"Tillader, at appen læser Cell Broadcast-underretninger, der modtages af din enhed. I nogle områder sendes der Cell Broadcast-underretninger for at advare om nødsituationer. Ondsindede apps kan forstyrre ydelsen eller driften af ​din ​enhed, når der modtages en Cell Broadcast-meddelelse om en nødsituation."</string>
     <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"læse feeds, jeg abonnerer på"</string>
@@ -421,12 +419,12 @@
     <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"Tillader, at appen kan ændre data om de kontakter, der er gemt på din tablet. Denne tilladelse giver apps mulighed for at slette kontaktdata."</string>
     <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"Tillader, at appen kan ændre data om de kontakter, der er gemt på din Android TV-enhed. Denne tilladelse giver apps mulighed for at slette kontaktdata."</string>
     <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"Tillader, at appen kan ændre data om de kontakter, der er gemt på din telefon. Denne tilladelse giver apps mulighed for at slette kontaktdata."</string>
-    <string name="permlab_readCallLog" msgid="1739990210293505948">"læse opkaldsliste"</string>
+    <string name="permlab_readCallLog" msgid="1739990210293505948">"læse opkaldshistorik"</string>
     <string name="permdesc_readCallLog" msgid="8964770895425873433">"Denne app kan læse din opkaldshistorik."</string>
-    <string name="permlab_writeCallLog" msgid="670292975137658895">"skriv opkaldsliste"</string>
-    <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"Tillader, at appen ændrer din tablets opkaldsliste, f.eks. data om indgående og udgående opkald. Ondsindede apps kan bruge dette til at slette eller ændre din opkaldsliste."</string>
-    <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Tillader, at appen ændrer din Android TV-enheds opkaldsliste, bl.a. data om indgående og udgående opkald. Skadelige apps kan bruge dette til at rydde eller ændre din opkaldsliste."</string>
-    <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Tillader, at appen ændrer telefonens opkaldsliste, f.eks. data om indgående og udgående opkald. Ondsindede apps kan bruge dette til at slette eller ændre din opkaldsliste."</string>
+    <string name="permlab_writeCallLog" msgid="670292975137658895">"skriv opkaldshistorik"</string>
+    <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"Tillader, at appen ændrer din tablets opkaldshistorik, f.eks. data om indgående og udgående opkald. Ondsindede apps kan bruge dette til at slette eller ændre din opkaldshistorik."</string>
+    <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Tillader, at appen ændrer din Android TV-enheds opkaldshistorik, bl.a. data om indgående og udgående opkald. Skadelige apps kan bruge dette til at rydde eller ændre din opkaldshistorik."</string>
+    <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Tillader, at appen ændrer telefonens opkaldshistorik, f.eks. data om indgående og udgående opkald. Ondsindede apps kan bruge dette til at slette eller ændre din opkaldshistorik."</string>
     <string name="permlab_bodySensors" msgid="3411035315357380862">"få adgang til kropssensorer (f.eks. pulsmålere)"</string>
     <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Giver appen adgang til data fra sensorer, der overvåger din fysiske tilstand, f.eks. din puls."</string>
     <string name="permlab_readCalendar" msgid="6408654259475396200">"Læs kalenderbegivenheder og -info"</string>
@@ -1697,7 +1695,7 @@
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"Fuld kontrol er velegnet til apps, der hjælper dig med hjælpefunktioner, men ikke de fleste apps."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Se og styre skærm"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Den kan læse alt indhold på skærmen og vise indhold oven på andre apps."</string>
-    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Se og udfør handlinger"</string>
+    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Se og udføre handlinger"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Den kan spore dine interaktioner med en app eller en hardwaresensor og interagere med apps på dine vegne."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Tillad"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Afvis"</string>
@@ -1710,7 +1708,7 @@
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"Deaktiver genvej"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Brug genvej"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Ombytning af farver"</string>
-    <string name="color_correction_feature_name" msgid="3655077237805422597">"Korriger farve"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"Farvekorrigering"</string>
     <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Ekstra dæmpet belysning"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Lydstyrkeknapperne blev holdt nede. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> er aktiveret."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Lydstyrkeknapperne blev holdt nede. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> er deaktiveret."</string>
@@ -1775,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1811,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Ukendt stående format"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Ukendt liggende format"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Annulleret"</string>
@@ -1854,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Opdateret af din administrator"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Slettet af din administrator"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Batterisparefunktionen aktiverer Mørkt tema og deaktiverer eller begrænser aktivitet i baggrunden, visse visuelle effekter og funktioner som f.eks. \"Hey Google\"\n\n"<annotation id="url">"Få flere oplysninger"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Batterisparefunktionen aktiverer Mørkt tema og deaktiverer eller begrænser aktivitet i baggrunden, visse visuelle effekter og funktioner som f.eks. \"Hey Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Batterisparefunktion aktiverer Mørkt tema og begrænser eller deaktiverer aktivitet i baggrunden, nogle visuelle effekter og visse funktioner.\n\n"<annotation id="url">"Få flere oplysninger"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Batterisparefunktion aktiverer Mørkt tema og begrænser eller deaktiverer aktivitet i baggrunden, nogle visuelle effekter og visse funktioner."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Datasparefunktionen forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du aktivere Datasparefunktion?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivér"</string>
@@ -1931,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Luk"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Besvar"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Afvis"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Læg på"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Indgående opkald"</string>
@@ -2076,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Denne notifikation blev angivet som Lydløs. Tryk for at give feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Denne notifikation blev placeret højere. Tryk for at give feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Denne notifikation blev placeret lavere. Tryk for at give feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Prøv forbedrede notifikationer"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Aktivér forbedrede notifikationer for at fortsætte med at få forslag til handlinger, svar og meget mere. Tilpassede Android-notifikationer understøttes ikke længere."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aktivér"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ikke nu"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Få flere oplysninger"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Forbedrede notifikationer kan læse alt indhold i notifikationer, bl.a. personlige oplysninger som f.eks. beskeder og navne på kontakter. Denne funktion kan også afvise notifikationer eller aktivere knapper i notifikationer, herunder besvare opkald.\n\nDenne funktion kan også aktivere og deaktivere tilstanden Prioritet samt ændre relaterede indstillinger."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifikation med oplysninger om rutinetilstand"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Enheden løber muligvis tør for batteri, inden du normalt oplader den"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparefunktion er aktiveret for at forlænge batteritiden"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 7d42e1b..f14273b 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1692,7 +1692,7 @@
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"AUS"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> die vollständige Kontrolle über dein Gerät geben?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Wenn du <xliff:g id="SERVICE">%1$s</xliff:g> aktivierst, verwendet dein Gerät nicht die Displaysperre, um die Datenverschlüsselung zu verbessern."</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Die vollständige Kontrolle sollte nur für die Apps aktiviert werden, die dir den Zugang zu den App-Funktionen erleichtern. Das ist in der Regel nur ein kleiner Teil der Apps."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Die vollständige Kontrolle sollte nur für Apps aktiviert werden, die dir Zugang zu App-Funktionen erleichtern. Das ist in der Regel nur ein kleiner Teil der Apps."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Bildschirm aufrufen und steuern"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Die Funktion kann alle Inhalte auf dem Bildschirm lesen und diese Inhalte über andere Apps anzeigen."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Aktionen aufrufen und durchführen"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Unbekannt – Hochformat"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Unbekannt – Querformat"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Abgebrochen"</string>
@@ -1852,9 +1865,9 @@
     <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>
-    <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
     <skip />
-    <!-- no translation found for battery_saver_description (7695751399533397741) -->
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
     <skip />
     <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>
@@ -1931,8 +1944,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Schließen"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Annehmen"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Ablehnen"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Auflegen"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Eingehender Anruf"</string>
@@ -2076,17 +2088,16 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Diese Benachrichtigung wurde auf „Lautlos“ herabgestuft. Tippe, um Feedback zu geben."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Diese Benachrichtigung wurde hochgestuft. Tippe, um Feedback zu geben."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Diese Benachrichtigung wurde herabgestuft. Tippe, um Feedback zu geben."</string>
-    <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
-    <skip />
-    <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+    <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Weitere Informationen"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
     <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Infomitteilung zum Ablaufmodus"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Dein Akku könnte vor der gewöhnlichen Ladezeit leer sein"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 1612a7b..1defb40 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"Μ"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Άγνωστος κατακόρυφος προσανατολισμός"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Άγνωστος οριζόντιος προσανατολισμός"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Ακυρώθηκε"</string>
@@ -1852,8 +1864,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">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Η Εξοικονόμηση μπαταρίας ενεργοποιεί το Σκούρο θέμα και περιορίζει ή απενεργοποιεί τη δραστηριότητα στο παρασκήνιο, ορισμένα οπτικά εφέ και λειτουργίες όπως την εντολή \"Ok Google\"\n\n"<annotation id="url">"Μάθετε περισσότερα"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Η Εξοικονόμηση μπαταρίας ενεργοποιεί το Σκούρο θέμα και περιορίζει ή απενεργοποιεί τη δραστηριότητα στο παρασκήνιο, ορισμένα οπτικά εφέ και λειτουργίες όπως την εντολή \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Η Εξοικονόμηση μπαταρίας ενεργοποιεί το Σκούρο θέμα και περιορίζει ή απενεργοποιεί τη δραστηριότητα στο παρασκήνιο, ορισμένα οπτικά εφέ και συγκεκριμένες λειτουργίες.\n\n"<annotation id="url">"Μάθετε περισσότερα"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Η Εξοικονόμηση μπαταρίας ενεργοποιεί το Σκούρο θέμα και περιορίζει ή απενεργοποιεί τη δραστηριότητα στο παρασκήνιο, ορισμένα οπτικά εφέ και συγκεκριμένες λειτουργίες."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Απάντηση"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Βίντεο"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Απόρριψη"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Τερματισμός"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Εισερχόμενη κλήση"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Αυτή η ειδοποίηση υποβιβάστηκε στις Αθόρυβες. Πατήστε για να υποβάλετε σχόλια."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Αυτή η ειδοποίηση κατατάχθηκε ψηλότερα. Πατήστε για να υποβάλετε σχόλια."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Αυτή η ειδοποίηση κατατάχθηκε χαμηλότερα. Πατήστε για να υποβάλετε σχόλια."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Δοκιμή βελτιωμ. ειδοποιήσεων"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Για να συνεχίσετε να λαμβάνετε προτεινόμενες ενέργειες, απαντήσεις και άλλα, ενεργοποιήστε τις βελτιωμένες ειδοποιήσεις. Δεν υποστηρίζονται πλέον οι Προσαρμοστικές ειδοποιήσεις Android."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Ενεργοποίηση"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Όχι τώρα"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Βελτιωμένες ειδοποιήσεις"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Οι προτεινόμενες ενέργειες και απαντήσεις παρέχονται πλέον από βελτιωμένες ειδοποιήσεις. Δεν υποστηρίζονται πλέον οι Προσαρμοστικές ειδοποιήσεις Android."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ΟΚ"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Απενεργοποίηση"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Μάθετε περισσότερα"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Οι Βελτιωμένες ειδοποιήσεις έχουν τη δυνατότητα ανάγνωσης όλου του περιεχομένου ειδοποιήσεων, συμπεριλαμβανομένων των προσωπικών πληροφοριών, όπως ονομάτων επαφών και μηνυμάτων. Αυτή η λειτουργία έχει επίσης τη δυνατότητα παράβλεψης ειδοποιήσεων ή λήψης ενεργειών σε κουμπιά στις ειδοποιήσεις, όπως η απάντηση τηλεφωνικών κλήσεων.\n\nΕπίσης, έχει τη δυνατότητα ενεργοποίησης ή απενεργοποίησης της λειτουργίας Προτεραιότητας, καθώς και αλλαγής των σχετικών ρυθμίσεων."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Στο Android 12, οι Βελτιωμένες ειδοποιήσεις αντικατέστησαν τις Προσαρμοστικές ειδοποιήσεις Android. Αυτή η λειτουργία εμφανίζει προτεινόμενες ενέργειες και απαντήσεις και οργανώνει τις ειδοποιήσεις σας.\n\nΟι Βελτιωμένες ειδοποιήσεις μπορούν να αποκτήσουν πρόσβαση σε περιεχόμενο ειδοποιήσεων, συμπεριλαμβανομένων προσωπικών στοιχείων, όπως ονομάτων επαφών και μηνυμάτων. Αυτή η λειτουργία παρέχει επίσης τη δυνατότητα παράβλεψης ή απάντησης ειδοποιήσεων, όπως η απάντηση σε τηλεφωνικές κλήσεις και ο έλεγχος της λειτουργίας Μην ενοχλείτε."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ειδοποίηση πληροφοριών λειτουργίας Ρουτίνας"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Η μπαταρία μπορεί να εξαντληθεί πριν από τη συνηθισμένη φόρτιση"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Η Εξοικονόμηση μπαταρίας ενεργοποιήθηκε για την επέκταση της διάρκειας ζωής της μπαταρίας"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 9692781..f123c8e 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Unknown portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Unknown landscape"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelled"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'\n\n"<annotation id="url">"Learn more"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features.\n\n"<annotation id="url">"Learn more"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you\'re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Try enhanced notifications"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"To keep getting suggested actions, replies and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Turn on"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Not now"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Enhanced notifications"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Suggested actions and replies are now provided by enhanced notifications. Android adaptive notifications are no longer supported."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.\n\nThis feature can also turn Priority mode on or off and change related settings."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls and controlling Do Not Disturb."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2264,7 +2276,7 @@
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
     <string name="window_magnification_prompt_title" msgid="2876703640772778215">"New magnification settings"</string>
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
-    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
+    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in Settings"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
     <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
     <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index f41ab42..686bb39 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Unknown portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Unknown landscape"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelled"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'\n\n"<annotation id="url">"Learn more"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features.\n\n"<annotation id="url">"Learn more"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you\'re currently using can access data, but may do so less frequently. This may mean, for example, that images don\'t display until you tap them."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Try enhanced notifications"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"To keep getting suggested actions, replies and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Turn on"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Not now"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Enhanced notifications"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Suggested actions and replies are now provided by enhanced notifications. Android adaptive notifications are no longer supported."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.\n\nThis feature can also turn Priority mode on or off and change related settings."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls and controlling Do Not Disturb."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2264,7 +2276,7 @@
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
     <string name="window_magnification_prompt_title" msgid="2876703640772778215">"New magnification settings"</string>
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
-    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
+    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in Settings"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
     <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
     <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 098a936..c8728ad 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Unknown portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Unknown landscape"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelled"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'\n\n"<annotation id="url">"Learn more"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features.\n\n"<annotation id="url">"Learn more"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Try enhanced notifications"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"To keep getting suggested actions, replies and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Turn on"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Not now"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Enhanced notifications"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Suggested actions and replies are now provided by enhanced notifications. Android adaptive notifications are no longer supported."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.\n\nThis feature can also turn Priority mode on or off and change related settings."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls and controlling Do Not Disturb."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2264,7 +2276,7 @@
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
     <string name="window_magnification_prompt_title" msgid="2876703640772778215">"New magnification settings"</string>
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
-    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
+    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in Settings"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
     <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
     <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index a7e1f5f..4e71212 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Unknown portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Unknown landscape"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelled"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'\n\n"<annotation id="url">"Learn more"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and features like \'Hey Google\'."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features.\n\n"<annotation id="url">"Learn more"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects and certain features."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"This notification was demoted to silent. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"This notification was ranked higher. Tap to provide feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"This notification was ranked lower. Tap to provide feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Try enhanced notifications"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"To keep getting suggested actions, replies and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Turn on"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Not now"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Enhanced notifications"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Suggested actions and replies are now provided by enhanced notifications. Android adaptive notifications are no longer supported."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.\n\nThis feature can also turn Priority mode on or off and change related settings."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls and controlling Do Not Disturb."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2264,7 +2276,7 @@
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
     <string name="window_magnification_prompt_title" msgid="2876703640772778215">"New magnification settings"</string>
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"You can now magnify part of your screen"</string>
-    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in settings"</string>
+    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Turn on in Settings"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Dismiss"</string>
     <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Unblock device microphone"</string>
     <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Unblock device camera"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 2cdf5ba..e6887e9 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‎‎‎‎‎‎Monarch‎‏‎‎‏‎"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎Quarto‎‏‎‎‏‎"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎Foolscap‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‏‎‎ANSI C‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎ANSI D‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‎ANSI E‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎ANSI F‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎Arch A‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎Arch B‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎Arch C‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎Arch D‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎Arch E‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎Arch E1‎‏‎‎‏‎"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎Super B‎‏‎‎‏‎"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‎ROC 8K‎‏‎‎‏‎"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎ROC 16K‎‏‎‎‏‎"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎PRC 1‎‏‎‎‏‎"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎Kahu‎‏‎‎‏‎"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‎Kaku2‎‏‎‎‏‎"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‎You4‎‏‎‎‏‎"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎L‎‏‎‎‏‎"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‏‎Unknown portrait‎‏‎‎‏‎"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‎Unknown landscape‎‏‎‎‏‎"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎Cancelled‎‏‎‎‏‎"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‎Updated by your admin‎‏‎‎‏‎"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎Deleted by your admin‎‏‎‎‏‎"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎OK‎‏‎‎‏‎"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like “Hey Google”‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<annotation id="url">"‎‏‎‎‏‏‏‎Learn more‎‏‎‎‏‏‎"</annotation>"‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like “Hey Google”.‎‏‎‎‏‎"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‎Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and certain features.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<annotation id="url">"‎‏‎‎‏‏‏‎Learn more‎‏‎‎‏‏‎"</annotation>"‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‏‎‎Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and certain features.‎‏‎‎‏‎"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them.‎‏‎‎‏‎"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‎Turn on Data Saver?‎‏‎‎‏‎"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‎Turn on‎‏‎‎‏‎"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎This notification was demoted to Silent. Tap to provide feedback.‎‏‎‎‏‎"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎This notification was ranked higher. Tap to provide feedback.‎‏‎‎‏‎"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎This notification was ranked lower. Tap to provide feedback.‎‏‎‎‏‎"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎Try enhanced notifications‎‏‎‎‏‎"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎To keep getting suggested actions, replies, and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported.‎‏‎‎‏‎"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‏‎‎Turn on‎‏‎‎‏‎"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎Not now‎‏‎‎‏‎"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎Enhanced notifications‎‏‎‎‏‎"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎Suggested actions and replies are now provided by enhanced notifications. Android Adaptive Notifications are no longer supported.‎‏‎‎‏‎"</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎OK‎‏‎‎‏‎"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎Turn off‎‏‎‎‏‎"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎Learn more‎‏‎‎‏‎"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎This feature can also turn Priority mode on or off and change related settings.‎‏‎‎‏‎"</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎Enhanced notifications replaced Android Adaptive Notifications in Android 12. This feature shows suggested actions and replies, and organizes your notifications.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Enhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls and controlling Do Not Disturb.‎‏‎‎‏‎"</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎Routine Mode info notification‎‏‎‎‏‎"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎Battery may run out before usual charge‎‏‎‎‏‎"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎Battery Saver activated to extend battery life‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 6a1cddc..e25d927 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -266,7 +266,7 @@
     <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string>
     <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"El sonido está Desactivado"</string>
     <string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"El sonido está Activado"</string>
-    <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"Modo avión"</string>
+    <string name="global_actions_toggle_airplane_mode" msgid="6911684460146916206">"Modo de avión"</string>
     <string name="global_actions_airplane_mode_on_status" msgid="5508025516695361936">"El modo avión está Activado"</string>
     <string name="global_actions_airplane_mode_off_status" msgid="8522219771500505475">"El modo avión está Desactivado"</string>
     <string name="global_action_settings" msgid="4671878836947494217">"Configuración"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarca"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Cuartilla"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Folio"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Cualquier tamaño vertical"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Cualquier tamaño horizontal"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelada"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Tu administrador actualizó este paquete"</string>
     <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="7963058670863485450">"El Ahorro de batería activa el Tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Hey Google\"\n\n"<annotation id="url">"Más información"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"El Ahorro de batería activa el Tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Hey Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"El Ahorro de batería activa el Tema oscuro y desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones determinadas.\n\n"<annotation id="url">"Más información"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"El Ahorro de batería activa el Tema oscuro y desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones determinadas."</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificación descendió de a Silenciada. Presiona para enviar comentarios."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificación recibió una clasificación superior. Presiona para enviar comentarios."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificación recibió una clasificación inferior. Presiona para enviar comentarios."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Prueba las notif. mejoradas"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Activa las notificaciones mejoradas para seguir recibiendo acciones sugeridas, respuestas y mucho más. Ya no se admiten las notificaciones adaptables de Android."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Activar"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ahora no"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Más información"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Las notificaciones mejoradas pueden leer todo el contenido de notificaciones, incluido el que contenga información personal, como nombres de contactos y mensajes. Esta función también podrá descartar notificaciones o realizar acciones en botones de notificaciones, como responder llamadas.\n\nTambién puede activar o desactivar el Modo prioridad y cambiar la configuración relacionada."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación de información del modo de Rutinas"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Es posible que la batería se agote antes de la carga habitual"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Se activó el Ahorro de batería para extender la duración de la batería"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 62ecf65..a28553a 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1694,7 +1694,7 @@
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Si activas <xliff:g id="SERVICE">%1$s</xliff:g>, el dispositivo no utilizará el bloqueo de pantalla para mejorar el cifrado de datos."</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"El control total es adecuado para las aplicaciones de accesibilidad, pero no para la mayoría de las aplicaciones."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Ver y controlar la pantalla"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Puede leer todo el contenido de la pantalla y mostrar contenido sobre otras aplicaciones."</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Puede leer todo el contenido de la pantalla y mostrar contenido encima de otras aplicaciones."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Ver y realizar acciones"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Puede registrar tus interacciones con una aplicación o un sensor de hardware, así como interactuar con las aplicaciones en tu nombre."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Permitir"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Cualquier tamaño vertical"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Cualquier tamaño horizontal"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelado"</string>
@@ -1852,9 +1864,9 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizado por el administrador"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado por el administrador"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Ahorro de batería activa el tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales y funciones como \"Hey Google\"\n\n"<annotation id="url">"Más información"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Ahorro de batería activa el tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales y funciones como \"Hey Google\"."</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="battery_saver_description_with_learn_more" msgid="750683025714899363">"Ahorro de batería activa el tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales y ciertas funciones.\n\n"<annotation id="url">"Más información"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Ahorro de batería activa el tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales y ciertas funciones."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"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 que estés usando de forma 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">
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Cerrar"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Responder"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Vídeo"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Rechazar"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Colgar"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Llamada entrante"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"La importancia de esta notificación ha disminuido a Silencio. Toca para enviar comentarios."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificación aparecerá en una posición más alta. Toca para enviar comentarios."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificación aparecerá en una posición más baja. Toca para enviar comentarios."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Probar notificaciones mejoradas"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Para seguir recibiendo sugerencias de acciones, respuestas y más, activa las notificaciones mejoradas. Las notificaciones adaptativas de Android ya no están disponibles."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Activar"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ahora no"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Más información"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Las notificaciones mejoradas pueden leer todo el contenido de las notificaciones, incluidas las relacionadas con información personal, como nombres y mensajes de tus contactos. Esta función también puede cerrar notificaciones o utilizar los botones de las notificaciones, por ejemplo, para responder llamadas telefónicas.\n\nAdemás, puede activar o desactivar el modo Prioridad y cambiar ajustes relacionados con él."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación sobre el modo rutina"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Quizás 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>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 1e58aed..b464f93 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Tundmatu vertikaalpaigutuses"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Tundmatu horisontaalpaigutuses"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Tühistatud"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Administraator on seda värskendanud"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administraator on selle kustutanud"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Akusäästja lülitab sisse tumeda teema ning piirab taustategevusi, teatud visuaalseid efekte ja funktsioone, nagu „Ok Google“ (või lülitab need välja)\n\n"<annotation id="url">"Lisateave"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Akusäästja lülitab sisse tumeda teema ning piirab taustategevusi, teatud visuaalseid efekte ja funktsioone, nagu „Ok Google“ (või lülitab need välja)."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Akusäästja lülitab sisse tumeda teema ja lülitab välja taustategevused, mõned visuaalsed efektid ja teatud funktsioonid või piirab neid.\n\n"<annotation id="url">"Lisateave"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Akusäästja lülitab sisse tumeda teema ja lülitab välja taustategevused, mõned visuaalsed efektid ja teatud funktsioonid 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ülitada andmemahu säästja sisse?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Lülita sisse"</string>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Sellele märguandele määrati prioriteet Vaikne. Puudutage tagasiside andmiseks."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Sellele märguandele määrati kõrgem prioriteet. Puudutage tagasiside andmiseks."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Sellele märguandele määrati madalam prioriteet. Puudutage tagasiside andmiseks."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Proovige täiustatud märguandeid"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Soovitatud toimingute, vastuste ja muu nägemiseks ka edaspidi lülitage sisse täiustatud märguanded. Androidi kohanduvaid märguandeid enam ei toetata."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Lülita sisse"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Mitte praegu"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Lisateave"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Täiustatud märguanded saavad lugeda kogu märguande sisu, sh isiklikku teavet, nagu kontaktide nimed ja sõnumid. Samuti saab selle funktsiooniga märguannetest loobuda või märguannetes nuppude abil toiminguid teha (nt vastata telefonikõnedele).\n\nLisaks saab selle funktsiooniga sisse või välja lülitada režiimi Prioriteetne ja muuta seotud seadeid."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutiinirežiimi teabe märguanne"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Aku võib enne tavapärast laadimist tühjaks saada"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akusäästja aktiveeriti aku tööea pikendamiseks"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 3d2eda9..a6859ed 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1723,7 +1723,7 @@
     <string name="user_switched" msgid="7249833311585228097">"Erabiltzailea: <xliff:g id="NAME">%1$s</xliff:g>."</string>
     <string name="user_switching_message" msgid="1912993630661332336">"\"<xliff:g id="NAME">%1$s</xliff:g>\" erabiltzailera aldatzen…"</string>
     <string name="user_logging_out_message" msgid="7216437629179710359">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzailearen saioa amaitzen…"</string>
-    <string name="owner_name" msgid="8713560351570795743">"Jabea"</string>
+    <string name="owner_name" msgid="8713560351570795743">"Jabe"</string>
     <string name="error_message_title" msgid="4082495589294631966">"Errorea"</string>
     <string name="error_message_change_not_allowed" msgid="843159705042381454">"Administratzaileak ez du eman aldaketa egiteko baimena"</string>
     <string name="app_not_found" msgid="3429506115332341800">"Ez da ekintza gauza dezakeen aplikaziorik aurkitu"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch (AEB)"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto (AEB)"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap (AEB)"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K (Txina)"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K (Txina)"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1 (Txina)"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu (Japonia)"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2 (Japonia)"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4 (Japonia)"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Bertikal ezezaguna"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Horizontal ezezaguna"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Bertan behera utzi da"</string>
@@ -1852,8 +1864,8 @@
     <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="7963058670863485450">"Bateria-aurrezleak gai iluna aktibatzen du, eta murriztu edo desaktibatu 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="7695751399533397741">"Bateria-aurrezleak gai iluna aktibatzen du, eta murriztu edo desaktibatu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Bateria-aurrezleak gai iluna aktibatzen du, eta murriztu edo desaktibatu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta eginbide jakin batzuk.\n\n"<annotation id="url">"Lortu informazio gehiago"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Bateria-aurrezleak gai iluna aktibatzen du, eta murriztu edo desaktibatu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta eginbide jakin batzuk."</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 aplikazio batek datuak atzitu ahal izango ditu, 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>
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Itxi"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Erantzun"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Bideoa"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Baztertu"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Amaitu deia"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Jasotako deia"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Isilarazi da jakinarazpena. Sakatu hau oharrak bidaltzeko."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Mailaz igo da jakinarazpena. Sakatu hau oharrak bidaltzeko."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Mailaz jaitsi da jakinarazpena. Sakatu hau oharrak bidaltzeko."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Probatu jakinarazpen hobetuak"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Iradokitako ekintzak, erantzunak eta abar jasotzen jarraitzeko, aktibatu jakinarazpen hobetuak. Android-en jakinarazpen egokituak ez dira onartzen jada."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aktibatu"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Orain ez"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Jakinarazpen hobetuak"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Orain, jakinarazpen hobetuen bitartez iradokitzen dira ekintzak eta erantzunak. Android-eko jakinarazpen egokituak ez dira onartzen jada."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Ados"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desaktibatu"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Lortu informazio gehiago"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Jakinarazpen hobetuek jakinarazpenen eduki osoa irakur dezakete, informazio pertsonala barne (esaterako, kontaktuen izenak eta mezuak). Halaber, jakinarazpenak baztertu edo jakinarazpenetako botoiak erabil ditzake eginbideak; adibidez, telefono-deiak erantzun.\n\nHorretaz gain, lehentasunezko modua aktibatu edo desaktiba dezake, eta erlazionatutako ezarpenak aldatu."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Android 12n, jakinarazpen hobetuek ordeztu dituzte Android-eko jakinarazpen egokituak. Eginbide horrek, iradokitako ekintzak eta erantzunak erakutsi, eta zure jakinarazpenak antolatzen ditu.\n\nJakinarazpen hobetuek jakinarazpenen eduki osoa atzi dezakete, informazio pertsonala barne (esaterako, kontaktuen izenak eta mezuak). Halaber, jakinarazpenak baztertu edo haiei erantzun diezaieke eginbideak; adibidez, telefono-deiak erantzun eta ez molestatzeko modua kontrolatu."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ohitura moduaren informazio-jakinarazpena"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baliteke bateria ohi baino lehenago agortzea"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Bateria-aurrezlea aktibatuta dago bateriaren iraupena luzatzeko"</string>
@@ -2274,6 +2285,6 @@
     <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sentsoreen pribatutasuna"</string>
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Aplikazioaren ikonoa"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Aplikazioaren marka-irudia"</string>
-    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Begiratu sarbide-ezarpenak"</string>
+    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Egiaztatu sarbide-ezarpenak"</string>
     <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> zerbitzuak pantaila ikusi eta kontrola dezake. Sakatu berrikusteko."</string>
 </resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index ae3f79a..472ea61 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -542,10 +542,10 @@
     <string name="permdesc_bluetooth_advertise" product="default" msgid="6085174451034210183">"برنامه مجاز می‌شود در دستگاه‌های بلوتوث اطراف تبلیغ کند."</string>
     <string name="permlab_uwb_ranging" msgid="8141915781475770665">"مشخص کردن موقعیت نسبی بین دستگاه‌های باند فوق‌وسیع اطراف"</string>
     <string name="permdesc_uwb_ranging" msgid="2519723069604307055">"به برنامه اجازه داده می‌شود موقعیت نسبی بین دستگاه‌های باند فوق‌وسیع اطراف را مشخص کند"</string>
-    <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"‏اطلاعات ترجیحی سرویس پولی «ارتباط میدان نزدیک» (NFC)"</string>
-    <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"‏به برنامه اجازه می‌دهد اطلاعات ترجیحی سرویس پولی «ارتباط میدان نزدیک» (NFC)، مانند کمک‌های ثبت‌شده و مقصد مسیر را دریافت کند."</string>
+    <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"‏اطلاعات ترجیحی سرویس پولی NFC"</string>
+    <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"‏به برنامه اجازه می‌دهد اطلاعات ترجیحی سرویس پولی NFC، مانند کمک‌های ثبت‌شده و مقصد مسیر را دریافت کند."</string>
     <string name="permlab_nfc" msgid="1904455246837674977">"کنترل ارتباط راه نزدیک"</string>
-    <string name="permdesc_nfc" msgid="8352737680695296741">"‏به برنامه اجازه می‎دهد تا با تگ‌های «ارتباط میدان نزدیک» (NFC)، کارت‌ها و فایل‌خوان ارتباط برقرار کند."</string>
+    <string name="permdesc_nfc" msgid="8352737680695296741">"‏به برنامه اجازه می‎دهد تا با تگ‌های NFC، کارت‌ها و فایل‌خوان ارتباط برقرار کند."</string>
     <string name="permlab_disableKeyguard" msgid="3605253559020928505">"غیرفعال کردن قفل صفحه شما"</string>
     <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"به برنامه امکان می‌دهد قفل کلید و هر گونه امنیت گذرواژه مرتبط را غیرفعال کند. به‌عنوان مثال تلفن هنگام دریافت یک تماس تلفنی ورودی قفل کلید را غیرفعال می‌کند و بعد از پایان تماس، قفل کلید را دوباره فعال می‌کند."</string>
     <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"درخواست پیچیدگی قفل صفحه"</string>
@@ -712,7 +712,7 @@
     <string name="permlab_removeDrmCertificates" msgid="710576248717404416">"‏حذف گواهی‌های DRM"</string>
     <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"‏به برنامه امکان می‌دهد گواهی‌های DRM را حذف کند. نباید برای برنامه‌های عادی هیچ‌وقت لازم باشد."</string>
     <string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"مقید به سرویس پیام‌رسانی شرکت مخابراتی"</string>
-    <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"به کنترل‌کننده اجازه می‌دهد که به سطح بالای رابط کاربر سرویس پیام‌رسانی شرکت مخابراتی مقید شود. هرگز نباید برای برنامه‌های عادی مورد نیاز شود."</string>
+    <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"به کنترل‌کننده اجازه می‌دهد که به سطح بالای میانای کاربر سرویس پیام‌رسانی شرکت مخابراتی مقید شود. هرگز نباید برای برنامه‌های عادی مورد نیاز شود."</string>
     <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"اتصال به سرویس‌های شرکت مخابراتی"</string>
     <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"به دارنده امکان می‌دهد به سرویس‌های شرکت مخابراتی متصل شود. هرگز نباید برای برنامه‌های عادی مورد نیاز باشد."</string>
     <string name="permlab_access_notification_policy" msgid="5524112842876975537">"دسترسی به حالت «مزاحم نشوید»"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"بزرگ"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"عمودی نامشخص"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"افقی نامشخص"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"لغو شد"</string>
@@ -1852,8 +1864,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="7963058670863485450">"‏«بهینه‌سازی باتری» «طرح زمینه تیره» را روشن می‌کند و فعالیت پس‌زمینه، برخی از جلوه‌های بصری، و ویژگی‌هایی مثل «Ok Google» را محدود یا خاموش می‌کند.\n\n"<annotation id="url">"بیشتر بدانید"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"‏«بهینه‌سازی باتری» «طرح زمینه تیره» را روشن می‌کند و فعالیت پس‌زمینه، برخی از جلوه‌های بصری، و ویژگی‌هایی مثل «Ok Google» را محدود یا خاموش می‌کند."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"«بهینه‌سازی باتری» «طرح زمینه تیره» را روشن می‌کند و فعالیت پس‌زمینه، برخی از جلوه‌های بصری، و ویژگی‌هایی خاص را محدود یا خاموش می‌کند.\n\n"<annotation id="url">"بیشتر بدانید"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"«بهینه‌سازی باتری» «طرح زمینه تیره» را روشن می‌کند و فعالیت پس‌زمینه، برخی از جلوه‌های بصری، و ویژگی‌هایی خاص را محدود یا خاموش می‌کند."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"پاسخ"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ویدیو"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"رد کردن"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"قطع تماس"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"تماس ورودی"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"این اعلان به «بی‌صدا» تنزل داده شد. برای ارائه بازخورد، ضربه بزنید."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"این اعلان در رتبه بالاتری قرار گرفت. برای ارائه بازخورد، ضربه بزنید."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"این اعلان در رتبه پایین‌تری قرار گرفت. برای ارائه بازخورد، ضربه بزنید."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"امتحان کردن اعلان‌های بهبودیافته"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"‏برای اینکه پاسخ‌ها و کنش‌های پیشنهادی و موارد دیگر را همچنان دریافت کنید، اعلان‌های بهبودیافته را روشن کنید. از «اعلان‌های تطبیقی Android» دیگر پشتیبانی نمی‌شود."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"روشن کردن"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"الآن نه"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"اعلان‌های بهبودیافته"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"‏اکنون پاسخ‌ها و کنش‌های پیشنهادی ازطریق اعلان‌های بهبودیافته ارائه می‌شوند. «اعلان‌های تطبیقی Android» دیگر پشتیبانی نمی‌شوند."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"تأیید"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"خاموش کردن"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"بیشتر بدانید"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"اعلان‌های بهبودیافته می‌تواند محتوای همه اعلان‌ها، ازجمله اطلاعات شخصی مثل نام مخاطبین و پیام‌ها را بخواند. این ویژگی همچنین می‌تواند اعلان‌ها را ببندد یا بااستفاده از دکمه‌های موجود در اعلان‌ها اقداماتی انجام دهد، مثلاً به تماس‌های تلفنی پاسخ دهد.\n\nبه‌علاوه، این ویژگی می‌تواند «حالت اولویت» را روشن یا خاموش کند و تنظیمات مربوطه را تغییر دهد."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"‏در Android نسخه ۱۲، اعلان‌های بهبودیافته جایگزین «اعلان‌های تطبیقی» شده است. این ویژگی پاسخ‌ها و کنش‌های پیشنهادی را نمایش می‌دهد و اعلان‌هایتان را سازمان‌دهی می‌کند.\n\nاعلان‌های بهبودیافته می‌توانند به محتوای اعلان، ازجمله اطلاعات شخصی مثل نام‌ها و پیام‌های مخاطبین دسترسی داشته باشند. این ویژگی همچنین می‌تواند اعلان‌ها را رد کند یا به آن‌ها پاسخ دهد؛ مثلاً پاسخ به تماس‌های تلفنی و کنترل کردن «مزاحم نشوید»."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"اعلان اطلاعات حالت روال معمول"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ممکن است شارژ باتری قبل از شارژ معمول تمام شود"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"جهت افزایش عمر باتری، «بهینه‌سازی باتری» فعال شد"</string>
@@ -2263,7 +2274,7 @@
     <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
     <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
-    <string name="window_magnification_prompt_title" msgid="2876703640772778215">"تنظیمات درشت‌نمایی جدید"</string>
+    <string name="window_magnification_prompt_title" msgid="2876703640772778215">"تنظیمات جدید درشت‌نمایی"</string>
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"اکنون می‌توانید بخشی از صفحه را درشت‌نمایی کنید"</string>
     <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"روشن کردن در «تنظیمات»"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"رد شدن"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 7e6cb56..c51bd26 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch (184 mm x 267 mm)"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto (203 mm x 254 mm)"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap (203 mm x 330 mm)"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K (270 mm x 390 mm)"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K (195 mm x 270 mm)"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1 (102 mm x 165 mm)"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu (240 mm x 322,1 mm)"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2 (240 mm x 332 mm)"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4 (105 mm x 235 mm)"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Tuntematon pystykoko"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Tuntematon vaakakoko"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Peruutettu"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Järjestelmänvalvoja päivitti tämän."</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Järjestelmänvalvoja poisti tämän."</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Virransäästö laittaa tumman teeman päälle ja rajoittaa tai laittaa pois päältä taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Ok Google).\n\n"<annotation id="url">"Lue lisää"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Virransäästö laittaa tumman teeman päälle ja rajoittaa tai laittaa pois päältä taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Ok Google)."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Virransäästö laittaa tumman teeman päälle ja laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja tiettyjä muita ominaisuuksia.\n\n"<annotation id="url">"Lue lisää"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Virransäästö laittaa tumman teeman päälle ja laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja tiettyjä muita ominaisuuksia."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Data Saver estää joitakin sovelluksia lähettämästä tai vastaanottamasta tietoja taustalla, jotta datan käyttöä voidaan vähentää. Käytössäsi oleva sovellus voi yhä käyttää dataa, mutta se saattaa tehdä niin tavallista harvemmin. Tämä voi tarkoittaa esimerkiksi sitä, että kuva ladataan vasta, kun kosketat sitä."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Otetaanko Data Saver käyttöön?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ota käyttöön"</string>
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Sulje"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Vastaa"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Hylkää"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Lopeta puhelu"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Saapuva puhelu"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Tämä ilmoitus hiljennettiin. Lähetä palautetta napauttamalla."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Tämän ilmoituksen tasoa nostettiin. Lähetä palautetta napauttamalla."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Tämän ilmoituksen tasoa laskettiin. Lähetä palautetta napauttamalla."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Kokeile parann. ilmoituksia"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Jos haluat jatkossakin saada ehdotuksia toiminnoista, vastauksista ja muista, laita parannetut ilmoitukset päälle. Androidin mukautuvia ilmoituksia ei enää tueta."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Laita päälle"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ei nyt"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Parannetut ilmoitukset"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Parannetut ehdotukset tarjoavat nyt toiminto- ja vastausehdotuksia. Androidin mukautuvia ilmoituksia ei enää tueta."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Laita pois päältä"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Lue lisää"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Parannetut ilmoitukset voivat lukea kaikkea ilmoitussisältöä, myös henkilökohtaisia tietoja (esim. kontaktien nimet ja viestit). Ominaisuus voi myös ohittaa ilmoituksia tai käyttää niiden toimintopainikkeita, esim. vastata puheluihin.\n\nLisäksi ominaisuus voi laittaa Tärkeät-tilan päälle tai pois päältä ja muuttaa siihen liittyviä asetuksia."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Parannetut ilmoitukset korvasivat Androidin mukautuvat ilmoitukset Android 12:ssa. Tämä ominaisuus näyttää toiminto- ja vastausehdotuksia ja järjestää ilmoituksesi.\n\nParannetuilla ilmoituksilla on pääsy kaikkeen ilmoitussisältöön, myös henkilökohtaisiin tietoihin (esim. kontaktien nimet ja viestit). Tämä ominaisuus voi myös ohittaa ilmoituksia tai vastata niihin, esim. vastata puheluihin ja ohjata Älä häiritse ‑tilaa."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ohjelmatilan tietoilmoitus"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akku saattaa loppua ennen normaalia latausaikaa"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Virransäästö otettu käyttöön akunkeston pidentämiseksi"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 3d22748..886c613 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarque"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"In-quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Taille inconnue au format portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Taille inconnue au format paysage"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Annulé"</string>
@@ -1852,8 +1864,8 @@
     <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="7963058670863485450">"La fonctionnalité Économiseur de pile active le mode sombre et limite ou désactive l\'activité en arrière-plan, certains effets visuels et certaines fonctionnalités, comme « Ok Google »\n\n"<annotation id="url">"En savoir plus"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"La fonctionnalité Économiseur de pile active le mode sombre et limite ou désactive l\'activité en arrière-plan, certains effets visuels et certaines fonctionnalités, comme « Ok Google »."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"La fonctionnalité Économiseur de pile active le thème sombre et limite ou désactive l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités.\n\n"<annotation id="url">"En savoir plus"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"La fonctionnalité Économiseur de pile active le thème sombre et limite ou désactive l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités."</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Cette notification a été rétrogradée à Silencieuse. Touchez pour envoyer des commentaires."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Cette notification a été élevée d\'un niveau. Touchez pour envoyer des commentaires."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Cette notification a été abaissée d\'un niveau. Touchez pour envoyer des commentaires."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Essayer les notif. améliorées"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Pour continuer de recevoir des suggestions d\'actions, de réponses et plus encore, activez les notifications améliorées. Les notifications adaptatives Android ne sont plus prises en charge."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Activer"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Plus tard"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"En savoir plus"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Les notifications améliorées peuvent lire le contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou effectuer des actions sur les boutons dans les notifications, comme répondre aux appels entrants.\n\nElle peut aussi activer et désactiver le mode Prioritaire et modifier les paramètres connexes."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification d\'information du mode Routine"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"La pile pourrait s\'épuiser avant la charge habituelle"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Le mode Économiseur de pile est activé afin de prolonger l\'autonomie"</string>
@@ -2263,7 +2280,7 @@
     <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
     <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Nouveaux paramètres d\'agrandissement"</string>
-    <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Vous pouvez agrandir une partie votre écran."</string>
+    <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Vous pouvez désormais agrandir une partie de votre écran."</string>
     <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Activer dans les paramètres"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Fermer"</string>
     <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Débloquer le microphone de l\'appareil"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 5f762ff..9524cd5 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Taille inconnue au format portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Taille inconnue au format paysage"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Tâche annulée."</string>
@@ -1842,7 +1855,7 @@
     <string name="select_day" msgid="2060371240117403147">"Sélectionner un mois et un jour"</string>
     <string name="select_year" msgid="1868350712095595393">"Sélectionner une année"</string>
     <string name="deleted_key" msgid="9130083334943364001">"\"<xliff:g id="KEY">%1$s</xliff:g>\" supprimé"</string>
-    <string name="managed_profile_label_badge" msgid="6762559569999499495">"<xliff:g id="LABEL">%1$s</xliff:g> (travail)"</string>
+    <string name="managed_profile_label_badge" msgid="6762559569999499495">"<xliff:g id="LABEL">%1$s</xliff:g> (pro)"</string>
     <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2e <xliff:g id="LABEL">%1$s</xliff:g> professionnelle"</string>
     <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3e <xliff:g id="LABEL">%1$s</xliff:g> professionnelle"</string>
     <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"Demander le code avant d\'annuler l\'épinglage"</string>
@@ -1852,9 +1865,11 @@
     <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="7963058670863485450">"L\'économiseur de batterie active le thème sombre et limite ou désactive les activités 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="7695751399533397741">"L\'économiseur de batterie active le thème sombre et limite ou désactive les activités en arrière-plan, certains effets visuels et d\'autres fonctionnalités comme \"Hey 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>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
+    <string name="data_saver_description" msgid="4995164271550590517">"Pour réduire la consommation des données, l\'Économiseur de données empêche certaines applis d\'envoyer ou de recevoir des données en arrière-plan. Les applis que vous utiliserez pourront toujours accéder aux données, mais le feront moins fréquemment. Par exemple, les images pourront ne pas s\'afficher tant que vous n\'aurez pas appuyé 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>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1929,8 +1944,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Fermer"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Répondre"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Vidéo"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Refuser"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Raccrocher"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Appel entrant"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Cette notification a été abaissée à la catégorie \"Silencieux\". Appuyez ici pour donner votre avis."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Cette notification a été élevée d\'un niveau. Appuyez ici pour donner votre avis."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Cette notification a été abaissée d\'un niveau. Appuyez ici pour donner votre avis."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Testez les notifications améliorées"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Activez les notifications améliorées pour continuer à recevoir des suggestions d\'actions, de réponses et plus encore. Les notifications intelligentes Android ne sont plus disponibles."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Activer"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Pas maintenant"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"En savoir plus"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Les notifications améliorées peuvent lire tout le contenu des notifications, y compris des informations personnelles comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou effectuer des actions grâce aux boutons figurant dans ces notifications, par exemple répondre aux appels téléphoniques.\n\nElle peut aussi activer ou désactiver le mode Prioritaire et modifier les paramètres associés."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification d\'information du mode Routine"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Vous risquez d\'être à court de batterie plus tôt que prévu"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Économiseur de batterie activé pour prolonger l\'autonomie"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 12bb42d..13cbdb3 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -307,7 +307,7 @@
     <string name="permgroupdesc_contacts" msgid="9163927941244182567">"acceder aos teus contactos"</string>
     <string name="permgrouplab_location" msgid="1858277002233964394">"Localización"</string>
     <string name="permgroupdesc_location" msgid="1995955142118450685">"acceder á localización deste dispositivo"</string>
-    <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendar"</string>
+    <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendario"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"acceder ao teu calendario"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"enviar e consultar mensaxes de SMS"</string>
@@ -425,7 +425,7 @@
     <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"Permite á aplicación modificar o rexistro de chamadas da tableta, incluídos os datos acerca de chamadas entrantes e saíntes. É posible que aplicacións maliciosas utilicen esta acción para borrar ou modificar o teu rexistro de chamadas."</string>
     <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite que a aplicación modifique o rexistro de chamadas do dispositivo Android TV, incluídos os datos acerca de chamadas entrantes e saíntes. As aplicacións maliciosas poden utilizar este permiso para borrar ou modificar o rexistro de chamadas."</string>
     <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite á aplicación modificar o rexistro de chamadas do teléfono, incluídos os datos acerca de chamadas entrantes e saíntes. É posible que aplicacións maliciosas utilicen esta acción para borrar ou modificar o teu rexistro de chamadas."</string>
-    <string name="permlab_bodySensors" msgid="3411035315357380862">"acceder a sensores do corpo (como monitores de ritmo cardíaco)"</string>
+    <string name="permlab_bodySensors" msgid="3411035315357380862">"acceder a sensores corporais (como monitores de ritmo cardíaco)"</string>
     <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite que a aplicación acceda aos datos dos sensores que controlan o teu estado físico, como o ritmo cardíaco."</string>
     <string name="permlab_readCalendar" msgid="6408654259475396200">"Ler os detalles e os eventos do calendario"</string>
     <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Esta aplicación pode ler todos os eventos do calendario almacenados na túa tableta e compartir ou gardar os datos do calendario."</string>
@@ -1175,8 +1175,8 @@
     <string name="no" msgid="5122037903299899715">"Cancelar"</string>
     <string name="dialog_alert_title" msgid="651856561974090712">"Atención"</string>
     <string name="loading" msgid="3138021523725055037">"Cargando..."</string>
-    <string name="capital_on" msgid="2770685323900821829">"SI"</string>
-    <string name="capital_off" msgid="7443704171014626777">"NON"</string>
+    <string name="capital_on" msgid="2770685323900821829">"ACTIVADO"</string>
+    <string name="capital_off" msgid="7443704171014626777">"DESACTIVADO"</string>
     <string name="checked" msgid="9179896827054513119">"seleccionado"</string>
     <string name="not_checked" msgid="7972320087569023342">"non seleccionado"</string>
     <string name="selected" msgid="6614607926197755875">"elemento seleccionado"</string>
@@ -1688,8 +1688,8 @@
     <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ao manter as dúas teclas de volume premidas durante uns segundos actívase <xliff:g id="SERVICE">%1$s</xliff:g>, unha función de accesibilidade. Esta acción pode cambiar o funcionamento do dispositivo.\n\nPodes cambiar o uso deste atallo para outra función en Configuración &gt; Accesibilidade."</string>
     <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activar"</string>
     <string name="accessibility_shortcut_off" msgid="3651336255403648739">"Non activar"</string>
-    <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"SI"</string>
-    <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"NON"</string>
+    <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ACTIVADO"</string>
+    <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"DESACTIVADO"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Queres permitir que <xliff:g id="SERVICE">%1$s</xliff:g> poida controlar totalmente o teu dispositivo?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Se activas <xliff:g id="SERVICE">%1$s</xliff:g>, o dispositivo non utilizará o teu bloqueo de pantalla para mellorar a encriptación de datos."</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"O control total é adecuado para as aplicacións que che axudan coa accesibilidade, pero non para a maioría das aplicacións."</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Tamaño folio"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Retrato descoñecido"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Paisaxe descoñecida"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelada"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizado polo teu administrador"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado polo teu administrador"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Coa función Aforro de batería actívase o tema escuro e restrínxense ou desactívanse a actividade en segundo plano, algúns efectos visuais e outras funcións, como “Hey Google”\n\n"<annotation id="url">"Máis información"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Coa función Aforro de batería actívase o tema escuro e restrínxense ou desactívanse a actividade en segundo plano, algúns efectos visuais e outras funcións, como “Hey Google”."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Coa función Aforro de batería actívase o tema escuro e restrínxense ou desactívanse a actividade en segundo plano, algúns efectos visuais e determinadas funcións.\n\n"<annotation id="url">"Máis información"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Coa función Aforro de batería actívase o tema escuro e restrínxense ou desactívanse a actividade en segundo plano, algúns efectos visuais e determinadas funcións."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Para contribuír a reducir o uso de datos, o aforro de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, poida que as imaxes non se mostren ata que as toques."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Queres activar o aforro de datos?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Pechar"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Resposta"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Vídeo"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Rexeitar"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Colgar"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Chamada entrante"</string>
@@ -1975,7 +1986,7 @@
     <string name="pin_specific_target" msgid="7824671240625957415">"Fixar a <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="unpin_target" msgid="3963318576590204447">"Deixar de fixar"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Deixar de fixar a <xliff:g id="LABEL">%1$s</xliff:g>"</string>
-    <string name="app_info" msgid="6113278084877079851">"Info. da aplicación"</string>
+    <string name="app_info" msgid="6113278084877079851">"Información da 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">"Restablecendo dispositivo…"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"O nivel desta notificación diminuíu a Silenciosa. Toca para compartir a túa opinión."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificación clasificouse nun nivel superior. Toca para compartir a túa opinión."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificación clasificouse nun nivel inferior. Toca para compartir a túa opinión."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Proba notificacións melloradas"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Para seguir recibindo accións suxeridas, respostas e moito máis, activa as notificacións melloradas. As notificacións intelixentes de Android xa non son compatibles."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Activar"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Agora non"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificacións melloradas"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Agora, as notificacións melloradas son as que che ofrecen suxestións de accións e respostas. As notificacións intelixentes de Android xa non son compatibles."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Aceptar"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactivar"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Máis información"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Coas notificacións melloradas pódese ler todo o contido das notificacións, mesmo a información persoal (por exemplo, os nomes dos contactos e as mensaxes). Con esta función tamén se poden ignorar as notificacións ou realizar accións nos botóns que aparecen nelas, como responder chamadas telefónicas.\n\nAdemais, permite activar e desactivar o modo de prioridade e cambiar a configuración relacionada."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"En Android 12, as notificacións melloradas substitúen as notificacións intelixentes. Esta función ofréceche suxestións de accións e respostas, ademais de organizar as notificacións.\n\nEste servizo pode acceder ao contido das notificacións, mesmo á información persoal, como os nomes dos contactos e as mensaxes. Ademais, esta función pode ignorar ou responder as notificacións (por exemplo, coller chamadas telefónicas e controlar o modo Non molestar)."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación da información do modo de rutina"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A batería pode esgotarse antes do habitual"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Para ampliar a duración da batería activouse a función Aforro de batería"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 2f2df47..af0c553 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"મોનાર્ક"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"ક્વાર્ટો"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"ફૂલસ્કેપ"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"રૉક 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"કહુ"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"કાકુ2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"અજાણ્યું પોર્ટ્રેટ"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"અજાણ્યું લેન્ડસ્કેપ"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"રદ થઈ"</string>
@@ -1852,8 +1865,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="7963058670863485450">"બૅટરી સેવર ઘેરી થીમની સુવિધા ચાલુ કરે છે અને બૅકગ્રાઉન્ડમાં થતી પ્રવૃત્તિ, કેટલીક વિઝ્યુઅલ ઇફેક્ટ અને “Ok Google” જેવી સુવિધાઓને મર્યાદિત કે બંધ કરે છે\n\n"<annotation id="url">"વધુ જાણો"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"બૅટરી સેવર ઘેરી થીમની સુવિધા ચાલુ કરે છે અને બૅકગ્રાઉન્ડમાં થતી પ્રવૃત્તિ, કેટલીક વિઝ્યુઅલ ઇફેક્ટ અને “Ok Google” જેવી સુવિધાઓને મર્યાદિત કે બંધ કરે છે."</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"જવાબ"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"વીડિયો"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"નકારો"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"સમાપ્ત કરો"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ઇનકમિંગ કૉલ"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"નોટિફિકેશનને સાઇલન્ટ પર અવનત કરવામાં આવ્યું. પ્રતિસાદ આપવા માટે ટૅપ કરો."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"આ નોટિફિકેશનને ઉપલી રેંક આપવામાં આવી. પ્રતિસાદ આપવા માટે ટૅપ કરો."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"આ નોટિફિકેશનને નીચલી રેંક આપવામાં આવી. પ્રતિસાદ આપવા માટે ટૅપ કરો."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"વધારાના નોટિફિકેશન અજમાવી જુઓ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"સૂચવેલી ક્રિયાઓ, જવાબો અને બીજું ઘણું મેળવવા માટે, વધારાના નોટિફિકેશન ચાલુ કરો. Android માટે અનુકૂળ નોટિફિકેશનને હવેથી સપોર્ટ કરવામાં આવતો નથી."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ચાલુ કરો"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"હમણાં નહીં"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"વધુ જાણો"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"વધારાના નોટિફિકેશન સંપર્કનું નામ અને સંદેશા જેવી વ્યક્તિગત માહિતી સહિત નોટિફિકેશનનું બધું કન્ટેન્ટ વાંચી શકે છે. આ સુવિધા નોટિફિકેશન છોડી પણ શકે છે અથવા નોટિફિકેશનમાં બટન પર ફોન કૉલનો જવાબ આપવા જેવી ક્રિયાઓ પણ કરી શકે છે.\n\nઆ સુવિધા પ્રાધાન્યતા મોડ ચાલુ કે બંધ પણ કરી શકે છે અને સંબંધિત સેટિંગ બદલી પણ શકે છે."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"રૂટિન મોડની માહિતીનું નોટિફિકેશન"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"સામાન્ય રીતે ચાર્જ કરવાના સમય પહેલાં બૅટરી સમાપ્ત થઈ શકે છે"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"બૅટરી આવરદા વધારવા માટે બૅટરી સેવર ચાલુ કર્યું"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 190d561..866f2ef 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -220,7 +220,7 @@
     <string name="turn_on_radio" msgid="2961717788170634233">"वायरलेस चालू करें"</string>
     <string name="turn_off_radio" msgid="7222573978109933360">"वायरलेस बंद करें"</string>
     <string name="screen_lock" msgid="2072642720826409809">"स्‍क्रीन लॉक"</string>
-    <string name="power_off" msgid="4111692782492232778">"पावर बंद"</string>
+    <string name="power_off" msgid="4111692782492232778">"पावर बंद करें"</string>
     <string name="silent_mode_silent" msgid="5079789070221150912">"रिंगर बंद"</string>
     <string name="silent_mode_vibrate" msgid="8821830448369552678">"रिंगर कंपन (वाइब्रेशन)"</string>
     <string name="silent_mode_ring" msgid="6039011004781526678">"रिंगर चालू"</string>
@@ -244,10 +244,10 @@
     <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>
+    <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>
@@ -1692,9 +1692,9 @@
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"बंद है"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> को अपना डिवाइस पूरी तरह कंट्रोल करने की मंज़ूरी दें?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"अगर आप <xliff:g id="SERVICE">%1$s</xliff:g> को चालू करते हैं, तो डेटा को एन्क्रिप्ट (सुरक्षित) करने के तरीके को बेहतर बनाने के लिए आपका डिवाइस सेट किए गए स्क्रीन लॉक का इस्तेमाल नहीं करेगा."</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"पूरी तरह नियंत्रित करने की अनुमति उन ऐप्लिकेशन के लिए ठीक है जो सुलभता से जुड़ी ज़रूरतों के लिए बने हैं, लेकिन ज़्यादातर ऐप्लिकेशन के लिए यह ठीक नहीं है."</string>
-    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"स्क्रीन को देखें और नियंत्रित करें"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"यह स्क्रीन पर दिखने वाली हर तरह की सामग्री को पढ़ सकता है और उसे दूसरे ऐप्लिकेशन पर दिखा सकता है."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"पूरी तरह कंट्रोल करने की अनुमति उन ऐप्लिकेशन के लिए ठीक है जो सुलभता से जुड़ी ज़रूरतों के लिए बने हैं, लेकिन ज़्यादातर ऐप्लिकेशन के लिए यह ठीक नहीं है."</string>
+    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"स्क्रीन को देखें और कंट्रोल करें"</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"यह स्क्रीन पर दिखने वाली हर तरह के कॉन्टेंट को पढ़ सकता है और उसे दूसरे ऐप्लिकेशन पर दिखा सकता है."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"देखें और कार्रवाई करें"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"यह आपके और किसी ऐप्लिकेशन या हार्डवेयर सेंसर के बीच होने वाले इंटरैक्शन को ट्रैक कर सकता है और आपकी तरफ़ से ऐप्लिकेशन के साथ इंटरैक्ट कर सकता है."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"अनुमति दें"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"मोनार्क"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"क्वार्टो"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"फ़ूल्ज़कैप"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"काहु"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"काकु2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"यौ4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"अज्ञात पोर्ट्रेट"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"अज्ञात लैंडस्केप"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"रद्द कर दी गई"</string>
@@ -1852,8 +1864,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="7963058670863485450">"बैटरी सेवर गहरे रंग वाली थीम को चालू कर देता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है\n\n"<annotation id="url">"ज़्यादा जानें"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"बैटरी सेवर गहरे रंग वाली थीम को चालू कर देता है. साथ ही, यह बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से डिवाइस को रोकता है या इन्हें बंद कर देता है."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"बैटरी सेवर, गहरे रंग वाली थीम को चालू कर देता है. साथ ही, यह बैकग्राउंड में चल रही गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ खास सुविधाएं इस्तेमाल करने से रोकता है या इन्हें बंद कर देता है.\n\n"<annotation id="url">"ज़्यादा जानें"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"बैटरी सेवर, गहरे रंग वाली थीम को चालू कर देता है. साथ ही, यह बैकग्राउंड में चल रही गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और कुछ खास सुविधाओं के इस्तेमाल को रोकता है या इन्हें बंद कर देता है."</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"इस सूचना के मिलने पर होने वाली आवाज़ बंद कर दी गई है. सुझाव/शिकायत/राय देने के लिए टैप करें."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"इस सूचना को रैंकिंग में ऊपर किया गया था. सुझाव/शिकायत/राय देने के लिए टैप करें."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"इस सूचना को रैंकिंग में नीचे किया गया था. सुझाव/शिकायत/राय देने के लिए टैप करें."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"\'बेहतर सूचनाएं\' सुविधा आज़माएं"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"कार्रवाई और जवाब वगैरह के लिए सुझाव पाना चाहते हैं, तो सूचनाएं पाने की सुविधा बेहतर करें. Android की, ज़रूरत के हिसाब से सूचनाएं पाने की सुविधा अब काम नहीं करती है."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"चालू करें"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"अभी नहीं"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ज़्यादा जानें"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"\'बेहतर सूचनाएं\' सुविधा, डिवाइस पर मिलने वाली सभी सूचनाओं का कॉन्टेंट पढ़ सकती है. इसमें आपकी निजी जानकारी, जैसे कि संपर्कों के नाम और मैसेज भी शामिल हैं. यह सुविधा, डिवाइस पर आने वाली सूचनाओं को रद्द कर सकती है या सूचनाओं में दिखने वाले बटन से कार्रवाइयां भी कर सकती है, जैसे कि फ़ोन कॉल का जवाब देना.\n\nयह सुविधा, प्राथमिकता मोड को चालू या बंद कर सकती है और इससे जुड़ी सेटिंग में बदलाव भी कर सकती है."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"रूटीन मोड जानकारी की सूचना"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"बैटरी आम तौर पर जितने समय चलती है, उससे पहले खत्म हो सकती है"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"बैटरी लाइफ़ बढ़ाने के लिए \'बैटरी सेवर\' चालू हो गया है"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 28fb400..7bc5eda 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1731,7 +1731,7 @@
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Upotrijebi prečac"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Inverzija boja"</string>
     <string name="color_correction_feature_name" msgid="3655077237805422597">"Korekcija boja"</string>
-    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Dodatno zatamnjenje"</string>
+    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Još tamnije"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Držali ste tipke za glasnoću. Uključila se usluga <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Držali ste tipke za glasnoću. Isključila se usluga <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Pritisnite i zadržite tipke za glasnoću na tri sekunde da biste koristili uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
@@ -1795,6 +1795,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1831,6 +1842,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Nepoznati portret"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Nepoznati pejzaž"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Otkazano"</string>
@@ -1875,8 +1887,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao administrator"</string>
     <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="7963058670863485450">"Štednja baterije uključuje tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizualne efekte i značajke kao što je Hey Google\n\n"<annotation id="url">"Saznajte više"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Štednja baterije uključuje tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizualne efekte i značajke kao što je Hey Google."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Štednja baterije uključuje tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizualne efekte i određene značajke.\n\n"<annotation id="url">"Saznajte više"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Štednja baterije uključuje tamnu temu i ograničava ili isključuje aktivnosti u pozadini, neke vizualne efekte i određene značajke."</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 Štednju podatkovnog prometa?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
@@ -2087,7 +2099,7 @@
     <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string>
     <string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string>
     <string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> želi prikazivati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
-    <string name="screenshot_edit" msgid="7408934887203689207">"Uređivanje"</string>
+    <string name="screenshot_edit" msgid="7408934887203689207">"Uredi"</string>
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Uređaj će vibrirati za pozive i obavijesti"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvučni signal poziva i obavijesti bit će isključen"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Promjene sustava"</string>
@@ -2106,12 +2118,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Obavijest je degradirana u bešumnu. Dodirnite da biste poslali povratne informacije."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Obavijest je više rangirana. Dodirnite da biste poslali povratne informacije."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Obavijest je niže rangirana. Dodirnite da biste poslali povratne informacije."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Proba poboljšanih obavijesti"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Da biste i dalje primali prijedloge za radnje, odgovore i druge informacije, uključite poboljšane obavijesti. Prilagodljive obavijesti za Android više nisu podržane."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Uključi"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ne sad"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Poboljšane obavijesti"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Predložene radnje i odgovori sad se pružaju putem poboljšanih obavijesti. Prilagodljive obavijesti za Android više nisu podržane."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"U redu"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Poboljšane obavijesti mogu čitati sadržaj svih obavijesti, uključujući osobne podatke kao što su imena kontakata i poruke. Ta značajka može i odbacivati obavijesti ili poduzimati radnje povezane s gumbima u obavijestima kao što je odgovaranje na telefonske pozive.\n\nZnačajka također može uključiti ili isključiti način prioritetnih obavijesti i promijeniti povezane postavke."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"U Androidu 12 poboljšane obavijesti zamjenjuju prilagodljive obavijesti za Android. Ta značajka prikazuje predložene radnje i odgovore te organizira vaše obavijesti.\n\nPoboljšane obavijesti mogu pristupiti sadržaju obavijesti, uključujući osobne podatke kao što su imena kontakata i poruke. Ta značajka može i odbacivati obavijesti ili poduzimati radnje u skladu s njima, na primjer može odgovarati na telefonske pozive i upravljati značajkom Ne uznemiravaj."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještavanje o informacijama u Rutinskom načinu rada"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se može isprazniti prije uobičajenog vremena punjenja"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Štednja baterije aktivirana je kako bi se produljilo trajanje baterije"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 4350d60..9fa0f28 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"„Monarch” méret"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"„Quarto” méret"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"„Foolscap” méret"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"„ROC 8K” méret"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"„ROC 16K” méret"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"„PRC 1” méret"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"„Kahu” méret"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"„Kaku2” méret"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"„You4” méret"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Ismeretlen álló"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Ismeretlen fekvő"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Törölve"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"A rendszergazda által frissítve"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"A rendszergazda által törölve"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Az Akkumulátorkímélő mód bekapcsolja a Sötét témát, és korlátozza vagy kikapcsolja a háttérbeli tevékenységeket, bizonyos vizuális effekteket és olyan funkciókat, mint az „Ok Google”.\n\n"<annotation id="url">"További információ"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Az Akkumulátorkímélő mód bekapcsolja a Sötét témát, és korlátozza vagy kikapcsolja a háttérbeli tevékenységeket, bizonyos vizuális effekteket és olyan funkciókat, mint az „Ok Google”."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Az Akkumulátorkímélő mód bekapcsolja a Sötét témát, valamint korlátozza vagy kikapcsolja a háttérbeli tevékenységeket, egyes vizuális effekteket és bizonyos funkciókat.\n\n"<annotation id="url">"További információ"</annotation>"."</string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Az Akkumulátorkímélő mód bekapcsolja a Sötét témát, valamint korlátozza vagy kikapcsolja a háttérbeli tevékenységeket, egyes vizuális effekteket és bizonyos 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 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>
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Bezárás"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Fogadás"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Videó"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Elutasítás"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Befejezés"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Bejövő hívás"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ezt az értesítést némára állította a rendszer. Visszajelzés küldéséhez koppintson ide."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ezt az értesítést előrébb sorolta a rendszer. Visszajelzés küldéséhez koppintson ide."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ezt az értesítést hátrébb sorolta a rendszer. Visszajelzés küldéséhez koppintson ide."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Bővített értesítés kipróbálása"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Ha továbbra is szeretne kapni javasolt műveleteket, válaszokat és egyebeket, kapcsolja be a bővített értesítéseket. Az androidos alkalmazkodó értesítések már nem támogatottak."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Bekapcsolás"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Most nem"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Bővített értesítések"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Javasolt műveletek és válaszok mostantól bővített értesítésekkel. Az androidos alkalmazkodó értesítések már nem támogatottak."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Kikapcsolás"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"További információ"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"A bővített értesítések minden értesítéstartalmat olvashatnak (így a személyes adatokat, mint például a névjegyek nevét és az üzeneteket is). Ez a funkció emellett elvetheti az értesítéseket, valamint műveleteket végezhet az értesítésekben lévő gombokkal, például felveheti a telefonhívásokat.\n\nEz a funkció a Prioritásos módot is be- vagy kikapcsolhatja, és módosíthatja a kapcsolódó beállításokat."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"A bővített értesítések felváltják az androidos alkalmazkodó értesítéseket az Android 12-es verziójában. Ez a funkció a javasolt műveleteket és válaszokat mutatja, és rendszerezi az értesítéseket.\n\nA bővített értesítések minden értesítéstartalmat olvashatnak (így a személyes adatokat, mint például a névjegyek nevét és az üzeneteket is). Ez a funkció emellett elvetheti az értesítéseket, valamint válaszolhat rájuk, például felveheti a telefonhívásokat, és vezérelheti a Ne zavarjanak módot."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Információs értesítés a rutinmódról"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Előfordulhat, hogy az akkumulátor lemerül a szokásos töltési időszak előtt"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akkumulátorkímélő mód aktiválva az akkumulátor üzemidejének növelése érdekében"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index bbf50a7..b6d59c6 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1694,7 +1694,7 @@
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Եթե միացնեք <xliff:g id="SERVICE">%1$s</xliff:g> ծառայությունը, ձեր սարքը չի օգտագործի էկրանի կողպումը՝ տվյալների գաղտնագրումը բարելավելու համար:"</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"Ամբողջական վերահսկումն անհրաժեշտ է միայն այն հավելվածներին, որոնք օգնում են ձեզ հատուկ գործառույթներից օգտվելիս։"</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Դիտել և կառավարել էկրանը"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Կարող է կարդալ էկրանի բովանդակությունն ու ցուցադրել այլ հավելվածներում։"</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Կարող է կարդալ էկրանի ողջ բովանդակությունը և ցուցադրել բովանդակություն այլ հավելվածների վրայից։"</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Դիտել և համակարգել գործողությունները"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Կարող է հետագծել ձեր գործողությունները հավելվածներում և սարքակազմի սենսորների վրա, ինչպես նաև հավելվածներում կատարել գործողություններ ձեր անունից։"</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Թույլատրել"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Անհայտ դիմանկար"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Անհայտ բնապատկեր"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Չեղարկված է"</string>
@@ -1852,8 +1864,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="7963058670863485450">"Մարտկոցի տնտեսումը միացնում է մուգ թեման և սահմանափակում կամ անջատում է ֆոնային գործընթացները, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «Ok Google» հրահանգի ճանաչումը։\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Մարտկոցի տնտեսումը միացնում է մուգ թեման և սահմանափակում կամ անջատում է ֆոնային գործընթացները, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «Ok Google» հրահանգի ճանաչումը։"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"«Մարտկոցի տնտեսում» գործառույթը միացնում է մուգ թեման և անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ։\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"«Մարտկոցի տնտեսում» գործառույթը միացնում է մուգ թեման և անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ։"</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Պատասխանել"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Տեսազանգ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Մերժել"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Ավարտել"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Մուտքային զանգ"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Այս ծանուցման կարևորության մակարդակը իջեցվել է և դարձել անձայն։ Հպեք՝ կարծիք հայտնելու համար։"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Այս ծանուցման կարևորության մակարդակը բարձրացվել է։ Հպեք՝ կարծիք հայտնելու համար։"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Այս ծանուցման կարևորության մակարդակն իջեցվել է։ Հպեք՝ կարծիք հայտնելու համար։"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Փորձեք ընդլայնված ծանուցումները"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Միացրեք ընդլայնված ծանուցումները, որպեսզի այսուհետ ևս ստանաք գործողությունների, պատասխանների և այլ առաջարկներ։ Android-ի հարմարվող ծանուցումներն այլևս չեն աջակցվում։"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Միացնել"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ոչ հիմա"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Իմանալ ավելին"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Ընդլայնված ծանուցումներին հասանելի է բոլոր ծանուցումների պարունակությունը, ներառյալ անձնական տվյալները, օրինակ՝ կոնտակտների անուններն ու հաղորդագրությունները։ Այս գործառույթը կարող է նաև փակել ծանուցումները կամ ակտիվացնել դրանցում առկա կոճակները, այդ թվում՝ պատասխանել հեռախոսազանգերի։\n\nԱյս գործառույթը կարող է նաև միացնել/անջատել «Միայն կարևորները» ռեժիմը և փոխել համապատասխան կարգավորումները։"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ծանուցում լիցքավորման մասին"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Մարտկոցը կարող է սովորականից շուտ սպառվել"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Մարտկոցի կյանքը երկարացնելու համար ակտիվացվել է մարտկոցի տնտեսման ռեժիմը"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 222bbe8..e782377 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1693,10 +1693,10 @@
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Izinkan <xliff:g id="SERVICE">%1$s</xliff:g> memiliki kontrol penuh atas perangkat Anda?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Jika Anda mengaktifkan <xliff:g id="SERVICE">%1$s</xliff:g>, perangkat tidak akan menggunakan kunci layar untuk meningkatkan enkripsi data."</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"Kontrol penuh sesuai untuk aplikasi yang membantu Anda terkait kebutuhan aksesibilitas, tetapi tidak untuk sebagian besar aplikasi."</string>
-    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Tampilan dan layar kontrol"</string>
+    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Melihat dan mengontrol layar"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Aplikasi dapat membaca semua konten di layar dan menampilkan konten di atas aplikasi lain."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Menampilkan dan melakukan tindakan"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Aplikasi dapat melacak interaksi Anda dengan aplikasi atau sensor hardware, dan berinteraksi dengan aplikasi atas nama Anda."</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Aplikasi dapat melacak interaksi Anda dengan aplikasi atau sensor hardware, dan melakukan interaksi dengan aplikasi untuk Anda."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Izinkan"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Tolak"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Ketuk fitur untuk mulai menggunakannya:"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Kuarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Folio"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Potret tidak diketahui"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Lanskap tidak diketahui"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Dibatalkan"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Diupdate oleh admin Anda"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Dihapus oleh admin Anda"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Oke"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Penghemat Baterai mengaktifkan Tema gelap dan membatasi atau menonaktifkan aktivitas di latar belakang, beberapa efek visual, dan fitur seperti “Ok Google”\n\n"<annotation id="url">"Pelajari lebih lanjut"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Penghemat Baterai mengaktifkan Tema gelap dan membatasi atau menonaktifkan aktivitas di latar belakang, beberapa efek visual, dan fitur seperti “Ok Google”."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Penghemat Baterai mengaktifkan Tema gelap dan membatasi atau menonaktifkan aktivitas latar belakang, beberapa efek visual, dan fitur tertentu.\n\n"<annotation id="url">"Pelajari lebih lanjut"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Penghemat Baterai mengaktifkan Tema gelap dan membatasi atau menonaktifkan aktivitas latar belakang, beberapa efek visual, dan fitur tertentu."</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>
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Tutup"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Jawab"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Tolak"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Tutup"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Panggilan masuk"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Notifikasi ini didemosikan menjadi Senyap. Ketuk untuk memberikan masukan."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Notifikasi ini diberi peringkat lebih tinggi. Ketuk untuk memberikan masukan."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Notifikasi ini diberi peringkat lebih rendah. Ketuk untuk memberikan masukan."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Coba notifikasi yang disempurnakan"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Untuk terus mendapatkan saran tindakan, balasan, dan lainnya, aktifkan notifikasi yang disempurnakan. Notifikasi Adaptif Android tidak lagi didukung."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aktifkan"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Lain kali"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notifikasi yang ditingkatkan"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Tindakan dan balasan yang disarankan kini diberikan oleh notifikasi yang ditingkatkan. Notifikasi Adaptif Android tidak lagi didukung."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Oke"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Nonaktifkan"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Pelajari lebih lanjut"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Notifikasi yang disempurnakan dapat membaca semua isi notifikasi, termasuk informasi pribadi seperti nama kontak dan pesan. Fitur ini juga dapat menutup notifikasi atau memicu tindakan pada tombol di notifikasi, seperti menjawab panggilan telepon.\n\nFitur ini juga dapat mengaktifkan atau menonaktifkan mode Prioritas dan mengubah setelan terkait."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Notifikasi yang ditingkatkan menggantikan Notifikasi Adaptif Android di Android 12. Fitur ini menunjukkan tindakan dan balasan yang disarankan, dan mengatur notifikasi.\n\nNotifikasi yang ditingkatkan dapat mengakses konten notifikasi, termasuk informasi pribadi seperti nama kontak dan pesan. Fitur ini juga dapat menutup atau merespons notifikasi, seperti menjawab panggilan telepon dan mengontrol Jangan Ganggu."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifikasi info Mode Rutinitas"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterai mungkin habis sebelum pengisian daya biasanya"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Penghemat Baterai diaktifkan untuk memperpanjang masa pakai baterai"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 47503ed..0a834fa 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Örk A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Örk B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Örk C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Örk D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Örk E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Örk E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Óþekkt skammsnið"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Óþekkt langsnið"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Hætt við"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Kerfisstjóri uppfærði"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Kerfisstjóri eyddi"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Í lagi"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Rafhlöðusparnaður kveikir á dökku þema og takmarkar eða slekkur á bakgrunnsvirkni, tilteknum myndbrellum og eiginleikum eins og „Ok Google“.\n\n"<annotation id="url">"Nánar"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Rafhlöðusparnaður kveikir á dökku þema og takmarkar eða slekkur á bakgrunnsvirkni, tilteknum myndbrellum og eiginleikum eins og „Ok Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Rafhlöðusparnaður kveikir á dökku þema og dregur úr eða slekkur á bakgrunnsvirkni, sumum myndáhrifum og tilteknum eiginleikum.\n\n"<annotation id="url">"Nánar"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Rafhlöðusparnaður kveikir á dökku þema og dregur úr eða slekkur á bakgrunnsvirkni, sumum myndáhrifum og tilteknum eiginleikum."</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ð að myndir eru ekki birtar fyrr en þú ýtir á þær, svo dæmi sé tekið."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Kveikja á gagnasparnaði?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Kveikja"</string>
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Loka"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Svara"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Myndsímtal"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Hafna"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Leggja á"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Símtal berst"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Þessi tilkynning var gerð þögul. Ýttu til að senda ábendingu."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Þessi tilkynning fékk hærri stöðu. Ýttu til að senda ábendingu."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Þessi tilkynning fékk lægri stöðu. Ýttu til að senda ábendingu."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Prófa auknar tilkynningar"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Kveiktu á auknum tilkynningum til að halda áfram að fá tillögur að aðgerðum, svörum og fleira. Breytilegar tilkynningar í Android eru ekki lengur studdar."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Kveikja"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ekki núna"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Auknar tilkynningar"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Auknar tilkynningar bjóða nú upp á tillögur að aðgerðum og svörum. Breytilegar tilkynningar í Android eru ekki lengur studdar."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Í lagi"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Slökkva"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Nánar"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Auknar tilkynningar geta lesið allt efni tilkynninga, þar á meðal persónuupplýsingar á borð við nöfn tengiliða og skilaboð. Þessi eiginleiki getur einnig hunsað tilkynningar eða notað hnappa í tilkynningum eins og að svara símtölum.\n\nÞessi eiginleiki getur einnig kveikt og slökkt á forgangsstillingu og breytt tengdum stillingum."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Auknar tilkynningar hafa leyst breytilegar tilkynningar í Android af hólmi í Android 12. Eiginleikinn birtir tillögur að aðgerðum og svörum og flokkar tilkynningar.\n\nAuknar tilkynningar hafa aðgang að efni tilkynninga, þ. á m persónuupplýsingum á borð við nöfn tengiliða og skilaboð. Eiginleikinn getur einnig hunsað eða svarað tilkynningum, til dæmis svarað símtölum og stjórnað „Ónáðið ekki“."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Upplýsingatilkynning aðgerðastillingar"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Rafhlaðan kann að tæmast áður en hún kemst í hleðslu"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Kveikt á rafhlöðusparnaði til að lengja endingu rafhlöðunnar"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 31096c7..21c7aaa 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1692,10 +1692,10 @@
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"OFF"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Vuoi consentire a <xliff:g id="SERVICE">%1$s</xliff:g> di avere il controllo totale del tuo dispositivo?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Se attivi <xliff:g id="SERVICE">%1$s</xliff:g>, il dispositivo non utilizzerà il blocco schermo per migliorare la crittografia dei dati."</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Il pieno controllo è appropriato per le app che rispondono alle tue esigenze di accessibilità, ma non per gran parte delle app."</string>
-    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Visualizza e controlla lo schermo"</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"Il controllo totale è appropriato per le app che rispondono alle tue esigenze di accessibilità, ma non per gran parte delle app."</string>
+    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Visualizzare e controllare lo schermo"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Può leggere i contenuti presenti sullo schermo e mostrare i contenuti su altre app."</string>
-    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Visualizza ed esegui azioni"</string>
+    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Visualizzare ed eseguire azioni"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Può tenere traccia delle tue interazioni con un\'app o un sensore hardware e interagire con app per tuo conto."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Consenti"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Rifiuta"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Carta protocollo"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Verticale sconosciuto"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Orizzontale sconosciuto"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Annullato"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Aggiornato dall\'amministratore"</string>
     <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="7963058670863485450">"L\'opzione Risparmio energetico attiva il tema scuro e limita o disattiva l\'attività in background, alcuni effetti visivi e funzionalità come \"Hey Google\"\n\n"<annotation id="url">"Scopri di più"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"L\'opzione Risparmio energetico attiva il tema scuro e limita o disattiva l\'attività in background, alcuni effetti visivi e funzionalità come \"Hey Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"La funzionalità Risparmio energetico attiva il tema scuro e limita o disattiva le attività in background, alcuni effetti visivi e funzionalità.\n\n"<annotation id="url">"Scopri di più"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"La funzionalità Risparmio energetico attiva il tema scuro e limita o disattiva le attività in background, alcuni effetti visivi e funzionalità."</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>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Questa notifica è stata retrocessa a Silenziosa. Tocca per dare un feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Questa notifica è stata posizionata più in alto. Tocca per dare un feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Questa notifica è stata posizionata più in basso. Tocca per dare un feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Prova le notifiche avanzate"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Per continuare a ricevere suggerimenti di azioni, risposte e altro, attiva le notifiche avanzate. Le notifiche adattive Android non sono più supportate."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Attiva"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Non ora"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notifiche avanzate"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Ora le risposte e le azioni suggerite vengono fornite dalle notifiche avanzate. Le notifiche adattive Android non sono più supportate."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Disattiva"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Scopri di più"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Le notifiche avanzate possono accedere all\'intero contenuto di una notifica, incluse le informazioni personali, come i nomi dei contatti e i messaggi. Questa funzionalità può anche ignorare le notifiche o svolgere azioni sui pulsanti nelle notifiche, come rispondere alle telefonate.\n\nQuesta funzionalità può anche attivare o disattivare la modalità Priorità e modificare le relative impostazioni."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Le notifiche adattive Android sono state sostituite dalle notifiche avanzate in Android 12. Questa funzionalità mostra risposte e azioni suggerite e organizza le tue notifiche.\n\nLe notifiche avanzate possono accedere ai contenuti di una notifica, incluse le informazioni personali, come i nomi dei contatti e i messaggi. Questa funzionalità può anche ignorare le notifiche o rispondervi, ad esempio accettando le telefonate e controllando Non disturbare."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifica di informazioni sulla modalità Routine"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"La batteria potrebbe esaurirsi prima della ricarica abituale"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Risparmio energetico attivo per far durare di più la batteria"</string>
@@ -2274,5 +2286,5 @@
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Icona dell\'applicazione"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Immagine del branding dell\'applicazione"</string>
     <string name="view_and_control_notification_title" msgid="4300765399209912240">"Controlla le impostazioni di accesso"</string>
-    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> può visualizzare e controllare il tuo schermo. Tocca per esaminare."</string>
+    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> può visualizzare e controllare il tuo schermo. Tocca per verificare."</string>
 </resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index b3134a7..ae0abb4 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super-B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"הדפסה לאורך בגודל לא ידוע"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"הדפסה לרוחב בגודל לא ידוע"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"בוטלה"</string>
@@ -1898,9 +1910,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="7963058670863485450">"‏התכונה \'חיסכון בסוללה\' מפעילה עיצוב כהה ומגבילה או מכבה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות כמו \"Hey Google\"\n\n"<annotation id="url">"מידע נוסף"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"‏התכונה \'חיסכון בסוללה\' מפעילה עיצוב כהה ומגבילה או מכבה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות כמו \"Hey Google\"."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"‏כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה נעשה שימוש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"התכונה \'חיסכון בסוללה\' מפעילה עיצוב כהה ומגבילה או מכבה את הפעילות ברקע, חלק מהאפקטים החזותיים ותכונות מסוימות.\n\n"<annotation id="url">"מידע נוסף"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"התכונה \'חיסכון בסוללה\' מפעילה עיצוב כהה ומגבילה או מכבה את הפעילות ברקע, חלק מהאפקטים החזותיים ותכונות מסוימות."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"‏כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (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">
@@ -1991,8 +2003,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"תשובה"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"וידאו"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"דחייה"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ניתוק"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"שיחה נכנסת"</string>
@@ -2140,12 +2151,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ההתראה הזו הורדה בדרגה ל\'שקטה\'. יש להקיש כדי לשלוח משוב."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"דירוג ההתראה הזו הוגבה. יש להקיש כדי לשלוח משוב."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ההתראה הזו דורגה נמוך יותר. יש להקיש כדי לשלוח משוב."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"רוצה לנסות את ההתראות המשופרות?"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"‏כדי להמשיך לקבל הצעות לפעולות, לתשובות ועוד, יש להפעיל את ההתראות המשופרות. אין יותר תמיכה בהתראות מותאמות ל-Android."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"הפעלה"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"לא עכשיו"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"מידע נוסף"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"כשתכונת ההתראות המשופרות פועלת, המערכת יכולה לקרוא את כל תוכן ההתראות, כולל מידע אישי כמו שמות של אנשי קשר והודעות. כמו כן, התכונה תוכל לסגור התראות או לבצע פעולות שהן כוללות, כמו מענה לשיחות טלפון.\n\nהתכונה תוכל גם להפעיל או להשבית את מצב העדיפות ולשנות את ההגדרות הקשורות."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"התראת מידע לגבי מצב שגרתי"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index a8d2f1a..65e1849 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1621,7 +1621,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>
@@ -1692,7 +1692,7 @@
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"OFF"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> にデバイスのフル コントロールを許可しますか?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"<xliff:g id="SERVICE">%1$s</xliff:g> をオンにすると、デバイスデータの暗号化の強化に画面ロックは使用されなくなります。"</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"フル コントロールは、ユーザー補助機能を必要とするユーザーをサポートするアプリには適していますが、ほとんどのアプリには適していません。"</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"フル コントロールは、ユーザー補助機能が必要な場合には適していますが、その他の多くのアプリには不要です。"</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"画面の表示と操作"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"画面上のすべてのコンテンツを読み取り、他のアプリでコンテンツを表示することができます。"</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"操作の表示と実行"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"モナーク"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"クォート"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"フールスキャップ"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"角2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"洋4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"縦向き不明"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"横向き不明"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"キャンセルされました"</string>
@@ -1852,8 +1865,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">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"バッテリー セーバーを有効にすると、ダークテーマが ON になり、バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能が制限されるか OFF になります\n\n"<annotation id="url">"詳細"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"バッテリー セーバーを有効にすると、ダークテーマが ON になり、バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能が制限されるか OFF になります。"</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -2073,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"この通知の重要度がサイレントに下がりました。タップしてフィードバックをお送りください。"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"この通知の重要度が上がりました。タップしてフィードバックをお送りください。"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"この通知の重要度が下がりました。タップしてフィードバックをお送りください。"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"拡張通知を使ってみる"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"操作や返信の候補などを利用し続けるには、拡張通知を ON にしてください。Android 通知の自動調整はサポートを終了しました。"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ON にする"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"後で"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"詳細"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"拡張通知はすべての通知コンテンツにアクセスできます。これには、連絡先の名前などの個人情報やメッセージも含まれます。また、通知を非表示にしたり、電話に出るなど、通知内の操作ボタンを実行したりすることもできます。\n\nまた、この機能は、優先モードの設定を切り替えたり、関連する設定を変更したりすることもできます。"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ルーティン モード情報の通知"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"通常の充電を行う前に電池が切れる可能性があります"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"電池を長持ちさせるため、バッテリー セーバーが有効になりました"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index ba7beac..b8d1e2d 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"დიდი"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"უცნობი პორტრეტი"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"უცნობი ლანდშაფტი"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"გაუქმებული"</string>
@@ -1852,8 +1864,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="7963058670863485450">"ბატარეის დამზოგი ჩართავს მუქ თემას და შეზღუდავს ან გამორთავს ფონურ აქტივობას, ზოგიერთ ვიზუალურ ეფექტს და ისეთ ფუნქციებს, როგორიცაა „Ok Google“\n\n"<annotation id="url">"შეიტყვეთ მეტი"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"ბატარეის დამზოგი ჩართავს მუქ თემას და შეზღუდავს ან გამორთავს ფონურ აქტივობას, ზოგიერთ ვიზუალურ ეფექტს და ისეთ ფუნქციებს, როგორიცაა „Ok Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"ბატარეის დამზოგი ჩართავს მუქ თემას და შეზღუდავს ან გამორთავს ფონურ აქტივობას, ზოგიერთ ვიზუალურ ეფექტსა და გარკვეულ ფუნქციებს.\n\n"<annotation id="url">"შეიტყვეთ მეტი"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"ბატარეის დამზოგი ჩართავს მუქ თემას და შეზღუდავს ან გამორთავს ფონურ აქტივობას, ზოგიერთ ვიზუალურ ეფექტსა და გარკვეულ ფუნქციებს."</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>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ეს შეტყობინება ჩამოქვეითდა და გახდა „ჩუმი“. შეეხეთ გამოხმაურების მოსაწოდებლად."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ეს შეტყობინება დაწინაურდა. შეეხეთ გამოხმაურების მოსაწოდებლად."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ეს შეტყობინება ჩამოქვეითდა. შეეხეთ გამოხმაურების მოსაწოდებლად."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"გამოცადეთ გაფართოებული შეტყობინებები"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"შემოთავაზებული ქმედებების, პასუხების და სხვა მითითებების მიღების გასაგრძელებლად ჩართეთ გაფართოებული შეტყობინებები. Android-ის ადაპტაციური შეტყობინებები აღარაა მხარდაჭერილი."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ჩართვა"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ახლა არა"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"გაფართოებული შეტყობინებები"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"შემოთავაზებული მოქმედებები და პასუხები ამიერიდან უზრუნველყოფილია გაფართოებული შეტყობინებების მიერ. Android-ის ადაპტაციური შეტყობინებები აღარაა მხარდაჭერილი."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"კარგი"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"გამორთვა"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"შეიტყვეთ მეტი"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"გაფართოებულ შეტყობინებებს შეუძლია ყველა შეტყობინების კონტენტის, მათ შორის, ისეთი პერსონალური ინფორმაციის წაკითხვა, როგორიცაა კონტაქტების სახელები და შეტყობინებები. ამ ფუნქციას ასევე შეუძლია შეტყობინებების დახურვა ან შეტყობინებათა ღილაკების ამოქმედება, მაგალითად, სატელეფონო ზარებზე პასუხი.\n\nამ ფუნქციას ასევე შეუძლია პრიორიტეტული რეჟიმის ჩართვა თუ გამორთვა და დაკავშირებული პარამეტრების შეცვლა."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"გაფართოებულმა შეტყობინებებმა ჩაანაცვლა Android-ის ადაპტაციური შეტყობინებების ფუნქცია Android 12-ში. ეს ფუნქცია გაჩვენებთ შემოთავაზებულ მოქმედებებს და პასუხებს, ამასთანავე კი ახდენს თქვენი შეტყობინებების ორგანიზებას.\n\nგაფართოებულ შეტყობინებებს შეუძლია ყველა შეტყობინების კონტენტზე, მათ შორის, ისეთ პერსონალურ ინფორმაციაზე წვდომა, როგორიცაა კონტაქტების სახელები და შეტყობინებები. ამ ფუნქციას ასევე შეუძლია შეტყობინებათა დახურვა ან მათზე პასუხის გაცემა, მაგალითად, სატელეფონო ზარებზე პასუხი და „არ შემაწუხოთ“ რეჟიმის მართვა."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"რუტინის რეჟიმის საინფორმაციო შეტყობინება"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ბატარეა შეიძლება დაჯდეს დატენის ჩვეულ დრომდე"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ბატარეის დამზოგი გააქტიურდა ბატარეის მუშაობის გასახანგრძლივლებლად"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 7d6bf12..abddce1 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1707,7 +1707,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="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Экранды қарайту"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Пайдаланушы дыбыс деңгейі пернелерін басып ұстап тұрды. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қосулы."</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Монарх"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Кварто"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Белгісіз портреттік"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Белгісіз ландшафт"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Тоқтатылды"</string>
@@ -1852,10 +1864,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="7963058670863485450">"Батареяны үнемдеу режимі қараңғы тақырыпты іске қосады және фондық әрекеттерге, кейбір визуалдық әсерлерге, \"Ok Google\" сияқты функцияларға шектеу қояды немесе оларды өшіреді.\n\n"<annotation id="url">"Толығырақ"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Батареяны үнемдеу режимі қараңғы тақырыпты іске қосады және фондық әрекеттерге, кейбір визуалдық әсерлерге, \"Ok Google\" сияқты функцияларға шектеу қояды немесе оларды өшіреді."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Батареяны үнемдеу режимі қараңғы тақырыпты іске қосады және фондық әрекеттерге, кейбір визуалдық әсерлер мен белгілі бір функцияларға шектеу қояды немесе оларды өшіреді.\n\n"<annotation id="url">"Толығырақ"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Батареяны үнемдеу режимі қараңғы тақырыпты іске қосады және фондық әрекеттерге, кейбір визуалдық әсерлер мен белгілі бір функцияларға шектеу қояды немесе оларды өшіреді."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Жауап"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Бейне"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Қабылдамау"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Тұтқаны қою"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Кіріс қоңырау"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Бұл хабарландырудың маңыздылық деңгейі \"Үнсіз\" санатына төмендетілді. Пікір қалдыру үшін түртіңіз."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Бұл хабарландырудың маңыздылық деңгейі көтерілді. Пікір қалдыру үшін түртіңіз."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Бұл хабарландырудың маңыздылық деңгейі төмендетілді. Пікір қалдыру үшін түртіңіз."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Кеңейтілген хабарландыруларды пайдалану"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Ұсынылған әрекеттер, жауаптар және т.б. алып отыру үшін \"Кеңейтілген хабарландырулар\" функциясын қосыңыз. Android-тың \"Бейімделетін хабарландырулар\" функциясына бұдан былай қолдау көрсетілмейді."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Қосу"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Қазір емес"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Толығырақ"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"\"Кеңейтілген хабарландырулар\" функциясы барлық хабарландыру мазмұнын (контакт атаулары мен хабарлар сияқты жеке ақпаратты қоса алғанда) оқи алады. Сондай-ақ бұл функция арқылы хабарландыруларды жабуға немесе хабарландырулардағы түймелерді басқаруға (мысалы, телефон қоңырауларына жауап беру) болады.\n\nОл арқылы \"Маңызды\" режимін қосуға немесе өшіруге, қатысты параметрлерді өзгертуге де болады."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Режим туралы хабарландыру"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея заряды азаюы мүмкін"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батарея ұзаққа жетуі үшін, Батареяны үнемдеу режимі іске қосылды"</string>
@@ -2112,7 +2128,7 @@
       <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
       <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%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-km/strings.xml b/core/res/res/values-km/strings.xml
index 370bb29..4834695 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1365,8 +1365,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>
@@ -1566,7 +1566,7 @@
     <string name="action_menu_overflow_description" msgid="4579536843510088170">"ជម្រើស​ច្រើន​ទៀត"</string>
     <string name="action_bar_home_description_format" msgid="5087107531331621803">"%1$s, %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="4346835454749569826">"%1$s, %2$s, %3$s"</string>
-    <string name="storage_internal" msgid="8490227947584914460">"ឧបករណ៍ផ្ទុកដែលចែករំលែកខាងក្នុង"</string>
+    <string name="storage_internal" msgid="8490227947584914460">"ទំហំផ្ទុករួមខាងក្នុង"</string>
     <string name="storage_sd_card" msgid="3404740277075331881">"កាត​អេសឌី"</string>
     <string name="storage_sd_card_label" msgid="7526153141147470509">"កាត SD <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
     <string name="storage_usb_drive" msgid="448030813201444573">"ឧបករណ៍ផ្ទុក USB"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"ធំ"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"​មិន​ស្គាល់​បញ្ឈរ"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"មិន​ស្គាល់​ទេសភាព"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"បាន​បោះ​បង់​"</string>
@@ -1852,8 +1864,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="7963058670863485450">"មុខងារ​សន្សំថ្ម​បើករចនាប័ទ្មងងឹត និងបិទឬដាក់កំហិត​លើសកម្មភាព​ផ្ទៃខាងក្រោយ ឥទ្ធិពលរូបភាព​មួយចំនួន និងមុខងារ​ដូចជា “Ok Google” ជាដើម\n\n"<annotation id="url">"ស្វែងយល់​បន្ថែម"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"មុខងារ​សន្សំថ្ម​បើករចនាប័ទ្មងងឹត និងបិទឬដាក់កំហិត​លើសកម្មភាព​ផ្ទៃខាងក្រោយ ឥទ្ធិពលរូបភាព​មួយចំនួន និងមុខងារ​ដូចជា “Ok Google” ជាដើម។"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"មុខងារសន្សំថ្មបើក​រចនាប័ទ្មងងឹត និងដាក់កំហិត ឬបិទសកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពលរូបភាពមួយចំនួន និងមុខងារជាក់លាក់។\n\n"<annotation id="url">"ស្វែងយល់បន្ថែម"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"មុខងារសន្សំថ្មបើក​រចនាប័ទ្មងងឹត និងដាក់កំហិត ឬបិទសកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពលរូបភាពមួយចំនួន និងមុខងារជាក់លាក់។"</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ការជូនដំណឹងនេះ​ត្រូវបានបន្ទាបតំណែងទៅ​ស្ងាត់។ សូមចុច​ដើម្បី​ផ្ដល់មតិកែលម្អ។"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ការជូនដំណឹងនេះ​ត្រូវបានចាត់ថ្នាក់​ខ្ពស់ជាងមុន។ សូមចុច​ដើម្បី​ផ្ដល់មតិកែលម្អ។"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ការជូនដំណឹងនេះ​ត្រូវបានចាត់ថ្នាក់​ទាបជាងមុន។ សូមចុច​ដើម្បី​ផ្ដល់មតិកែលម្អ។"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"សាកល្បងប្រើការជូនដំណឹងប្រសើរជាងមុន"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"ដើម្បីបន្ត​ទទួលបាន​ការឆ្លើយតប សកម្មភាព​ដែលបានណែនាំ និងអ្វីៗ​ជាច្រើនទៀត សូមបើក​ការជូនដំណឹង​ប្រសើរជាងមុន​។ ការជូនដំណឺង​ដែលមានភាព​បត់បែន Android មិនអាចប្រើ​បានទៀតទេ​។"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"បើក"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"កុំទាន់"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ស្វែងយល់បន្ថែម"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"ការជូនដំណឹង​ប្រសើរជាងមុន​អាចអាន​ខ្លឹមសារ​ជូនដំណឹង​ទាំងអស់ រួមទាំង​ព័ត៌មានផ្ទាល់ខ្លួនដូចជា ឈ្មោះទំនាក់ទំនង និង​សារជាដើម​។ មុខងារនេះ​ក៏អាចច្រានចោល​ការជូនដំណឹង ឬធ្វើសកម្មភាព​លើប៊ូតុង​នៅក្នុង​ការជូនដំណឹង​ផងដែរ ដូចជា​ការទទួល​ការហៅទូរសព្ទ​ជាដើម។\n\nមុខងារនេះ​ក៏អាចបើក​ឬបិទមុខងារ​អាទិភាព និង​ផ្លាស់ប្ដូរ​ការកំណត់​ដែលពាក់ព័ន្ធ​ផងដែរ​។"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ការ​ជូនដំណឹង​ព័ត៌មាន​របស់​មុខងារ​ទម្លាប់"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ថ្ម​អាច​នឹង​អស់ មុនពេល​សាកថ្មធម្មតា"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"បាន​បើក​ដំណើរការមុខងារ​សន្សំ​ថ្ម ដើម្បីបង្កើនកម្រិត​ថាមពល​​ថ្ម"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 0daa7fe..07e0ca3 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -220,7 +220,7 @@
     <string name="turn_on_radio" msgid="2961717788170634233">"ವೈರ್‌ಲೆಸ್ ಆನ್‌ ಮಾಡಿ"</string>
     <string name="turn_off_radio" msgid="7222573978109933360">"ವೈರ್‌ಲೆಸ್ ಆಫ್ ಮಾಡು"</string>
     <string name="screen_lock" msgid="2072642720826409809">"ಸ್ಕ್ರೀನ್ ಲಾಕ್"</string>
-    <string name="power_off" msgid="4111692782492232778">"ಪವರ್ ಆಫ್ ಮಾಡು"</string>
+    <string name="power_off" msgid="4111692782492232778">"ಪವರ್ ಆಫ್"</string>
     <string name="silent_mode_silent" msgid="5079789070221150912">"ರಿಂಗರ್ ಆಫ್"</string>
     <string name="silent_mode_vibrate" msgid="8821830448369552678">"ರಿಂಗರ್ ವೈಬ್ರೇಷನ್‌"</string>
     <string name="silent_mode_ring" msgid="6039011004781526678">"ರಿಂಗರ್ ಆನ್"</string>
@@ -244,7 +244,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>
@@ -1366,7 +1366,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">"ವೈರ್‌ಲೆಸ್ ಡೀಬಗ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"ವೈರ್‌ಲೆಸ್ ಡೀಬಗ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಆಫ್‌ ಮಾಡಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
@@ -1773,6 +1773,28 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"ಮೊನಾರ್ಕ್‌"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"ಕ್ವಾರ್ಟೊ"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <!-- no translation found for mediasize_na_ansi_c (3104916921818289618) -->
+    <skip />
+    <!-- no translation found for mediasize_na_ansi_d (254005964819282724) -->
+    <skip />
+    <!-- no translation found for mediasize_na_ansi_e (4424174989686785675) -->
+    <skip />
+    <!-- no translation found for mediasize_na_ansi_f (146980362213260987) -->
+    <skip />
+    <!-- no translation found for mediasize_na_arch_a (5280681822380032361) -->
+    <skip />
+    <!-- no translation found for mediasize_na_arch_b (2113344093437297427) -->
+    <skip />
+    <!-- no translation found for mediasize_na_arch_c (971002546186856623) -->
+    <skip />
+    <!-- no translation found for mediasize_na_arch_d (6450996075335049806) -->
+    <skip />
+    <!-- no translation found for mediasize_na_arch_e (6782708486949266519) -->
+    <skip />
+    <!-- no translation found for mediasize_na_arch_e1 (4707138568738504275) -->
+    <skip />
+    <!-- no translation found for mediasize_na_super_b (6964127155618393178) -->
+    <skip />
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1831,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"ಅಪರಿಚಿತ ಪೋರ್ಟ್ರೇಟ್"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"ಅಪರಿಚಿತ ಲ್ಯಾಂಡ್‌ಸ್ಕೇಪ್"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ರದ್ದುಮಾಡಲಾಗಿದೆ"</string>
@@ -1852,8 +1875,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="7963058670863485450">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್‌ಗಳು ಮತ್ತು “Ok Google” ನಂತಹ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಆಫ್ ಮಾಡುತ್ತದೆ.\n\n"<annotation id="url">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್‌ಗಳು ಮತ್ತು “Ok Google” ನಂತಹ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಆಫ್ ಮಾಡುತ್ತದೆ."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್‌ಗಳು, ಮತ್ತು ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಆಫ್ ಮಾಡುತ್ತದೆ.\n\n"<annotation id="url">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್‌ಗಳು, ಮತ್ತು ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಆಫ್ ಮಾಡುತ್ತದೆ."</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>
@@ -1929,8 +1952,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"ಉತ್ತರಿಸಿ"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ವೀಡಿಯೊ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"ನಿರಾಕರಿಸಿ"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ಹ್ಯಾಂಗ್ ಅಪ್"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ಒಳಬರುವ ಕರೆ"</string>
@@ -2074,12 +2096,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ಈ ಅಧಿಸೂಚನೆಗೆ ಸೈಲೆಂಟ್‌ಗೆ ಹಿಂಬಡ್ತಿ ನೀಡಲಾಗಿದೆ. ಪ್ರತಿಕ್ರಿಯೆ ನೀಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ಈ ಅಧಿಸೂಚನೆಗೆ ಮೇಲಿನ ಸ್ಥಾನವನ್ನು ನೀಡಲಾಗಿದೆ. ಪ್ರತಿಕ್ರಿಯೆ ನೀಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ಈ ಅಧಿಸೂಚನೆಗೆ ಕೆಳಗಿನ ಸ್ಥಾನವನ್ನು ನೀಡಲಾಗಿದೆ. ಪ್ರತಿಕ್ರಿಯೆ ನೀಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"ವರ್ಧಿತ ಅಧಿಸೂಚನೆಗಳು ಪ್ರಯತ್ನಿಸಿ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"ಸೂಚಿಸಲಾದ ಕ್ರಿಯೆಗಳು, ಪ್ರತ್ಯುತ್ತರಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಪಡೆಯಲು, ವರ್ಧಿತ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆನ್ ಮಾಡಿ. Android ಅಡಾಪ್ಟಿವ್ ಅಧಿಸೂಚನೆಗಳು ಇನ್ನು ಮುಂದೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ಆನ್ ಮಾಡಿ"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ಈಗ ಬೇಡ"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"ವರ್ಧಿತ ಅಧಿಸೂಚನೆಗಳು ಸಂಪರ್ಕ ಹೆಸರುಗಳು ಮತ್ತು ಸಂದೇಶಗಳಂತಹ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಎಲ್ಲಾ ಅಧಿಸೂಚನೆ ವಿಷಯವನ್ನು ಓದಬಹುದು. ಈ ವೈಶಿಷ್ಟ್ಯವು ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾಗೊಳಿಸಬಹುದು ಅಥವಾ ಫೋನ್ ಕರೆಗಳಿಗೆ ಉತ್ತರಿಸುವಂತಹ ಅಧಿಸೂಚನೆಗಳಲ್ಲಿನ ಬಟನ್‌ಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಕ್ರಮ ತೆಗೆದುಕೊಳ್ಳಬಹುದು.\n\nಈ ವೈಶಿಷ್ಟ್ಯವು ಆದ್ಯತಾ ಮೋಡ್ ಅನ್ನು ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡಬಹುದು ಮತ್ತು ಸಂಬಂಧಿತ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ದೈನಂದಿನ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯ ಅಧಿಸೂಚನೆ"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ಚಾರ್ಜ್‌ಗೆ ಮೊದಲೆ ಬ್ಯಾಟರಿ ಮುಗಿದು ಬಿಡಬಹುದು"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ಬ್ಯಾಟರಿ ಅವಧಿ ಹೆಚ್ಚಿಸಲು ಬ್ಯಾಟರಿ ಸೇವರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index da8f4ab..8208182 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"모나크"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"쿼토"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"풀스캡"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"지정되지 않은 세로 방향"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"지정되지 않은 가로 방향"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"취소됨"</string>
@@ -1852,8 +1864,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="7963058670863485450">"절전 기능은 어두운 테마를 사용 설정하고 백그라운드 활동, 일부 시각 효과, \'Hey Google\'과 같은 기능을 제한하거나 사용 중지합니다.\n\n"<annotation id="url">"자세히 알아보기"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"절전 기능은 어두운 테마를 사용 설정하고 백그라운드 활동, 일부 시각 효과, \'Hey Google\'과 같은 기능을 제한하거나 사용 중지합니다."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"절전 모드는 어두운 테마를 사용 설정하고 백그라운드 활동, 일부 시각 효과, 특정 기능을 제한하거나 사용 중지합니다.\n\n"<annotation id="url">"자세히 알아보기"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"절전 모드는 어두운 테마를 사용 설정하고 백그라운드 활동, 일부 시각 효과, 특정 기능을 제한하거나 사용 중지합니다."</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"이 알림의 중요도가 무음으로 하향되었습니다. 의견을 보내려면 탭하세요."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"이전에 이 알림의 중요도는 더 높았습니다. 의견을 보내려면 탭하세요."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"이전에 이 알림의 중요도는 더 낮았습니다. 의견을 보내려면 탭하세요."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"개선된 알림 기능 사용해 보기"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"추천 작업, 답장 등을 계속 받으려면 개선된 알림 기능을 사용 설정하세요. Android 적응형 알림은 더 이상 지원되지 않습니다."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"사용 설정"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"나중에"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"자세히 알아보기"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"개선된 알림 기능은 연락처 이름과 메시지 등 개인 정보가 포함된 모든 알림 내용을 읽어줍니다. 알림을 닫거나 알림에 표시되는 버튼 관련 작업(예: 전화 받기)을 실행할 수도 있습니다.\n\n또한 이 기능은 우선순위 모드를 사용 또는 사용 중지하고 관련 설정을 변경할 수 있습니다."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"루틴 모드 정보 알림"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다."</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"배터리 수명을 연장하기 위해 절전 모드가 활성화되었습니다."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index de0acbe..697b60b5 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch (184mm x 267mm)"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto (203mm x 254mm)"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap (203mm x 330mm)"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K (270mm x 390mm)"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K (195mm x 270mm)"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1 (102mm x 165mm)"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu (240mm x 322.1mm)"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2 (240mm x 332mm)"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4 (105mm x 235mm)"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"Ч"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Белгисиз, тикесинен"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Белгисиз, туурасынан"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Токтотулду"</string>
@@ -1852,8 +1864,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="7963058670863485450">"Батареяны үнөмдөгүч режиминде Караңгы тема күйгүзүлүп, фондогу аракеттер, айрым визуалдык эффекттер жана \"Окей, Google\" сыяктуу функциялар чектелип же өчүрүлөт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Батареяны үнөмдөгүч режиминде Караңгы тема күйгүзүлүп, фондогу аракеттер, айрым визуалдык эффекттер жана \"Окей, Google\" сыяктуу функциялар чектелип же өчүрүлөт."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Батареяны үнөмдөгүч режиминде Караңгы тема күйгүзүлүп, фондогу аракеттер, айрым визуалдык эффекттер жана белгилүү бир функциялар чектелип же өчүрүлөт.\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Батареяны үнөмдөгүч режиминде Караңгы тема күйгүзүлүп, фондогу аракеттер, айрым визуалдык эффекттер жана белгилүү бир функциялар чектелип же өчүрүлөт."</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Бул билдирменин маанилүүлүгү Үнсүз болуп төмөндөтүлдү. Пикир билдирүү үчүн таптап коюңуз."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Бул билдирменин маанилүүлүгү жогорулатылды. Пикир билдирүү үчүн таптап коюңуз."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Бул билдирменин маанилүүлүгү төмөндөтүлдү. Пикир билдирүү үчүн таптап коюңуз."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Жакшыр-ган бил-ди байкап көрүү"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Сунушталган аракеттерди, жоопторду жана башка маалыматты ала берүү үчүн жакшыртылган билдирмелерди күйгүзүңүз. Android\'дин Ыңгайлаштырылуучу билдирмелери колдоого алынбай калды."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Күйгүзүү"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Азыр эмес"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Кененирээк"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Жакшыртылган билдирмелер бардык билдирмелердин мазмунун, ошондой эле байланыштардын аты-жөнү жана билдирүүлөр сыяктуу жеке маалыматты окуй алат. Мындан тышкары, билдирмелерди жаап же телефон чалууларына жооп берүү сыяктуу билдирмелердеги баскычтарды баса алат.\n\nБул функция Маанилүү жазышуулар режимин күйгүзүп же өчүрүп, ошондой эле анын жөндөөлөрүн өзгөртө алат."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Режимдин адаттагы билдирмеси"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея кубаттоого чейин отуруп калышы мүмкүн"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батареянын отуруп калбашы үчүн Батареяны үнөмдөгүч режими иштетилди"</string>
@@ -2130,8 +2147,8 @@
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сүрөт жөнөттү"</string>
-    <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Жазышуу"</string>
-    <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтошуп жазышуу"</string>
+    <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Сүйлөшүү"</string>
+    <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтошуп сүйлөшүү"</string>
     <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>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index caa9154..f75612f 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Unknown portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Unknown landscape"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ຍົກເລີກແລ້ວ"</string>
@@ -1852,8 +1864,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="7963058670863485450">"ຕົວປະຢັດແບັດເຕີຣີຈະເປີດໃຊ້ຮູບແບບສີສັນມືດ ແລະ ຈຳກັດ ຫຼື ປິດການ​ເຄື່ອນ​ໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກດ້ານພາບບາງຢ່າງ ແລະ ຄຸນສົມບັດຕ່າງໆ ເຊັ່ນ: “Ok Google”\n\n"<annotation id="url">"ສຶກສາເພີ່ມເຕີມ"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"ຕົວປະຢັດແບັດເຕີຣີຈະເປີດໃຊ້ຮູບແບບສີສັນມືດ ແລະ ຈຳກັດ ຫຼື ປິດການ​ເຄື່ອນ​ໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກດ້ານພາບບາງຢ່າງ ແລະ ຄຸນສົມບັດຕ່າງໆ ເຊັ່ນ: “Ok Google”."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"ຕົວປະຢັດແບັດເຕີຣີຈະເປີດໃຊ້ຮູບແບບສີສັນມືດ ແລະ ຈຳກັດ ຫຼື ປິດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກທາງພາບຈຳນວນໜຶ່ງ ແລະ ຄຸນສົມບັດບາງຢ່າງ.\n\n"<annotation id="url">"ສຶກສາເພີ່ມເຕີມ"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"ຕົວປະຢັດແບັດເຕີຣີຈະເປີດໃຊ້ຮູບແບບສີສັນມືດ ແລະ ຈຳກັດ ຫຼື ປິດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກທາງພາບຈຳນວນໜຶ່ງ ແລະ ຄຸນສົມບັດບາງຢ່າງ."</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>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ການແຈ້ງເຕືອນນີ້ຖືກຫຼຸດລະດັບເປັນປິດສຽງແລ້ວ. ແຕະເພື່ອສົ່ງຄຳຕິຊົມ."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ການແຈ້ງເຕືອນນີ້ຖືກເລື່ອນລະດັບຂຶ້ນແລ້ວ. ແຕະເພື່ອສົ່ງຄຳຕິຊົມ."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ການແຈ້ງເຕືອນນີ້ຖືກຫຼຸດລະດັບລົງແລ້ວ. ແຕະເພື່ອສົ່ງຄຳຕິຊົມ."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"ລອງໃຊ້ການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"ກະລຸນາເປີດໃຊ້ການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນເພື່ອສືບຕໍ່ຮັບຄຳສັ່ງທີ່ແນະນຳ, ການຕອບກັບ ແລະ ອື່ນໆ. ບໍ່ຮອງຮັບການແຈ້ງເຕືອນແບບປັບຕົວໄດ້ຂອງ Android ອີກຕໍ່ໄປແລ້ວ."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ເປີດໃຊ້"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ບໍ່ຟ້າວເທື່ອ"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"ການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນ"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"ຕອນນີ້ຄຳສັ່ງ ແລະ ການຕອບກັບທີ່ແນະນຳແມ່ນສະໜອງໃຫ້ໂດຍການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນ. ບໍ່ຮອງຮັບການແຈ້ງເຕືອນແບບປັບຕົວໄດ້ຂອງ Android ອີກຕໍ່ໄປແລ້ວ."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ຕົກລົງ"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ປິດໄວ້"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ສຶກສາເພີ່ມເຕີມ"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"ການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນສາມາດອ່ານເນື້ອຫາການແຈ້ງເຕືອນທັງໝົດໄດ້, ຮວມທັງຂໍ້ມູນສ່ວນຕົວ ເຊັ່ນ: ຊື່ຜູ້ຕິດຕໍ່ ແລະ ຂໍ້ຄວາມຕ່າງໆ. ນອກຈາກນັ້ນ, ຄຸນສົມບັດນີ້ຍັງສາມາດປິດການແຈ້ງເຕືອນໄວ້ ຫຼື ໃຊ້ຄຳສັ່ງຕ່າງໆຢູ່ປຸ່ມໃນການແຈ້ງເຕືອນໄດ້ນຳ ເຊັ່ນ: ການຮັບສາຍໂທລະສັບ.\n\nຄຸນສົມບັດນີ້ສາມາດເປີດ ຫຼື ປິດໂໝດສຳຄັນ ແລະ ປ່ຽນການຕັ້ງຄ່າທີ່ກ່ຽວຂ້ອງໄດ້ນຳ."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"ການແຈ້ງເຕືອນແບບປັບຕົວໄດ້ຂອງ Android ຖືກແທນທີ່ດ້ວຍການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນໃນ Android 12 ແລ້ວ. ຄຸນສົມບັດນີ້ສະແດງຄຳສັ່ງ ແລະ ການຕອບກັບທີ່ແນະນຳ ແລະ ຈັດລະບຽບການແຈ້ງເຕືອນຂອງທ່ານ.\n\nການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນສາມາດເຂົ້າເຖິງເນື້ອຫາການແຈ້ງເຕືອນໄດ້, ຮວມທັງຂໍ້ມູນສ່ວນຕົວ ເຊັ່ນ: ຊື່ຜູ້ຕິດຕໍ່ ແລະ ຂໍ້ຄວາມ. ຄຸນສົມບັດນີ້ສາມາດປິດ ຫຼື ຕອບກັບຫາການແຈ້ງເຕືອນໄດ້ນຳ ເຊັ່ນ: ການຮັບສາຍໂທລະສັບ ແລະ ການຄວບຄຸມໂໝດຫ້າມລົບກວນ."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ການແຈ້ງເຕືອນຂໍ້ມູນໂໝດກິດຈະວັດປະຈຳວັນ"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ແບັດເຕີຣີອາດໝົດກ່ອນການສາກຕາມປົກກະຕິ"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ເປີດຕົວປະຢັດແບັດເຕີຣີເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index d06bc16..88c90b7 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Nežinomas stačias"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Nežinomas gulsčias"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Atšaukta"</string>
@@ -1898,8 +1910,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Atnaujino administratorius"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Ištrynė administratorius"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Gerai"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Akumuliatoriaus tausojimo priemonė įjungia tamsiąją temą ir apriboja arba išjungia veiklą fone, kai kuriuos vizualinius efektus ir funkcijas, pvz., „Ok Google“\n\n"<annotation id="url">"Sužinokite daugiau"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Akumuliatoriaus tausojimo priemonė įjungia tamsiąją temą ir apriboja arba išjungia veiklą fone, kai kuriuos vizualinius efektus ir funkcijas, pvz., „Ok Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Akumuliatoriaus tausojimo priemonė įjungia tamsiąją temą ir apriboja arba išjungia veiklą fone, kai kuriuos vaizdinius efektus bei tam tikras funkcijas.\n\n"<annotation id="url">"Sužinokite daugiau"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Akumuliatoriaus tausojimo priemonė įjungia tamsiąją temą ir apriboja arba išjungia veiklą fone, kai kuriuos vaizdinius efektus bei tam tikras funkcijas."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Kad padėtų sumažinti duomenų naudojimą, Duomenų taupymo priemonė neleidžia kai kurioms programoms siųsti ar gauti duomenų fone. Šiuo metu naudojama programa gali pasiekti duomenis, bet tai bus daroma rečiau. Tai gali reikšti, kad, pvz., vaizdai nebus pateikiami, jei jų nepaliesite."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Įj. Duomenų taupymo priemonę?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Įjungti"</string>
@@ -1991,8 +2003,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Uždaryti"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Atsakyti"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Vaizdo įrašas"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Atmesti"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Baigti pok."</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Gaunamasis skambutis"</string>
@@ -2140,12 +2151,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Šio pranešimo svarba sumažinta iki begarsio lygio. Palieskite, kad pateiktumėte atsiliepimą."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Šio pranešimo svarba padidinta. Palieskite, kad pateiktumėte atsiliepimą."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Šio pranešimo svarba sumažinta. Palieskite, kad pateiktumėte atsiliepimą."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Išb. patobulintus pranešimus"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Norėdami toliau gauti siūlomus veiksmus, atsakymus ir daugiau, įjunkite patobulintus pranešimus. „Android“ prisitaikantys pranešimai nebepalaikomi."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Įjungti"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ne dabar"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Sužinokite daugiau"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Patobulintų pranešimų funkcija gali skaityti visų pranešimų turinį, įskaitant asmens informaciją (pvz., kontaktų vardus ir pranešimus). Ši funkcija taip pat gali atsisakyti pranešimų ar imtis veiksmų su pranešimuose esančiais mygtukais, pvz., atsakyti į telefono skambučius.\n\nBe to, ši funkcija gali įjungti arba išjungti svarbiausių pokalbių režimą ir pakeisti susijusius nustatymus."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Veiksmų sekos režimo informacijos pranešimas"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akumuliatoriaus energija gali išsekti prieš įprastą įkrovimą"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akumuliatoriaus tausojimo priemonė suaktyvinta, kad akumuliatorius veiktų ilgiau"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 7e54fb9..c952dc2 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1795,6 +1795,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1831,6 +1842,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Nezināma izmēra portrets"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Nezināma izmēra ainava"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Atcelts"</string>
@@ -1875,8 +1887,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Atjaunināja administrators"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Dzēsa administrators"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Labi"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Akumulatora enerģijas taupīšanas režīmā tiek ieslēgts tumšais motīvs un ierobežotas vai izslēgtas darbības fonā, konkrēti vizuālie efekti un tādas funkcijas kā īsinājumvārda “Hey Google” atpazīšana.\n\n"<annotation id="url">"Uzzināt vairāk"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Akumulatora enerģijas taupīšanas režīmā tiek ieslēgts tumšais motīvs un ierobežotas vai izslēgtas darbības fonā, konkrēti vizuālie efekti un tādas funkcijas kā īsinājumvārda “Hey Google” atpazīšana."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Akumulatora enerģijas taupīšanas režīmā tiek ieslēgts tumšais motīvs, kā arī tiek ierobežotas vai izslēgtas darbības fonā, daži vizuālie efekti un funkcijas.\n\n"<annotation id="url">"Uzzināt vairāk"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Akumulatora enerģijas taupīšanas režīmā tiek ieslēgts tumšais motīvs, kā arī tiek ierobežotas vai izslēgtas darbības fonā, daži vizuālie efekti un funkcijas."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Lai samazinātu datu lietojumu, datu lietojuma samazinātājs neļauj dažām lietotnēm fonā nosūtīt vai saņemt datus. Lietotne, kuru pašlaik izmantojat, var piekļūt datiem, bet, iespējams, piekļūs tiem retāk (piemēram, attēli tiks parādīti tikai tad, kad tiem pieskarsieties)."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Vai ieslēgt datu lietojuma samazinātāju?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ieslēgt"</string>
@@ -1960,8 +1972,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Aizvērt"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Atbildēt"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Noraidīt"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Pārtraukt"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Ienākošais zvans"</string>
@@ -2107,12 +2118,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Šī paziņojuma svarīgums tika pazemināts, un paziņojums tiks rādīts bez skaņas. Lai sniegtu atsauksmes, pieskarieties."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Šī paziņojuma rangs tika paaugstināts. Lai sniegtu atsauksmes, pieskarieties."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Šī paziņojuma rangs tika pazemināts. Lai sniegtu atsauksmes, pieskarieties."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Uzlabotie paziņojumi"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Lai arī turpmāk saņemtu darbību un atbilžu ieteikumus un citu saturu, ieslēdziet uzlabotos paziņojumus. Android adaptīvie paziņojumi vairs netiek atbalstīti."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Ieslēgt"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Vēlāk"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Uzzināt vairāk"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Funkcija “Uzlabotie paziņojumi” var lasīt visu paziņojumu saturu, tostarp personas informāciju, piemēram, kontaktpersonu vārdus un ziņojumus. Šī funkcija var arī noraidīt paziņojumus un izmantot paziņojumos esošās pogas darbību veikšanai, piemēram, atbildēt uz tālruņa zvaniem.\n\nTurklāt šī funkcija var ieslēgt un izslēgt režīmu Prioritāte un mainīt ar to saistītos iestatījumus."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informatīvs paziņojums par akumulatoru"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akumulators var izlādēties pirms parastā uzlādes laika"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Aktivizēts akumulatora enerģijas taupīšanas režīms, lai palielinātu akumulatora darbības ilgumu"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 1e4ede2..82ac5828 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1566,7 +1566,7 @@
     <string name="action_menu_overflow_description" msgid="4579536843510088170">"Повеќе опции"</string>
     <string name="action_bar_home_description_format" msgid="5087107531331621803">"%1$s, %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="4346835454749569826">"%1$s, %2$s, %3$s"</string>
-    <string name="storage_internal" msgid="8490227947584914460">"Внатрешно заедничко место за складирање"</string>
+    <string name="storage_internal" msgid="8490227947584914460">"Внатрешен споделен капацитет"</string>
     <string name="storage_sd_card" msgid="3404740277075331881">"СД картичка"</string>
     <string name="storage_sd_card_label" msgid="7526153141147470509">"<xliff:g id="MANUFACTURER">%s</xliff:g> СД-картичка"</string>
     <string name="storage_usb_drive" msgid="448030813201444573">"USB-меморија"</string>
@@ -1621,7 +1621,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>
@@ -1694,9 +1694,9 @@
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Ако вклучите <xliff:g id="SERVICE">%1$s</xliff:g>, уредот нема да го користи заклучувањето на екранот за да го подобри шифрирањето на податоците."</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"Целосната контрола е соодветна за апликации што ви помагаат со потребите за пристапност, но не и за повеќето апликации."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Приказ и контрола на екранот"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Може да ги чита сите содржини на екранот и да прикажува содржини на други апликации."</string>
-    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Приказ и изведување дејства"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Може да ги следи вашите интеракции со апликациите или хардверскиот сензор и да комуницира со апликациите во ваше име."</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Може да ги чита сите содржини на екранот и да прикажува содржини врз другите апликации."</string>
+    <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Преглед и вршење на дејствата"</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Може да ја следи вашата интеракција со апликациите или хардверскиот сензор и да врши интеракција со апликациите во ваше име."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Дозволи"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Одбиј"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Допрете на функција за да почнете да ја користите:"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Монарх"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Кварто"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Непознат портрет"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Непознат пејзаж"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Откажано"</string>
@@ -1852,8 +1864,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="7963058670863485450">"„Штедачот на батерија“ вклучува темна тема и исклучува или ограничува активност во заднина, некои визуелни ефекти и функции како „Ok Google“\n\n"<annotation id="url">"Дознајте повеќе"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"„Штедачот на батерија“ вклучува темна тема и исклучува или ограничува активност во заднина, некои визуелни ефекти и функции како „Ok Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"„Штедачот на батерија“ ја вклучува темната тема и ги ограничува или исклучува активноста во заднина, некои визуелни ефекти и одредени функции.\n\n"<annotation id="url">"Дознајте повеќе"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"„Штедачот на батерија“ ја вклучува темната тема и ги ограничува или исклучува активноста во заднина, некои визуелни ефекти и одредени функции."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Одговори"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Видео"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Одбиј"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Спушти"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Дојдовен повик"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Приоритетноста на известувањево е намалена на „Тивко“. Допрете за да дадете повратни информации."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Известувањево е рангирано повисоко. Допрете за да дадете повратни информации."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Известувањево е рангирано пониско. Допрете за да дадете повратни информации."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Пробај „Подобрени известувања“"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Вклучете ги „Подобрените известувања“ за да продолжите да добивате предлози за дејства, одговори и слично. „Приспособливите известувања на Android“ веќе не се достапни."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Вклучи"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Не сега"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Подобрени известувања"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"„Подобрените известувања“ сега ги даваат предложените дејства и одговорите. „Приспособливите известувања на Android“ веќе не се достапни."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Во ред"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Исклучи"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Дознајте повеќе"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"„Подобрените известувања“ може да ги читаат сите содржини од известувањата, вклучително и личните податоци, како што се имињата на контактите и пораките. Функцијава ќе може и да отфрла известувања или да ги користи копчињата во известувањата, како на пр., да одговара на телефонски повици.\n\nФункцијава може и да го вклучува или исклучува „Приоритетниот режим“ и да ги менува поврзаните поставки."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"„Подобрените известувања“ ги заменија „Приспособливите известувања на Android“ во Android 12. Оваа функција прикажува предложени дејства и одговори и ги организира вашите известувања.\n\n„Подобрените известувања“ може да пристапат до содржините од известувањата, вклучително и личните податоци, како што се имињата на контактите и пораките. Функцијава може и да отфрла или одговара на известувања, како на пример, одговарање телефонски повици и контролирање на „Не вознемирувај“."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Известување за информации за режимот за рутини"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батеријата може да се потроши пред вообичаеното време за полнење"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Активиран е „Штедачот на батерија“ за да се продолжи траењето на батеријата"</string>
@@ -2265,7 +2276,7 @@
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
     <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Нови поставки за зголемување"</string>
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Сега може да зголемувате дел од екранот"</string>
-    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Вклучи во „Поставки“"</string>
+    <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Вклучете во „Поставки“"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Отфрли"</string>
     <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Одблокирајте го пристапот до микрофонот на уредот"</string>
     <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Одблокирајте го пристапот до камерата на уредот"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 1a27c20..e6ff7ea 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -220,7 +220,7 @@
     <string name="turn_on_radio" msgid="2961717788170634233">"വയർലെസ് ഓണാക്കുക"</string>
     <string name="turn_off_radio" msgid="7222573978109933360">"വയർലെസ്സ് ഓഫാക്കുക"</string>
     <string name="screen_lock" msgid="2072642720826409809">"സ്‌ക്രീൻ ലോക്ക്"</string>
-    <string name="power_off" msgid="4111692782492232778">"പവർ ഓഫാക്കുക"</string>
+    <string name="power_off" msgid="4111692782492232778">"പവർ ഓഫ്"</string>
     <string name="silent_mode_silent" msgid="5079789070221150912">"റിംഗർ ഓഫുചെയ്യുക"</string>
     <string name="silent_mode_vibrate" msgid="8821830448369552678">"റിംഗർ വൈബ്രേറ്റുചെയ്യുക"</string>
     <string name="silent_mode_ring" msgid="6039011004781526678">"റിംഗർ ഓൺചെയ്യുക"</string>
@@ -244,10 +244,10 @@
     <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>
+    <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>
@@ -1194,7 +1194,7 @@
     <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"ആക്‌സസ് നൽകുക"</string>
     <string name="whichEditApplication" msgid="6191568491456092812">"ഇത് ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string>
     <string name="whichEditApplicationNamed" msgid="8096494987978521514">"%1$s ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string>
-    <string name="whichEditApplicationLabel" msgid="1463288652070140285">"എഡിറ്റുചെയ്യുക"</string>
+    <string name="whichEditApplicationLabel" msgid="1463288652070140285">"എഡിറ്റ് ചെയ്യുക"</string>
     <string name="whichSendApplication" msgid="4143847974460792029">"പങ്കിടുക"</string>
     <string name="whichSendApplicationNamed" msgid="4470386782693183461">"%1$s എന്നതുമായി പങ്കിടുക"</string>
     <string name="whichSendApplicationLabel" msgid="7467813004769188515">"പങ്കിടുക"</string>
@@ -1497,7 +1497,7 @@
     <string name="vpn_lockdown_config" msgid="8331697329868252169">"നെറ്റ്‍വര്‍ക്ക് അല്ലെങ്കിൽ VPN ക്രമീകരണം മാറ്റുക"</string>
     <string name="upload_file" msgid="8651942222301634271">"ഫയല്‍‌ തിരഞ്ഞെടുക്കുക"</string>
     <string name="no_file_chosen" msgid="4146295695162318057">"ഫയലൊന്നും തിരഞ്ഞെടുത്തില്ല"</string>
-    <string name="reset" msgid="3865826612628171429">"പുനഃസജ്ജമാക്കുക"</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_message" msgid="8954550232288567515">"ഡ്രൈവിംഗ് ആപ്പിൽ നിന്ന് പുറത്തുകടക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
@@ -1572,7 +1572,7 @@
     <string name="storage_usb_drive" msgid="448030813201444573">"USB ഡ്രൈവ്"</string>
     <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="extract_edit_menu_button" msgid="63954536535863040">"എഡിറ്റ് ചെയ്യുക"</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>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"മൊണാർക്ക്"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"ക്വാർട്ടോ"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"ഫൂൾസ്‌കെയ്പ്പ്"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"കഹു"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"അജ്ഞാത പോർട്രെയ്റ്റ്"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"അജ്ഞാത ലാൻഡ്‌സ്‌കെയ്പ്പ്"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"റദ്ദാക്കി"</string>
@@ -1852,8 +1864,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="7963058670863485450">"ബാറ്ററി ലാഭിക്കൽ, ഡാർക്ക് തീം ഓണാക്കുന്നു, പശ്ചാത്തല പ്രവർത്തനവും ചില വിഷ്വൽ ഇഫക്‌റ്റുകളും “Ok Google” പോലുള്ള ഫീച്ചറുകളും നിയന്ത്രിക്കുകയോ ഓഫാക്കുകയോ ചെയ്യുന്നു\n\n"<annotation id="url">"കൂടുതലറിയുക"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"ബാറ്ററി ലാഭിക്കൽ, ഡാർക്ക് തീം ഓണാക്കുന്നു, പശ്ചാത്തല പ്രവർത്തനവും ചില വിഷ്വൽ ഇഫക്‌റ്റുകളും “Ok Google” പോലുള്ള ഫീച്ചറുകളും നിയന്ത്രിക്കുകയോ ഓഫാക്കുകയോ ചെയ്യുന്നു."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"ബാറ്ററി ലാഭിക്കൽ ഡാർക്ക് തീം ഓണാക്കുന്നു, കൂടാതെ പശ്ചാത്തല ആക്റ്റിവിറ്റി, ചില വിഷ്വൽ ഇഫക്റ്റുകൾ, ചില ഫീച്ചറുകൾ എന്നിവ പരിമിതപ്പെടുത്തുകയോ ഓഫാക്കുകയോ ചെയ്യുന്നു.\n\n"<annotation id="url">"കൂടുതലറിയുക"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"ബാറ്ററി ലാഭിക്കൽ ഡാർക്ക് തീം ഓണാക്കുന്നു, കൂടാതെ പശ്ചാത്തല ആക്റ്റിവിറ്റി, ചില വിഷ്വൽ ഇഫക്റ്റുകൾ, ചില ഫീച്ചറുകൾ എന്നിവ പരിമിതപ്പെടുത്തുകയോ ഓഫാക്കുകയോ ചെയ്യുന്നു."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"മറുപടി നൽകുക"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"വീഡിയോ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"നിരസിക്കുക"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"കോൾ നിർത്തുക"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ഇൻകമിംഗ് കോൾ"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ഈ അറിയിപ്പിനെ നിശബ്‌ദമാക്കി തരം താഴ്‌ത്തി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ഈ അറിയിപ്പിന് ഉയർന്ന റാങ്ക് നൽകി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ഈ അറിയിപ്പിന് താഴ്‌ന്ന റാങ്ക് നൽകി. ഫീഡ്ബാക്ക് നൽകാൻ ടാപ്പ് ചെയ്യുക."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"മെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾ പരീക്ഷിക്കൂ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"നിർദ്ദേശിച്ച പ്രവർത്തനങ്ങളും മറുപടികളും മറ്റും ലഭിക്കുന്നത് തുടരാൻ, മെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾ ഓണാക്കുക. Android അഡാപ്റ്റീവ് അറിയിപ്പുകൾക്ക് ഇനി പിന്തുണയില്ല."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ഓണാക്കുക"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ഇപ്പോൾ വേണ്ട"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"കൂടുതലറിയുക"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"മെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾക്ക്, കോൺടാക്‌റ്റ് പേരുകളും സന്ദേശങ്ങളും പോലുള്ള വ്യക്തിപരമായ വിവരങ്ങൾ ഉൾപ്പെടെ എല്ലാ അറിയിപ്പ് ഉള്ളടക്കവും വായിക്കാനാകും. അറിയിപ്പുകൾ ഡിസ്‌മിസ് ചെയ്യാനോ ഫോൺ കോളുകൾക്ക് മറുപടി നൽകുന്നത് പോലെ അറിയിപ്പുകളിലെ ബട്ടണുകളിൽ നടപടിയെടുക്കാനോ ഈ ഫീച്ചറിന് കഴിയും.\n\nമുൻഗണനാ മോഡ് ഓണാക്കാനോ ഓഫാക്കാനോ ബന്ധപ്പെട്ട ക്രമീകരണം മാറ്റാനോ ഈ ഫീച്ചറിന് കഴിയും."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ദിനചര്യ മോഡ് വിവരത്തെ കുറിച്ചുള്ള അറിയിപ്പ്"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"സാധാരണയുള്ളതിലും നേരത്തെ ബാറ്ററിയുടെ ചാർജ് തീർന്നേക്കാം"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ബാറ്ററി ലൈഫ് വര്‍ദ്ധിപ്പിക്കാൻ, ബാറ്ററി ലാഭിക്കൽ സജീവമാക്കി"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index a3a3cdb..5064068 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"Том"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Тодорхойгүй босоо цаас"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Тодорхойгүй хөндлөн цаас"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Цуцлагдсан"</string>
@@ -1852,8 +1864,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="7963058670863485450">"Батарей хэмнэгч нь Бараан загварыг асааж, дэвсгэрийн үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг онцлогуудыг хязгаарлаж эсвэл унтраана\n\n"<annotation id="url">"Нэмэлт мэдээлэл авах"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Батарей хэмнэгч нь Бараан загварыг асааж, дэвсгэрийн үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг онцлогуудыг хязгаарлаж эсвэл унтраана."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Батарей хэмнэгч нь Бараан загварыг асааж, дэвсгэрийн үйл ажиллагаа, зарим визуал эффект болон тодорхой онцлогуудийг хязгаарлаж эсвэл унтраана.\n\n"<annotation id="url">"Нэмэлт мэдээлэл авах"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Батарей хэмнэгч нь Бараан загварыг асааж, дэвсгэрийн үйл ажиллагаа, зарим визуал эффект болон тодорхой онцлогуудийг хязгаарлаж эсвэл унтраана."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Хариулах"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Видео"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Татгалзах"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Таслах"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Ирсэн дуудлага"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Энэ мэдэгдлийг Чимээгүй болгож зэргийг нь бууруулсан байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Энэ мэдэгдлийг дээгүүр зэрэглэсэн байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Энэ мэдэгдлийг доогуур зэрэглэсэн байна. Санал хүсэлт өгөхийн тулд товшино уу."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Сайжруулсан мэдэгдлийг турших"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Санал болгосон үйлдэл, хариу болон илүү ихийг үргэлжлүүлэн авахын тулд сайжруулсан мэдэгдлийг асаана уу. Android-н Орчинтой тохирсон мэдэгдлийг дэмжихээ больсон байна."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Асаах"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Одоо биш"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Нэмэлт мэдээлэл авах"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Сайжруулсан мэдэгдэл нь харилцагчийн нэр, мессеж зэрэг хувийн мэдээллийг оруулаад бүх мэдэгдлийн контентыг унших боломжтой. Энэ онцлог мөн мэдэгдлийг хаах эсвэл утасны дуудлагад хариулах гэх мэт мэдэгдэл дэх товчлуур дээр үйлдэл хийх боломжтой.\n\nЭнэ онцлог мөн Чухал горимыг асаах, унтраах болон холбогдох тохиргоог өөрчлөх боломжтой."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Хэвшлийн горимын мэдээллийн мэдэгдэл"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарей ихэвчлэн цэнэглэдэг хугацаанаас өмнө дуусаж болзошгүй"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгчийг идэвхжүүллээ"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 24ed1b6..ba20d59 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"अज्ञात पोट्रेट"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"अज्ञात लँडस्केप"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"रद्द केले"</string>
@@ -1852,8 +1864,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="7963058670863485450">"बॅटरी सेव्हर गडद थीम सुरू करते आणि बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट व “Ok Google” सारखी वैशिष्‍ट्ये मर्यादित किंवा बंद करते\n\n"<annotation id="url">"अधिक जाणून घ्या"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"बॅटरी सेव्हर गडद थीम सुरू करते आणि बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट व “Ok Google” सारखी वैशिष्‍ट्ये मर्यादित किंवा बंद करते."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"बॅटरी सेव्हर गडद थीम सुरू करते आणि बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट व ठरावीक वैशिष्ट्ये मर्यादित किंवा बंद करते.\n\n"<annotation id="url">"अधिक जाणून घ्या"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"बॅटरी सेव्हर गडद थीम सुरू करते आणि बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट व ठरावीक वैशिष्ट्ये मर्यादित किंवा बंद करते."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"उत्तर द्या"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"व्हिडिओ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"नकार द्या"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"कॉल बंद करा"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"इनकमिंग कॉल"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ही सूचना सायलंट करण्यात आली आहे. फीडबॅक देण्यासाठी टॅप करा."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"हा सूचनेला उच्च रँक करण्यात आले. फीडबॅक देण्यासाठी टॅप करा."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"या सूचनेला कमी रँक करण्यात आले. फीडबॅक देण्यासाठी टॅप करा."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"वर्धित सूचना वापरून पहा"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"सुचवलेल्या कृती, उत्तरे आणि आणखी बरेच काही मिळवत राहण्यासाठी, वर्धित सूचना सुरू करा. Android अ‍ॅडॅप्टिव्ह सूचना यांना आता सपोर्ट नाही."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"सुरू करा"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"आता नको"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"वर्धित सूचना"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"सुचवलेल्या कृती आणि उत्तरे आता वर्धित सूचनांद्वारे दिल्या जातात. Android अ‍ॅडॅप्टिव्ह सूचना यांना आता सपोर्ट नाही."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ओके"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"बंद करा"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"अधिक जाणून घ्या"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"संपर्कांची नावे आणि मेसेज यांसारख्या वैयक्तिक माहितीच्या समावेशासह वर्धित सूचना या सर्व सूचनांचा आशय वाचू शकतात. हे वैशिष्‍ट्य सूचना डिसमिस करू शकते किंवा फोन कॉलना उत्तर देण्यासारख्या सूचनांमधील बटणवर कृतीदेखील करू शकते.\n\nहे वैशिष्‍ट्य प्राधान्य मोड सुरू किंवा बंद करू शकते आणि संबंधित सेटिंग्जदेखील बदलू शकते."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Android 12 मधील Android अ‍ॅडॅप्टिव्ह सूचना यांना आता वर्धित सूचनांनी बदलले आहे. हे वैशिष्ट्य सुचवलेल्या कृती आणि उत्तरे दाखवते व तुमच्या सूचना व्यवस्थापित करते.\n\nवर्धित सूचना या संपर्कांची नावे आणि मेसेज यांसारख्या वैयक्तिक माहितीसह सर्व सूचनांचा आशय अ‍ॅक्सेस करू शकतात. हे वैशिष्‍ट्य फोन कॉलना उत्तर देणे आणि व्यत्यय आणू नका नियंत्रित करणे यांसारख्या कृती करून सूचना डिसमिस करू शकते किंवा त्यांना प्रतिसाद देऊ शकते."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनक्रम मोडची माहिती सूचना"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"चार्जिंगची सामान्य पातळी गाठेपर्यंत कदाचित बॅटरी संपू शकते"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर सुरू केला आहे"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 0afa2f9..4d55195 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarki"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Kertas kajang"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Potret tidak diketahui"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Landskap tidak diketahui"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Dibatalkan"</string>
@@ -1852,9 +1864,9 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Dikemas kini oleh pentadbir anda"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Dipadamkan oleh pentadbir anda"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Penjimat Bateri menghidupkan Tema gelap dan mengehadkan atau mematikan aktiviti latar, sesetengah kesan visual dan ciri seperti \"Ok Google\"\n\n"<annotation id="url">"Ketahui lebih lanjut"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Penjimat Bateri menghidupkan Tema gelap dan mengehadkan atau mematikan aktiviti latar, sesetengah kesan visual dan ciri seperti \"Ok Google\"."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangkan penggunaan data, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Penjimat Bateri menghidupkan tema Gelap dan mengehadkan atau mematikan aktiviti latar, sesetengah kesan visual dan ciri tertentu.\n\n"<annotation id="url">"Ketahui lebih lanjut"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Penjimat Bateri menghidupkan tema Gelap dan mengehadkan atau mematikan aktiviti latar, sesetengah kesan visual dan ciri tertentu."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu penggunaan data dikurangkan, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Hidupkan Penjimat Data?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Hidupkan"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Tutup"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Jawapan"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Tolak"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Tamatkan Panggilan"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Panggilan masuk"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Pemberitahuan ini telah diturun taraf kepada Senyap. Ketik untuk memberikan maklum balas."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Pemberitahuan ini berada di kedudukan lebih tinggi. Ketik untuk memberikan maklum balas."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Pemberitahuan ini berada di kedudukan lebih rendah. Ketik untuk memberikan maklum balas."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Cuba pemberitahuan dipertingkatkan"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Untuk terus mendapatkan tindakan yang dicadangkan, balasan dan banyak lagi, hidupkan pemberitahuan yang dipertingkatkan. Pemberitahuan Boleh Suai Android tidak disokong lagi."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Hidupkan"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Bukan sekarang"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Pemberitahuan dipertingkatkan"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Tindakan dan balasan yang dicadangkan kini disediakan oleh pemberitahuan yang dipertingkatkan. Pemberitahuan Boleh Suai Android tidak disokong lagi."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Matikan"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Ketahui lebih lanjut"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Pemberitahuan yang dipertingkatkan dapat membaca semua kandungan pemberitahuan, termasuk maklumat peribadi seperti nama kenalan dan mesej. Ciri ini juga dapat mengetepikan pemberitahuan atau mengambil tindakan pada butang dalam pemberitahuan, seperti menjawab panggilan telefon.\n\nCiri ini juga dapat menghidupkan atau mematikan mod Keutamaan dan menukar tetapan yang berkaitan."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Pemberitahuan yang dipertingkatkan menggantikan Pemberitahuan Boleh Suai Android dalam Android 12. Ciri ini menunjukkan tindakan dan balasan yang dicadangkan, serta mengatur pemberitahuan anda.\n\nPemberitahuan yang dipertingkatkan dapat mengakses kandungan pemberitahuan, termasuk maklumat peribadi seperti nama kenalan dan mesej. Ciri ini juga dapat mengetepikan atau membalas pemberitahuan, seperti menjawab panggilan telefon dan mengawal Jangan Ganggu."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Pemberitahuan maklumat Mod Rutin"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateri mungkin habis sebelum pengecasan biasa"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Penjimat Bateri diaktifkan untuk memanjangkan hayat bateri"</string>
@@ -2275,5 +2286,5 @@
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikon aplikasi"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imej jenama aplikasi"</string>
     <string name="view_and_control_notification_title" msgid="4300765399209912240">"Semak tetapan akses"</string>
-    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> boleh melihat dan mengawal skrin anda. Ketik untuk menyemak."</string>
+    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> boleh melihat dan mengawal skrin anda. Ketik untuk membuat semakan."</string>
 </resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index be4bf4fa..43ed918 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -142,7 +142,7 @@
     <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string>
     <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi ခေါ်ဆိုမှု"</string>
     <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string>
-    <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ပိတ်ထားသည်"</string>
+    <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ပိတ်"</string>
     <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi သုံး၍ ခေါ်ဆိုသည်"</string>
     <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"မိုဘိုင်းကွန်ရက်သုံး၍ ခေါ်ဆိုသည်"</string>
     <string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"ကြိုးမဲ့အင်တာနက် သာလျှင်"</string>
@@ -317,7 +317,7 @@
     <string name="permgroupdesc_microphone" msgid="1047786732792487722">"အသံဖမ်းခြင်း"</string>
     <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ကိုယ်လက်လှုပ်ရှားမှု"</string>
     <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"သင့်ကိုယ်လက်လှုပ်ရှားမှုကို ဝင်ကြည့်ရန်"</string>
-    <string name="permgrouplab_camera" msgid="9090413408963547706">"ကင်မရာ"</string>
+    <string name="permgrouplab_camera" msgid="9090413408963547706">"Camera"</string>
     <string name="permgroupdesc_camera" msgid="7585150538459320326">"ဓာတ်ပုံ ရိုက်ပြီးနောက် ဗွီဒီယို မှတ်တမ်းတင်ရန်"</string>
     <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"အနီးတစ်ဝိုက်ရှိ စက်များ"</string>
     <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"အနီးတစ်ဝိုက်ရှိ စက်များကို ရှာဖွေပြီးချိတ်ဆက်မည်"</string>
@@ -1175,7 +1175,7 @@
     <string name="no" msgid="5122037903299899715">"မလုပ်တော့"</string>
     <string name="dialog_alert_title" msgid="651856561974090712">"သတိပြုရန်"</string>
     <string name="loading" msgid="3138021523725055037">"တင်နေ…"</string>
-    <string name="capital_on" msgid="2770685323900821829">"ဖွင့်ရန်"</string>
+    <string name="capital_on" msgid="2770685323900821829">"ဖွင့်"</string>
     <string name="capital_off" msgid="7443704171014626777">"ပိတ်"</string>
     <string name="checked" msgid="9179896827054513119">"အမှန်ခြစ်ပြီး"</string>
     <string name="not_checked" msgid="7972320087569023342">"ခြစ် မထား"</string>
@@ -1688,8 +1688,8 @@
     <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုဖြစ်သော <xliff:g id="SERVICE">%1$s</xliff:g> ကို ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nဤဖြတ်လမ်းလင့်ခ်ကို \'ဆက်တင်များ &gt; အများသုံးစွဲနိုင်မှု\' တွင် နောက်ဝန်ဆောင်မှုတစ်ခုသို့ ပြောင်းနိုင်သည်။"</string>
     <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ဖွင့်ရန်"</string>
     <string name="accessibility_shortcut_off" msgid="3651336255403648739">"မဖွင့်ပါနှင့်"</string>
-    <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ဖွင့်ထားသည်"</string>
-    <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ပိတ်ထားသည်"</string>
+    <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ဖွင့်"</string>
+    <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ပိတ်"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> ကို သင့်စက်အား အပြည့်အဝထိန်းချုပ်ခွင့် ပေးလိုပါသလား။"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"<xliff:g id="SERVICE">%1$s</xliff:g> ဖွင့်လိုက်ပါက သင်၏စက်သည် ဒေတာအသွင်ဝှက်ခြင်း ပိုကောင်းမွန်စေရန် သင့်ဖန်သားပြင်လော့ခ်ကို သုံးမည်မဟုတ်ပါ။"</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"အများသုံးစွဲနိုင်မှု လိုအပ်ချက်များအတွက် အထောက်အကူပြုသည့် အက်ပ်များအား အပြည့်အဝ ထိန်းချုပ်ခွင့်ပေးခြင်းသည် သင့်လျော်သော်လည်း အက်ပ်အများစုအတွက် မသင့်လျော်ပါ။"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"မိုနာချ့်"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"ကွာတို"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"ဖူးစကဒ်"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"အာအိုစီ ၈ကေ"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"အာအိုစီ ၁၆ကေ"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"ပီအာစီ ၁"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"ကဟူ"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"ကဟူ၂"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"ယူ၄"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"ဒေါင်လိုက် အရွယ်မသိ"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"အလျားလိုက် အရွယ်မသိ"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ဖျက်သိမ်းလိုက်ပြီး"</string>
@@ -1852,8 +1864,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">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"‘ဘက်ထရီ အားထိန်း’ က ‘မှောင်သည့် အပြင်အဆင်’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် “Ok Google” ကဲ့သို့ ဝန်ဆောင်မှုများကို ကန့်သတ်သည် (သို့) ပိတ်သည်\n\n"<annotation id="url">"ပိုမိုလေ့လာရန်"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"‘ဘက်ထရီ အားထိန်း’ က ‘မှောင်သည့် အပြင်အဆင်’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် “Ok Google” ကဲ့သို့ ဝန်ဆောင်မှုများကို ကန့်သတ်သည် (သို့) ပိတ်သည်။"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"‘ဘက်ထရီ အားထိန်း’ က ‘မှောင်သည့် အပြင်အဆင်’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် ဝန်ဆောင်မှုအချို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။\n\n"<annotation id="url">"ပိုမိုလေ့လာရန်"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"‘ဘက်ထရီ အားထိန်း’ က ‘မှောင်သည့် အပြင်အဆင်’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် ဝန်ဆောင်မှုအချို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"ဖုန်းကိုင်ရန်"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ဗီဒီယို"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"ငြင်းပယ်ရန်"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ဖုန်းချရန်"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"အဝင်ခေါ်ဆိုမှု"</string>
@@ -2066,7 +2077,7 @@
     <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ပိတ်ထားသည့်အရာများကို ကြည့်ရန် တို့ပါ။"</string>
     <string name="notification_app_name_system" msgid="3045196791746735601">"စနစ်"</string>
     <string name="notification_app_name_settings" msgid="9088548800899952531">"ဆက်တင်များ"</string>
-    <string name="notification_appops_camera_active" msgid="8177643089272352083">"ကင်မရာ"</string>
+    <string name="notification_appops_camera_active" msgid="8177643089272352083">"Camera"</string>
     <string name="notification_appops_microphone_active" msgid="581333393214739332">"မိုက်ခရိုဖုန်း"</string>
     <string name="notification_appops_overlay_active" msgid="5571732753262836481">"သင့်မျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များပေါ်တွင် ပြသခြင်း"</string>
     <string name="notification_feedback_indicator" msgid="663476517711323016">"အကြံပြုချက် ပေးရန်"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ဤအကြောင်းကြားချက်ကို \'အသံတိတ်ခြင်း\' သို့ ပြန်ချိန်ညှိထားသည်။ အကြံပြုချက်ပေးရန် တို့ပါ။"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ဤအကြောင်းကြားချက်ကို အဆင့်တိုးထားသည်။ အကြံပြုချက်ပေးရန် တို့ပါ။"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ဤအကြောင်းကြားချက်ကို အဆင့်လျှော့ထားသည်။ အကြံပြုချက်ပေးရန် တို့ပါ။"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"အဆင့်မြင့် အကြောင်းကြားချက်များ စမ်းသုံးကြည့်ခြင်း"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"အကြံပြုထားသော လုပ်ဆောင်ချက်များ၊ ပြန်စာများ စသည်တို့ကို ဆက်လက်ရယူရန် အဆင့်မြင့် အကြောင်းကြားချက်များကို ဖွင့်ပါ။ ‘Android အလိုက်သင့် အကြောင်းကြားချက်များ’ ကို ပံ့ပိုးမထားတော့ပါ။"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ဖွင့်ရန်"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ယခုမလုပ်ပါ"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ပိုမိုလေ့လာရန်"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"အဆင့်မြင့် အကြောင်းကြားချက်များသည် အဆက်အသွယ်အမည်နှင့် မက်ဆေ့ဂျ်များကဲ့သို့ ကိုယ်ရေးကိုယ်တာအချက်လက်များ အပါအဝင် အကြောင်းကြားချက် အကြောင်းအရာအားလုံးကို ဖတ်နိုင်သည်။ ဤဝန်ဆောင်မှုသည် အကြောင်းကြားချက်များကို ပယ်ခြင်း (သို့) ဖုန်းခေါ်ဆိုမှုများ ဖြေခြင်းကဲ့သို့ အကြောင်းကြားချက်များရှိ ခလုတ်များ နှိပ်ခြင်းကိုလည်း ပြုလုပ်နိုင်သည်။\n\nဤဝန်ဆောင်မှုသည် ‘ဦးစားပေးမုဒ်’ ကို ဖွင့်ခြင်း (သို့) ပိတ်ခြင်း ပြုလုပ်နိုင်ပြီး ဆက်စပ်နေသော ဆက်တင်များကိုလည်း ပြောင်းနိုင်သည်။"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ပုံမှန်မုဒ်အတွက် အချက်အလက်ပြသည့် အကြောင်းကြားချက်"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ပုံမှန်အားသွင်းမှုမပြုလုပ်မီ ဘက်ထရီကုန်သွားနိုင်သည်"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ဘက်ထရီသက်တမ်းကို တိုးမြှင့်ရန် \'ဘက်ထရီအားထိန်း\' စတင်ပြီးပါပြီ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 9c70fdf..5baea2c 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1709,7 +1709,7 @@
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Bruk snarveien"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Fargeinvertering"</string>
     <string name="color_correction_feature_name" msgid="3655077237805422597">"Fargekorrigering"</string>
-    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Ekstra dempet belysning"</string>
+    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Ekstra dimmet"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Volumtastene holdes inne. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> er slått på."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Volumtastene holdes inne. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> er slått av."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Trykk og hold inne begge volumtastene i tre sekunder for å bruke <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Ukjent portrett"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Ukjent landskap"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Kansellert"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Oppdatert av administratoren din"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Slettet av administratoren din"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Batterisparing slår på mørkt tema og begrenser eller slår av bakgrunnsaktivitet, enkelte visuelle effekter og funksjoner, for eksempel «Hey Google»\n\n"<annotation id="url">"Finn ut mer"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Batterisparing slår på mørkt tema og begrenser eller slår av bakgrunnsaktivitet, enkelte visuelle effekter og funksjoner, for eksempel «Hey Google»."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Batterisparing slår på mørkt tema og begrenser eller slår av bakgrunnsaktivitet, enkelte visuelle effekter og noen funksjoner.\n\n"<annotation id="url">"Finn ut mer"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Batterisparing slår på mørkt tema og begrenser eller slår av bakgrunnsaktivitet, enkelte visuelle effekter og noen funksjoner."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Datasparing hindrer noen apper fra å sende og motta data i bakgrunnen, for å redusere dataforbruket. Aktive apper kan bruke data, men kanskje ikke så mye som ellers – for eksempel vises ikke bilder før du trykker på dem."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du slå på Datasparing?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Slå på"</string>
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Lukk"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Svar"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Avvis"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Legg på"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Innkommende anrop"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Dette varselet ble nedgradert til lydløst. Trykk for å gi tilbakemelding."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Dette varselet ble rangert høyere. Trykk for å gi tilbakemelding."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Dette varselet ble rangert lavere. Trykk for å gi tilbakemelding."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Prøv forbedrede varsler"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"For å fortsette å få foreslåtte handlinger, svar med mer, slå på forbedrede varsler. Tilpassede Android-varsler støttes ikke lenger."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Slå på"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ikke nå"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Forbedrede varsler"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Foreslåtte handlinger og svar leveres nå i forbedrede varsler. Tilpassede Android-varsler støttes ikke lenger."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Slå av"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Finn ut mer"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Forbedrede varsler kan lese alt varselinnhold, inkludert personopplysninger som kontaktnavn og meldinger. Denne funksjonen kan også avvise varsler eller bruke knapper i varsler, for eksempel for å svare på telefonanrop.\n\nDenne funksjonen kan også slå prioriteringsmodus på eller av og endre relaterte innstillinger."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Forbedrede varsler erstatter tilpassede Android-varsler i Android 12. Denne funksjonen viser foreslåtte handlinger og svar og organiserer varslene dine.\n\nForbedrede varsler har tilgang til varselinnhold, inkludert personopplysninger som kontaktnavn og meldinger. Funksjonen kan også avvise og svare på varsler, for eksempel svare på anrop og kontrollere «Ikke forstyrr»."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Varsel med informasjon om rutinemodus"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batteriet kan gå tomt før den vanlige ladingen"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparing er aktivert for å forlenge batterilevetiden"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index ece2a53..5c9382a 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -246,7 +246,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>
@@ -1354,7 +1354,7 @@
     <string name="no_permissions" msgid="5729199278862516390">"कुनै अनुमति आवश्यक छैन"</string>
     <string name="perm_costs_money" msgid="749054595022779685">"सायद तपाईँलाई पैसा पर्न सक्छ।"</string>
     <string name="dlg_ok" msgid="5103447663504839312">"ठिक छ"</string>
-    <string name="usb_charging_notification_title" msgid="1674124518282666955">"यो यन्त्रलाई USB मार्फत चार्ज गर्दै"</string>
+    <string name="usb_charging_notification_title" msgid="1674124518282666955">"यो डिभाइस USB बाट चार्ज गरिँदै छ"</string>
     <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">"USB मार्फत PTP सेवा सक्रिय गरियो"</string>
@@ -1365,8 +1365,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 डिबग गर्न ADB कनेक्ट गरिएको छ"</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>
@@ -1566,7 +1566,7 @@
     <string name="action_menu_overflow_description" msgid="4579536843510088170">"थप विकल्पहरू"</string>
     <string name="action_bar_home_description_format" msgid="5087107531331621803">"%1$s, %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="4346835454749569826">"%1$s, %2$s, %3$s"</string>
-    <string name="storage_internal" msgid="8490227947584914460">"साझेदारी गरिएको आन्तरिक भण्डारण"</string>
+    <string name="storage_internal" msgid="8490227947584914460">"प्रयोग भएको आन्तरिक भण्डारण"</string>
     <string name="storage_sd_card" msgid="3404740277075331881">"SD कार्ड"</string>
     <string name="storage_sd_card_label" msgid="7526153141147470509">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD कार्ड"</string>
     <string name="storage_usb_drive" msgid="448030813201444573">"USB ड्राइभ"</string>
@@ -1621,7 +1621,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>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"मोनार्क"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"क्वार्टो"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"फुलस्केप"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super-B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"अज्ञात चित्र"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"अज्ञात परिदृश्य"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"रद्द गरियो"</string>
@@ -1852,12 +1865,12 @@
     <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>
-    <!-- no translation found for battery_saver_description_with_learn_more (7963058670863485450) -->
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
     <skip />
-    <!-- no translation found for battery_saver_description (7695751399533397741) -->
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
     <skip />
     <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>
@@ -1902,7 +1915,7 @@
     <string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"डाउनटाइम"</string>
     <string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"हरेक हप्तादिनको राति"</string>
     <string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"शनिबार"</string>
-    <string name="zen_mode_default_events_name" msgid="2280682960128512257">"घटना"</string>
+    <string name="zen_mode_default_events_name" msgid="2280682960128512257">"कार्यक्रम"</string>
     <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"शयन अवस्था"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ले केही ध्वनिहरू म्युट गर्दै छ"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ, र तपाईंले फ्याक्ट्री डाटा रिसेट नगर्दासम्म यो अस्थिर रहन्छ।"</string>
@@ -1931,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"कलको जवाफ दिनु…"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"भिडियो"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"अस्वीकार गर्नुहोस्"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"फोन राख्नुहोस्"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"आगमन कल"</string>
@@ -2076,17 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"यस सूचनालाई कम महत्त्वपूर्ण ठानी यसका लागि साइलेन्ट मोड सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"यस सूचनालाई धेरै महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"यस सूचनालाई कम महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
-    <!-- no translation found for nas_upgrade_notification_title (4224351129445073051) -->
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_content (7036860187157134706) -->
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_enable_action (4823652531622744798) -->
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_disable_action (7561210256700811433) -->
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
     <skip />
     <!-- no translation found for nas_upgrade_notification_learn_more_action (7011130656195423947) -->
     <skip />
-    <!-- no translation found for nas_upgrade_notification_learn_more_content (6276343083934111208) -->
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
     <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनचर्या मोडको जानकारीमूलक सूचना"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 0222f6f..2dab66e 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1108,8 +1108,8 @@
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minuut geleden</item>
     </plurals>
     <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
-      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uur geleden, </item>
-      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> uur geleden, </item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uur geleden</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> uur geleden</item>
     </plurals>
     <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dagen geleden</item>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Onbekend staand"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Onbekend liggend"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Geannuleerd"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Geüpdatet door je beheerder"</string>
     <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="7963058670863485450">"Batterijbesparing zet het donkere thema aan en beperkt achtergrondactiviteit, bepaalde visuele effecten en functies zoals Hey Google of zet dit uit\n\n"<annotation id="url">"Meer informatie"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Batterijbesparing zet het donkere thema aan en beperkt achtergrondactiviteit, bepaalde visuele effecten en functies zoals Hey Google of zet dit uit."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Met Batterijbesparing wordt het donkere thema aangezet en worden achtergrondactiviteit, sommige visuele effecten en bepaalde functies beperkt of uitgezet.\n\n"<annotation id="url">"Meer informatie"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Met Batterijbesparing wordt het donkere thema aangezet en worden achtergrondactiviteit, sommige visuele effecten en bepaalde functies beperkt of uitgezet."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens sturen 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 aanzetten?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aanzetten"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Deze melding is verlaagd naar Stil. Tik om feedback te geven."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Deze melding is hoger geclassificeerd. Tik om feedback te geven."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Deze melding is lager geclassificeerd. Tik om feedback te geven."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Probeer verbeterde meldingen"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Activeer verbeterde meldingen om voorgestelde acties, antwoorden en meer te blijven ontvangen. Aanpasbare Android-meldingen worden niet meer ondersteund."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aanzetten"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Niet nu"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Verbeterde meldingen"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Voorgestelde acties en antwoorden worden nu geleverd via verbeterde meldingen. Aanpasbare Android-meldingen worden niet meer ondersteund."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Uitzetten"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Meer informatie"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Verbeterde meldingen kunnen alle meldingscontent lezen, waaronder persoonlijke informatie zoals contactnamen en berichten. Deze functie kan ook meldingen sluiten of acties uitvoeren voor knoppen in meldingen, zoals telefoongesprekken aannemen.\n\nDeze functie kan ook de prioriteitsmodus aan- of uitzetten en gerelateerde instellingen wijzigen."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"In Android 12 hebben verbeterde meldingen aanpasbare Android-meldingen vervangen. Deze functie laat voorgestelde acties en antwoorden zien en ordent je meldingen.\n\nVerbeterde meldingen hebben toegang tot meldingscontent, waaronder persoonlijke informatie zoals contactnamen en berichten. Deze functie kan ook meldingen sluiten of erop reageren, zoals telefoongesprekken aannemen en Niet storen beheren."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informatiemelding voor routinemodus"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"De batterij raakt mogelijk leeg voordat deze normaal gesproken wordt opgeladen"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterijbesparing is geactiveerd om de batterijduur te verlengen"</string>
@@ -2274,5 +2286,5 @@
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"App-icoon"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Merkafbeelding voor app"</string>
     <string name="view_and_control_notification_title" msgid="4300765399209912240">"Toegangsinstellingen checken"</string>
-    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kan je scherm bekijken en beheren. Tik om te bekijken."</string>
+    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kan je scherm bekijken en bedienen. Tik om te checken."</string>
 </resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 7948f64..8a63f06 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"ମୋନାର୍କ"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"କ୍ୱାର୍ଟୋ"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"ଅଜଣା ପୋର୍ଟ୍ରେଟ୍‍"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"ଅଜଣା ଲ୍ୟାଣ୍ଡସ୍କେପ୍‌"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ବାତିଲ୍‍ କରାଗଲା"</string>
@@ -1852,8 +1865,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="7963058670863485450">"ବ୍ୟାଟେରୀ ସେଭର୍ ଗାଢ଼ା ଥିମକୁ ଚାଲୁ କରେ ଏବଂ ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ଇଫେକ୍ଟ ଏବଂ “Hey Google” ପରି ଫିଚରଗୁଡ଼ିକୁ ସୀମିତ କିମ୍ବା ବନ୍ଦ କରେ\n\n"<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"ବ୍ୟାଟେରୀ ସେଭର୍ ଗାଢ଼ା ଥିମକୁ ଚାଲୁ କରେ ଏବଂ ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ଇଫେକ୍ଟ ଏବଂ “Hey Google” ପରି ଫିଚରଗୁଡ଼ିକୁ ସୀମିତ କିମ୍ବା ବନ୍ଦ କରେ।"</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"ଉତ୍ତର ଦିଅନ୍ତୁ"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ଭିଡିଓ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"ଅଗ୍ରାହ୍ୟ କର"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ସମାପ୍ତ କରନ୍ତୁ"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ଇନକମିଂ କଲ୍"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ଏହି ବିଜ୍ଞପ୍ତିକୁ ନୀରବ ଭାବେ ଡିମୋଟ୍ କରାଯାଇଛି। ମତାମତ ପ୍ରଦାନ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ଏହି ବିଜ୍ଞପ୍ତିର ରେଙ୍କ ଉପରକୁ କରାଯାଇଛି। ମତାମତ ପ୍ରଦାନ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ଏହି ବିଜ୍ଞପ୍ତିର ରେଙ୍କ ତଳକୁ କରାଯାଇଛି। ମତାମତ ପ୍ରଦାନ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"ଉନ୍ନତ ବିଜ୍ଞପ୍ତି ବ୍ୟବହାରକରି ଦେଖ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"ପ୍ରସ୍ତାବିତ କାର୍ଯ୍ୟ, ପ୍ରତ୍ୟୁତ୍ତର ଏବଂ ଆହୁରି ଅନେକ କିଛି ପାଇବା ଜାରି ରଖିବାକୁ, ଉନ୍ନତ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଚାଲୁ କରନ୍ତୁ। Android ଆଡେପ୍ଟିଭ୍ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଆଉ ସମର୍ଥିତ ନୁହେଁ।"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ଚାଲୁ କରନ୍ତୁ"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ବର୍ତ୍ତମାନ ନୁହେଁ"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"ଉନ୍ନତ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଯୋଗାଯୋଗ ନାମ ଏବଂ ମେସେଜଗୁଡ଼ିକ ପରି ବ୍ୟକ୍ତିଗତ ସୂଚନା ସମେତ ସମସ୍ତ ବିଜ୍ଞପ୍ତି ବିଷୟବସ୍ତୁକୁ ପଢ଼ିପାରିବ। ଏହି ଫିଚର୍ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଖାରଜ କରିପାରିବ କିମ୍ବା ଫୋନ୍ କଲଗୁଡ଼ିକର ଉତ୍ତର ଦେବା ପରି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକରେ ଥିବା ବଟନଗୁଡ଼ିକ ଉପରେ ପଦକ୍ଷେପ ମଧ୍ୟ ନେଇପାରିବ।\n\nଏହି ଫିଚର୍ ପ୍ରାଥମିକତା ମୋଡକୁ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିପାରିବ ଏବଂ ସମ୍ବନ୍ଧିତ ସେଟିଂସକୁ ପରିବର୍ତ୍ତନ ମଧ୍ୟ କରିପାରିବ।"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ନିୟମିତ ମୋଡ୍‍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍‍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index ac5af41..1711a88 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -307,7 +307,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">"Calendar"</string>
+    <string name="permgrouplab_calendar" msgid="6426860926123033230">"ਕੈਲੰਡਰ"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦੇਖੋ"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"ਸਮਰਾਟ"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"ਚੁਪੱਤਰੀ"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"ਅਗਿਆਤ ਪੋਰਟਰੇਟ"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"ਅਗਿਆਤ ਲੈਂਡਸਕੇਪ"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ਰੱਦ ਕੀਤਾ ਗਿਆ"</string>
@@ -1852,8 +1865,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="7963058670863485450">"ਬੈਟਰੀ ਸੇਵਰ ਗੂੜ੍ਹੇ ਥੀਮ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸੀਮਤ ਕਰਦਾ ਹੈ ਜਾਂ ਬੰਦ ਕਰਦਾ ਹੈ\n\n"<annotation id="url">"ਹੋਰ ਜਾਣੋ"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"ਬੈਟਰੀ ਸੇਵਰ ਗੂੜ੍ਹੇ ਥੀਮ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸੀਮਤ ਕਰਦਾ ਹੈ ਜਾਂ ਬੰਦ ਕਰਦਾ ਹੈ।"</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"ਜਵਾਬ ਦਿਓ"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ਵੀਡੀਓ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"ਸਮਾਪਤ ਕਰੋ"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ਇਨਕਮਿੰਗ ਕਾਲ"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਘਟਾ ਕੇ ਸ਼ਾਂਤ \'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ। ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਵਧਾ ਦਿੱਤਾ ਗਿਆ। ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ਇਸ ਸੂਚਨਾ ਦਾ ਦਰਜਾ ਘਟਾ ਦਿੱਤਾ ਗਿਆ। ਵਿਚਾਰ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"ਵਿਸਤ੍ਰਿਤ ਸੂਚਨਾਵਾਂ ਅਜ਼ਮਾਓ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"ਸੁਝਾਈਆਂ ਗਈਆਂ ਕਾਰਵਾਈਆਂ, ਜਵਾਬਾਂ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਦੇ ਰਹਿਣ ਲਈ, ਵਿਸਤ੍ਰਿਤ ਸੂਚਨਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ। Android ਅਡੈਪਟਿਵ ਸੂਚਨਾਵਾਂ ਹੁਣ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ।"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ਚਾਲੂ ਕਰੋ"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ਹੁਣੇ ਨਹੀਂ"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ਹੋਰ ਜਾਣੋ"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"ਵਿਸਤ੍ਰਿਤ ਸੂਚਨਾਵਾਂ ਸਾਰੀ ਸੂਚਨਾ ਸਮੱਗਰੀ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀਆਂ ਹਨ, ਜਿਸ ਵਿੱਚ ਸੰਪਰਕ ਨਾਮ ਅਤੇ ਸੁਨੇਹੇ ਵਰਗੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੀ ਸ਼ਾਮਲ ਹੈ। ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸੂਚਨਾਵਾਂ ਨੂੰ ਖਾਰਜ ਵੀ ਕਰ ਸਕਦੀ ਹੈ ਜਾਂ ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਬਟਨਾਂ \'ਤੇ ਕਾਰਵਾਈਆਂ ਵੀ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਫ਼ੋਨ ਕਾਲਾਂ ਦਾ ਜਵਾਬ ਦੇਣਾ।\n\nਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਤਰਜੀਹੀ ਮੋਡ ਨੂੰ ਚਾਲੂ ਜਾਂ ਬੰਦ ਵੀ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਸੰਬੰਧਿਤ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ਨਿਯਮਬੱਧ ਮੋਡ ਦੀ ਜਾਣਕਾਰੀ ਵਾਲੀ ਸੂਚਨਾ"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੇ ਮਿੱਥੇ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਇਦ ਬੈਟਰੀ ਖਤਮ ਹੋ ਜਾਵੇ"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 89279d4..bc11c37 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1737,7 +1737,7 @@
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Pozwolić usłudze <xliff:g id="SERVICE">%1$s</xliff:g> na pełną kontrolę nad urządzeniem?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Jeśli włączysz usługę <xliff:g id="SERVICE">%1$s</xliff:g>, Twoje urządzenie nie będzie korzystać z blokady ekranu, by usprawnić szyfrowanie danych."</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"Pełna kontrola jest odpowiednia dla aplikacji, które pomagają Ci radzić sobie z niepełnosprawnością, ale nie należy jej przyznawać wszystkim aplikacjom."</string>
-    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Wyświetlaj i steruj ekranem"</string>
+    <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Wyświetlaj i kontroluj ekran"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Może odczytywać całą zawartość ekranu i wyświetlać treść nad innymi aplikacjami."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Wyświetlaj i wykonuj działania"</string>
     <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Może śledzić Twoje interakcje z aplikacjami lub czujnikiem sprzętowym, a także obsługiwać aplikacje za Ciebie."</string>
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Nieznany pionowy"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Nieznany poziomy"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Anulowane"</string>
@@ -1898,8 +1910,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Zaktualizowany przez administratora"</string>
     <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="7963058670863485450">"Oszczędzanie baterii uruchamia ciemny motyw oraz wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne i inne funkcje, np. „OK Google”\n\n"<annotation id="url">"Więcej informacji"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Oszczędzanie baterii uruchamia ciemny motyw oraz wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne i inne funkcje, np. „OK Google”."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Oszczędzanie baterii uruchamia ciemny motyw oraz wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne i wybrane funkcje.\n\n"<annotation id="url">"Więcej informacji"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Oszczędzanie baterii uruchamia ciemny motyw oraz wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne i wybrane funkcje."</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>
@@ -1991,8 +2003,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Zamknij"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Odbierz"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Film"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Odrzuć"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Rozłącz"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Połączenie przychodzące"</string>
@@ -2140,12 +2151,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"To powiadomienie zostało zmienione na Ciche. Kliknij, by przesłać opinię."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Podniesiono ważność tego powiadomienia. Kliknij, by przesłać opinię."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Obniżono ważność tego powiadomienia. Kliknij, by przesłać opinię."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Wypróbuj ulepszone powiadomienia"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Aby nadal otrzymywać sugestie działań oraz odpowiedzi i inne podpowiedzi, włącz ulepszone powiadomienia. Powiadomienia adaptacyjne w Androidzie nie są już obsługiwane."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Włącz"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Nie teraz"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Więcej informacji"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Ulepszone powiadomienia mogą czytać wszystkie powiadomienia, w tym dane osobowe takie jak nazwy kontaktów i treść wiadomości. Funkcja będzie też mogła odrzucać powiadomienia oraz używać zawartych w nich przycisków, np. odbierać połączenia telefoniczne.\n\nMoże również włączać i wyłączać tryb Priorytet oraz zmieniać powiązane ustawienia."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Powiadomienie z informacją o trybie rutynowym"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria może się wyczerpać przed zwykłą porą ładowania"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Włączono Oszczędzanie baterii, by wydłużyć czas pracy na baterii"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 102073e..dd1ebb6 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Retrato desconhecido"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Paisagem desconhecido"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelado"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu administrador"</string>
     <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="7963058670863485450">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos como o \"Ok Google\"\n\n"<annotation id="url">"Saiba mais"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos como o \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos específicos.\n\n"<annotation id="url">"Saiba mais"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos específicos."</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>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi rebaixada a Silenciosa. Toque para enviar seu feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Testar notif. aprimoradas"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Para continuar a receber sugestões de ações, respostas e muito mais, ative as notificações aprimoradas. As Notificações adaptáveis do Android não estão mais disponíveis."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Ativar"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Agora não"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações aprimoradas"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações aprimoradas. As Notificações adaptáveis do Android não estão mais disponíveis."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"As notificações aprimoradas podem ler todo o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Além disso, esse recurso pode dispensar notificações e usar os botões delas para, por exemplo, atender chamadas telefônicas.\n\nEle também pode ativar ou desativar o modo Prioridade e mudar as configurações relacionadas."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"No Android 12, as notificações aprimoradas substituíram as Notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações aprimoradas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 019107a..3b0a5ca 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1621,7 +1621,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"Visualização sem fios"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Transmitir"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Ligar ao dispositivo"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Transmitir ecrã para o dispositivo"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Transmitir ecrã para dispositivo"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"A pesquisar dispositivos…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Definições"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Desligar"</string>
@@ -1692,11 +1692,11 @@
     <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"DESATIVADO"</string>
     <string name="accessibility_enable_service_title" msgid="3931558336268541484">"Permitir que o serviço <xliff:g id="SERVICE">%1$s</xliff:g> tenha controlo total sobre o seu dispositivo?"</string>
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Se ativar o serviço <xliff:g id="SERVICE">%1$s</xliff:g>, o dispositivo não utilizará o bloqueio de ecrã para otimizar a encriptação de dados."</string>
-    <string name="accessibility_service_warning_description" msgid="291674995220940133">"O controlo total é adequado para aplicações que ajudam nas necessidades de acessibilidade, mas não para a maioria das aplicações."</string>
+    <string name="accessibility_service_warning_description" msgid="291674995220940133">"O controlo total é adequado para aplicações que ajudam nas necessidades de acessibilidade, mas não para a maioria das apps."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Ver e controlar o ecrã"</string>
     <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Pode ler todo o conteúdo do ecrã e sobrepor conteúdo a outras aplicações."</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Veja e execute ações"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Pode monitorizar as suas interações com uma app ou um sensor de hardware e interagir com aplicações em seu nome."</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Pode monitorizar as suas interações com uma app ou um sensor de hardware e interagir com apps em seu nome."</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Permitir"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Recusar"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Toque numa funcionalidade para começar a utilizá-la:"</string>
@@ -1709,7 +1709,7 @@
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Utilizar atalho"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Inversão de cores"</string>
     <string name="color_correction_feature_name" msgid="3655077237805422597">"Correção da cor"</string>
-    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Escurecimento extra"</string>
+    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Mais escuro"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Teclas do volume premidas. Serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ativado."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Teclas de volume premidas. Serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g> desativado."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Prima sem soltar as teclas de volume durante três segundos para utilizar o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Vertical desconhecido"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Horizontal desconhecido"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelada"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu gestor"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado pelo seu gestor"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"A Poupança de bateria ativa o tema escuro e limita ou desativa a atividade em segundo plano, alguns efeitos visuais e funcionalidades como \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"A Poupança de bateria ativa o tema escuro e limita ou desativa a atividade em segundo plano, alguns efeitos visuais e funcionalidades como \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"A Poupança de bateria ativa o tema escuro e limita ou desativa a atividade em segundo plano, alguns efeitos visuais e determinadas funcionalidades.\n\n"<annotation id="url">"Saiba mais"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"A Poupança de bateria ativa o tema escuro e limita ou desativa a atividade em segundo plano, alguns efeitos visuais e determinadas funcionalidades."</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 app 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">"Pretende ativar a Poupança de dados?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi despromovida para Silenciosa. Toque para fornecer feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação passou para uma classificação superior. Toque para fornecer feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação passou para uma classificação inferior. Toque para fornecer feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Experimente as not. melhoradas"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Para continuar a obter sugestões de ações, respostas e muito mais, ative as notificações melhoradas. As notificações adaptáveis do Android já não são suportadas."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Ativar"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Agora não"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações melhoradas"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e as respostas sugeridas são agora fornecidas por notificações melhoradas. As notificações adaptáveis do Android já não são suportadas."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saber mais"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"As notificações melhoradas podem ler todo o conteúdo das notificações, incluindo informações pessoais como nomes de contactos e mensagens. Esta funcionalidade também pode ignorar notificações ou acionar botões em notificações, como atender chamadas telefónicas.\n\nAlém disso, esta funcionalidades pode ativar ou desativar o modo Prioridade e alterar as definições relacionadas."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"As notificações melhoradas substituíram as notificações adaptáveis do Android no Android 12. Esta funcionalidade mostra ações e respostas sugeridas e organiza as suas notificações.\n\nAs notificações melhoradas podem aceder a todo o conteúdo das notificações, incluindo informações pessoais como nomes de contactos e mensagens. Esta funcionalidade também pode ignorar ou responder a notificações, como atender chamadas telefónicas e controlar o modo Não incomodar."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informações do Modo rotina"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pode ficar sem bateria antes do carregamento habitual"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Poupança de bateria ativada para prolongar a duração da bateria"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 102073e..dd1ebb6 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Retrato desconhecido"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Paisagem desconhecido"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Cancelado"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu administrador"</string>
     <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="7963058670863485450">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos como o \"Ok Google\"\n\n"<annotation id="url">"Saiba mais"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos como o \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos específicos.\n\n"<annotation id="url">"Saiba mais"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"A Economia de bateria ativa o tema escuro e limita ou desativa as atividades em segundo plano, alguns efeitos visuais e recursos específicos."</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>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi rebaixada a Silenciosa. Toque para enviar seu feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Testar notif. aprimoradas"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Para continuar a receber sugestões de ações, respostas e muito mais, ative as notificações aprimoradas. As Notificações adaptáveis do Android não estão mais disponíveis."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Ativar"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Agora não"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações aprimoradas"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações aprimoradas. As Notificações adaptáveis do Android não estão mais disponíveis."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"As notificações aprimoradas podem ler todo o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Além disso, esse recurso pode dispensar notificações e usar os botões delas para, por exemplo, atender chamadas telefônicas.\n\nEle também pode ativar ou desativar o modo Prioridade e mudar as configurações relacionadas."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"No Android 12, as notificações aprimoradas substituíram as Notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações aprimoradas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index d54829a..f064932 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1795,6 +1795,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super-B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1831,6 +1842,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Portret necunoscut"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Peisaj necunoscut"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Anulat"</string>
@@ -1875,8 +1887,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizat de administratorul dvs."</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Șters de administratorul dvs."</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Economisirea bateriei activează Tema întunecată și limitează sau dezactivează activitatea din fundal, anumite efecte vizuale și funcții precum „Ok Google”\n\n"<annotation id="url">"Aflați mai multe"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Economisirea bateriei activează Tema întunecată și limitează sau dezactivează activitatea din fundal, anumite efecte vizuale și funcții precum „Ok Google”."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Economisirea bateriei activează tema întunecată și dezactivează sau restricționează activitatea în fundal, unele efecte vizuale și alte funcții.\n\n"<annotation id="url">"Aflați mai multe"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Economisirea bateriei activează tema întunecată și dezactivează sau restricționează activitatea în fundal, unele efecte vizuale și alte funcții."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Activați Economizorul de date?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activați"</string>
@@ -1960,8 +1972,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Închideți"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Răspundeți"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Respingeți"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Încheiați"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Apel primit"</string>
@@ -2107,12 +2118,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Notificarea a fost mutată în jos la Silențioasă. Atingeți pentru a oferi feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Notificarea a fost mutată la un nivel superior. Atingeți pentru a oferi feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Notificarea a fost mutată la un nivel inferior. Atingeți pentru a oferi feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Încercați notificările optimizate"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Ca să primiți în continuare acțiuni sugerate, răspunsuri și altele, activați notificările optimizate. Notificările adaptive Android nu mai sunt acceptate."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Activați"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Nu acum"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Aflați mai multe"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Notificările optimizate pot citi tot conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă notificări sau să acționeze asupra butoanelor din notificări, inclusiv să răspundă la apeluri telefonice.\n\nÎn plus, funcția poate să activeze sau să dezactiveze modul Cu prioritate și să schimbe setările asociate."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificare pentru informații despre modul Rutină"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria se poate descărca înainte de încărcarea obișnuită"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei"</string>
@@ -2309,5 +2325,5 @@
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Pictograma aplicației"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imaginea de branding a aplicației"</string>
     <string name="view_and_control_notification_title" msgid="4300765399209912240">"Verificați setările pentru acces"</string>
-    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> poată să vadă și să vă controleze ecranul. Atingeți pentru a examina."</string>
+    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> poate să vadă și să vă controleze ecranul. Atingeți pentru a examina."</string>
 </resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 76b3991..2e9c749 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1405,9 +1405,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_message" msgid="5617264033476778211">"Нажмите, чтобы отключить отладку по USB."</string>
-    <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Нажмите, чтобы отключить отладку по USB."</string>
+    <string name="adb_active_notification_title" msgid="408390247354560331">"Отладка по USB активна"</string>
+    <string name="adb_active_notification_message" msgid="5617264033476778211">"Нажмите, чтобы отключить"</string>
+    <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Нажмите, чтобы запретить"</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Отладка по Wi-Fi включена"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Нажмите, чтобы отключить отладку по Wi-Fi."</string>
     <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Нажмите, чтобы отключить отладку по Wi-Fi."</string>
@@ -1554,7 +1554,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">"Cлед."</string>
@@ -1738,9 +1738,9 @@
     <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Если включить сервис \"<xliff:g id="SERVICE">%1$s</xliff:g>\", устройство не будет использовать блокировку экрана для защиты данных."</string>
     <string name="accessibility_service_warning_description" msgid="291674995220940133">"Полный контроль нужен приложениям для реализации специальных возможностей и не нужен большинству остальных."</string>
     <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"Просмотр и контроль экрана"</string>
-    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Сервис может читать весь контент на экране и отображать контент поверх других приложений."</string>
+    <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"Сервис может просматривать весь контент на экране и отображать контент поверх других приложений"</string>
     <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"Просмотр и выполнение действий"</string>
-    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Сервис может отслеживать ваше взаимодействие с приложением или датчиками устройства и давать приложениям команды от вашего имени."</string>
+    <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Сервис может отслеживать ваше взаимодействие с приложениями и датчиками устройства и давать приложениям команды от вашего имени"</string>
     <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Разрешить"</string>
     <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Отклонить"</string>
     <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Выберите, какую функцию использовать:"</string>
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kaku"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Неизвестный вертикальный формат"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Неизвестный горизонтальный формат"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Печать отменена"</string>
@@ -1898,8 +1910,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="7963058670863485450">"В режиме энергосбережения включается тёмная тема. Кроме того, отключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и различные функции, например распознавание команды \"Окей, Google\".\n\n"<annotation id="url">"Подробнее…"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"В режиме энергосбережения включается тёмная тема. Кроме того, отключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и различные функции, например распознавание команды \"Окей, Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"В режиме энергосбережения включается тёмная тема, ограничиваются или отключаются фоновые процессы, некоторые визуальные эффекты и определенные функции.\n\n"<annotation id="url">"Подробнее…"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"В режиме энергосбережения включается тёмная тема, ограничиваются или отключаются фоновые процессы, некоторые визуальные эффекты и определенные функции."</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>
@@ -2120,7 +2132,7 @@
     <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ОТКРЫТЬ"</string>
     <string name="harmful_app_warning_title" msgid="8794823880881113856">"Обнаружено вредоносное приложение"</string>
     <string name="slices_permission_request" msgid="3677129866636153406">"Приложение \"<xliff:g id="APP_0">%1$s</xliff:g>\" запрашивает разрешение на показ фрагментов приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"."</string>
-    <string name="screenshot_edit" msgid="7408934887203689207">"Редактировать"</string>
+    <string name="screenshot_edit" msgid="7408934887203689207">"Изменить"</string>
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Для звонков и уведомлений включен вибросигнал."</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Для звонков и уведомлений отключен звук."</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Системные изменения"</string>
@@ -2139,12 +2151,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Уровень важности этого уведомления был понижен до \"Без звука\". Нажмите, чтобы отправить отзыв."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Уровень важности этого уведомления был повышен. Нажмите, чтобы отправить отзыв."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Уровень важности этого уведомления был понижен. Нажмите, чтобы отправить отзыв."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Улучшенные уведомления"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Чтобы по-прежнему пользоваться рекомендуемыми действиями, ответами и другими подсказками, включите улучшенные уведомления. Адаптивные уведомления для Android больше не поддерживаются."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Включить"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Не сейчас"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Улучшенные уведомления"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Быстрые ответы и действия теперь включены в улучшенные уведомления. Адаптивные уведомления для Android больше не поддерживаются."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ОК"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Отключить"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Подробнее"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Улучшенным уведомлениям доступно содержимое всех уведомлений, в том числе личная информация, такая как имена контактов и сообщения. У этой функции также есть право закрывать уведомления и нажимать кнопки в них, например отвечать на звонки.\n\nКроме того, улучшенные уведомления могут включать и отключать режим \"Только важные\" и изменять связанные с ним настройки."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"В Android 12 адаптивные уведомления заменены улучшенными. Эта функция упорядочивает все ваши уведомления и подсказывает ответы и действия.\n\nЕй доступно содержимое всех уведомлений, в том числе личная информация, такая как имена контактов и сообщения. Также эта функция может закрывать уведомления и нажимать кнопки в них, например отвечать на звонки или управлять режимом \"Не беспокоить\"."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Уведомление о батарее"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея может разрядиться"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Чтобы увеличить время работы от батареи, был включен режим энергосбережения."</string>
@@ -2342,5 +2354,5 @@
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Значок приложения"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Образ бренда приложения"</string>
     <string name="view_and_control_notification_title" msgid="4300765399209912240">"Проверьте настройки доступа"</string>
-    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> может просматривать информацию на вашем экране и управлять им. Нажмите, чтобы узнать подробности."</string>
+    <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> просматривать и контролировать то, что отображается на вашем экране. Нажмите здесь, чтобы узнать больше."</string>
 </resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index c0577d6..e98c547 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"ෆුල්ස්කැප්"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super-B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"නොදන්නා සිරස් දිශානතිය"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"නොදන්නා තිරස් දිශානතිය"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"අවලංගු කරන ලදි"</string>
@@ -1852,8 +1864,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="7963058670863485450">"බැටරි සුරැකුම අඳුරු තේමාව ක්‍රියාත්මක කර පසුබිම් ක්‍රියාකාරකම්, සමහර දෘශ්‍ය ප්‍රයෝග සහ “Hey Google” වැනි විශේෂාංග සීමා කරයි\n\n"<annotation id="url">"තව දැන ගන්න"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"බැටරි සුරැකුම අඳුරු තේමාව ක්‍රියාත්මක කර පසුබිම් ක්‍රියාකාරකම්, සමහර දෘශ්‍ය ප්‍රයෝග සහ “Hey Google” වැනි විශේෂාංග සීමා කරයි."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"බැටරි සුරැකුම අඳුරු තේමාව ක්‍රියාත්මක කර පසුබිම් ක්‍රියාකාරකම්, සමහර දෘශ්‍ය ප්‍රයෝග සහ යම් විශේෂාංග ක්‍රියාවිරහිත හෝ සීමා කරයි.\n\n"<annotation id="url">"තව දැන ගන්න"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"බැටරි සුරැකුම අඳුරු තේමාව ක්‍රියාත්මක කර පසුබිම් ක්‍රියාකාරකම්, සමහර දෘශ්‍ය ප්‍රයෝග සහ යම් විශේෂාංග ක්‍රියාවිරහිත හෝ සීමා කරයි."</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>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"මෙම දැනුම්දීම නිහඬ වෙත පහත දමන ලදී. ප්‍රතිපෝෂණය ලබා දීමට තට්ටු කරන්න."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"මෙම දැනුම්දීම ඉහළට ශ්‍රේණිගත කරන ලදී. ප්‍රතිපෝෂණය ලබා දීමට තට්ටු කරන්න."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"මෙම දැනුම්දීම පහළට ශ්‍රේණිගත කරන ලදී. ප්‍රතිපෝෂණය ලබා දීමට තට්ටු කරන්න."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"දියුණු කළ දැනුම්දීම් උත්සාහ ක."</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"යෝජිත ක්‍රියා, පිළිතුරු සහ තවත් දේ ලබා ගැනීම සඳහා, වැඩි දියුණු කළ දැනුම්දීම් ක්‍රියාත්මක කරන්න. Android අනුවර්තී දැනුම්දීම් තවදුරටත් සහාය නොදක්වයි."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ක්‍රියාත්මක කරන්න"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"දැන් නොවේ"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"වැඩිදියුණු කළ දැනුම්දීම්"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"යෝජිත ක්‍රියා සහ පිළිතුරු දැන් වැඩි දියුණු කරන ලද දැනුම්දීම් මගින් සපයනු ලැබේ. Android අනුවර්තී දැනුම්දීම් තවදුරටත් සහාය නොදක්වයි."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"හරි"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ක්‍රියාවිරහිත කරන්න"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"තව දැන ගන්න"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"වැඩිදියුණු කළ දැනුම්දීම්වලට සම්බන්ධතා නම් සහ පණිවිඩ වැනි පුද්ගලික තොරතුරු ඇතුළුව, සියලු දැනුම්දීම් අන්තර්ගතය කියවිය හැකිය. මෙම විශේෂාංගයට දැනුම්දීම් ඉවත දැමීමට හෝ දුරකථන ඇමතුම්වලට පිළිතුරු දීම වැනි, දැනුම්දීම්වල බොත්තම් මත ක්‍රියා සිදු කිරීමටද හැකිය.\n\nමෙම විශේෂාංගයට ප්‍රමුඛතා ප්‍රකාරය ක්‍රියාත්මක හෝ ක්‍රියාවිරහිත කිරීමට සහ අදාළ සැකසීම් වෙනස් කිරීමටද හැකිය."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"වැඩිදියුණු කළ දැනුම්දීම් Android 12 හි Android අනුවර්තී දැනුම්දීම් ප්‍රතිස්ථාපනය කරයි. මෙම විශේෂාංගය යෝජිත ක්‍රියා සහ පිළිතුරු පෙන්වන අතර, ඔබගේ දැනුම්දීම් සංවිධානය කරයි.\n\nවැඩිදියුණු කළ දැනුම්දීම්වලට සම්බන්ධතා නම් සහ පණිවිඩ වැනි පුද්ගලික තොරතුරු ඇතුළුව, සියලු දැනුම්දීම් අන්තර්ගතය වෙත ප්‍රවේශ විය හැකිය. මෙම විශේෂාංගයට දැනුම්දීම් ඉවත දැමීමට හෝ දුරකථන ඇමතුම්වලට පිළිතුරු දීම සහ බාධා නොකරන්න පාලනය කිරීම වැනි, දැනුම්දීම්වලට ප්‍රතිචාර දැක්වීමටද හැකිය."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"දිනචරියා ප්‍රකාර තතු දැනුම්දීම"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"බැටරිය සුපුරුදු ආරෝපණයට පෙර ඉවර විය හැක"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"බැටරි සුරැකුම බැටරි ආයු කාලය දීර්ඝ කිරීමට සක්‍රිය කෙරිණි"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 806e5a0..6a68397 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -325,7 +325,7 @@
     <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"prístup k vašej fyzickej aktivite"</string>
     <string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparát"</string>
     <string name="permgroupdesc_camera" msgid="7585150538459320326">"fotenie a natáčanie videí"</string>
-    <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Zariadenia v okolí"</string>
+    <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Zariadenia nablízku"</string>
     <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"objavovať a pripájať zariadenia v okolí"</string>
     <string name="permgrouplab_calllog" msgid="7926834372073550288">"Zoznam hovorov"</string>
     <string name="permgroupdesc_calllog" msgid="2026996642917801803">"čítať a zapisovať do zoznamu hovorov"</string>
@@ -1753,7 +1753,7 @@
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Použiť skratku"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Inverzia farieb"</string>
     <string name="color_correction_feature_name" msgid="3655077237805422597">"Úprava farieb"</string>
-    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Mimoriadne stmavenie"</string>
+    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Veľmi tmavé"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Pridržali ste tlačidlá hlasitosti. Služba <xliff:g id="SERVICE_NAME">%1$s</xliff:g> je zapnutá."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Pridržali ste tlačidlá hlasitosti. Služba <xliff:g id="SERVICE_NAME">%1$s</xliff:g> je vypnutá."</string>
     <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Ak chcete používať službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, pridržte tri sekundy oba klávesy hlasitosti"</string>
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Neznáma veľkosť papiera na výšku"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Neznáma veľkosť papiera na šírku"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Zrušené"</string>
@@ -1898,8 +1910,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Aktualizoval správca"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Odstránil správca"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Šetrič batérie zapne tmavý motív a obmedzí alebo vypne aktivitu na pozadí, niektoré vizuálne efekty a funkcie, napríklad „Hey Google“\n\n"<annotation id="url">"Ďalšie informácie"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Šetrič batérie zapne tmavý motív a obmedzí alebo vypne aktivitu na pozadí, niektoré vizuálne efekty a funkcie, napríklad „Hey Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Šetrič batérie zapne tmavý motív a obmedzí alebo vypne aktivitu na pozadí, niektoré vizuálne efekty a určité funkcie.\n\n"<annotation id="url">"Ďalšie informácie"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Šetrič batérie zapne tmavý motív a obmedzí alebo vypne aktivitu na pozadí, niektoré vizuálne efekty a určité funkcie."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"S cieľom znížiť spotrebu dát bráni šetrič dát niektorým aplikáciám odosielať alebo prijímať dáta na pozadí. Aplikácia, ktorú práve používate, môže využívať dáta, ale možno to bude robiť menej často. Môže to napríklad znamenať, že sa obrázky zobrazia, až keď na ne klepnete."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnúť šetrič dát?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnúť"</string>
@@ -2139,12 +2151,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Toto upozornenie bolo znížené na Tiché. Klepnutím nám poskytnite spätnú väzbu."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Toto upozornenie bolo preradené vyššie. Klepnutím nám poskytnite spätnú väzbu."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Toto upozornenie bolo preradené nižšie. Klepnutím nám poskytnite spätnú väzbu."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Skúste zlepšené upozornenia"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Ak chcete ďalej dostávať navrhované akcie, odpovede a ďalší obsah, zapnite zlepšené upozornenia. Adaptívne upozornenia Androidu už nie sú podporované."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Zapnúť"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Teraz nie"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Zlepšené upozornenia"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Navrhované akcie a odpovede budú odteraz poskytované zlepšenými upozorneniami. Adaptívne upozornenia Androidu už nie sú podporované."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Vypnúť"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Ďalšie informácie"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Zlepšené upozornenia môžu čítať všetok obsah upozornení vrátane osobných údajov, ako sú mená kontaktov a správy. Táto funkcia tiež môže rušiť upozornenia alebo aktivovať tlačidlá v upozorneniach, napríklad na prijatie telefonických hovorov.\n\nTáto funkcia môže tiež zapnúť alebo vypnúť režim priority a zmeniť súvisiace nastavenia."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Adaptívne upozornenia Androidu boli v Androide 12 nahradené zlepšenými upozorneniami. Táto funkcia zobrazuje navrhované akcie aj odpovede a organizuje vaše upozornenia.\n\nZlepšené upozornenia majú prístup k obsahu upozornení vrátane osobných údajov, ako sú mená kontaktov a správy. Táto funkcia tiež môže zavrieť upozornenia alebo na ne reagovať, napríklad prijať telefonáty a ovládať režim bez vyrušení."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Upozornenie s informáciami o rutinnom režime"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batéria sa môže vybiť pred obvyklým nabitím"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Bol aktivovaný šetrič batérie na predĺženie výdrže batérie"</string>
@@ -2341,6 +2353,6 @@
     <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Ochrana súkromia senzorov"</string>
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ikona aplikácie"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Imidž značky aplikácie"</string>
-    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Skontrolujte nastavenia prístupu"</string>
+    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Kontrola nastavení prístupu"</string>
     <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> môže zobraziť a ovládať vašu obrazovku. Skontrolujte to klepnutím."</string>
 </resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index b5a73ee..5759f6ad 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Neznano pokončno"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Neznano ležeče"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Preklicano"</string>
@@ -1898,11 +1910,11 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Posodobil skrbnik"</string>
     <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="7963058670863485450">"Varčevanje z energijo baterije vklopi temno temo in omeji ali izklopi dejavnost v ozadju, nekatere vizualne učinke in druge funkcije, kot je »Hey Google«.\n\n"<annotation id="url">"Več o tem"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Varčevanje z energijo baterije vklopi temno temo in omeji ali izklopi dejavnost v ozadju, nekatere vizualne učinke in druge funkcije, kot je »Hey Google«."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Varčevanje z energijo baterije vklopi temno temo ter omeji ali izklopi dejavnost v ozadju, nekatere vizualne učinke in določene funkcije.\n\n"<annotation id="url">"Več o tem"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Varčevanje z energijo baterije vklopi temno temo ter omeji ali izklopi dejavnost v ozadju, nekatere vizualne učinke in določene funkcije."</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>
+    <string name="data_saver_enable_button" msgid="4399405762586419726">"Vklopi"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
       <item quantity="one">%d minuto (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
       <item quantity="two">%d minuti (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1991,8 +2003,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Zapri"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Sprejmi"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Zavrni"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Prekini klic"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Dohodni klic"</string>
@@ -2121,7 +2132,7 @@
     <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VSEENO ODPRI"</string>
     <string name="harmful_app_warning_title" msgid="8794823880881113856">"Zaznana je bila škodljiva aplikacija"</string>
     <string name="slices_permission_request" msgid="3677129866636153406">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati izreze aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
-    <string name="screenshot_edit" msgid="7408934887203689207">"Urejanje"</string>
+    <string name="screenshot_edit" msgid="7408934887203689207">"Uredi"</string>
     <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibriranje bo vklopljeno za klice in obvestila"</string>
     <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvonjenje bo izklopljeno za klice in obvestila"</string>
     <string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemske spremembe"</string>
@@ -2140,12 +2151,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"To obvestilo je bilo uvrščeno nižje – med obvestila brez zvoka. Dotaknite se, če želite poslati povratne informacije."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"To obvestilo je bilo uvrščeno višje. Dotaknite se, če želite poslati povratne informacije."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"To obvestilo je bilo uvrščeno nižje. Dotaknite se, če želite poslati povratne informacije."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Preizkusite pametna obvestila"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Če želite še naprej prejemati predlagana dejanja, odgovore in drugo, vklopite pametna obvestila. Prilagodljiva obvestila Android niso več podprta."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Vklopi"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Ne zdaj"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Več o tem"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Pametna obvestila lahko preberejo vso vsebino obvestil, vključno z osebnimi podatki, kot so imena in sporočila stikov. Ta funkcija lahko tudi opusti obvestila in izvaja dejanja z gumbi v obvestilih, kot je sprejemanje telefonskih klicev.\n\nPoleg tega lahko ta funkcija vklopi ali izklopi prednostni način ter spremeni povezane nastavitve."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutinsko informativno obvestilo o načinu delovanja"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se bo morda izpraznila, preden jo običajno priključite na polnjenje"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Vklopilo se je varčevanje z energijo baterije za podaljšanje časa delovanja baterije"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 30bcbaf..3f0b8f3 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"\"Monarch\""</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"\"Quatro\""</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Vertikalisht i panjohur"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Orientim i panjohur horizontal"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Anuluar"</string>
@@ -1852,8 +1865,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Përditësuar nga administratori"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Fshirë nga administratori"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Në rregull"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"\"Kursyesi i baterisë\" aktivizon \"Temën e errët\" dhe kufizon ose çaktivizon aktivitetin në sfond, disa efekte vizuale dhe veçoritë si \"Ok Google\"\n\n"<annotation id="url">"Mëso më shumë"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"\"Kursyesi i baterisë\" aktivizon \"Temën e errët\" dhe kufizon ose çaktivizon aktivitetin në sfond, disa efekte vizuale dhe veçoritë si \"Ok Google\"."</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <string name="data_saver_description" msgid="4995164271550590517">"Për të ndihmuar në reduktimin e përdorimit të të dhënave, \"Kursyesi i të dhënave\" pengon që disa aplikacione të dërgojnë apo të marrin të dhëna në sfond. Një aplikacion që po përdor aktualisht mund të ketë qasje te të dhënat, por këtë mund ta bëjë më rrallë. Kjo mund të nënkuptojë, për shembull, se imazhet nuk shfaqen kur troket mbi to."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Të aktivizohet \"Kursyesi i të dhënave\"?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivizo"</string>
@@ -1929,8 +1944,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Mbyll"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Përgjigju"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Refuzo"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Mbyll"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Telefonatë hyrëse"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ky njoftim është ulur në nivel si në heshtje. Trokit për të dhënë komente."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ky njoftim është renditur më lart. Trokit për të dhënë komente."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ky njoftim është renditur më poshtë. Trokit për të dhënë komente."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Provo njoftimet e përmirësuara"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Për të vazhduar të marrësh sugjerime për veprimet, përgjigjet etj., aktivizo njoftimet e përmirësuara. \"Njoftimet me përshtatje të Android\" nuk mbështeten më."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aktivizo"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Jo tani"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Mëso më shumë"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Njoftimet e përmirësuara mund të lexojnë të gjithë përmbajtjen e njoftimeve, duke përfshirë edhe informacionet personale si emrat e kontakteve dhe mesazhet. Kjo veçori mund të heqë po ashtu njoftimet ose të veprojë mbi butonat te njoftimet, si p.sh. t\'u përgjigjet telefonatave.\n\nKjo veçori mund të aktivizojë ose të çaktivizojë po ashtu modalitetin \"Me përparësi\" dhe të ndryshojë cilësimet përkatëse."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Njoftimi i informacionit të \"Modalitetit rutinë\""</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria mund të mbarojë përpara ngarkimit të zakonshëm"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"\"Kursyesi i baterisë\" u aktivizua për të rritur kohëzgjatjen e baterisë"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 96fa82d..e4cadb7 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1795,6 +1795,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1831,6 +1842,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Непозната величина, усправно"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Непозната величина, водоравно"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Отказано је"</string>
@@ -1875,8 +1887,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="7963058670863485450">"Уштеда батерије укључује Тамну тему и ограничава или искључује активности у позадини, неке визуелне ефекте и функције, на пример, „Хеј Google“.\n\n"<annotation id="url">"Сазнајте више"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Уштеда батерије укључује Тамну тему и ограничава или искључује активности у позадини, неке визуелне ефекте и функције, на пример, „Хеј Google“."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Уштеда батерије укључује Тамну тему и ограничава или искључује активности у позадини, неке визуелне ефекте и одређене функције.\n\n"<annotation id="url">"Сазнајте више"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Уштеда батерије укључује Тамну тему и ограничава или искључује активности у позадини, неке визуелне ефекте и одређене функције."</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>
@@ -2106,12 +2118,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Ово обавештење је деградирано у Нечујно. Додирните да бисте навели повратне информације."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Ово обавештење је рангирано више. Додирните да бисте навели повратне информације."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ово обавештење је рангирано ниже. Додирните да бисте навели повратне информације."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Пробајте побољшана обавештења"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Укључите побољшана обавештења да бисте и даље добијали препоручене радње, одговоре и друго. Прилагодљива обавештења за Android више нису подржана."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Укључи"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Не сада"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Побољшана обавештења"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Предложене радње и одговоре сада добијате помоћу побољшаних обавештења. Прилагодљива обавештења за Android више нису подржана."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Потврди"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Искључи"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Сазнајте више"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Побољшана обавештења могу да читају садржај свих обавештења, укључујући личне податке, попут имена контаката и порука. Ова функција може и да одбацује обавештења или активира дугмад у обавештењима, попут јављања на телефонске позиве.\n\nОва функција може и да укључи или искључи Приоритетни режим и да мења повезана подешавања."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Побољшана обавештења су заменила Android прилагодљива обавештења у Android-у 12. Ова функција показује предложене радње и одговоре и организује обавештења.\n\nПобољшана обавештења могу да приступају садржају обавештења, укључујући личне информације попут имена контаката и порука. Ова функција може и да одбацује обавештења или да одговара на њих, на пример, да се јавља на телефонске позиве и контролише режим Не узнемиравај."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Обавештење о информацијама Рутинског режима"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батерија ће се можда испразнити пре уобичајеног пуњења"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Уштеда батерије је активирана да би се продужило трајање батерије"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index b9efba0..e07cf41 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Porträtt – okänd storlek"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Landskap – okänd storlek"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Inställd"</string>
@@ -1852,9 +1864,9 @@
     <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="7963058670863485450">"I batterisparläget aktiveras mörkt tema och bakgrundsaktivitet som vissa visuella effekter och funktioner som ”Hey Google” begränsas eller inaktiveras\n\n"<annotation id="url">"Läs mer"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"I batterisparläget aktiveras mörkt tema och bakgrundsaktivitet som vissa visuella effekter och funktioner som ”Hey Google” begränsas eller inaktiveras."</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="battery_saver_description_with_learn_more" msgid="750683025714899363">"Batterisparläget aktiverar mörkt tema och begränsar eller inaktiverar bakgrundsaktivitet, vissa visuella effekter och vissa funktioner.\n\n"<annotation id="url">"Läs mer"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Batterisparläget aktiverar mörkt tema och begränsar eller inaktiverar bakgrundsaktivitet, vissa visuella effekter och vissa funktioner."</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">"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">
@@ -1929,8 +1941,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Stäng"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Svara"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Avvisa"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Lägg på"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Inkommande samtal"</string>
@@ -2074,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Den här aviseringen har ändrats till Tyst. Tryck för att lämna feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Den här aviseringen har fått högre rankning. Tryck för att lämna feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Den här aviseringen har fått lägre rankning. Tryck för att lämna feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Testa förbättrade aviseringar"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Aktivera förbättrade aviseringar om du vill fortsätta att få rekommenderade åtgärder, svar och annat. Anpassade aviseringar för Android stöds inte längre."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aktivera"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Inte nu"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Förbättrade aviseringar"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Förslag på åtgärder och svar tillhandahålls nu via förbättrade aviseringar. Anpassade aviseringar för Android stöds inte längre."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Inaktivera"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Läs mer"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Förbättrade aviseringar kan läsa allt innehåll i aviseringar, inklusive personliga uppgifter som namn på kontakter och meddelanden. Funktionen kan även stänga aviseringar eller använda åtgärdsknappar i aviseringar, till exempel för att svara på telefonsamtal.\n\nFunktionen kan även aktivera och inaktivera prioritetsläget och ändra tillhörande inställningar."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Förbättrade aviseringar har ersatt Anpassade aviseringar för Android i Android 12. Den här funktionen visar förslag på åtgärder och svar och organiserar dina aviseringar.\n\nFörbättrade aviseringar har åtkomst till allt innehåll i aviseringar, inklusive personliga uppgifter som namn på kontakter och meddelanden. Funktionen kan även ignorera aviseringar eller utföra åtgärder utifrån dem, till exempel svara på telefonsamtal och styra Stör ej."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Avisering om rutinläge"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batteriet kan ta slut innan du brukar ladda det"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparläget har aktiverats för att utöka batteritiden"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index ea069e1..c2e14bb 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Mkao wima usiojulikana"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Mandhari yasiyojulikana"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Imeghairiwa"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Imesasishwa na msimamizi wako"</string>
     <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="7963058670863485450">"Kiokoa Betri huwasha Mandhari meusi na kudhibiti au kuzima shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele kama vile \"Ok Google\"\n\n"<annotation id="url">"Pata maelezo zaidi"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Kiokoa Betri huwasha Mandhari meusi na kudhibiti au kuzima shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele kama vile \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Kiokoa Betri huwasha Mandhari meusi na kudhibiti au kuzima shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele fulani.\n\n"<annotation id="url">"Pata maelezo zaidi"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Kiokoa Betri huwasha Mandhari meusi na kudhibiti au kuzima shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele fulani."</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Arifa hii ilishushwa hadhi kuwa Kimya. Gusa ili utoe maoni."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Arifa hii imeorodheshwa katika nafasi ya juu. Gusa ili utoe maoni."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Arifa hii imeorodheshwa katika nafasi ya chini. Gusa ili utoe maoni."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Jaribu arifa zilizoboreshwa"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Ili uendelee kupata vitendo, majibu na mambo mengine yanayopendekezwa, washa arifa zilizoboreshwa. Arifa Zinazojirekebisha za Android hazitumiki tena."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Washa"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Si sasa"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Pata maelezo zaidi"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Kipengele cha Arifa zilizoboreshwa kinaweza kusoma maudhui yote ya arifa, zikiwemo taarifa binafsi kama vile majina ya anwani na ujumbe. Kipengele hiki kinaweza pia kuondoa arifa au kuchukua hatua kwenye vitufe katika arifa, kama vile kujibu simu.\n\nKipengele hiki pia kinaweza kuwasha au kuzima hali ya Kipaumbele na kubadilisha mipangilio inayohusiana."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Arifa ya maelezo ya Hali ya Kawaida"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Huenda betri itakwisha chaji mapema"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Imewasha Kiokoa Betri ili kurefusha muda wa matumizi ya betri"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 0b989c5..23cab42 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -307,7 +307,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">"Calendar"</string>
+    <string name="permgrouplab_calendar" msgid="6426860926123033230">"கேலெண்டர்"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"கேலெண்டரை அணுகலாம்"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string>
@@ -1707,8 +1707,8 @@
     <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_correction_feature_name" msgid="3655077237805422597">"வண்ணத் திருத்தம்"</string>
+    <string name="color_inversion_feature_name" msgid="326050048927789012">"நிற நேரெதிர் மாற்றம்"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"நிறத் திருத்தம்"</string>
     <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"மிகக் குறைவான வெளிச்சம்"</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>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"மோனார்க்"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"குவார்டோ"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"பூல்ஸ்கேப்"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"அறியப்படாத நிலைபதிப்பு"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"அறியப்படாத நிலைபரப்பு"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ரத்துசெய்யப்பட்டது"</string>
@@ -1852,8 +1864,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="7963058670863485450">"பேட்டரி சேமிப்பான் டார்க் தீமினை ஆன் செய்து பின்னணிச் செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள், “Ok Google” போன்ற அம்சங்களை ஆஃப் செய்யும் அல்லது கட்டுப்படுத்தும்\n\n"<annotation id="url">"மேலும் அறிக"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"பேட்டரி சேமிப்பான் டார்க் தீமினை ஆன் செய்து பின்னணிச் செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள், “Ok Google” போன்ற அம்சங்களை ஆஃப் செய்யும் அல்லது கட்டுப்படுத்தும்."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"பேட்டரி சேமிப்பான் டார்க் தீமை ஆன் செய்யும். பின்னணிச் செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள் மற்றும் குறிப்பிட்ட அம்சங்களைக் கட்டுப்படுத்தும் அல்லது ஆஃப் செய்யும்.\n\n"<annotation id="url">"மேலும் அறிக"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"பேட்டரி சேமிப்பான் டார்க் தீமை ஆன் செய்யும். பின்னணிச் செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள் மற்றும் குறிப்பிட்ட அம்சங்களைக் கட்டுப்படுத்தும் அல்லது ஆஃப் செய்யும்."</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"பதிலளி"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"வீடியோ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"நிராகரி"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"துண்டி"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"உள்வரும் அழைப்பு"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"இந்த அறிவிப்பின் முக்கியத்துவம் நிசப்த நிலைக்குக் குறைத்து அமைக்கப்பட்டது. கருத்து தெரிவிக்க தட்டவும்."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"இந்த அறிவிப்பின் முக்கியத்துவம் உயர்த்தப்பட்டது. கருத்து தெரிவிக்க தட்டவும்."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"இந்த அறிவிப்பின் முக்கியத்துவம் குறைக்கப்பட்டது. கருத்து தெரிவிக்க தட்டவும்."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"மேம்பட்ட அறிவிப்புகளை முயல்க"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"பரிந்துரைக்கப்பட்ட செயல்பாடுகள், பதில்கள் மற்றும் பலவற்றையும் தொடர்ந்து பெற மேம்பட்ட அறிவிப்புகளை ஆன் செய்யவும். Android சூழலுக்கேற்ற அறிவிப்புகள் இனி ஆதரிக்கப்படாது."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ஆன் செய்"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"இப்போது வேண்டாம்"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"மேலும் அறிக"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"மேம்பட்ட அறிவிப்புகளால் அனைத்து அறிவிப்புகளின் உள்ளடக்கத்தையும் (தொடர்புகளின் பெயர்கள், மெசேஜ்கள் போன்ற தனிப்பட்ட தகவல்கள் உட்பட) படிக்க முடியும். இந்த அம்சத்தால் அறிவிப்புகளை நிராகரிக்கவோ அறிவிப்புகளிலுள்ள பட்டன்களை இயக்கவோ (அழைப்புகளுக்குப் பதிலளிப்பது போன்றவை) முடியும்.\n\nஇந்த அம்சத்தால் முன்னுரிமைப் பயன்முறையை இயக்கவோ முடக்கவோ முடியும் மற்றும் தொடர்புடைய அமைப்புகளை மாற்றவும் முடியும்."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 882af55..aa97fb5 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1366,7 +1366,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">"డీబగ్గింగ్‌ని నిలిపివేయడానికి ఎంచుకోండి."</string>
     <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"వైర్‌లెస్ డీబగ్గింగ్ కనెక్ట్ చేయబడింది"</string>
     <string name="adbwifi_active_notification_message" msgid="930987922852867972">"వైర్‌లెస్ డీబగ్గింగ్‌ని ఆఫ్ చేయడానికి ట్యాప్ చేయండి"</string>
@@ -1566,7 +1566,7 @@
     <string name="action_menu_overflow_description" msgid="4579536843510088170">"మరిన్ని ఆప్షన్‌లు"</string>
     <string name="action_bar_home_description_format" msgid="5087107531331621803">"%1$s, %2$s"</string>
     <string name="action_bar_home_subtitle_description_format" msgid="4346835454749569826">"%1$s, %2$s, %3$s"</string>
-    <string name="storage_internal" msgid="8490227947584914460">"షేర్ చేయబడిన అంతర్గత నిల్వ"</string>
+    <string name="storage_internal" msgid="8490227947584914460">"షేర్ చేయబడిన అంతర్గత స్టోరేజ్"</string>
     <string name="storage_sd_card" msgid="3404740277075331881">"SD కార్డు"</string>
     <string name="storage_sd_card_label" msgid="7526153141147470509">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD కార్డ్"</string>
     <string name="storage_usb_drive" msgid="448030813201444573">"USB డ్రైవ్"</string>
@@ -1621,7 +1621,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>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"మోనార్క్"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"క్వార్టో"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"ఫుల్‌స్కేప్"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"కాహు"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"కాకు2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"యు4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"తెలియని పొర్ట్రెయిట్"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"తెలియని ల్యాండ్‍స్కేప్"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"రద్దు చేయబడింది"</string>
@@ -1852,8 +1865,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="7963058670863485450">"బ్యాటరీ సేవర్ ముదురు రంగు రూపంను ఆన్ చేస్తుంది అలాగే బ్యాక్‌గ్రౌండ్ యాక్టివిటీని, కొన్ని విజువల్ ఎఫెక్ట్‌లు, అలాగే “Ok Google” వంటి ఫీచర్‌లను పరిమితం చేస్తుంది లేదా ఆఫ్ చేస్తుంది\n\n"<annotation id="url">"మరింత తెలుసుకోండి"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"బ్యాటరీ సేవర్ ముదురు రంగు రూపంను ఆన్ చేస్తుంది అలాగే బ్యాక్‌గ్రౌండ్ యాక్టివిటీని, కొన్ని విజువల్ ఎఫెక్ట్‌లు, అలాగే “Ok Google” వంటి ఫీచర్‌లను పరిమితం చేస్తుంది లేదా ఆఫ్ చేస్తుంది."</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"సమాధానం ఇవ్వు"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"వీడియో కాల్"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"తిరస్కరించండి"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"కాల్ ముగించు"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"ఇన్‌కమింగ్ కాల్"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"ఈ నోటిఫికేషన్ స్థాయి నిశ్శబ్దంగా ఉండేలా తగ్గించబడింది. ఫీడ్‌బ్యాక్‌ను అందించడానికి ట్యాప్ చేయండి."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"ఈ నోటిఫికేషన్‌కు ఎక్కువ ర్యాంక్ ఇవ్వబడింది. ఫీడ్‌బ్యాక్‌ను అందించడానికి ట్యాప్ చేయండి."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"ఈ నోటిఫికేషన్‌కు తక్కువ ర్యాంక్ ఇవ్వబడింది. ఫీడ్‌బ్యాక్‌ను అందించడానికి ట్యాప్ చేయండి."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"మెరుగైన నోటిఫికేషన్‌ల ట్రై"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"సూచించిన చర్యలు, రిప్లయిలు, అలాగే మరిన్ని పొందడం కొనసాగించడానికి మెరుగైన నోటిఫికేషన్‌లను ఆన్ చేయండి. Android అనుకూల నోటిఫికేషన్‌లు ఇకపై సపోర్ట్ చేయవు."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"ఆన్ చేయి"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ఇప్పుడు కాదు"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"మరింత తెలుసుకోండి"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"కాంటాక్ట్ పేర్లు, మెసేజ్‌లు వంటి వ్యక్తిగత సమాచారంతో సహా మెరుగైన నోటిఫికేషన్‌లు అన్ని నోటిఫికేషన్ కంటెంట్‌ను చదవగలవు. ఈ ఫీచర్ నోటిఫికేషన్‌లను తీసివేయవచ్చు లేదా ఫోన్ కాల్‌లకు సమాధానం ఇవ్వడం వంటి నోటిఫికేషన్‌లలోని బటన్‌లపై చర్యలు తీసుకోవచ్చు.\n\nఈ ఫీచర్ ప్రాధాన్యత మోడ్‌ను కూడా ఆన్ లేదా ఆఫ్ చేయవచ్చు, ఇది సంబంధిత సెట్టింగ్‌లను మార్చగలదు."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"రొటీన్ మోడ్ సమాచార నోటిఫికేషన్"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index e0001c2..65a38db 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"กระดาษฟุลสแก๊ป"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super-B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"แนวตั้งไม่ทราบขนาด"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"แนวนอนไม่ทราบขนาด"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"ยกเลิก"</string>
@@ -1852,8 +1864,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="7963058670863485450">"โหมดประหยัดแบตเตอรี่จะเปิดธีมมืดและจำกัดหรือปิดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์อย่างเช่น \"Ok Google\"\n\n"<annotation id="url">"ดูข้อมูลเพิ่มเติม"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"โหมดประหยัดแบตเตอรี่จะเปิดธีมมืดและจำกัดหรือปิดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์อย่างเช่น \"Ok Google\""</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"โหมดประหยัดแบตเตอรี่จะเปิดใช้ธีมมืดและจำกัดหรือปิดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์บางส่วน\n\n"<annotation id="url">"ดูข้อมูลเพิ่มเติม"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"โหมดประหยัดแบตเตอรี่จะเปิดใช้ธีมมืดและจำกัดหรือปิดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์บางส่วน"</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"รับสาย"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"วิดีโอ"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"ปฏิเสธ"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"วางสาย"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"สายเรียกเข้า"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"การแจ้งเตือนนี้มีการลดระดับเป็นแบบปิดเสียง แตะเพื่อแสดงความคิดเห็น"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"การแจ้งเตือนนี้มีการเพิ่มระดับ แตะเพื่อแสดงความคิดเห็น"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"การแจ้งเตือนนี้มีการลดระดับ แตะเพื่อแสดงความคิดเห็น"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"ลองใช้การแจ้งเตือนที่เพิ่มประสิทธิภาพ"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"หากต้องการรับการดําเนินการ การตอบ และอื่นๆ ที่แนะนําต่อไป ให้เปิดการแจ้งเตือนที่เพิ่มประสิทธิภาพ ไม่รองรับการแจ้งเตือนแบบปรับอัตโนมัติใน Android อีกต่อไป"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"เปิด"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ไว้ทีหลัง"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ดูข้อมูลเพิ่มเติม"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"การแจ้งเตือนที่เพิ่มประสิทธิภาพจะอ่านเนื้อหาการแจ้งเตือนทั้งหมดได้ รวมถึงข้อมูลส่วนบุคคล เช่น ชื่อผู้ติดต่อและข้อความ ฟีเจอร์นี้ยังปิดการแจ้งเตือนหรือดำเนินการกับปุ่มต่างๆ ในการแจ้งเตือนได้ด้วย เช่น การรับสายเรียกเข้า\n\nอีกทั้งสามารถเปิดหรือปิดโหมดลำดับความสำคัญสูงและเปลี่ยนแปลงการตั้งค่าที่เกี่ยวข้อง"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"การแจ้งเตือนข้อมูลโหมดกิจวัตร"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"แบตเตอรี่อาจหมดก่อนการชาร์จปกติ"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"เปิดใช้งานโหมดประหยัดแบตเตอรี่แล้วเพื่อยืดอายุการใช้งานแบตเตอรี่"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index adaa774..c646cba 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Hindi alam na portrait"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Hindi alam na landscape"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Kinansela"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Na-update ng iyong admin"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Na-delete ng iyong admin"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Ino-on ng Pantipid ng Baterya ang Madilim na tema at nililimitahan o ino-off nito ang aktibidad sa background, ilang visual effect, at mga feature gaya ng “Hey Google”\n\n"<annotation id="url">"Matuto pa"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Ino-on ng Pantipid ng Baterya ang Madilim na tema at nililimitahan o ino-off nito ang aktibidad sa background, ilang visual effect, at mga feature gaya ng “Hey Google.”"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Ino-on ng Pantipid ng Baterya ang Madilim na tema at nililimitahan o ino-off nito ang aktibidad sa background, ilang visual effect, at ilang partikular na feature.\n\n"<annotation id="url">"Matuto pa"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Ino-on ng Pantipid ng Baterya ang Madilim na tema at nililimitahan o ino-off nito ang aktibidad sa background, ilang visual effect, at ilang partikular na feature."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Upang makatulong na mabawasan ang paggamit ng data, pinipigilan ng Data Saver ang ilang app na magpadala o makatanggap ng data sa background. Maaaring mag-access ng data ang isang app na ginagamit mo sa kasalukuyan, ngunit mas bihira na nito magagawa iyon. Halimbawa, maaaring hindi lumabas ang mga larawan hangga\'t hindi mo nata-tap ang mga ito."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"I-on ang Data Saver?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"I-on"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Na-demote sa Naka-silent ang notification na ito. I-tap para magbigay ng feedback."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Itinaas ang ranggo ng notification na ito. I-tap para magbigay ng feedback."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Ibinaba ang ranggo ng notification na ito. I-tap para magbigay ng feedback."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Subukan ang enhanced notification"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Para patuloy na makakuha ng mga iminumungkahing pagkilos, sagot, at higit pa, i-on ang mga pinahusay na notification. Hindi na sinusuportahan ang Mga Adaptive na Notification ng Android."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"I-on"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Hindi ngayon"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Mga pinahusay na notification"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Nagbibigay na ng mga iminumungkahing pagkilos at tugon ang mga pinahusay na notification. Hindi na sinusuportahan ang Mga Adaptive na Notification ng Android."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"I-off"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Matuto pa"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Puwedeng basahin ng mga pinahusay na notification ang lahat ng notification, kabilang ang personal na impormasyon gaya ng mga pangalan ng contact at mga mensahe. Magagawa ring ng feature na ito na i-dismiss ang mga notification o gumawa ng mga pagkilos sa mga button sa mga notification, gaya ng pagsagot sa mga tawag sa telepono.\n\nPuwede ring i-on o i-off ng feature na ito ang Priority mode at baguhin ang mga kaugnay na setting."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Pinalitan ng mga pinahusay na notification ang Mga Adaptive na Notification ng Android sa Android 12. Nagpapakita ng mga iminumungkahing pagkilos at tugon ang feature na ito, at isinasaayos nito ang iyong mga notification.\n\nMaa-access ng mga pinahusay na notification ang content ng notification, kabilang ang personal na impormasyon gaya ng mga pangalan ng contact at mensahe. Puwede ring i-dismiss o tugunan ng feature na ito ang mga notification, gaya ng pagsagot sa mga tawag at pagkontrol sa Huwag Istorbohin."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification ng impormasyon ng Routine Mode"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Maaaring maubos ang baterya bago ang karaniwang pag-charge"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Na-activate ang Pantipid ng Baterya para patagalin ang buhay ng baterya"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index bd85322..668ae77 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Bilinmeyen dikey"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Bilinmeyen yatay"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"İptal edildi"</string>
@@ -1852,9 +1864,9 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Yöneticiniz tarafından güncellendi"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Yöneticiniz tarafından silindi"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Tamam"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Pil Tasarrufu, Koyu temayı açıp arka plan etkinliğini, bazı görsel efektleri ve \"Ok Google\" gibi özellikleri kapatır veya kısıtlar.\n\n"<annotation id="url">"Daha fazla bilgi"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Pil Tasarrufu, Koyu temayı açıp arka plan etkinliğini, bazı görsel efektleri ve \"Ok Google\" gibi özellikleri kapatır veya kısıtlar."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Veri kullanımını azaltmaya yardımcı olması için Veri Tasarrufu, bazı uygulamaların arka planda veri göndermesini veya almasını engeller. Şu anda kullandığınız bir uygulama veri bağlantısına erişebilir, ancak bunu daha seyrek yapabilir. Bu durumda örneğin, siz resimlere dokunmadan resimler görüntülenmez."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Pil Tasarrufu özelliği Koyu temayı açıp arka plan etkinliğini, bazı görsel efektleri ve belirli özellikleri sınırlandırır ya da kapatır.\n\n"<annotation id="url">"Daha fazla bilgi"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Pil Tasarrufu özelliği Koyu temayı açıp arka plan etkinliğini, bazı görsel efektleri ve belirli özellikleri sınırlandırır ya da kapatır."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Veri kullanımını azaltmaya yardımcı olması için Veri Tasarrufu, bazı uygulamaların arka planda veri göndermesini veya almasını engeller. Kullanmakta olduğunuz bir uygulama veri bağlantısına erişebilir, ancak bunu daha seyrek yapabilir. Bu durumda örneğin, siz resimlere dokunmadan resimler görüntülenmez."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Veri Tasarrufu açılsın mı?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Aç"</string>
     <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Bu bildirimin önem derecesi, \"Sessiz\" seviyesine düşürüldü. Geri bildirimde bulunmak için dokunun."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Bu bildirimin önem derecesi yükseltildi. Geri bildirimde bulunmak için dokunun."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Bu bildirimin önem derecesi düşürüldü. Geri bildirimde bulunmak için dokunun."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Gelişmiş bildirimleri deneyin"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Önerilen işlemleri, yanıtları ve diğer içerikleri almaya devam etmek için gelişmiş bildirimleri açın. Android Uyarlamalı Bildirimler artık desteklenmiyor."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Aç"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Şimdi değil"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Gelişmiş bildirimler"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Önerilen işlemler ve yanıtlar artık gelişmiş bildirimler tarafından sağlanıyor. Android Uyarlamalı Bildirimler artık desteklenmiyor."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Tamam"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Kapat"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Daha fazla bilgi"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Gelişmiş bildirimler, kişiler ve mesajlar gibi kişisel bilgiler dahil olmak üzere tüm bildirim içeriklerini okuyabilir. Bu özellik ayrıca bildirimleri kapatabilir veya bildirimlerdeki düğmeler üzerinde telefon çağrılarını yanıtlamak gibi işlemler yapabilir.\n\nBu özellik ayrıca Öncelik modunu açıp kapatabilir ve ilgili ayarları değiştirebilir."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Gelişmiş bildirimler, Android 12\'de Android Uyarlamalı Bildirimler\'in yerini aldı. Bu özellik, önerilen işlem ve yanıtları gösterir ve bildirimlerinizi organize eder.\n\nGelişmiş bildirimler, kişiler ve mesajlar gibi kişisel bilgiler dahil olmak üzere tüm bildirim içeriklerine erişebilir. Bu özellik ayrıca bildirimleri kapatabilir veya telefon aramalarını yanıtlamak ve Rahatsız Etmeyin modunu kontrol etmek gibi işlemlerle bildirimlere yanıt verebilir."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutin Modu bilgi bildirimi"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pil normal şarjdan önce bitebilir"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Pilin ömrünü uzatmak için Pil Tasarrufu etkinleştirildi"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 9401d50..1eea6317f 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1817,6 +1817,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch (Пн. Америка)"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto (Пн. Америка)"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap (Пн. Америка)"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K (Китай)"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K (Китай)"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1 (Китай)"</string>
@@ -1853,6 +1864,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu (Японія)"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2 (Японія)"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4 (Японія)"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Невідома книжкова орієнтація"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Невідома альбомна орієнтація"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Скасовано"</string>
@@ -1898,8 +1910,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="7963058670863485450">"У режимі енергозбереження вмикається темна тема й обмежуються чи вимикаються фонова робота додатків, деякі візуальні ефекти та інші функції, як-от \"Ok Google\"\n\n"<annotation id="url">"Докладніше"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"У режимі енергозбереження вмикається темна тема й обмежуються чи вимикаються фонова робота додатків, деякі візуальні ефекти та інші функції, як-от \"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"У режимі енергозбереження вмикається темна тема й обмежуються чи вимикаються фонова робота додатків, деякі візуальні ефекти та певні функції.\n\n"<annotation id="url">"Докладніше"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"У режимі енергозбереження вмикається темна тему й обмежуються чи вимикаються фонова робота додатків, деякі візуальні ефекти та певні функції."</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>
@@ -1991,8 +2003,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Відповісти"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Відео"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Відхилити"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Завершити"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Вхідний виклик"</string>
@@ -2140,12 +2151,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Важливість цього сповіщення знижено до рівня \"Без звуку\". Натисніть, щоб надіслати відгук."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Важливість цього сповіщення підвищено. Натисніть, щоб надіслати відгук."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Важливість цього сповіщення знижено. Натисніть, щоб надіслати відгук."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Спробуйте покращені сповіщення"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Щоб і надалі отримувати пропозиції дій, відповідей тощо, увімкніть покращені сповіщення. Адаптивні сповіщення Android більше не підтримуються."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Увімкнути"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Не зараз"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Докладніше"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Покращені сповіщення дають змогу читати весь вміст сповіщень, зокрема особисту інформацію, як-от імена контактів і повідомлення. Крім того, ви зможете відхиляти сповіщення або натискати кнопки в них, щоб виконувати певні дії, наприклад відповідати на телефонні дзвінки.\n\nЦя функція також дає змогу вмикати й вимикати режим пріоритетності та змінювати відповідні налаштування."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Сповіщення про послідовнсть дій"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Акумулятор може розрядитися раніше ніж зазвичай"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Режим енергозбереження активовано для збільшення часу роботи акумулятора"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 9291cd2..1f056fa 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"مونارک"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"کوارٹو"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"فل اسکیپ"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"نامعلوم پورٹریٹ"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"نامعلوم لینڈ اسکیپ"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"منسوخ کر دیا گیا"</string>
@@ -1852,8 +1865,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="7963058670863485450">"‏بیٹری سیور گہری تھیم کو آن کرتی ہے اور پس منظر کی سرگرمی، کچھ بصری اثرات اور \"Hey Google\" جیسی خصوصیات کو محدود یا آف کرتی ہے\n\n"<annotation id="url">"مزید جانیں"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"‏بیٹری سیور گہری تھیم کو آن کرتی ہے اور پس منظر کی سرگرمی، کچھ بصری اثرات اور \"Hey Google\" جیسی خصوصیات کو محدود یا آف کرتی ہے۔"</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"جواب"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"ویڈیو"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"مسترد کریں"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"منقطع کر دیں"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"اِن کمنگ کال"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"اس اطلاع کو خاموش پر ڈیموٹ کیا گيا۔ تاثرات فراہم کرنے کے ليے تھپتھپائیں۔"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"اس اطلاع کو اعلی درجہ دیا گیا۔ تاثرات فراہم کرنے کے ليے تھپتھپائیں۔"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"اس اطلاع کو کم درجہ دیا گیا۔ تاثرات فراہم کرنے کے ليے تھپتھپائیں۔"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"بہتر کردہ اطلاعات آزمائیں"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"‏تجویز کردہ کارروائیاں، جوابات اور مزید بہت کچھ حاصل کرنا جاری رکھنے کے لیے بہتر کردہ اطلاعات آن کریں۔ Android اڈاپٹیو اطلاعات اب تعاون یافتہ نہیں ہیں۔"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"آن کریں"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"ابھی نہیں"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"مزید جانیں"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"بہتر کردہ اطلاعات رابطوں کے نام اور پیغامات جیسی ذاتی معلومات سمیت تمام اطلاعی مواد پڑھ سکتی ہیں۔ یہ خصوصیت اطلاعات کو برخاست بھی کر سکتی ہے یا کالز کا جواب دینے جیسے اطلاعات میں نظر آنے والے بٹنوں سے کارروائیاں کر سکتی ہے۔\n\nیہ خصوصیت ترجیحی موڈ کو آن یا آف بھی کر سکتی ہے اور متعلقہ ترتیبات کو تبدیل کر سکتی ہے۔"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"روٹین موڈ معلومات کی اطلاع"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"معمول چارج سے پہلے بیٹری ختم ہو سکتی ہے"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"بیٹری لائف کو بڑھانے کے لیے بیٹری سیور کو فعال کر دیا گیا ہے"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 3b135ec..bac2b6f 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1708,7 +1708,7 @@
     <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"Tezkor ishga tushirishni o‘chirib qo‘yish"</string>
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Tezkor ishga tushirishdan foydalanish"</string>
     <string name="color_inversion_feature_name" msgid="326050048927789012">"Ranglarni akslantirish"</string>
-    <string name="color_correction_feature_name" msgid="3655077237805422597">"Rangni tuzatish"</string>
+    <string name="color_correction_feature_name" msgid="3655077237805422597">"Ranglarni tuzatish"</string>
     <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Juda xira"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Tovush tugmalari bosib turildi. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> yoqildi."</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Tovush tugmalari bosib turildi. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> faolsizlantirildi."</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarx"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Noma’lum bo‘yiga"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Noma’lum eniga"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Bekor qilindi"</string>
@@ -1852,8 +1865,10 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Administrator tomonidan yangilangan"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administrator tomonidan o‘chirilgan"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Quvvat tejash funksiyasi Tungi mavzuni va cheklovlarni yoqadi va fondagi harakatlar, vizual effektlar va “Ok Google” kabi boshqa funksiyalarni faolsizlantiradi yoki cheklaydi.\n\n"<annotation id="url">"Batafsil"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Quvvat tejash funksiyasi Tungi mavzuni va cheklovlarni yoqadi va fondagi harakatlar, vizual effektlar va “Ok Google” kabi boshqa funksiyalarni faolsizlantiradi yoki cheklaydi."</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <string name="data_saver_description" msgid="4995164271550590517">"Trafik tejash rejimida ayrim ilovalar uchun orqa fonda internetdan foydalanish imkoniyati cheklanadi. Siz ishlatayotgan ilova zaruratga qarab internet-trafik sarflashi mumkin, biroq cheklangan miqdorda. Masalan, rasmlar ustiga bosmaguningizcha ular yuklanmaydi."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Trafik tejash yoqilsinmi?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Yoqish"</string>
@@ -1929,8 +1944,7 @@
     <string name="close_button_text" msgid="10603510034455258">"Yopish"</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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"Javob berish"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Video"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"Rad etish"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"Tugatish"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"Kiruvchi chaqiruv"</string>
@@ -2074,12 +2088,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Bu bildirishnoma darajasi Tovushsiz darajaga tushirildi Fikr-mulohaza bildirish uchun bosing."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Bu bildirishnoma darajasi oshirildi. Fikr-mulohaza bildirish uchun bosing."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Bu bildirishnoma darajasi pasaytirildi. Fikr-mulohaza bildirish uchun bosing."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Yangicha bildirishnomalar"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Amallar, javoblar va boshqa takliflarni olishda davom etish uchun yaxshilangan bildirishnomalarni yoqing. Android moslashuvchan bildirishnomalari endi ishlamaydi."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Yoqish"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Hozir emas"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Yangicha bildirishnomalar"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Amallar va javoblar taklifi endi yangicha bildirishnomalar orqali chiqadi. Android moslashuvchan bildirishnomalari endi ishlamaydi."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Faolsizlantirish"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Batafsil"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Yangicha bildirishnomalar funksiyasi barcha bildirishnomalarni, jumladan, shaxsiy maʼlumotlarni (kontakt nomlari va xabarlar) oʻqiy oladi. Shuningdek, bu funksiya bildirishnomalarni yopishi yoki telefon chaqiruvlariga javob berish kabi bildirishnomalarda tugmalar bilan amallar bajarishi mumkin.\n\nBu funksiya Faqat muhim rejimini yoqishi va faolsizlantirishi yoki unga aloqador sozlamalarni oʻzgartirishi ham mumkin."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Android 12 tizimida moslashuvchan bildirishnomalar oʻrniga yangicha bildirishnomalar chiqadi. Bu funksiya amallar va javoblarni taklif qiladi va bildirishnomalaringizni boshqaradi.\n\nYangicha bildirishnomalar barcha bildirishnomalar kontentini, jumladan kontakt nomlari va xabarlar kabi shaxsiy bildirishnomalarni ham oʻqiy oladi. Shuningdek, bu funksiya bildirishnomalarni yopishi yoki telefon chaqiruvlariga javob berishi va Bezovta qilinmasin rejimini boshqarishi mumkin."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Kun tartibi rejimi haqidagi bildirishnoma"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batareya quvvati odatdagidan ertaroq tugashi mumkin"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash rejimi yoqildi"</string>
@@ -2274,6 +2288,6 @@
     <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensorlar maxfiyligi"</string>
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Ilova belgisi"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Ilova brendining rasmi"</string>
-    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Kirish sozlamalarini tekshiring"</string>
+    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Ruxsat sozlamalarini tekshiring"</string>
     <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ekraningizni koʻrishi va boshqarishi mumkin. Tekshirish uchun bosing."</string>
 </resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 77d81d8..c65229c 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -715,7 +715,7 @@
     <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ nhắn tin của nhà cung cấp dịch vụ. Không cần thiết cho các ứng dụng thông thường."</string>
     <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"liên kết với dịch vụ của nhà cung cấp"</string>
     <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Cho phép chủ sở hữu liên kết với các dịch vụ của nhà cung cấp. Không bao giờ cần cho các ứng dụng thông thường."</string>
-    <string name="permlab_access_notification_policy" msgid="5524112842876975537">"truy cập Không làm phiền"</string>
+    <string name="permlab_access_notification_policy" msgid="5524112842876975537">"quyền truy cập chế độ Không làm phiền"</string>
     <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Cho phép ứng dụng đọc và ghi cấu hình Không làm phiền."</string>
     <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"cấp quyền xem"</string>
     <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Cho phép chủ sở hữu cấp quyền cho một ứng dụng. Các ứng dụng thông thường sẽ không bao giờ cần quyền này."</string>
@@ -1156,7 +1156,7 @@
     <string name="delete" msgid="1514113991712129054">"Xóa"</string>
     <string name="copyUrl" msgid="6229645005987260230">"Sao chép URL"</string>
     <string name="selectTextMode" msgid="3225108910999318778">"Chọn văn bản"</string>
-    <string name="undo" msgid="3175318090002654673">"Hoàn tác"</string>
+    <string name="undo" msgid="3175318090002654673">"Hủy"</string>
     <string name="redo" msgid="7231448494008532233">"Làm lại"</string>
     <string name="autofill" msgid="511224882647795296">"Tự động điền"</string>
     <string name="textSelectionCABTitle" msgid="5151441579532476940">"Lựa chọn văn bản"</string>
@@ -1709,7 +1709,7 @@
     <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">"Chỉnh màu"</string>
-    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Giảm độ sáng hơn nữa"</string>
+    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Siêu tối"</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>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Giấy khổ rộng"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Khổ dọc không xác định"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Khổ ngang không xác định"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Đã hủy"</string>
@@ -1852,8 +1864,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="7963058670863485450">"Tính năng Tiết kiệm pin sẽ bật Giao diện tối, đồng thời 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 như lệnh “Ok Google”\n\n"<annotation id="url">"Tìm hiểu thêm"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Tính năng Tiết kiệm pin sẽ bật Giao diện tối, đồng thời 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 như lệnh “Ok Google”."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Tính năng Tiết kiệm pin sẽ bật Giao diện tối, đồng thời hạn chế hoặc tắt hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng nhất định.\n\n"<annotation id="url">"Tìm hiểu thêm"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Tính năng Tiết kiệm pin sẽ bật Giao diện tối, đồng thời hạn chế hoặc tắt hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng nhất định."</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Hệ thống đã hạ mức ưu tiên của thông báo này xuống thành Im lặng. Hãy nhấn để chia sẻ ý kiến phản hồi."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Hệ thống đã nâng mức ưu tiên của thông báo này. Hãy nhấn để chia sẻ ý kiến phản hồi."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Hệ thống đã hạ mức ưu tiên của thông báo này. Hãy nhấn để chia sẻ ý kiến phản hồi."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Dùng thử thông báo nâng cao"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Để tiếp tục nhận các thao tác đề xuất, câu trả lời và nhiều nội dung khác, hãy bật thông báo nâng cao. Thông báo thích ứng trên Android không được hỗ trợ nữa."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Bật"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Để sau"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Tìm hiểu thêm"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Thông báo nâng cao có thể đọc mọi nội dung thông báo, bao gồm cả thông tin cá nhân như tên liên hệ và tin nhắn. Tính năng này cũng có thể đóng các thông báo hoặc thực hiện thao tác đối với các nút trong thông báo, chẳng hạn như trả lời cuộc gọi điện thoại.\n\nTính năng này cũng có thể bật hoặc tắt Chế độ ưu tiên và thay đổi các chế độ cài đặt liên quan."</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Thông báo cung cấp thông tin về chế độ sạc thông thường"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pin có thể hết trước khi sạc bình thường"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Trình tiết kiệm pin được kích hoạt để kéo dài thời lượng pin"</string>
@@ -2262,7 +2279,7 @@
     <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string>
     <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string>
     <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string>
-    <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Chế độ cài đặt phóng to mới"</string>
+    <string name="window_magnification_prompt_title" msgid="2876703640772778215">"Chế độ phóng to mới"</string>
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Giờ đây, bạn có thể phóng to một phần màn hình"</string>
     <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Bật trong phần Cài đặt"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Đóng"</string>
@@ -2273,6 +2290,6 @@
     <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Quyền riêng tư khi sử dụng cảm biến"</string>
     <string name="splash_screen_view_icon_description" msgid="180638751260598187">"Biểu tượng ứng dụng"</string>
     <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Hình ảnh thương hiệu của ứng dụng"</string>
-    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Kiểm tra chế độ cài đặt quyền truy cập"</string>
+    <string name="view_and_control_notification_title" msgid="4300765399209912240">"Hãy kiểm tra chế độ cài đặt quyền truy cập"</string>
     <string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> có thể xem và điều khiển màn hình của bạn. Nhấn để xem lại."</string>
 </resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 1d4ee44..df13cc0 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,8 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <!-- no translation found for mediasize_japanese_l (1326765321473431817) -->
+    <skip />
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"未知(纵向)"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"未知(横向)"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"已取消"</string>
@@ -1852,8 +1865,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="7963058670863485450">"省电模式会开启深色主题,并限制或关闭后台活动、部分视觉效果和“Ok Google”等功能\n\n"<annotation id="url">"了解详情"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"省电模式会开启深色主题,并限制或关闭后台活动、部分视觉效果和“Ok Google”等功能。"</string>
+    <!-- no translation found for battery_saver_description_with_learn_more (750683025714899363) -->
+    <skip />
+    <!-- no translation found for battery_saver_description (5693741424234005958) -->
+    <skip />
     <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>
@@ -1929,8 +1944,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"接听"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"视频通话"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"拒接"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"挂断"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"来电"</string>
@@ -2074,12 +2088,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"系统已将此通知的重要性降低为“静音”。点按即可提供反馈。"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"系统已提升此通知的重要性。点按即可提供反馈。"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"系统已降低此通知的重要性。点按即可提供反馈。"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"试用增强型通知"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"如需继续接收建议的操作、回复等内容,请开启增强型通知功能。系统不再支持 Android 自动调节通知功能。"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"开启"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"以后再说"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"了解详情"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"增强型通知功能可以读取所有通知内容,包括联系人姓名和消息等个人信息。该功能也能关闭通知或触发通知中的按钮,例如接听来电。\n\n此外,该功能还能开启或关闭“优先”模式,以及更改相关设置。"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"日常安排模式信息通知"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"电池电量可能会在您平时的充电时间之前耗尽"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"已启用省电模式以延长电池续航时间"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 9c6b851..3addf92 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -311,7 +311,7 @@
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"存取您的日曆"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"短訊"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"傳送和查看短訊"</string>
-    <string name="permgrouplab_storage" msgid="1938416135375282333">"檔案及媒體"</string>
+    <string name="permgrouplab_storage" msgid="1938416135375282333">"檔案和媒體"</string>
     <string name="permgroupdesc_storage" msgid="6351503740613026600">"存取裝置上的相片、媒體和檔案"</string>
     <string name="permgrouplab_microphone" msgid="2480597427667420076">"麥克風"</string>
     <string name="permgroupdesc_microphone" msgid="1047786732792487722">"錄音"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"不明直向紙張"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"不明橫向紙張"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"已取消"</string>
@@ -1852,8 +1864,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="7963058670863485450">"「省電模式」會開啟深色主題背景並限制或關閉背景活動、部分視覺效果,以及「Ok Google」啟動字詞等功能。\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"「省電模式」會開啟深色主題背景並限制或關閉背景活動、部分視覺效果,以及「Ok Google」啟動字詞等功能。"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"「省電模式」會開啟深色主題背景,並限制或關閉背景活動、部分視覺效果和特定功能。\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"「省電模式」會開啟深色主題背景,並限制或關閉背景活動、部分視覺效果和特定功能。"</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>
@@ -2073,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"此通知的重要性已降低為「靜音」。輕按即可提供意見。"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"此通知的重要性已提升。輕按即可提供意見。"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"此通知的重要性已降級。輕按即可提供意見。"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"試用強化通知"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"如要繼續收到建議操作和回覆等內容,請開啟強化通知功能。系統已不再支援 Android 自動調整通知功能。"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"開啟"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"暫時不要"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"瞭解詳情"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"強化通知功能可讀取所有通知內容 (包括聯絡人姓名和訊息等個人資料),以及關閉通知或針對通知中的按鈕採取行動,例如接聽來電。\n\n此功能亦可開啟或關閉「優先」模式及變更相關設定。"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"「日常安排模式」資料通知"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"電量可能會在日常充電前耗盡"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"「省電模式」已啟用,以便延長電池壽命"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 60cfa7e..08071be 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -315,7 +315,7 @@
     <string name="permgroupdesc_storage" msgid="6351503740613026600">"存取裝置中的相片、媒體和檔案"</string>
     <string name="permgrouplab_microphone" msgid="2480597427667420076">"麥克風"</string>
     <string name="permgroupdesc_microphone" msgid="1047786732792487722">"錄音"</string>
-    <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"體能活動記錄"</string>
+    <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"體能活動"</string>
     <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"存取你的體能活動記錄"</string>
     <string name="permgrouplab_camera" msgid="9090413408963547706">"相機"</string>
     <string name="permgroupdesc_camera" msgid="7585150538459320326">"拍照及錄製影片"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"不明縱向紙張"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"不明橫向紙張"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"已取消"</string>
@@ -1852,8 +1864,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="7963058670863485450">"省電模式會開啟深色主題並限制或關閉背景活動、部分視覺效果,以及「Ok Google」啟動字詞等功能\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"省電模式會開啟深色主題並限制或關閉背景活動、部分視覺效果,以及「Ok Google」啟動字詞等功能。"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"省電模式會開啟深色主題,並限制或關閉背景活動、某些視覺效果和特定功能。\n\n"<annotation id="url">"瞭解詳情"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"省電模式會開啟深色主題,並限制或關閉背景活動、某些視覺效果和特定功能。"</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>
@@ -1929,8 +1941,7 @@
     <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>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"接聽"</string>
-    <!-- no translation found for call_notification_answer_video_action (2086030940195382249) -->
-    <skip />
+    <string name="call_notification_answer_video_action" msgid="2086030940195382249">"視訊"</string>
     <string name="call_notification_decline_action" msgid="3700345945214000726">"拒接"</string>
     <string name="call_notification_hang_up_action" msgid="9130720590159188131">"掛斷"</string>
     <string name="call_notification_incoming_text" msgid="6143109825406638201">"來電"</string>
@@ -2074,12 +2085,17 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"這則通知的重要性已降低為「靜音」。輕觸即可提供意見。"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"這則通知的重要性順序已調高。輕觸即可提供意見。"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"這則通知的重要性順序已調降。輕觸即可提供意見。"</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"試試看加強型通知"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"如要繼續收到建議的操作、回覆等內容,請開啟加強型通知功能。系統已不再支援 Android 自動調整通知功能。"</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"開啟"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"暫時不要"</string>
+    <!-- no translation found for nas_upgrade_notification_title (8436359459300146555) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_content (5157550369837103337) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_enable_action (3046406808378726874) -->
+    <skip />
+    <!-- no translation found for nas_upgrade_notification_disable_action (3794833210043497982) -->
+    <skip />
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"瞭解詳情"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"加強型通知功能可讀取所有通知內容,包括聯絡人名稱和訊息內文等個人資訊。這項功能也能關閉通知或操作通知中的按鈕,例如接聽來電。\n\n此外,這項功能還可以開啟或關閉「優先」模式及變更相關設定。"</string>
+    <!-- no translation found for nas_upgrade_notification_learn_more_content (2353549817159426430) -->
+    <skip />
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"日常安排模式資訊通知"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"電池電力可能會在你平常的充電時間前耗盡"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"已啟用省電模式以延長電池續航力"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index e2a52f1..07a597b 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1621,7 +1621,7 @@
     <string name="wireless_display_route_description" msgid="8297563323032966831">"Ukubonisa okungenazintambo"</string>
     <string name="media_route_button_content_description" msgid="2299223698196869956">"Abalingisi"</string>
     <string name="media_route_chooser_title" msgid="6646594924991269208">"Xhuma kudivayisi"</string>
-    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Lingisa isikrini kudivayisi"</string>
+    <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"Sakaza isikrini kudivayisi"</string>
     <string name="media_route_chooser_searching" msgid="6119673534251329535">"Isesha amadivayisi…"</string>
     <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Izilungiselelo"</string>
     <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Nqamula"</string>
@@ -1773,6 +1773,17 @@
     <string name="mediasize_na_monarch" msgid="4396943937986136896">"I-Monarch"</string>
     <string name="mediasize_na_quarto" msgid="2119101847712239885">"I-Quarto"</string>
     <string name="mediasize_na_foolscap" msgid="5011612828564394648">"I-Foolscap"</string>
+    <string name="mediasize_na_ansi_c" msgid="3104916921818289618">"ANSI C"</string>
+    <string name="mediasize_na_ansi_d" msgid="254005964819282724">"ANSI D"</string>
+    <string name="mediasize_na_ansi_e" msgid="4424174989686785675">"ANSI E"</string>
+    <string name="mediasize_na_ansi_f" msgid="146980362213260987">"ANSI F"</string>
+    <string name="mediasize_na_arch_a" msgid="5280681822380032361">"Arch A"</string>
+    <string name="mediasize_na_arch_b" msgid="2113344093437297427">"Arch B"</string>
+    <string name="mediasize_na_arch_c" msgid="971002546186856623">"Arch C"</string>
+    <string name="mediasize_na_arch_d" msgid="6450996075335049806">"Arch D"</string>
+    <string name="mediasize_na_arch_e" msgid="6782708486949266519">"Arch E"</string>
+    <string name="mediasize_na_arch_e1" msgid="4707138568738504275">"Arch E1"</string>
+    <string name="mediasize_na_super_b" msgid="6964127155618393178">"Super-B"</string>
     <string name="mediasize_chinese_roc_8k" msgid="411670106572707544">"I-ROC 8K"</string>
     <string name="mediasize_chinese_roc_16k" msgid="7496706798725321898">"I-ROC 16K"</string>
     <string name="mediasize_chinese_prc_1" msgid="946949835711037253">"I-PRC 1"</string>
@@ -1809,6 +1820,7 @@
     <string name="mediasize_japanese_kahu" msgid="7290232592648122042">"I-Kahu"</string>
     <string name="mediasize_japanese_kaku2" msgid="7477551750461028312">"I-Kaku2"</string>
     <string name="mediasize_japanese_you4" msgid="5552111912684384833">"I-You4"</string>
+    <string name="mediasize_japanese_l" msgid="1326765321473431817">"L"</string>
     <string name="mediasize_unknown_portrait" msgid="3817016220446495613">"Ukuma ngobude obungaziwa"</string>
     <string name="mediasize_unknown_landscape" msgid="1584741567225095325">"Ukwakheka kwezwe okungaziwa"</string>
     <string name="write_fail_reason_cancelled" msgid="2344081488493969190">"Kukhanseliwe"</string>
@@ -1852,8 +1864,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"Kubuyekezwe umlawuli wakho"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"Kususwe umlawuli wakho"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"KULUNGILE"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="7963058670863485450">"Isilondolozi Sebhethri sivula Itimu Emnyama futhi sikhawulele noma sivale umsebenzi wendawo engemuva, izakhi ezithile ezibonakalayo, nezakhi ezinjenge-\"Ok Google\"\n\n"<annotation id="url">"Funda kabanzi"</annotation></string>
-    <string name="battery_saver_description" msgid="7695751399533397741">"Isilondolozi Sebhethri sivula Itimu Emnyama futhi sikhawulele noma sivale umsebenzi wendawo engemuva, izakhi ezithile ezibonakalayo, nezakhi ezinjenge-\"Ok Google\"."</string>
+    <string name="battery_saver_description_with_learn_more" msgid="750683025714899363">"Isilondolozi Sebhethri sivula Itimu emnyama futhi silinganise noma sivale umsebenzi ongemuva, imiphumela ethile yokubuka, nezakhi ezithile.\n\n"<annotation id="url">"Funda kabanzi"</annotation></string>
+    <string name="battery_saver_description" msgid="5693741424234005958">"Isilondolozi Sebhethri sivula itimu emnyama futhi silinganise noma sivale umsebenzi ongemuva, imiphumela ethile yokubuka, nezakhi ezithile."</string>
     <string name="data_saver_description" msgid="4995164271550590517">"Ukusiza ukwehlisa ukusetshenziswa kwedatha, iseva yedatha igwema ezinye izinhlelo zokusebenza ukuthi zithumele noma zamukele idatha ngasemuva. Uhlelo lokusebenza olisebenzisa okwamanje lingafinyelela idatha, kodwa lingenza kanjalo kancane. Lokhu kungachaza, isibonelo, ukuthi izithombe azibonisi uze uzithephe."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Vula iseva yedatha?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Vula"</string>
@@ -2073,12 +2085,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Lesi saziso sehliselwe esikhundleni Sokuthula. Thepha ukuze unikeze impendulo."</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Lesi saziso sibekwe ezingeni eliphakeme. Thepha ukuze unikeze impendulo."</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Lesi saziso sibekwe ezingeni eliphansi. Thepha ukuze unikeze impendulo."</string>
-    <string name="nas_upgrade_notification_title" msgid="4224351129445073051">"Zama izaziso ezigqanyisiwe"</string>
-    <string name="nas_upgrade_notification_content" msgid="7036860187157134706">"Ukuze uqhubeke nokuthola izenzo eziphakanyisiwe, izimpendulo nokuningi, vula izaziso ezigqanyisiwe. Izaziso ze-Androin Ezivumelana Nezimo azisasekelwe."</string>
-    <string name="nas_upgrade_notification_enable_action" msgid="4823652531622744798">"Vula"</string>
-    <string name="nas_upgrade_notification_disable_action" msgid="7561210256700811433">"Hhayi manje"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Izaziso ezigqanyisiwe"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"Izenzo nezimpendulo eziphakanyisiwe manje sezihlinzekwa ngezaziso ezithuthukisiwe. Izaziso ze-Androin Ezivumelana Nezimo azisasekelwe."</string>
+    <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"KULUNGILE"</string>
+    <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Vala"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Funda kabanzi"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="6276343083934111208">"Izaziso ezigqanyisiwe zingafunda konke okuqukethwe yizaziso zakho, kuhlanganise nolwazi lomuntu siqu njengamagama oxhumana nabo nemilayezo. Lesi sakhi singacashisa izaziso noma sithathe izinyathelo ezinkinobheni ezisezazisweni, njengokuphendula amakholi wefoni.\n\nLesi sici singavula noma sivale nemodi Yokubalulekile futhi sishintshe amasethingi ahambisanayo."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="2353549817159426430">"Izaziso ezithuthukisiwe zithathe isikhundla sezaziso eziguqukayo ze-Android ku-Android 12. Lesi sici sikhombisa izenzo eziphakanyisiwe nezimpendulo, futhi sihlela izaziso zakho.\n\nIzaziso ezithuthukisiwe zingafinyelela kokuqukethwe kwesaziso, kuhlanganise nemininingwane yomuntu efana namagama woxhumana nabo nemilayezo. Lesi sakhi singacashisa noma siphendule izaziso, njengokuphendula amakholi efoni nokulawula ukuthi Ungaphazamisi."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Isaziso solwazi lwe-Routine Mode"</string>
     <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Ibhethri lingaphela ngaphambi kokushaja okuvamile"</string>
     <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Isilondolozi sebhethri siyasebenza ngaphandle kwempilo yebhethri"</string>
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 0213c60..36168e7 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -427,4 +427,10 @@
     <!-- Darkest shade of the secondary neutral color used by the system. Black.
      This value can be overlaid at runtime by OverlayManager RROs. -->
     <color name="system_neutral2_1000">#000000</color>
+
+    <!-- Accessibility shortcut icon background color -->
+    <color name="accessibility_feature_background">#5F6368</color> <!-- Google grey 700 -->
+    <color name="accessibility_magnification_background">#F50D60</color>
+    <color name="accessibility_daltonizer_background">#00BCD4</color>
+    <color name="accessibility_color_inversion_background">#546E7A</color>
 </resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index f24d663..fbc9678 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -59,6 +59,7 @@
         <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_no_calling</xliff:g></item>
+        <item><xliff:g id="id">@string/status_bar_call_strength</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_battery</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_sensors_off</xliff:g></item>
     </string-array>
@@ -96,6 +97,7 @@
     <string translatable="false" name="status_bar_camera">camera</string>
     <string translatable="false" name="status_bar_airplane">airplane</string>
     <string translatable="false" name="status_bar_no_calling">no_calling</string>
+    <string translatable="false" name="status_bar_call_strength">call_strength</string>
     <string translatable="false" name="status_bar_sensors_off">sensors_off</string>
     <string translatable="false" name="status_bar_screen_record">screen_record</string>
 
@@ -655,6 +657,12 @@
     <!-- Indicate the display area rect for foldable devices in folded state. -->
     <string name="config_foldedArea"></string>
 
+    <!-- Indicates that the device supports having more than one internal display on at the same
+         time. Only applicable to devices with more than one internal display. If this option is
+         set to false, DisplayManager will make additional effort to ensure no more than 1 internal
+         display is powered on at the same time. -->
+    <bool name="config_supportsConcurrentInternalDisplays">true</bool>
+
     <!-- Desk dock behavior -->
 
     <!-- The number of degrees to rotate the display when the device is in a desk dock.
@@ -1949,6 +1957,8 @@
     <string name="config_systemTelevisionNotificationHandler" translatable="false"></string>
     <!-- The name of the package that will hold the system activity recognizer role. -->
     <string name="config_systemActivityRecognizer" translatable="false"></string>
+    <!-- The name of the package that will hold the system ui role -->
+    <string name="config_systemUi" translatable="false">com.android.systemui</string>
 
     <!-- The name of the package that will be allowed to change its components' label/icon. -->
     <string name="config_overrideComponentUiPackage" translatable="false">com.android.stk</string>
@@ -4850,18 +4860,36 @@
     <!-- Whether app hibernation deletes OAT artifact files as part of global hibernation. -->
     <bool name="config_hibernationDeletesOatArtifactsEnabled">true</bool>
 
-    <!-- On-device intelligent processor for system UI features. -->
+    <!-- Package name of the on-device intelligent processor for system UI
+         features. Examples include the search functionality or the app
+         predictor. -->
     <string name="config_systemUiIntelligence" translatable="false"></string>
-    <!-- On-device intelligent processor for ambient audio. -->
+    <!-- Package name of the on-device intelligent processor for ambient audio.
+         Ambient audio is the sound surrounding the device captured by the DSP
+         or the microphone. In other words, the device is continuously
+         processing audio data in background. -->
     <string name="config_systemAmbientAudioIntelligence" translatable="false"></string>
-    <!-- On-device intelligent processor for audio. -->
+    <!-- Package name of the on-device intelligent processor for audio. The
+         difference of 'ambient audio' and 'audio' is that in 'audio', the
+         user intentionally and consciously aware that the device is recording
+         or using the microphone.
+         -->
     <string name="config_systemAudioIntelligence" translatable="false"></string>
-    <!-- On-device intelligent processor for notification. -->
+    <!-- Package name of the on-device intelligent processor for notification.
+         -->
     <string name="config_systemNotificationIntelligence" translatable="false"></string>
-    <!-- On-device intelligent processor for text. -->
+    <!-- Package name of the on-device intelligent processor for text. Examples
+        include providing autofill functionality based on incoming text
+        messages. -->
     <string name="config_systemTextIntelligence" translatable="false"></string>
-    <!-- On-device intelligent processor for visual features. -->
+    <!-- Package name of the on-device intelligent processor for visual
+         features. Examples include the autorotate feature. -->
     <string name="config_systemVisualIntelligence" translatable="false"></string>
     <!-- On-device package for providing companion device associations. -->
     <string name="config_systemCompanionDeviceProvider" translatable="false"></string>
+
+    <!-- Whether this device is supporting the microphone toggle -->
+    <bool name="config_supportsMicToggle">false</bool>
+    <!-- Whether this device is supporting the camera toggle -->
+    <bool name="config_supportsCamToggle">false</bool>
 </resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 0e436e3..6be6167 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -37,7 +37,7 @@
     <!-- Text size of the message within a toast -->
     <dimen name="toast_text_size">14sp</dimen>
     <!-- Elevation of toast view -->
-    <dimen name="toast_elevation">6dp</dimen>
+    <dimen name="toast_elevation">2dp</dimen>
 
     <!-- Height of the status bar -->
     <dimen name="status_bar_height">@dimen/status_bar_height_portrait</dimen>
@@ -242,6 +242,9 @@
          this = conversation_content_start (80dp) - button inset (4dp) - action padding (12dp) -->
     <dimen name="call_notification_collapsible_indent">64dp</dimen>
 
+    <!-- The minimum width of the system actions added to the CallStyle notifications. -->
+    <dimen name="call_notification_system_action_min_width">100dp</dimen>
+
     <!-- The size of icons for visual actions in the notification_material_action_list -->
     <dimen name="notification_actions_icon_size">56dp</dimen>
 
@@ -364,6 +367,9 @@
     <!-- The spacing between messages in Notification.MessagingStyle -->
     <dimen name="notification_messaging_spacing">6dp</dimen>
 
+    <!-- The spacing between messages in Notification.MessagingStyle -->
+    <dimen name="notification_messaging_spacing_conversation_group">24dp</dimen>
+
     <!-- The rounding for messaging images -->
     <dimen name="messaging_image_rounding">4dp</dimen>
 
@@ -570,6 +576,9 @@
     <!-- Width of the outline stroke used by the accessibility focus rectangle -->
     <dimen name="accessibility_focus_highlight_stroke_width">4dp</dimen>
 
+    <!-- The padding ratio of the Accessibility icon foreground drawable -->
+    <item name="accessibility_icon_foreground_padding_ratio" type="dimen">21.88%</item>
+
     <!-- Margin around the various security views -->
     <dimen name="keyguard_muliuser_selector_margin">8dp</dimen>
 
@@ -757,7 +766,7 @@
     <!-- The maximum size of the grayscale icon -->
     <dimen name="notification_grayscale_icon_max_size">256dp</dimen>
 
-    <dimen name="messaging_avatar_size">36dp</dimen>
+    <dimen name="messaging_avatar_size">48dp</dimen>
     <dimen name="conversation_avatar_size">48dp</dimen>
     <!-- start margin of the icon circle in the conversation's skin of the header -->
     <dimen name="conversation_icon_circle_start">28dp</dimen>
@@ -776,17 +785,17 @@
     <!-- size of the face pile icons -->
     <dimen name="conversation_face_pile_avatar_size">32dp</dimen>
     <!-- size of the face pile icons when the group is expanded -->
-    <dimen name="conversation_face_pile_avatar_size_group_expanded">25dp</dimen>
+    <dimen name="conversation_face_pile_avatar_size_group_expanded">@dimen/conversation_face_pile_avatar_size</dimen>
     <!-- Side margins of the conversation badge in relation to the conversation icon when the group is expanded-->
-    <dimen name="conversation_badge_side_margin_group_expanded">22dp</dimen>
+    <dimen name="conversation_badge_side_margin_group_expanded">@dimen/conversation_badge_side_margin</dimen>
     <!-- Side margins of the conversation badge in relation to the conversation icon when the group is expanded-->
-    <dimen name="conversation_badge_side_margin_group_expanded_face_pile">18dp</dimen>
+    <dimen name="conversation_badge_side_margin_group_expanded_face_pile">@dimen/conversation_badge_side_margin</dimen>
     <!-- The width of the protection of the face pile layout-->
     <dimen name="conversation_face_pile_protection_width">2dp</dimen>
     <!-- The width of the protection of the face pile layout when expanded-->
-    <dimen name="conversation_face_pile_protection_width_expanded">1dp</dimen>
+    <dimen name="conversation_face_pile_protection_width_expanded">@dimen/conversation_face_pile_protection_width</dimen>
     <!-- The padding of the expanded message container-->
-    <dimen name="expanded_group_conversation_message_padding">17dp</dimen>
+    <dimen name="expanded_group_conversation_message_padding">32dp</dimen>
     <!-- The stroke width of the ring used to visually mark a conversation as important -->
     <dimen name="importance_ring_stroke_width">2dp</dimen>
     <!-- The maximum stroke width used for the animation shown when a conversation is marked as important -->
@@ -798,7 +807,7 @@
     <dimen name="conversation_icon_container_top_padding">20dp</dimen>
 
     <!-- The top padding of the conversation icon container when the avatar is small-->
-    <dimen name="conversation_icon_container_top_padding_small_avatar">9dp</dimen>
+    <dimen name="conversation_icon_container_top_padding_small_avatar">8dp</dimen>
 
     <!-- The padding of the conversation header when expanded. This is calculated from the expand button size + notification_content_margin_end -->
     <dimen name="conversation_header_expanded_padding_end">38dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 2a76c57..c716000 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3228,6 +3228,8 @@
     <public name="config_systemActivityRecognizer" />
     <!-- @hide @SystemApi -->
     <public name="config_systemCompanionDeviceProvider"/>
+    <!-- @hide @SystemApi -->
+    <public name="config_systemUi" />
   </staging-public-group>
 
   <staging-public-group type="id" first-id="0x01020055">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 8d07ae2..270b98e 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4778,6 +4778,28 @@
     <string name="mediasize_na_quarto">Quarto</string>
     <!-- North America Foolscap media (paper) size: 8" x 13" (203mm x 330mm) -->
     <string name="mediasize_na_foolscap">Foolscap</string>
+    <!-- North America ANSI C media (paper) size: 17" x 22" (432mm x 559mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_ansi_c">ANSI C</string>
+    <!-- North America ANSI D media (paper) size: 22" x 34" (559mm x 864mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_ansi_d">ANSI D</string>
+    <!-- North America ANSI E media (paper) size: 34" x 44" (864mm x 1118mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_ansi_e">ANSI E</string>
+    <!-- North America ANSI F media (paper) size: 28" x 40" (711mm x 1016mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_ansi_f">ANSI F</string>
+    <!-- North America Arch A media (paper) size: 9" x 12" (229mm x 305mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_arch_a">Arch A</string>
+    <!-- North America Arch B media (paper) size: 12" x 18" (305mm x 457mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_arch_b">Arch B</string>
+    <!-- North America Arch C media (paper) size: 18" x 24" (457mm x 610mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_arch_c">Arch C</string>
+    <!-- North America Arch D media (paper) size: 24" x 36" (610mm x 914mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_arch_d">Arch D</string>
+    <!-- North America Arch E media (paper) size: 36" x 48" (914mm x 1219mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_arch_e">Arch E</string>
+    <!-- North America Arch E1 media (paper) size: 30" x 42" (762mm x 1067mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_arch_e1">Arch E1</string>
+    <!-- North America Super B media (paper) size: 13" x 19" (330mm x 483mm) [CHAR LIMIT=none] -->
+    <string name="mediasize_na_super_b">Super B</string>
 
     <!-- Chinese Roc 8k media (paper) size: 270mm x 390mm (10.629" x 15.3543") -->
     <string name="mediasize_chinese_roc_8k">ROC 8K</string>
@@ -4857,6 +4879,8 @@
     <string name="mediasize_japanese_kaku2">Kaku2</string>
     <!-- Japanese You4 media (paper) size: 105mm x 235mm (4.134" x 9.252") -->
     <string name="mediasize_japanese_you4">You4</string>
+    <!-- Japanese Photo L (paper) size: 89mm x 127mm (3.5 x 5") [CHAR LIMIT=20] -->
+    <string name="mediasize_japanese_l">L</string>
 
     <!-- Media (paper) size for specifying any paper size in portrait.-->
     <string name="mediasize_unknown_portrait">Unknown portrait</string>
@@ -4983,10 +5007,10 @@
     <string name="confirm_battery_saver">OK</string>
 
     <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, with a "learn more" link. -->
-    <string name="battery_saver_description_with_learn_more">Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like \u201cHey Google\u201d\n\n<annotation id="url">Learn more</annotation></string>
+    <string name="battery_saver_description_with_learn_more">Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and certain features.\n\n<annotation id="url">Learn more</annotation></string>
 
     <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, without a "learn more" link. -->
-    <string name="battery_saver_description">Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and features like \u201cHey Google\u201d.</string>
+    <string name="battery_saver_description">Battery Saver turns on Dark theme and limits or turns off background activity, some visual effects, and certain features.</string>
 
     <!-- [CHAR_LIMIT=NONE] Data saver: Feature description -->
     <string name="data_saver_description">To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them.</string>
@@ -5515,19 +5539,19 @@
     <!-- Content description of the demoted feedback icon in the notification. [CHAR LIMIT=NONE] -->
     <string name="notification_feedback_indicator_demoted">This notification was ranked lower. Tap to provide feedback.</string>
 
-    <!-- Notification Intelligence -->
-    <!-- Title of notification indicating notification intelligence settings have changed when upgrading to S [CHAR LIMIT=30] -->
-    <string name="nas_upgrade_notification_title">Try enhanced notifications</string>
+    <!-- Enhanced Notifications -->
+    <!-- Title of notification indicating adaptive notifications setting need migration when upgrading to S [CHAR LIMIT=30] -->
+    <string name="nas_upgrade_notification_title">Enhanced notifications</string>
     <!-- Content of notification indicating users need to update the settings [CHAR LIMIT=NONE] -->
-    <string name="nas_upgrade_notification_content">To keep getting suggested actions, replies, and more, turn on enhanced notifications. Android Adaptive Notifications are no longer supported.</string>
-    <!-- Label of notification action button to turn on the notification intelligence [CHAR LIMIT=20] -->
-    <string name="nas_upgrade_notification_enable_action">Turn on</string>
-    <!-- Label of notification action button to turn off the notification intelligence [CHAR LIMIT=20] -->
-    <string name="nas_upgrade_notification_disable_action">Not now</string>
-    <!-- Label of notification action button to learn more about the notification intelligence settings [CHAR LIMIT=20] -->
+    <string name="nas_upgrade_notification_content">Suggested actions and replies are now provided by enhanced notifications. Android Adaptive Notifications are no longer supported.</string>
+    <!-- Label of notification action button to turn on the enhanced notifications [CHAR LIMIT=20] -->
+    <string name="nas_upgrade_notification_enable_action">OK</string>
+    <!-- Label of notification action button to turn off the enhanced notifications [CHAR LIMIT=20] -->
+    <string name="nas_upgrade_notification_disable_action">Turn off</string>
+    <!-- Label of notification action button to learn more about the enhanced notifications [CHAR LIMIT=20] -->
     <string name="nas_upgrade_notification_learn_more_action">Learn more</string>
-    <!-- Content of notification learn more dialog about the notification intelligence settings [CHAR LIMIT=NONE] -->
-    <string name="nas_upgrade_notification_learn_more_content">Enhanced notifications can read all notification content, including personal information like contact names and messages. This feature can also dismiss notifications or take actions on buttons in notifications, such as answering phone calls.\n\nThis feature can also turn Priority mode on or off and change related settings.</string>
+    <!-- Content of notification learn more dialog about the enhanced notifications [CHAR LIMIT=NONE] -->
+    <string name="nas_upgrade_notification_learn_more_content">Enhanced notifications replaced Android Adaptive Notifications in Android 12. This feature shows suggested actions and replies, and organizes your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls and controlling Do Not Disturb.</string>
 
 
     <!-- Dynamic mode battery saver strings -->
@@ -5982,4 +6006,8 @@
     <string name="view_and_control_notification_title">Check access settings</string>
     <!-- Notification content to prompt the user that some accessibility service has view and control access. [CHAR LIMIT=none] -->
     <string name="view_and_control_notification_content"><xliff:g id="service_name" example="TalkBack">%s</xliff:g> can view and control your screen. Tap to review.</string>
+    <!-- Accessibility message announced when the view text displayed on the screen that has been translated to a different language by the system. [CHAR LIMIT=NONE] -->
+    <string name="ui_translation_accessibility_translated_text"><xliff:g id="message" example="Hello">%1$s</xliff:g> Translated.</string>
+    <!-- Accessibility message announced to notify the user when the system has finished translating the content displayed on the screen to a different language after the user requested translation. [CHAR LIMIT=NONE] -->
+    <string name="ui_translation_accessibility_translation_finished">Message translated from <xliff:g id="from_language" example="English">%1$s</xliff:g> to <xliff:g id="to_language" example="French">%2$s</xliff:g>.</string>
 </resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index fbf67e0..bac9cf2 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -964,7 +964,7 @@
     </style>
 
     <style name="TextAppearance.Toast">
-        <item name="fontFamily">@*android:string/config_headlineFontFamily</item>
+        <item name="fontFamily">@*android:string/config_bodyFontFamily</item>
         <item name="textSize">14sp</item>
         <item name="textColor">?android:attr/textColorPrimary</item>
     </style>
diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml
index 439ae48..ad0d0e0 100644
--- a/core/res/res/values/styles_device_defaults.xml
+++ b/core/res/res/values/styles_device_defaults.xml
@@ -302,10 +302,6 @@
     <style name="TextAppearance.DeviceDefault.Notification.Time" parent="TextAppearance.Material.Notification.Time">
         <item name="fontFamily">@string/config_bodyFontFamily</item>
     </style>
-    <style name="TextAppearance.DeviceDefault.Notification.Conversation.AppName"
-           parent="TextAppearance.Material.Notification.Conversation.AppName">
-        <item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
-    </style>
     <style name="TextAppearance.DeviceDefault.Widget" parent="TextAppearance.Material.Widget">
         <item name="fontFamily">@string/config_bodyFontFamily</item>
     </style>
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index 3c4a5d4..eec6ae3 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -497,10 +497,6 @@
     <!-- unused; keep identical to parent -->
     <style name="TextAppearance.Material.Notification.Emphasis"/>
 
-    <style name="TextAppearance.Material.Notification.Conversation.AppName" parent="TextAppearance.Material.Notification.Title">
-        <item name="android:textSize">16sp</item>
-    </style>
-
     <style name="TextAppearance.Material.ListItem" parent="TextAppearance.Material.Subhead" />
     <style name="TextAppearance.Material.ListItemSecondary" parent="TextAppearance.Material.Body1" />
 
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 5715fab..a8d29d4 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1150,6 +1150,17 @@
   <java-symbol type="string" name="mediasize_na_monarch" />
   <java-symbol type="string" name="mediasize_na_quarto" />
   <java-symbol type="string" name="mediasize_na_foolscap" />
+  <java-symbol type="string" name="mediasize_na_ansi_c" />
+  <java-symbol type="string" name="mediasize_na_ansi_d" />
+  <java-symbol type="string" name="mediasize_na_ansi_e" />
+  <java-symbol type="string" name="mediasize_na_ansi_f" />
+  <java-symbol type="string" name="mediasize_na_arch_a" />
+  <java-symbol type="string" name="mediasize_na_arch_b" />
+  <java-symbol type="string" name="mediasize_na_arch_c" />
+  <java-symbol type="string" name="mediasize_na_arch_d" />
+  <java-symbol type="string" name="mediasize_na_arch_e" />
+  <java-symbol type="string" name="mediasize_na_arch_e1" />
+  <java-symbol type="string" name="mediasize_na_super_b" />
   <java-symbol type="string" name="mediasize_chinese_roc_8k" />
   <java-symbol type="string" name="mediasize_chinese_roc_16k" />
   <java-symbol type="string" name="mediasize_chinese_prc_1" />
@@ -1186,6 +1197,7 @@
   <java-symbol type="string" name="mediasize_japanese_kahu" />
   <java-symbol type="string" name="mediasize_japanese_kaku2" />
   <java-symbol type="string" name="mediasize_japanese_you4" />
+  <java-symbol type="string" name="mediasize_japanese_l" />
   <java-symbol type="string" name="network_partial_connectivity" />
   <java-symbol type="string" name="network_partial_connectivity_detailed" />
   <java-symbol type="string" name="reason_service_unavailable" />
@@ -2979,6 +2991,7 @@
   <java-symbol type="string" name="status_bar_clock" />
   <java-symbol type="string" name="status_bar_airplane" />
   <java-symbol type="string" name="status_bar_no_calling" />
+  <java-symbol type="string" name="status_bar_call_strength" />
   <java-symbol type="string" name="status_bar_mobile" />
   <java-symbol type="string" name="status_bar_ethernet" />
   <java-symbol type="string" name="status_bar_vpn" />
@@ -3070,6 +3083,7 @@
   <java-symbol type="string" name="negative_duration" />
 
   <java-symbol type="dimen" name="notification_messaging_spacing" />
+  <java-symbol type="dimen" name="notification_messaging_spacing_conversation_group" />
 
   <java-symbol type="dimen" name="notification_text_margin_top" />
   <java-symbol type="dimen" name="notification_inbox_item_top_padding" />
@@ -3126,6 +3140,7 @@
   <java-symbol type="color" name="call_notification_decline_color"/>
   <java-symbol type="color" name="call_notification_answer_color"/>
   <java-symbol type="dimen" name="call_notification_collapsible_indent"/>
+  <java-symbol type="dimen" name="call_notification_system_action_min_width"/>
   <java-symbol type="drawable" name="ic_call_answer" />
   <java-symbol type="drawable" name="ic_call_answer_video" />
   <java-symbol type="drawable" name="ic_call_decline" />
@@ -3389,6 +3404,7 @@
   <java-symbol type="drawable" name="ic_accessibility_color_inversion" />
   <java-symbol type="drawable" name="ic_accessibility_color_correction" />
   <java-symbol type="drawable" name="ic_accessibility_magnification" />
+  <java-symbol type="drawable" name="ic_accessibility_reduce_bright_colors" />
 
   <java-symbol type="string" name="reduce_bright_colors_feature_name" />
 
@@ -3786,6 +3802,7 @@
   <!-- For Foldables -->
   <java-symbol type="array" name="config_foldedDeviceStates" />
   <java-symbol type="string" name="config_foldedArea" />
+  <java-symbol type="bool" name="config_supportsConcurrentInternalDisplays" />
 
   <java-symbol type="array" name="config_disableApksUnlessMatchedSku_apk_list" />
   <java-symbol type="array" name="config_disableApkUnlessMatchedSku_skus_list" />
@@ -4075,7 +4092,6 @@
   <java-symbol type="dimen" name="button_inset_horizontal_material" />
   <java-symbol type="layout" name="conversation_face_pile_layout" />
   <java-symbol type="string" name="unread_convo_overflow" />
-  <java-symbol type="style" name="TextAppearance.DeviceDefault.Notification.Conversation.AppName" />
   <java-symbol type="drawable" name="conversation_badge_background" />
   <java-symbol type="drawable" name="conversation_badge_ring" />
   <java-symbol type="color" name="conversation_important_highlight" />
@@ -4341,6 +4357,12 @@
   <java-symbol type="drawable" name="ic_accessibility_24dp" />
   <java-symbol type="string" name="view_and_control_notification_title" />
   <java-symbol type="string" name="view_and_control_notification_content" />
+  <!-- Translation -->
+  <java-symbol type="string" name="ui_translation_accessibility_translated_text" />
+  <java-symbol type="string" name="ui_translation_accessibility_translation_finished" />
 
   <java-symbol type="layout" name="notification_expand_button"/>
+
+  <java-symbol type="bool" name="config_supportsMicToggle" />
+  <java-symbol type="bool" name="config_supportsCamToggle" />
 </resources>
diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index d5733e3..2650d9f 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -40,7 +40,7 @@
     <shortcode country="al" pattern="\\d{5}" premium="15191|55[56]00" />
 
     <!-- Argentina: 5 digits, known short codes listed -->
-    <shortcode country="ar" pattern="\\d{5}" free="11711|28291" />
+    <shortcode country="ar" pattern="\\d{5}" free="11711|28291|44077" />
 
     <!-- Armenia: 3-4 digits, emergency numbers 10[123] -->
     <shortcode country="am" pattern="\\d{3,4}" premium="11[2456]1|3024" free="10[123]" />
@@ -76,14 +76,14 @@
     <shortcode country="ch" pattern="[2-9]\\d{2,4}" premium="543|83111|30118" free="98765|30075|30047" />
 
     <!-- Chile: 4-5 digits (not confirmed), known premium codes listed -->
-    <shortcode country="cl" pattern="\\d{4,5}" free="9963|9240" />
+    <shortcode country="cl" pattern="\\d{4,5}" free="9963|9240|1038" />
 
     <!-- China: premium shortcodes start with "1066", free shortcodes start with "1065":
          http://clients.txtnation.com/entries/197192-china-premium-sms-short-code-requirements -->
     <shortcode country="cn" premium="1066.*" free="1065.*" />
 
     <!-- Colombia: 1-6 digits (not confirmed) -->
-    <shortcode country="co" pattern="\\d{1,6}" free="890350|908160|892255|898002|898880|899960" />
+    <shortcode country="co" pattern="\\d{1,6}" free="890350|908160|892255|898002|898880|899960|899948|87739" />
 
     <!-- Cyprus: 4-6 digits (not confirmed), known premium codes listed, plus EU -->
     <shortcode country="cy" pattern="\\d{4,6}" premium="7510" free="116\\d{3}" />
@@ -156,7 +156,7 @@
     <shortcode country="jp" pattern="\\d{1,5}" free="8083" />
 
     <!-- Kenya: 5 digits, known premium codes listed -->
-    <shortcode country="ke" pattern="\\d{5}" free="21725" />
+    <shortcode country="ke" pattern="\\d{5}" free="21725|21562|40520" />
 
     <!-- Kyrgyzstan: 4 digits, known premium codes listed -->
     <shortcode country="kg" pattern="\\d{4}" premium="415[2367]|444[69]" />
@@ -187,13 +187,13 @@
     <shortcode country="mx" pattern="\\d{4,5}" premium="53035|7766" free="26259|46645|50025|50052|5050|76551|88778|9963" />
 
     <!-- Malaysia: 5 digits: http://www.skmm.gov.my/attachment/Consumer_Regulation/Mobile_Content_Services_FAQs.pdf -->
-    <shortcode country="my" pattern="\\d{5}" premium="32298|33776" free="22099|28288" />
+    <shortcode country="my" pattern="\\d{5}" premium="32298|33776" free="22099|28288|66668" />
 
     <!-- The Netherlands, 4 digits, known premium codes listed, plus EU -->
     <shortcode country="nl" pattern="\\d{4}" premium="4466|5040" free="116\\d{3}|2223|6225|2223|1662" />
 
     <!-- Nigeria -->
-    <shortcode country="ng" pattern="\\d{1,5}" free="2441" />
+    <shortcode country="ng" pattern="\\d{1,5}" free="2441|55019" />
 
     <!-- Norway: 4-5 digits (not confirmed), known premium codes listed -->
     <shortcode country="no" pattern="\\d{4,5}" premium="2201|222[67]" free="2171" />
@@ -202,7 +202,7 @@
     <shortcode country="nz" pattern="\\d{3,4}" premium="3903|8995|4679" free="1737|176|2141|3067|3068|3110|4006|4053|4061|4062|4202|4300|4334|4412|4575|5626|8006|8681" />
 
     <!-- Peru: 4-5 digits (not confirmed), known premium codes listed -->
-    <shortcode country="pe" pattern="\\d{4,5}" free="9963" />
+    <shortcode country="pe" pattern="\\d{4,5}" free="9963|40777" />
 
     <!-- Philippines -->
     <shortcode country="ph" pattern="\\d{1,5}" free="2147|5495|5496" />
@@ -224,7 +224,7 @@
     <shortcode country="re" pattern="\\d{1,5}" free="38600,36300,36303,959" />
 
     <!-- Romania: 4 digits, plus EU: http://www.simplus.ro/en/resources/glossary-of-terms/ -->
-    <shortcode country="ro" pattern="\\d{4}" premium="12(?:63|66|88)|13(?:14|80)" free="116\\d{3}|3654|8360" />
+    <shortcode country="ro" pattern="\\d{4}" premium="12(?:63|66|88)|13(?:14|80)" free="116\\d{3}|3654|8360|3838" />
 
     <!-- Russia: 4 digits, known premium codes listed: http://smscoin.net/info/pricing-russia/ -->
     <shortcode country="ru" pattern="\\d{4}" premium="1(?:1[56]1|899)|2(?:09[57]|322|47[46]|880|990)|3[589]33|4161|44(?:4[3-9]|81)|77(?:33|81)|8424" free="6954|8501" standard="2037|2044"/>
@@ -252,7 +252,7 @@
     <shortcode country="tj" pattern="\\d{4}" premium="11[3-7]1|4161|4333|444[689]" />
 
     <!-- Turkey -->
-    <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493" />
+    <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493|3193" />
 
     <!-- Ukraine: 4 digits, known premium codes listed -->
     <shortcode country="ua" pattern="\\d{4}" premium="444[3-9]|70[579]4|7540" />
@@ -268,6 +268,6 @@
     <shortcode country="yt" pattern="\\d{1,5}" free="38600,36300,36303,959" />
 
     <!-- South Africa -->
-    <shortcode country="za" pattern="\d{1,5}" free="44136" />
+    <shortcode country="za" pattern="\d{1,5}" free="44136|30791|36056" />
 
 </shortcodes>
diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
index 0f3bb1d..81ec3f3 100644
--- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
@@ -58,11 +58,8 @@
 
             for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT;
                     component++) {
-                totalPowerPerComponentMah[component] += uidBatteryConsumer.getConsumedPower(
-                        component);
-            }
-
-            for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT; component++) {
+                totalPowerPerComponentMah[component] +=
+                        uidBatteryConsumer.getConsumedPower(component);
                 totalDurationPerComponentMs[component] +=
                         uidBatteryConsumer.getUsageDurationMillis(component);
             }
@@ -76,18 +73,15 @@
             addMetric(getPowerMetricName(component), MetricKind.POWER,
                     selectedBatteryConsumer.getConsumedPower(component),
                     totalPowerPerComponentMah[component]);
-        }
-
-        for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT; component++) {
-            addMetric(getTimeMetricName(component), MetricKind.DURATION,
+            addMetric(getDurationMetricName(component), MetricKind.DURATION,
                     selectedBatteryConsumer.getUsageDurationMillis(component),
                     totalDurationPerComponentMs[component]);
         }
     }
 
-    static String getTimeMetricName(int componentId) {
-        return "TIME_" + DebugUtils.constantToString(BatteryConsumer.class,
-                "TIME_COMPONENT_", componentId);
+    static String getDurationMetricName(int componentId) {
+        return "DURATION_" + DebugUtils.constantToString(BatteryConsumer.class,
+                "POWER_COMPONENT_", componentId);
     }
 
     static String getPowerMetricName(int componentId) {
diff --git a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
index 5b5da60..6fc10dd 100644
--- a/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
@@ -306,8 +306,8 @@
         return null;
     }
 
-    public PowerMetrics.Metric getTimeMetric(@BatteryConsumer.TimeComponent int component) {
-        final String name = PowerMetrics.getTimeMetricName(component);
+    public PowerMetrics.Metric getTimeMetric(@BatteryConsumer.PowerComponent int component) {
+        final String name = PowerMetrics.getDurationMetricName(component);
         for (PowerMetrics.Metric metric : mPowerMetricsDelta) {
             if (metric.metricName.equals(name)) {
                 return metric;
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/Android.bp b/core/tests/batterystatstests/BatteryStatsViewer/Android.bp
index c2e7d81..abac56b 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/Android.bp
+++ b/core/tests/batterystatstests/BatteryStatsViewer/Android.bp
@@ -7,7 +7,7 @@
     default_applicable_licenses: ["frameworks_base_license"],
 }
 
-android_test {
+android_app {
     name: "BatteryStatsViewer",
     srcs: ["src/**/*.java"],
     defaults: ["SettingsLibDefaults"],
@@ -19,4 +19,6 @@
     ],
     platform_apis: true,
     certificate: "platform",
+    system_ext_specific: true,
+    owner: "google",
 }
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
index edb1b10..1b1f64a 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
@@ -25,8 +25,9 @@
     <application
         android:theme="@style/Theme"
         android:label="Battery Stats Viewer">
-        <activity android:name=".BatteryStatsViewerActivity"
-                  android:label="Battery Stats Viewer"
+        <activity android:name=".BatteryConsumerPickerActivity"
+                  android:label="Battery Stats"
+                  android:icon="@mipmap/ic_launcher"
                   android:launchMode="singleTop"
                   android:exported="true">
             <intent-filter>
@@ -35,7 +36,8 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".BatteryConsumerPickerActivity"
-                  android:label="Select a battery consumer"/>
+        <activity android:name=".BatteryStatsViewerActivity"
+                  android:label="Battery Stats"
+                  android:parentActivityName=".BatteryConsumerPickerActivity"/>
     </application>
 </manifest>
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_background.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path
+        android:fillColor="#3DDC84"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+</vector>
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_foreground.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..fc0c6ab
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,42 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path
+        android:fillType="evenOdd"
+        android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,
+        49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="78.5885"
+                android:endY="90.9159"
+                android:startX="48.7653"
+                android:startY="61.0927"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,
+        50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,
+        37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,
+        42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,
+        40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,
+        52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,
+        56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,
+        52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher.xml
new file mode 100644
index 0000000..6b78462
--- /dev/null
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/mipmap-anydpi/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
index f7d7098..a15a8d8 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
@@ -68,7 +68,7 @@
         double[] totalPowerByComponentMah = new double[BatteryConsumer.POWER_COMPONENT_COUNT];
         double[] totalModeledPowerByComponentMah =
                 new double[BatteryConsumer.POWER_COMPONENT_COUNT];
-        long[] totalDurationByComponentMs = new long[BatteryConsumer.TIME_COMPONENT_COUNT];
+        long[] totalDurationByComponentMs = new long[BatteryConsumer.POWER_COMPONENT_COUNT];
         final int customComponentCount =
                 requestedBatteryConsumer.getCustomPowerComponentCount();
         double[] totalCustomPowerByComponentMah = new double[customComponentCount];
@@ -108,7 +108,7 @@
                     mBatteryConsumerInfo.isSystemBatteryConsumer);
         }
 
-        for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT; component++) {
+        for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT; component++) {
             final String metricTitle = getTimeMetricTitle(component);
             addEntry(metricTitle, EntryType.DURATION,
                     requestedBatteryConsumer.getUsageDurationMillis(component),
@@ -141,7 +141,7 @@
 
     static String getTimeMetricTitle(int componentId) {
         final String componentName = DebugUtils.constantToString(BatteryConsumer.class,
-                "TIME_COMPONENT_", componentId);
+                "POWER_COMPONENT_", componentId);
         return componentName.charAt(0) + componentName.substring(1).toLowerCase().replace('_', ' ')
                 + " time";
     }
@@ -159,7 +159,7 @@
     private void computeTotalDuration(BatteryUsageStats batteryUsageStats,
             long[] durationByComponentMs) {
         for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
-            for (int component = 0; component < BatteryConsumer.TIME_COMPONENT_COUNT;
+            for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT;
                     component++) {
                 durationByComponentMs[component] += consumer.getUsageDurationMillis(component);
             }
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java
index 2db848b..63a15d6 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java
@@ -20,9 +20,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 
-import androidx.activity.result.contract.ActivityResultContract;
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentStatePagerAdapter;
@@ -32,31 +30,14 @@
 
 /**
  * Picker, showing a sorted lists of applications and other types of entities consuming power.
- * Returns the selected entity ID or null.
+ * Opens BatteryStatsViewerActivity upon item selection.
  */
 public class BatteryConsumerPickerActivity extends FragmentActivity {
-
-    public static final ActivityResultContract<Void, String> CONTRACT =
-            new ActivityResultContract<Void, String>() {
-                @NonNull
-                @Override
-                public Intent createIntent(@NonNull Context context, Void aVoid) {
-                    return new Intent(context, BatteryConsumerPickerActivity.class);
-                }
-
-                @Override
-                public String parseResult(int resultCode, @Nullable Intent intent) {
-                    if (resultCode != RESULT_OK || intent == null) {
-                        return null;
-                    }
-                    return intent.getStringExtra(Intent.EXTRA_RETURN_RESULT);
-                }
-            };
+    private static final String PREF_SELECTED_BATTERY_CONSUMER = "batteryConsumerId";
 
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        getActionBar().setDisplayHomeAsUpEnabled(true);
 
         setContentView(R.layout.battery_consumer_picker_activity_layout);
 
@@ -99,18 +80,25 @@
         viewPager.setAdapter(adapter);
         TabLayout tabLayout = findViewById(R.id.tab_layout);
         tabLayout.setupWithViewPager(viewPager);
+        if (icicle == null) {
+            final String batteryConsumerId = getPreferences(Context.MODE_PRIVATE)
+                    .getString(PREF_SELECTED_BATTERY_CONSUMER, null);
+            if (batteryConsumerId != null) {
+                startBatteryStatsActivity(batteryConsumerId);
+            }
+        }
     }
 
     public void setSelectedBatteryConsumer(String batteryConsumerId) {
-        Intent intent = new Intent();
-        intent.putExtra(Intent.EXTRA_RETURN_RESULT, batteryConsumerId);
-        setResult(RESULT_OK, intent);
-        finish();
+        getPreferences(Context.MODE_PRIVATE).edit()
+                .putString(PREF_SELECTED_BATTERY_CONSUMER, batteryConsumerId)
+                .apply();
+        startBatteryStatsActivity(batteryConsumerId);
     }
 
-    @Override
-    public boolean onNavigateUp() {
-        onBackPressed();
-        return true;
+    private void startBatteryStatsActivity(String batteryConsumerId) {
+        final Intent intent = new Intent(this, BatteryStatsViewerActivity.class)
+                .putExtra(BatteryStatsViewerActivity.EXTRA_BATTERY_CONSUMER, batteryConsumerId);
+        startActivity(intent);
     }
 }
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java
index 74d3fb3..03dde04 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java
@@ -17,7 +17,6 @@
 package com.android.frameworks.core.batterystatsviewer;
 
 import android.content.Context;
-import android.content.SharedPreferences;
 import android.os.BatteryStatsManager;
 import android.os.BatteryUsageStats;
 import android.os.BatteryUsageStatsQuery;
@@ -27,9 +26,9 @@
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import androidx.activity.ComponentActivity;
-import androidx.activity.result.ActivityResultLauncher;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.loader.app.LoaderManager;
@@ -45,14 +44,14 @@
 import java.util.Locale;
 
 public class BatteryStatsViewerActivity extends ComponentActivity {
+    public static final String EXTRA_BATTERY_CONSUMER = "batteryConsumerId";
+
     private static final int BATTERY_STATS_REFRESH_RATE_MILLIS = 60 * 1000;
     private static final int MILLIS_IN_MINUTE = 60000;
-    private static final String PREF_SELECTED_BATTERY_CONSUMER = "batteryConsumerId";
     private static final int LOADER_BATTERY_USAGE_STATS = 1;
 
     private BatteryStatsDataAdapter mBatteryStatsDataAdapter;
     private final Runnable mBatteryStatsRefresh = this::periodicBatteryStatsRefresh;
-    private SharedPreferences mSharedPref;
     private String mBatteryConsumerId;
     private TextView mTitleView;
     private TextView mDetailsView;
@@ -62,21 +61,16 @@
     private RecyclerView mBatteryConsumerDataView;
     private View mLoadingView;
     private View mEmptyView;
-    private final ActivityResultLauncher<Void> mStartAppPicker = registerForActivityResult(
-            BatteryConsumerPickerActivity.CONTRACT, this::onApplicationSelected);
     private List<BatteryUsageStats> mBatteryUsageStats;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        mSharedPref = getPreferences(Context.MODE_PRIVATE);
+        mBatteryConsumerId = getIntent().getStringExtra(EXTRA_BATTERY_CONSUMER);
 
         setContentView(R.layout.battery_stats_viewer_layout);
 
-        View appCard = findViewById(R.id.app_card);
-        appCard.setOnClickListener((e) -> startAppPicker());
-
         mTitleView = findViewById(android.R.id.title);
         mDetailsView = findViewById(R.id.details);
         mIconView = findViewById(android.R.id.icon);
@@ -91,11 +85,7 @@
         mLoadingView = findViewById(R.id.loading_view);
         mEmptyView = findViewById(R.id.empty_view);
 
-        mBatteryConsumerId = mSharedPref.getString(PREF_SELECTED_BATTERY_CONSUMER, null);
         loadBatteryStats();
-        if (mBatteryConsumerId == null) {
-            startAppPicker();
-        }
     }
 
     @Override
@@ -110,25 +100,6 @@
         getMainThreadHandler().removeCallbacks(mBatteryStatsRefresh);
     }
 
-    private void startAppPicker() {
-        mStartAppPicker.launch(null);
-    }
-
-    private void onApplicationSelected(String batteryConsumerId) {
-        if (batteryConsumerId == null) {
-            if (mBatteryConsumerId == null) {
-                finish();
-            }
-        } else {
-            mBatteryConsumerId = batteryConsumerId;
-            mSharedPref.edit()
-                    .putString(PREF_SELECTED_BATTERY_CONSUMER, mBatteryConsumerId)
-                    .apply();
-            mLoadingView.setVisibility(View.VISIBLE);
-            loadBatteryStats();
-        }
-    }
-
     private void periodicBatteryStatsRefresh() {
         loadBatteryStats();
         getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
@@ -200,9 +171,10 @@
         BatteryConsumerInfoHelper.BatteryConsumerInfo
                 batteryConsumerInfo = batteryConsumerData.getBatteryConsumerInfo();
         if (batteryConsumerInfo == null) {
-            mTitleView.setText("Battery consumer not found");
-            mPackagesView.setVisibility(View.GONE);
-            mHeadingsView.setVisibility(View.GONE);
+            Toast.makeText(this, "Battery consumer not found: " + mBatteryConsumerId,
+                    Toast.LENGTH_SHORT).show();
+            finish();
+            return;
         } else {
             mTitleView.setText(batteryConsumerInfo.label);
             if (batteryConsumerInfo.details != null) {
diff --git a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java
index 3ebe103..0299832 100644
--- a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java
+++ b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java
@@ -91,7 +91,7 @@
     public void timeMigrateTun(int reps) {
         for (int i = 0; i < reps; i++) {
             NetworkStats stats = mNetworkStats.clone();
-            stats.migrateTun(TUN_UID, TUN_IFACE, getVpnUnderlyingIfaces());
+            stats.migrateTun(TUN_UID, TUN_IFACE, Arrays.asList(getVpnUnderlyingIfaces()));
         }
     }
 
diff --git a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
index b2b9ab3..c9a18da 100644
--- a/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
+++ b/core/tests/coretests/src/android/app/admin/PasswordMetricsTest.java
@@ -30,6 +30,7 @@
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
+import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PIN;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -284,33 +285,42 @@
         PasswordMetrics none = new PasswordMetrics(CREDENTIAL_TYPE_NONE);
         PasswordMetrics pattern = new PasswordMetrics(CREDENTIAL_TYPE_PATTERN);
         PasswordMetrics password = new PasswordMetrics(CREDENTIAL_TYPE_PASSWORD);
+        PasswordMetrics pin = new PasswordMetrics(CREDENTIAL_TYPE_PIN);
 
         // To pass minimal length check.
         password.length = 4;
+        pin.length = 4;
 
         // No errors expected, credential is of stronger or equal type.
         assertValidationErrors(
-                validatePasswordMetrics(none, PASSWORD_COMPLEXITY_NONE, false, none));
+                validatePasswordMetrics(none, PASSWORD_COMPLEXITY_NONE, none));
         assertValidationErrors(
-                validatePasswordMetrics(none, PASSWORD_COMPLEXITY_NONE, false, pattern));
+                validatePasswordMetrics(none, PASSWORD_COMPLEXITY_NONE, pattern));
         assertValidationErrors(
-                validatePasswordMetrics(none, PASSWORD_COMPLEXITY_NONE, false, password));
+                validatePasswordMetrics(none, PASSWORD_COMPLEXITY_NONE, password));
         assertValidationErrors(
-                validatePasswordMetrics(pattern, PASSWORD_COMPLEXITY_NONE, false, pattern));
+                validatePasswordMetrics(none, PASSWORD_COMPLEXITY_NONE, pin));
         assertValidationErrors(
-                validatePasswordMetrics(pattern, PASSWORD_COMPLEXITY_NONE, false, password));
+                validatePasswordMetrics(pattern, PASSWORD_COMPLEXITY_NONE, pattern));
         assertValidationErrors(
-                validatePasswordMetrics(password, PASSWORD_COMPLEXITY_NONE, false, password));
+                validatePasswordMetrics(pattern, PASSWORD_COMPLEXITY_NONE, password));
+        assertValidationErrors(
+                validatePasswordMetrics(password, PASSWORD_COMPLEXITY_NONE, password));
+        assertValidationErrors(
+                validatePasswordMetrics(pin, PASSWORD_COMPLEXITY_NONE, pin));
 
         // Now actual credential type is weaker than required:
         assertValidationErrors(
-                validatePasswordMetrics(pattern, PASSWORD_COMPLEXITY_NONE, false, none),
+                validatePasswordMetrics(pattern, PASSWORD_COMPLEXITY_NONE, none),
                 PasswordValidationError.WEAK_CREDENTIAL_TYPE, 0);
         assertValidationErrors(
-                validatePasswordMetrics(password, PASSWORD_COMPLEXITY_NONE, false, none),
+                validatePasswordMetrics(password, PASSWORD_COMPLEXITY_NONE, none),
                 PasswordValidationError.WEAK_CREDENTIAL_TYPE, 0);
         assertValidationErrors(
-                validatePasswordMetrics(password, PASSWORD_COMPLEXITY_NONE, false, pattern),
+                validatePasswordMetrics(password, PASSWORD_COMPLEXITY_NONE, pattern),
+                PasswordValidationError.WEAK_CREDENTIAL_TYPE, 0);
+        assertValidationErrors(
+                validatePasswordMetrics(password, PASSWORD_COMPLEXITY_NONE, pin),
                 PasswordValidationError.WEAK_CREDENTIAL_TYPE, 0);
     }
 
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/AppSearchEmailTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/AppSearchEmailTest.java
index ed53d5f..3989ec7 100644
--- a/core/tests/coretests/src/android/app/appsearch/external/app/AppSearchEmailTest.java
+++ b/core/tests/coretests/src/android/app/appsearch/external/app/AppSearchEmailTest.java
@@ -25,7 +25,7 @@
     @Test
     public void testBuildEmailAndGetValue() {
         AppSearchEmail email =
-                new AppSearchEmail.Builder("namespace", "uri")
+                new AppSearchEmail.Builder("namespace", "id")
                         .setFrom("FakeFromAddress")
                         .setCc("CC1", "CC2")
                         // Score and Property are mixed into the middle to make sure
@@ -38,7 +38,7 @@
                         .build();
 
         assertThat(email.getNamespace()).isEqualTo("namespace");
-        assertThat(email.getUri()).isEqualTo("uri");
+        assertThat(email.getId()).isEqualTo("id");
         assertThat(email.getFrom()).isEqualTo("FakeFromAddress");
         assertThat(email.getTo()).isNull();
         assertThat(email.getCc()).asList().containsExactly("CC1", "CC2");
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java
index b884ddc..6884f13d 100644
--- a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java
+++ b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java
@@ -27,13 +27,13 @@
     @Test
     public void testRecreateFromParcel() {
         GenericDocument inDoc =
-                new GenericDocument.Builder<>("namespace", "uri1", "schema1")
+                new GenericDocument.Builder<>("namespace", "id1", "schema1")
                         .setScore(42)
                         .setPropertyString("propString", "Hello")
                         .setPropertyBytes("propBytes", new byte[][] {{1, 2}})
                         .setPropertyDocument(
                                 "propDocument",
-                                new GenericDocument.Builder<>("namespace", "uri2", "schema2")
+                                new GenericDocument.Builder<>("namespace", "id2", "schema2")
                                         .setPropertyString("propString", "Goodbye")
                                         .setPropertyBytes("propBytes", new byte[][] {{3, 4}})
                                         .build())
diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java
index 7637214..a1f7986 100644
--- a/core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java
+++ b/core/tests/coretests/src/android/app/appsearch/external/app/PutDocumentsRequestTest.java
@@ -36,7 +36,7 @@
         PutDocumentsRequest request =
                 new PutDocumentsRequest.Builder().addGenericDocuments(emails).build();
 
-        assertThat(request.getGenericDocuments().get(0).getUri()).isEqualTo("test1");
-        assertThat(request.getGenericDocuments().get(1).getUri()).isEqualTo("test2");
+        assertThat(request.getGenericDocuments().get(0).getId()).isEqualTo("test1");
+        assertThat(request.getGenericDocuments().get(1).getId()).isEqualTo("test2");
     }
 }
diff --git a/core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java b/core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java
index 36da927..3e2c4e9 100644
--- a/core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java
+++ b/core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java
@@ -234,6 +234,7 @@
                 .setIsImportantConversation(true)
                 .setStatuses(statusList).setNotificationKey("key")
                 .setNotificationContent("content")
+                .setNotificationSender("sender")
                 .setNotificationDataUri(Uri.parse("data"))
                 .setMessagesCount(2)
                 .setIntent(new Intent())
@@ -256,6 +257,7 @@
         assertThat(readTile.getStatuses()).isEqualTo(tile.getStatuses());
         assertThat(readTile.getNotificationKey()).isEqualTo(tile.getNotificationKey());
         assertThat(readTile.getNotificationContent()).isEqualTo(tile.getNotificationContent());
+        assertThat(readTile.getNotificationSender()).isEqualTo(tile.getNotificationSender());
         assertThat(readTile.getNotificationDataUri()).isEqualTo(tile.getNotificationDataUri());
         assertThat(readTile.getMessagesCount()).isEqualTo(tile.getMessagesCount());
         assertThat(readTile.getIntent().toString()).isEqualTo(tile.getIntent().toString());
@@ -282,6 +284,16 @@
     }
 
     @Test
+    public void testNotificationSender() {
+        PeopleSpaceTile tile = new PeopleSpaceTile
+                .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps)
+                .setNotificationSender("test")
+                .build();
+
+        assertThat(tile.getNotificationSender()).isEqualTo("test");
+    }
+
+    @Test
     public void testNotificationDataUri() {
         PeopleSpaceTile tile =
                 new PeopleSpaceTile.Builder(new ShortcutInfo.Builder(mContext, "123").build(),
diff --git a/core/tests/coretests/src/android/app/time/TimeZoneConfigurationTest.java b/core/tests/coretests/src/android/app/time/TimeZoneConfigurationTest.java
index 3948eb8..17d2492 100644
--- a/core/tests/coretests/src/android/app/time/TimeZoneConfigurationTest.java
+++ b/core/tests/coretests/src/android/app/time/TimeZoneConfigurationTest.java
@@ -16,11 +16,8 @@
 
 package android.app.time;
 
-import static android.app.timezonedetector.ParcelableTestSupport.assertRoundTripParcelable;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
 import androidx.test.filters.SmallTest;
@@ -29,25 +26,12 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+/** Also see {@link android.app.time.cts.TimeZoneConfigurationTest}, which covers the SDK APIs. */
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class TimeZoneConfigurationTest {
 
     @Test
-    public void testBuilder_copyConstructor() {
-        TimeZoneConfiguration.Builder builder1 =
-                new TimeZoneConfiguration.Builder()
-                        .setAutoDetectionEnabled(true)
-                        .setGeoDetectionEnabled(true);
-        TimeZoneConfiguration configuration1 = builder1.build();
-
-        TimeZoneConfiguration configuration2 =
-                new TimeZoneConfiguration.Builder(configuration1).build();
-
-        assertEquals(configuration1, configuration2);
-    }
-
-    @Test
     public void testIntrospectionMethods() {
         TimeZoneConfiguration empty = new TimeZoneConfiguration.Builder().build();
         assertFalse(empty.isComplete());
@@ -90,84 +74,4 @@
             assertEquals(configuration2, merged1And2);
         }
     }
-
-    @Test
-    public void testEquals() {
-        TimeZoneConfiguration.Builder builder1 =
-                new TimeZoneConfiguration.Builder();
-        {
-            TimeZoneConfiguration one = builder1.build();
-            assertEquals(one, one);
-        }
-
-        TimeZoneConfiguration.Builder builder2 =
-                new TimeZoneConfiguration.Builder();
-        {
-            TimeZoneConfiguration one = builder1.build();
-            TimeZoneConfiguration two = builder2.build();
-            assertEquals(one, two);
-            assertEquals(two, one);
-        }
-
-        builder1.setAutoDetectionEnabled(true);
-        {
-            TimeZoneConfiguration one = builder1.build();
-            TimeZoneConfiguration two = builder2.build();
-            assertNotEquals(one, two);
-        }
-
-        builder2.setAutoDetectionEnabled(false);
-        {
-            TimeZoneConfiguration one = builder1.build();
-            TimeZoneConfiguration two = builder2.build();
-            assertNotEquals(one, two);
-        }
-
-        builder1.setAutoDetectionEnabled(false);
-        {
-            TimeZoneConfiguration one = builder1.build();
-            TimeZoneConfiguration two = builder2.build();
-            assertEquals(one, two);
-        }
-
-        builder1.setGeoDetectionEnabled(true);
-        {
-            TimeZoneConfiguration one = builder1.build();
-            TimeZoneConfiguration two = builder2.build();
-            assertNotEquals(one, two);
-        }
-
-        builder2.setGeoDetectionEnabled(false);
-        {
-            TimeZoneConfiguration one = builder1.build();
-            TimeZoneConfiguration two = builder2.build();
-            assertNotEquals(one, two);
-        }
-
-        builder1.setGeoDetectionEnabled(false);
-        {
-            TimeZoneConfiguration one = builder1.build();
-            TimeZoneConfiguration two = builder2.build();
-            assertEquals(one, two);
-        }
-    }
-
-    @Test
-    public void testParcelable() {
-        TimeZoneConfiguration.Builder builder =
-                new TimeZoneConfiguration.Builder();
-        assertRoundTripParcelable(builder.build());
-
-        builder.setAutoDetectionEnabled(true);
-        assertRoundTripParcelable(builder.build());
-
-        builder.setAutoDetectionEnabled(false);
-        assertRoundTripParcelable(builder.build());
-
-        builder.setGeoDetectionEnabled(false);
-        assertRoundTripParcelable(builder.build());
-
-        builder.setGeoDetectionEnabled(true);
-        assertRoundTripParcelable(builder.build());
-    }
 }
diff --git a/core/tests/coretests/src/android/os/VibratorInfoTest.java b/core/tests/coretests/src/android/os/VibratorInfoTest.java
index 3a80464..8c7d10c 100644
--- a/core/tests/coretests/src/android/os/VibratorInfoTest.java
+++ b/core/tests/coretests/src/android/os/VibratorInfoTest.java
@@ -100,6 +100,19 @@
     }
 
     @Test
+    public void testGetPrimitiveDuration() {
+        VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+                .setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS)
+                .setSupportedPrimitives(VibrationEffect.Composition.PRIMITIVE_CLICK)
+                .setPrimitiveDuration(VibrationEffect.Composition.PRIMITIVE_CLICK, 20)
+                .build();
+        assertEquals(20, info.getPrimitiveDuration(VibrationEffect.Composition.PRIMITIVE_CLICK));
+        assertEquals(0, info.getPrimitiveDuration(VibrationEffect.Composition.PRIMITIVE_TICK));
+        assertEquals(0, new VibratorInfo.Builder(TEST_VIBRATOR_ID).build()
+                .getPrimitiveDuration(VibrationEffect.Composition.PRIMITIVE_TICK));
+    }
+
+    @Test
     public void testGetDefaultBraking_returnsFirstSupportedBraking() {
         assertEquals(Braking.NONE, new VibratorInfo.Builder(
                 TEST_VIBRATOR_ID).build().getDefaultBraking());
@@ -251,12 +264,14 @@
                 .setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL)
                 .setSupportedEffects(VibrationEffect.EFFECT_CLICK)
                 .setSupportedPrimitives(VibrationEffect.Composition.PRIMITIVE_CLICK)
+                .setPrimitiveDuration(VibrationEffect.Composition.PRIMITIVE_CLICK, 20)
                 .setQFactor(2f)
                 .setFrequencyMapping(TEST_FREQUENCY_MAPPING);
         VibratorInfo complete = completeBuilder.build();
 
         assertEquals(complete, complete);
         assertEquals(complete, completeBuilder.build());
+        assertEquals(complete.hashCode(), completeBuilder.build().hashCode());
 
         VibratorInfo completeWithComposeControl = completeBuilder
                 .setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS)
@@ -279,6 +294,11 @@
                 .build();
         assertNotEquals(complete, completeWithUnknownPrimitives);
 
+        VibratorInfo completeWithDifferentPrimitiveDuration = completeBuilder
+                .setPrimitiveDuration(VibrationEffect.Composition.PRIMITIVE_CLICK, 10)
+                .build();
+        assertNotEquals(complete, completeWithDifferentPrimitiveDuration);
+
         VibratorInfo completeWithDifferentFrequencyMapping = completeBuilder
                 .setFrequencyMapping(new VibratorInfo.FrequencyMapping(TEST_MIN_FREQUENCY + 10,
                         TEST_RESONANT_FREQUENCY + 20, TEST_FREQUENCY_RESOLUTION + 5,
@@ -314,7 +334,8 @@
         VibratorInfo original = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
                 .setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS)
                 .setSupportedEffects(VibrationEffect.EFFECT_CLICK)
-                .setSupportedPrimitives(null)
+                .setSupportedPrimitives(VibrationEffect.Composition.PRIMITIVE_CLICK)
+                .setPrimitiveDuration(VibrationEffect.Composition.PRIMITIVE_CLICK, 20)
                 .setQFactor(Float.NaN)
                 .setFrequencyMapping(TEST_FREQUENCY_MAPPING)
                 .build();
@@ -324,5 +345,6 @@
         parcel.setDataPosition(0);
         VibratorInfo restored = VibratorInfo.CREATOR.createFromParcel(parcel);
         assertEquals(original, restored);
+        assertEquals(original.hashCode(), restored.hashCode());
     }
 }
diff --git a/core/tests/coretests/src/android/os/VibratorTest.java b/core/tests/coretests/src/android/os/VibratorTest.java
index 6213285..8f9168b 100644
--- a/core/tests/coretests/src/android/os/VibratorTest.java
+++ b/core/tests/coretests/src/android/os/VibratorTest.java
@@ -80,6 +80,16 @@
     }
 
     @Test
+    public void getPrimitivesDurations_returnsArrayOfSameSize() {
+        assertEquals(0, mVibratorSpy.getPrimitiveDurations(new int[0]).length);
+        assertEquals(1, mVibratorSpy.getPrimitiveDurations(
+                new int[]{VibrationEffect.Composition.PRIMITIVE_CLICK}).length);
+        assertEquals(2, mVibratorSpy.getPrimitiveDurations(
+                new int[]{VibrationEffect.Composition.PRIMITIVE_CLICK,
+                        VibrationEffect.Composition.PRIMITIVE_QUICK_RISE}).length);
+    }
+
+    @Test
     public void vibrate_withAudioAttributes_createsVibrationAttributesWithSameUsage() {
         VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
         AudioAttributes audioAttributes = new AudioAttributes.Builder().setUsage(
diff --git a/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java b/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java
index 2833ea3..25608c3 100644
--- a/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java
+++ b/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java
@@ -33,7 +33,6 @@
 import android.platform.test.annotations.Presubmit;
 
 import androidx.annotation.NonNull;
-import androidx.test.filters.FlakyTest;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
 
@@ -92,6 +91,18 @@
                 viewGroup.getScrollCaptureHint());
     }
 
+    /** Make sure the hint flags are saved and loaded correctly. */
+    @Test
+    public void testSetScrollCaptureHint_mutuallyExclusiveFlags() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        final MockViewGroup viewGroup = new MockViewGroup(context);
+
+        viewGroup.setScrollCaptureHint(
+                View.SCROLL_CAPTURE_HINT_INCLUDE | View.SCROLL_CAPTURE_HINT_EXCLUDE);
+        assertEquals("Mutually exclusive flags were not resolved correctly",
+                ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE, 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
@@ -343,6 +354,54 @@
                 target.getContainingView().getScrollCaptureHint());
     }
 
+    /**
+     * Tests the effect of padding on scroll capture search dispatch.
+     * <p>
+     * Verifies computation of child visible bounds with padding.
+     */
+    @MediumTest
+    @Test
+    public void testOnScrollCaptureSearch_withPadding() {
+        final Context context = getInstrumentation().getContext();
+
+        Rect windowBounds = new Rect(0, 0, 200, 200);
+        Point windowOffset = new Point(0, 0);
+
+        final MockViewGroup parent = new MockViewGroup(context, 0, 0, 200, 200);
+        parent.setPadding(25, 50, 25, 50);
+        parent.setClipToPadding(true); // (default)
+
+        final MockView view1 = new MockView(context, 0, -100, 200, 100);
+        parent.addView(view1);
+
+        final MockView view2 = new MockView(context, 0, 0, 200, 200);
+        parent.addView(view2);
+
+        final MockViewGroup view3 = new MockViewGroup(context, 0, 100, 200, 300);
+        parent.addView(view3);
+        view3.setPadding(25, 25, 25, 25);
+        view3.setClipToPadding(true);
+
+        // Where targets are added
+        final ScrollCaptureSearchResults results = new ScrollCaptureSearchResults(DIRECT_EXECUTOR);
+
+        // Dispatch to the ViewGroup
+        parent.dispatchScrollCaptureSearch(windowBounds, windowOffset, results::addTarget);
+
+        // Verify padding (with clipToPadding) is subtracted from visibleBounds
+        parent.assertOnScrollCaptureSearchLastArgs(new Rect(25, 50, 175, 150), new Point(0, 0));
+
+        view1.assertOnScrollCaptureSearchLastArgs(
+                new Rect(25, 150, 175, 200), new Point(0, -100));
+
+        view2.assertOnScrollCaptureSearchLastArgs(
+                new Rect(25, 50, 175, 150), new Point(0, 0));
+
+        // Account for padding on view3 as well (top == 25px)
+        view3.assertOnScrollCaptureSearchLastArgs(
+                new Rect(25, 25, 175, 50), new Point(0, 100));
+    }
+
     public static final class MockView extends View {
         private ScrollCaptureCallback mInternalCallback;
 
@@ -350,6 +409,8 @@
         private Rect mDispatchScrollCaptureSearchLastLocalVisibleRect;
         private Point mDispatchScrollCaptureSearchLastWindowOffset;
         private int mCreateScrollCaptureCallbackInternalCount;
+        private Rect mOnScrollCaptureSearchLastLocalVisibleRect;
+        private Point mOnScrollCaptureSearchLastWindowOffset;
 
         MockView(Context context) {
             this(context, /* left */ 0, /* top */0, /* right */ 0, /* bottom */0);
@@ -395,6 +456,21 @@
         }
 
         @Override
+        public void onScrollCaptureSearch(Rect localVisibleRect, Point windowOffset,
+                Consumer<ScrollCaptureTarget> targets) {
+            super.onScrollCaptureSearch(localVisibleRect, windowOffset, targets);
+            mOnScrollCaptureSearchLastLocalVisibleRect = new Rect(localVisibleRect);
+            mOnScrollCaptureSearchLastWindowOffset = new Point(windowOffset);
+        }
+
+        void assertOnScrollCaptureSearchLastArgs(Rect localVisibleRect, Point windowOffset) {
+            assertEquals("arg localVisibleRect was incorrect.",
+                    localVisibleRect, mOnScrollCaptureSearchLastLocalVisibleRect);
+            assertEquals("arg windowOffset was incorrect.",
+                    windowOffset, mOnScrollCaptureSearchLastWindowOffset);
+        }
+
+        @Override
         public void dispatchScrollCaptureSearch(Rect localVisibleRect, Point windowOffset,
                 Consumer<ScrollCaptureTarget> results) {
             mDispatchScrollCaptureSearchNumCalls++;
@@ -437,6 +513,8 @@
 
     public static final class MockViewGroup extends ViewGroup {
         private ScrollCaptureCallback mInternalCallback;
+        private Rect mOnScrollCaptureSearchLastLocalVisibleRect;
+        private Point mOnScrollCaptureSearchLastWindowOffset;
 
         MockViewGroup(Context context) {
             this(context, /* left */ 0, /* top */0, /* right */ 0, /* bottom */0);
@@ -465,6 +543,21 @@
         }
 
         @Override
+        public void onScrollCaptureSearch(Rect localVisibleRect, Point windowOffset,
+                Consumer<ScrollCaptureTarget> targets) {
+            super.onScrollCaptureSearch(localVisibleRect, windowOffset, targets);
+            mOnScrollCaptureSearchLastLocalVisibleRect = new Rect(localVisibleRect);
+            mOnScrollCaptureSearchLastWindowOffset = new Point(windowOffset);
+        }
+
+        void assertOnScrollCaptureSearchLastArgs(Rect localVisibleRect, Point windowOffset) {
+            assertEquals("arg localVisibleRect was incorrect.",
+                    localVisibleRect, mOnScrollCaptureSearchLastLocalVisibleRect);
+            assertEquals("arg windowOffset was incorrect.",
+                    windowOffset, mOnScrollCaptureSearchLastWindowOffset);
+        }
+
+        @Override
         protected void onLayout(boolean changed, int l, int t, int r, int b) {
             // We don't layout this view.
         }
diff --git a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java
index c63ec45..236c3da 100644
--- a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java
@@ -65,7 +65,7 @@
         SystemBatteryConsumer consumer =
                 mStatsRule.getSystemBatteryConsumer(
                         SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(90 * MINUTE_IN_MS);
         // 100,000,00 uC / 1000 (micro-/milli-) / 360 (seconds/hour) = 27.777778 mAh
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
@@ -91,7 +91,7 @@
         SystemBatteryConsumer consumer =
                 mStatsRule.getSystemBatteryConsumer(
                         SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(90 * MINUTE_IN_MS);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isWithin(PRECISION).of(15.0);
diff --git a/core/tests/coretests/src/com/android/internal/os/AudioPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/AudioPowerCalculatorTest.java
index ed4638c..c694d67 100644
--- a/core/tests/coretests/src/com/android/internal/os/AudioPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/AudioPowerCalculatorTest.java
@@ -52,7 +52,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO))
                 .isEqualTo(1000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO))
                 .isWithin(PRECISION).of(0.1);
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java
index e0739be..41fe372 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java
@@ -171,7 +171,7 @@
         final boolean includePowerModels = (query.getFlags()
                 & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0;
         BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(
-                customPowerComponentNames, 0, includePowerModels);
+                customPowerComponentNames, includePowerModels);
         SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats();
         for (int i = 0; i < uidStats.size(); i++) {
             builder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i));
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
index b253599..55302bc 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
@@ -67,7 +67,7 @@
         final BatteryStatsImpl.Uid batteryStatsUid = batteryStats.getUidStatsLocked(2000);
 
         final BatteryUsageStats.Builder builder =
-                new BatteryUsageStats.Builder(new String[]{"FOO"}, 1)
+                new BatteryUsageStats.Builder(new String[]{"FOO"})
                         .setDischargePercentage(20)
                         .setDischargedPowerRange(1000, 2000)
                         .setStatsStartTimestamp(1000);
@@ -83,11 +83,9 @@
                 .setConsumedPowerForCustomComponent(
                         BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 500)
                 .setUsageDurationMillis(
-                        BatteryConsumer.TIME_COMPONENT_CPU, 600)
-                .setUsageDurationMillis(
-                        BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND, 700)
+                        BatteryConsumer.POWER_COMPONENT_CPU, 600)
                 .setUsageDurationForCustomComponentMillis(
-                        BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID, 800);
+                        BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 800);
 
         builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_CAMERA)
                 .setConsumedPower(
@@ -95,9 +93,9 @@
                 .setConsumedPowerForCustomComponent(
                         BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200)
                 .setUsageDurationMillis(
-                        BatteryConsumer.TIME_COMPONENT_CPU, 10300)
+                        BatteryConsumer.POWER_COMPONENT_CPU, 10300)
                 .setUsageDurationForCustomComponentMillis(
-                        BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID, 10400)
+                        BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10400)
                 .setPowerConsumedByApps(20000);
 
         return builder.build();
@@ -129,11 +127,9 @@
                 assertThat(uidBatteryConsumer.getConsumedPowerForCustomComponent(
                         BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(500);
                 assertThat(uidBatteryConsumer.getUsageDurationMillis(
-                        BatteryConsumer.TIME_COMPONENT_CPU)).isEqualTo(600);
-                assertThat(uidBatteryConsumer.getUsageDurationMillis(
-                        BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND)).isEqualTo(700);
+                        BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(600);
                 assertThat(uidBatteryConsumer.getUsageDurationForCustomComponentMillis(
-                        BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID)).isEqualTo(800);
+                        BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(800);
                 assertThat(uidBatteryConsumer.getConsumedPower()).isEqualTo(1200);
                 assertThat(uidBatteryConsumer.getCustomPowerComponentCount()).isEqualTo(1);
                 assertThat(uidBatteryConsumer.getCustomPowerComponentName(
@@ -152,9 +148,9 @@
                 assertThat(systemBatteryConsumer.getConsumedPowerForCustomComponent(
                         BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10200);
                 assertThat(systemBatteryConsumer.getUsageDurationMillis(
-                        BatteryConsumer.TIME_COMPONENT_CPU)).isEqualTo(10300);
+                        BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10300);
                 assertThat(systemBatteryConsumer.getUsageDurationForCustomComponentMillis(
-                        BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID)).isEqualTo(10400);
+                        BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10400);
                 assertThat(systemBatteryConsumer.getConsumedPower()).isEqualTo(20300);
                 assertThat(systemBatteryConsumer.getPowerConsumedByApps()).isEqualTo(20000);
                 assertThat(systemBatteryConsumer.getUsageDurationMillis())
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
index 7890168..e2e672e 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
@@ -938,17 +938,9 @@
     }
 
     @Test
-    public void testLatencyCollectionDisabledByDefault() {
+    public void testLatencyCollectionEnabledByDefault() {
         TestBinderCallsStats bcs = new TestBinderCallsStats();
-        assertEquals(false, bcs.getCollectLatencyData());
-
-        Binder binder = new Binder();
-        CallSession callSession = bcs.callStarted(binder, 1, WORKSOURCE_UID);
-        bcs.time += 10;
-        bcs.elapsedTime += 20;
-        bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID);
-
-        assertEquals(0, bcs.getLatencyObserver().getLatencyHistograms().size());
+        assertEquals(true, bcs.getCollectLatencyData());
     }
 
     private static class TestHandler extends Handler {
@@ -992,8 +984,9 @@
                     return mHandler;
                 }
 
-                public BinderLatencyObserver getLatencyObserver() {
-                    return new BinderLatencyObserverTest.TestBinderLatencyObserver();
+                @Override
+                public BinderLatencyObserver getLatencyObserver(int processSource) {
+                    return new BinderLatencyObserverTest.TestBinderLatencyObserver(processSource);
                 }
             });
             setSamplingInterval(1);
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java b/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java
index bf87683..4157f5e 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java
@@ -245,18 +245,24 @@
         private ArrayList<String> mWrittenAtoms;
 
         TestBinderLatencyObserver() {
-            // Make random generator not random.
-            super(new Injector() {
-                public Random getRandomGenerator() {
-                    return new Random() {
-                        int mCallCount = 0;
+            this(SYSTEM_SERVER);
+        }
 
-                        public int nextInt() {
-                            return mCallCount++;
+        TestBinderLatencyObserver(int processSource) {
+            // Make random generator not random.
+            super(
+                    new Injector() {
+                        public Random getRandomGenerator() {
+                            return new Random() {
+                                int mCallCount = 0;
+
+                                public int nextInt() {
+                                    return mCallCount++;
+                                }
+                            };
                         }
-                    };
-                }
-            });
+                    },
+                    processSource);
             setSamplingInterval(1);
             mWrittenAtoms = new ArrayList<>();
         }
diff --git a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
index 71cdb5f..8723195 100644
--- a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
@@ -147,7 +147,7 @@
                 .isEqualTo(powerModel);
 
         long usageDurationMillis = batteryConsumer.getUsageDurationMillis(
-                BatteryConsumer.TIME_COMPONENT_BLUETOOTH);
+                BatteryConsumer.POWER_COMPONENT_BLUETOOTH);
 
         assertThat(usageDurationMillis).isEqualTo(durationMs);
     }
diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
index a181bc8..1fc3a21 100644
--- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
@@ -354,6 +354,7 @@
         batteryOffScreenOn();
     }
 
+    @SkipPresubmit("b/185960974 flaky")
     @Test
     public void testCpuFreqTimes_stateTopSleeping() throws Exception {
         if (!sCpuFreqTimesAvailable || !sPerProcStateTimesAvailable) {
diff --git a/core/tests/coretests/src/com/android/internal/os/CameraPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/CameraPowerCalculatorTest.java
index a21dd58..61eb173 100644
--- a/core/tests/coretests/src/com/android/internal/os/CameraPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/CameraPowerCalculatorTest.java
@@ -52,7 +52,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CAMERA))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA))
                 .isEqualTo(1000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA))
                 .isWithin(PRECISION).of(0.1);
diff --git a/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java
index 63af21d..1a99fb0f 100644
--- a/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/CpuPowerCalculatorTest.java
@@ -144,7 +144,7 @@
         mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
 
         UidBatteryConsumer uidConsumer1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
-        assertThat(uidConsumer1.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU))
+        assertThat(uidConsumer1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isEqualTo(3333);
         assertThat(uidConsumer1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isWithin(PRECISION).of(1.092233);
@@ -153,7 +153,7 @@
         assertThat(uidConsumer1.getPackageWithHighestDrain()).isEqualTo("bar");
 
         UidBatteryConsumer uidConsumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
-        assertThat(uidConsumer2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU))
+        assertThat(uidConsumer2.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isEqualTo(7777);
         assertThat(uidConsumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isWithin(PRECISION).of(2.672322);
@@ -208,7 +208,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer uidConsumer1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
-        assertThat(uidConsumer1.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU))
+        assertThat(uidConsumer1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isEqualTo(3333);
         assertThat(uidConsumer1.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isWithin(PRECISION).of(3.18877);
@@ -217,7 +217,7 @@
         assertThat(uidConsumer1.getPackageWithHighestDrain()).isEqualTo("bar");
 
         UidBatteryConsumer uidConsumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
-        assertThat(uidConsumer2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU))
+        assertThat(uidConsumer2.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isEqualTo(7777);
         assertThat(uidConsumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
                 .isWithin(PRECISION).of(7.44072);
diff --git a/core/tests/coretests/src/com/android/internal/os/FlashlightPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/FlashlightPowerCalculatorTest.java
index b7bbedd..98d5aac 100644
--- a/core/tests/coretests/src/com/android/internal/os/FlashlightPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/FlashlightPowerCalculatorTest.java
@@ -52,7 +52,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_FLASHLIGHT))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
                 .isEqualTo(1000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT))
                 .isWithin(PRECISION).of(0.1);
diff --git a/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java
index aa066c3..7ea799f 100644
--- a/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/GnssPowerCalculatorTest.java
@@ -56,7 +56,7 @@
         mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_GNSS))
                 .isEqualTo(1000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
                 .isWithin(PRECISION).of(0.1);
@@ -83,7 +83,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_GNSS))
                 .isEqualTo(1000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
                 .isWithin(PRECISION).of(2.77777);
@@ -91,7 +91,7 @@
                 .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
 
         UidBatteryConsumer consumer2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
-        assertThat(consumer2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_GNSS))
+        assertThat(consumer2.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_GNSS))
                 .isEqualTo(2000);
         assertThat(consumer2.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
                 .isWithin(PRECISION).of(5.55555);
diff --git a/core/tests/coretests/src/com/android/internal/os/IdlePowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/IdlePowerCalculatorTest.java
index a9800b7..2331eeb 100644
--- a/core/tests/coretests/src/com/android/internal/os/IdlePowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/IdlePowerCalculatorTest.java
@@ -48,7 +48,7 @@
 
         SystemBatteryConsumer consumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_IDLE);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_IDLE))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE))
                 .isEqualTo(3000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE))
                 .isWithin(PRECISION).of(0.7);
diff --git a/core/tests/coretests/src/com/android/internal/os/MemoryPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/MemoryPowerCalculatorTest.java
index 71dbcdb..94e760a 100644
--- a/core/tests/coretests/src/com/android/internal/os/MemoryPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/MemoryPowerCalculatorTest.java
@@ -55,7 +55,7 @@
 
         SystemBatteryConsumer consumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MEMORY);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MEMORY))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY))
                 .isEqualTo(3000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY))
                 .isWithin(PRECISION).of(0.7);
diff --git a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java
index 7d829e4..93c7106 100644
--- a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java
@@ -84,7 +84,7 @@
 
         SystemBatteryConsumer consumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(80 * MINUTE_IN_MS);
 
         // 600000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s)  = 166.66666 mAh
@@ -98,7 +98,7 @@
                 .isWithin(PRECISION).of(166.66666);
 
         UidBatteryConsumer uid1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
-        assertThat(uid1.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(uid1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(20 * MINUTE_IN_MS);
 
         // Uid1 took all of the foreground time during the first Display update.
@@ -110,7 +110,7 @@
                 .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
 
         UidBatteryConsumer uid2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
-        assertThat(uid2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(uid2.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(60 * MINUTE_IN_MS);
 
         // Uid2 ran for 40 minutes out of the total 45 min of foreground time during the second
@@ -153,7 +153,7 @@
 
         SystemBatteryConsumer consumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(80 * MINUTE_IN_MS);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isWithin(PRECISION).of(92.0);
@@ -165,7 +165,7 @@
                 .isWithin(PRECISION).of(92.0);
 
         UidBatteryConsumer uid1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
-        assertThat(uid1.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(uid1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(20 * MINUTE_IN_MS);
 
         // Uid1 took 20 out of the total of 80 min of foreground activity
@@ -176,7 +176,7 @@
                 .isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
 
         UidBatteryConsumer uid2 = mStatsRule.getUidBatteryConsumer(APP_UID2);
-        assertThat(uid2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
+        assertThat(uid2.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
                 .isEqualTo(60 * MINUTE_IN_MS);
 
         // Uid2 took 60 out of the total of 80 min of foreground activity
diff --git a/core/tests/coretests/src/com/android/internal/os/SensorPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/SensorPowerCalculatorTest.java
index b50435b..74235b2 100644
--- a/core/tests/coretests/src/com/android/internal/os/SensorPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/SensorPowerCalculatorTest.java
@@ -70,7 +70,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SENSORS))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SENSORS))
                 .isEqualTo(3000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS))
                 .isWithin(PRECISION).of(0.5);
diff --git a/core/tests/coretests/src/com/android/internal/os/UserPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/UserPowerCalculatorTest.java
index 6fa1d3b..aae69d7 100644
--- a/core/tests/coretests/src/com/android/internal/os/UserPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/UserPowerCalculatorTest.java
@@ -58,16 +58,16 @@
         assertThat(mStatsRule.getUserBatteryConsumer(USER1)).isNull();
 
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER1, APP_UID1))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO)).isEqualTo(3000);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO)).isEqualTo(3000);
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER1, APP_UID1))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO)).isEqualTo(7000);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO)).isEqualTo(7000);
 
         assertThat(mStatsRule.getUserBatteryConsumer(USER2)).isNull();
 
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER2, APP_UID2))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO)).isEqualTo(5555);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO)).isEqualTo(5555);
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER2, APP_UID2))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO)).isEqualTo(9999);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO)).isEqualTo(9999);
     }
 
     @Test
@@ -82,19 +82,19 @@
         assertThat(mStatsRule.getUserBatteryConsumer(USER1)).isNull();
 
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER1, APP_UID1))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO)).isEqualTo(3000);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO)).isEqualTo(3000);
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER1, APP_UID1))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO)).isEqualTo(7000);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO)).isEqualTo(7000);
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER1, APP_UID2))).isNull();
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER1, APP_UID3))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO)).isEqualTo(7070);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO)).isEqualTo(7070);
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER1, APP_UID3))
-                .getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO)).isEqualTo(11110);
+                .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO)).isEqualTo(11110);
 
         UserBatteryConsumer user2 = mStatsRule.getUserBatteryConsumer(USER2);
-        assertThat(user2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO))
+        assertThat(user2.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO))
                 .isEqualTo(15308);
-        assertThat(user2.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO))
+        assertThat(user2.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO))
                 .isEqualTo(24196);
 
         assertThat(mStatsRule.getUidBatteryConsumer(UserHandle.getUid(USER2, APP_UID1))).isNull();
@@ -130,7 +130,7 @@
         protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
                 long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
             long durationMs = u.getAudioTurnedOnTimer().getTotalTimeLocked(rawRealtimeUs, 0);
-            app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO, durationMs / 1000);
+            app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, durationMs / 1000);
         }
     }
 
@@ -139,7 +139,7 @@
         protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
                 long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
             long durationMs = u.getVideoTurnedOnTimer().getTotalTimeLocked(rawRealtimeUs, 0);
-            app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO, durationMs / 1000);
+            app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO, durationMs / 1000);
         }
     }
 }
diff --git a/core/tests/coretests/src/com/android/internal/os/VideoPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/VideoPowerCalculatorTest.java
index 39eac49..fa0dbc7 100644
--- a/core/tests/coretests/src/com/android/internal/os/VideoPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/VideoPowerCalculatorTest.java
@@ -52,7 +52,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_VIDEO))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO))
                 .isEqualTo(1000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO))
                 .isWithin(PRECISION).of(0.1);
diff --git a/core/tests/coretests/src/com/android/internal/os/WakelockPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/WakelockPowerCalculatorTest.java
index 4f71b43..9d3ed55 100644
--- a/core/tests/coretests/src/com/android/internal/os/WakelockPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/WakelockPowerCalculatorTest.java
@@ -62,13 +62,13 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer consumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WAKELOCK))
+        assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
                 .isEqualTo(1000);
         assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
                 .isWithin(PRECISION).of(0.1);
 
         UidBatteryConsumer osConsumer = mStatsRule.getUidBatteryConsumer(Process.ROOT_UID);
-        assertThat(osConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WAKELOCK))
+        assertThat(osConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
                 .isEqualTo(5000);
         assertThat(osConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
                 .isWithin(PRECISION).of(0.5);
diff --git a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
index 9349bce..4a7cf1e 100644
--- a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
@@ -87,7 +87,7 @@
         mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
 
         UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(1423);
         assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isWithin(PRECISION).of(0.2214666);
@@ -96,7 +96,7 @@
 
         SystemBatteryConsumer systemConsumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
-        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(5577);
         assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isWithin(PRECISION).of(1.11153);
@@ -117,7 +117,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(1423);
         /* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */
         assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
@@ -127,7 +127,7 @@
 
         SystemBatteryConsumer systemConsumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
-        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(5577);
         /* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */
         assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
@@ -162,7 +162,7 @@
         mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
 
         UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(1000);
         assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isWithin(PRECISION).of(0.8231573);
@@ -171,7 +171,7 @@
 
         SystemBatteryConsumer systemConsumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
-        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(2222);
         assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isWithin(PRECISION).of(2.575000);
@@ -193,7 +193,7 @@
         mStatsRule.apply(calculator);
 
         UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
-        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(uidConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(1000);
         /* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */
         assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
@@ -203,7 +203,7 @@
 
         SystemBatteryConsumer systemConsumer =
                 mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
-        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI))
+        assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
                 .isEqualTo(2222);
         /* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */
         assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
diff --git a/core/tests/coretests/src/com/android/internal/power/MeasuredEnergyStatsTest.java b/core/tests/coretests/src/com/android/internal/power/MeasuredEnergyStatsTest.java
index f1edc87..2d894f5 100644
--- a/core/tests/coretests/src/com/android/internal/power/MeasuredEnergyStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/power/MeasuredEnergyStatsTest.java
@@ -159,7 +159,7 @@
         stats.updateCustomBucket(1, 60);
 
         final Parcel parcel = Parcel.obtain();
-        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false);
+        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false, false);
         parcel.setDataPosition(0);
         MeasuredEnergyStats newStats = MeasuredEnergyStats.createAndReadSummaryFromParcel(parcel);
 
@@ -175,6 +175,7 @@
         }
         assertEquals(POWER_DATA_UNAVAILABLE,
                 newStats.getAccumulatedCustomBucketCharge(customBucketNames.length + 1));
+        assertThat(newStats.getCustomBucketNames()).asList().containsExactly("A", "B");
         parcel.recycle();
     }
 
@@ -201,7 +202,7 @@
         stats.updateCustomBucket(1, 316);
 
         final Parcel parcel = Parcel.obtain();
-        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false);
+        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false, true);
 
         final boolean[] newsupportedStandardBuckets = new boolean[NUMBER_STANDARD_POWER_BUCKETS];
         newsupportedStandardBuckets[POWER_BUCKET_SCREEN_ON] = true;
@@ -234,6 +235,7 @@
         }
         assertEquals(POWER_DATA_UNAVAILABLE,
                 newStats.getAccumulatedCustomBucketCharge(customBucketNames.length + 1));
+        assertThat(newStats.getCustomBucketNames()).asList().containsExactly("A", "B");
         parcel.recycle();
     }
 
@@ -251,7 +253,7 @@
 
         // Let's try parcelling with including zeros
         final Parcel includeZerosParcel = Parcel.obtain();
-        MeasuredEnergyStats.writeSummaryToParcel(stats, includeZerosParcel, false);
+        MeasuredEnergyStats.writeSummaryToParcel(stats, includeZerosParcel, false, false);
         includeZerosParcel.setDataPosition(0);
 
         MeasuredEnergyStats newStats = MeasuredEnergyStats.createAndReadSummaryFromParcel(
@@ -275,7 +277,7 @@
 
         // Now let's try parcelling with skipping zeros
         final Parcel skipZerosParcel = Parcel.obtain();
-        MeasuredEnergyStats.writeSummaryToParcel(stats, skipZerosParcel, true);
+        MeasuredEnergyStats.writeSummaryToParcel(stats, skipZerosParcel, true, false);
         skipZerosParcel.setDataPosition(0);
 
         newStats = MeasuredEnergyStats.createAndReadSummaryFromParcel(skipZerosParcel);
@@ -315,7 +317,7 @@
         stats.updateCustomBucket(1, 60);
 
         final Parcel parcel = Parcel.obtain();
-        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false);
+        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false, true);
         parcel.setDataPosition(0);
 
         MeasuredEnergyStats newStats =
@@ -344,7 +346,7 @@
         stats.updateStandardBucket(POWER_BUCKET_SCREEN_OTHER, 7L);
 
         final Parcel parcel = Parcel.obtain();
-        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false);
+        MeasuredEnergyStats.writeSummaryToParcel(stats, parcel, false, true);
 
         final boolean[] newSupportedStandardBuckets = new boolean[NUMBER_STANDARD_POWER_BUCKETS];
         newSupportedStandardBuckets[POWER_BUCKET_SCREEN_ON] = true;
diff --git a/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk b/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk
index cba9cbd..d9e6151 100644
--- a/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk
+++ b/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk
@@ -24,6 +24,9 @@
 LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
 
 LOCAL_PACKAGE_NAME := DownloadManagerTestApp
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 LOCAL_PRIVATE_PLATFORM_APIS := true
 
 ifneq ($(TARGET_BUILD_VARIANT),user)
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
index cc2d8d2..2d8556f 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyAndException/Android.mk
@@ -26,6 +26,9 @@
 LOCAL_SDK_VERSION := 8
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyAndException
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_DEX_PREOPT := false
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
index fe7c944..d7af2d9 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestApp/Android.mk
@@ -26,6 +26,9 @@
 LOCAL_SDK_VERSION := 8
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestApp
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_DEX_PREOPT := false
 
@@ -59,6 +62,9 @@
 LOCAL_SDK_VERSION := 8
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestApp2
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_DEX_PREOPT := false
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests/Android.mk
index 69ec5ce..236c740 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests/Android.mk
@@ -26,6 +26,9 @@
 LOCAL_SDK_VERSION := 8
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestAppTests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_DEX_PREOPT := false
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk
index 2dc30ea..6f6ccfe 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppTests2/Android.mk
@@ -26,6 +26,9 @@
 LOCAL_SDK_VERSION := current
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestAppTests2
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_DEX_PREOPT := false
 
@@ -49,6 +52,9 @@
 LOCAL_SDK_VERSION := 8
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestAppTests2-multidex
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_DEX_PREOPT := false
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk
index a6f87ea..33a46ea 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk
@@ -23,6 +23,9 @@
 LOCAL_SDK_VERSION := 18
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestApp_corrupted
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
index 3636c73..efc0688 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServices/Android.mk
@@ -23,6 +23,9 @@
 LOCAL_SDK_VERSION := 9
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestServices
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk
index afbcd46..3920fd6 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests2/Android.mk
@@ -21,6 +21,9 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyTestServicesTests2
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_JAVA_LIBRARIES := android-support-multidex
 LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
@@ -30,4 +33,3 @@
 LOCAL_DEX_PREOPT := false
 
 include $(BUILD_PACKAGE)
-
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
index 67f1fa5..2323ad9 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v1/Android.mk
@@ -23,6 +23,9 @@
 LOCAL_SDK_VERSION := 9
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyVersionedTestApp_v1
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
index 33871e5..79a5906 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v2/Android.mk
@@ -23,6 +23,9 @@
 LOCAL_SDK_VERSION := 9
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyVersionedTestApp_v2
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex
 
diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
index 1b267ee..521bad0 100644
--- a/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
+++ b/core/tests/hosttests/test-apps/MultiDexLegacyVersionedTestApp_v3/Android.mk
@@ -23,6 +23,9 @@
 LOCAL_SDK_VERSION := 9
 
 LOCAL_PACKAGE_NAME := MultiDexLegacyVersionedTestApp_v3
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex
 
@@ -43,4 +46,3 @@
 	echo "com/android/framework/multidexlegacyversionedtestapp/MultiDexUpdateTest.class" >> $@
 
 $(built_dex_intermediate): $(mainDexList)
-
diff --git a/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java b/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java
index 43f9b6f..48f4288 100644
--- a/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java
+++ b/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java
@@ -19,6 +19,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -62,7 +63,36 @@
     }
 
     @Test
+    public void testRegister_RegisterUnregisterWhenNotSupported() throws RemoteException {
+        // isControllerAlwaysOnSupported() returns false, not supported.
+        doReturn(false).when(mNfcAdapter).isControllerAlwaysOnSupported();
+        NfcControllerAlwaysOnListener mListener =
+                new NfcControllerAlwaysOnListener(mNfcAdapter);
+        ControllerAlwaysOnListener mockListener1 = mock(ControllerAlwaysOnListener.class);
+        ControllerAlwaysOnListener mockListener2 = mock(ControllerAlwaysOnListener.class);
+
+        // Verify that the state listener will not registered with the NFC Adapter
+        mListener.register(getExecutor(), mockListener1);
+        verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any());
+
+        // Register a second client and no any call to NFC Adapter
+        mListener.register(getExecutor(), mockListener2);
+        verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any());
+
+        // Unregister first listener, and no any call to NFC Adapter
+        mListener.unregister(mockListener1);
+        verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any());
+        verify(mNfcAdapter, times(0)).unregisterControllerAlwaysOnListener(any());
+
+        // Unregister second listener, and no any call to NFC Adapter
+        mListener.unregister(mockListener2);
+        verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any());
+        verify(mNfcAdapter, times(0)).unregisterControllerAlwaysOnListener(any());
+    }
+
+    @Test
     public void testRegister_RegisterUnregister() throws RemoteException {
+        doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported();
         NfcControllerAlwaysOnListener mListener =
                 new NfcControllerAlwaysOnListener(mNfcAdapter);
         ControllerAlwaysOnListener mockListener1 = mock(ControllerAlwaysOnListener.class);
@@ -89,6 +119,7 @@
 
     @Test
     public void testRegister_FirstRegisterFails() throws RemoteException {
+        doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported();
         NfcControllerAlwaysOnListener mListener =
                 new NfcControllerAlwaysOnListener(mNfcAdapter);
         ControllerAlwaysOnListener mockListener1 = mock(ControllerAlwaysOnListener.class);
@@ -116,6 +147,7 @@
 
     @Test
     public void testRegister_RegisterSameListenerTwice() throws RemoteException {
+        doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported();
         NfcControllerAlwaysOnListener mListener =
                 new NfcControllerAlwaysOnListener(mNfcAdapter);
         ControllerAlwaysOnListener mockListener = mock(ControllerAlwaysOnListener.class);
@@ -132,7 +164,7 @@
 
     @Test
     public void testNotify_AllListenersNotified() throws RemoteException {
-
+        doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported();
         NfcControllerAlwaysOnListener listener = new NfcControllerAlwaysOnListener(mNfcAdapter);
         List<ControllerAlwaysOnListener> mockListeners = new ArrayList<>();
         for (int i = 0; i < 10; i++) {
@@ -149,7 +181,8 @@
     }
 
     @Test
-    public void testStateChange_CorrectValue() {
+    public void testStateChange_CorrectValue() throws RemoteException {
+        doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported();
         runStateChangeValue(true, true);
         runStateChangeValue(false, false);
 
diff --git a/core/tests/overlaytests/host/test-apps/SignatureOverlay/Android.mk b/core/tests/overlaytests/host/test-apps/SignatureOverlay/Android.mk
index f3c0abd..b453cde9 100644
--- a/core/tests/overlaytests/host/test-apps/SignatureOverlay/Android.mk
+++ b/core/tests/overlaytests/host/test-apps/SignatureOverlay/Android.mk
@@ -19,6 +19,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := OverlayHostTests_NonPlatformSignatureOverlay
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_bad
@@ -27,6 +30,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := OverlayHostTests_PlatformSignatureStaticOverlay
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_CERTIFICATE := platform
@@ -37,6 +43,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := OverlayHostTests_PlatformSignatureOverlay
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_CERTIFICATE := platform
diff --git a/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk b/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk
index 878f05d..77fc887 100644
--- a/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk
+++ b/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk
@@ -18,6 +18,9 @@
 LOCAL_MODULE_TAGS := tests
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 LOCAL_PACKAGE_NAME := OverlayHostTests_UpdateOverlay
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
@@ -30,6 +33,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := OverlayHostTests_FrameworkOverlayV1
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_CERTIFICATE := platform
@@ -42,6 +48,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := OverlayHostTests_FrameworkOverlayV2
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_CERTIFICATE := platform
@@ -56,6 +65,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := OverlayHostTests_AppOverlayV1
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v1
@@ -67,6 +79,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := OverlayHostTests_AppOverlayV2
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_COMPATIBILITY_SUITE := device-tests
 LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v2
diff --git a/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java b/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java
index ce67ef7..4cad535 100644
--- a/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java
+++ b/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java
@@ -17,10 +17,8 @@
 package android.uwb;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -55,7 +53,7 @@
             Object[] args = invocation.getArguments();
             IUwbAdapterStateCallbacks cb = (IUwbAdapterStateCallbacks) args[0];
             try {
-                cb.onAdapterStateChanged(false, StateChangeReason.UNKNOWN);
+                cb.onAdapterStateChanged(AdapterState.STATE_DISABLED, StateChangeReason.UNKNOWN);
             } catch (RemoteException e) {
                 // Nothing to do
             }
@@ -76,7 +74,7 @@
 
     private static void verifyCallbackStateChangedInvoked(
             AdapterStateCallback callback, int numTimes) {
-        verify(callback, times(numTimes)).onStateChanged(anyBoolean(), anyInt());
+        verify(callback, times(numTimes)).onStateChanged(anyInt(), anyInt());
     }
 
     @Test
@@ -115,30 +113,6 @@
     }
 
     @Test
-    public void testRegister_FirstRegisterFails() throws RemoteException {
-        AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
-        AdapterStateCallback callback1 = mock(AdapterStateCallback.class);
-        AdapterStateCallback callback2 = mock(AdapterStateCallback.class);
-
-        // Throw a remote exception whenever first registering
-        doThrow(mThrowRemoteException).when(mUwbAdapter).registerAdapterStateCallbacks(any());
-
-        adapterStateListener.register(getExecutor(), callback1);
-        verify(mUwbAdapter, times(1)).registerAdapterStateCallbacks(any());
-
-        // No longer throw an exception, instead succeed
-        doAnswer(mRegisterSuccessAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any());
-
-        // Register a different callback
-        adapterStateListener.register(getExecutor(), callback2);
-        verify(mUwbAdapter, times(2)).registerAdapterStateCallbacks(any());
-
-        // Ensure first callback was invoked again
-        verifyCallbackStateChangedInvoked(callback1, 2);
-        verifyCallbackStateChangedInvoked(callback2, 1);
-    }
-
-    @Test
     public void testRegister_RegisterSameCallbackTwice() throws RemoteException {
         AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
         AdapterStateCallback callback = mock(AdapterStateCallback.class);
@@ -151,7 +125,8 @@
         verifyCallbackStateChangedInvoked(callback, 1);
 
         // Invoke a state change and ensure the callback is only called once
-        adapterStateListener.onAdapterStateChanged(false, StateChangeReason.UNKNOWN);
+        adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
+                StateChangeReason.UNKNOWN);
         verifyCallbackStateChangedInvoked(callback, 2);
     }
 
@@ -162,13 +137,6 @@
         runViaExecutor();
     }
 
-    @Test
-    public void testCallback_RunViaExecutor_Failure() throws RemoteException {
-        // Verify that the callbacks are invoked on the executor when there is a remote exception
-        doThrow(mThrowRemoteException).when(mUwbAdapter).registerAdapterStateCallbacks(any());
-        runViaExecutor();
-    }
-
     private void runViaExecutor() {
         AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
         AdapterStateCallback callback = mock(AdapterStateCallback.class);
@@ -182,13 +150,15 @@
         verifyCallbackStateChangedInvoked(callback, 0);
 
         // Manually invoke the callback and ensure callback is not invoked
-        adapterStateListener.onAdapterStateChanged(false, StateChangeReason.UNKNOWN);
+        adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
+                StateChangeReason.UNKNOWN);
         verify(executor, times(2)).execute(any());
         verifyCallbackStateChangedInvoked(callback, 0);
 
         // Run the command that the executor receives
         doAnswer(new ExecutorAnswer(true)).when(executor).execute(any());
-        adapterStateListener.onAdapterStateChanged(false, StateChangeReason.UNKNOWN);
+        adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
+                StateChangeReason.UNKNOWN);
         verify(executor, times(3)).execute(any());
         verifyCallbackStateChangedInvoked(callback, 1);
     }
@@ -227,7 +197,8 @@
         }
 
         // Invoke a state change and ensure all callbacks are invoked
-        adapterStateListener.onAdapterStateChanged(true, StateChangeReason.ALL_SESSIONS_CLOSED);
+        adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
+                StateChangeReason.ALL_SESSIONS_CLOSED);
         for (AdapterStateCallback callback : callbacks) {
             verifyCallbackStateChangedInvoked(callback, 2);
         }
@@ -242,32 +213,36 @@
         adapterStateListener.register(getExecutor(), callback);
 
         runStateChangeValue(StateChangeReason.ALL_SESSIONS_CLOSED,
-                AdapterStateCallback.STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED);
+                AdapterState.STATE_ENABLED_INACTIVE,
+                AdapterStateCallback.STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED,
+                AdapterStateCallback.STATE_ENABLED_INACTIVE);
 
-        runStateChangeValue(StateChangeReason.SESSION_STARTED,
-                AdapterStateCallback.STATE_CHANGED_REASON_SESSION_STARTED);
+        runStateChangeValue(StateChangeReason.SESSION_STARTED, AdapterState.STATE_ENABLED_ACTIVE,
+                AdapterStateCallback.STATE_CHANGED_REASON_SESSION_STARTED,
+                AdapterStateCallback.STATE_ENABLED_ACTIVE);
 
-        runStateChangeValue(StateChangeReason.SYSTEM_BOOT,
-                AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_BOOT);
+        runStateChangeValue(StateChangeReason.SYSTEM_BOOT, AdapterState.STATE_DISABLED,
+                AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_BOOT,
+                AdapterStateCallback.STATE_DISABLED);
 
-        runStateChangeValue(StateChangeReason.SYSTEM_POLICY,
-                AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_POLICY);
+        runStateChangeValue(StateChangeReason.SYSTEM_POLICY, AdapterState.STATE_DISABLED,
+                AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_POLICY,
+                AdapterStateCallback.STATE_DISABLED);
 
-        runStateChangeValue(StateChangeReason.UNKNOWN,
-                AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN);
+        runStateChangeValue(StateChangeReason.UNKNOWN, AdapterState.STATE_DISABLED,
+                AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN,
+                AdapterStateCallback.STATE_DISABLED);
     }
 
-    private void runStateChangeValue(@StateChangeReason int reasonIn,
-            @AdapterStateCallback.StateChangedReason int reasonOut) {
+    private void runStateChangeValue(@StateChangeReason int reasonIn, @AdapterState int stateIn,
+            @AdapterStateCallback.StateChangedReason int reasonOut,
+            @AdapterStateCallback.State int stateOut) {
         AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
         AdapterStateCallback callback = mock(AdapterStateCallback.class);
         adapterStateListener.register(getExecutor(), callback);
 
-        adapterStateListener.onAdapterStateChanged(false, reasonIn);
-        verify(callback, times(1)).onStateChanged(false, reasonOut);
-
-        adapterStateListener.onAdapterStateChanged(true, reasonIn);
-        verify(callback, times(1)).onStateChanged(true, reasonOut);
+        adapterStateListener.onAdapterStateChanged(stateIn, reasonIn);
+        verify(callback, times(1)).onStateChanged(stateOut, reasonOut);
     }
 
     @Test
@@ -280,7 +255,8 @@
                 Object[] args = invocation.getArguments();
                 IUwbAdapterStateCallbacks cb = (IUwbAdapterStateCallbacks) args[0];
                 try {
-                    cb.onAdapterStateChanged(true, StateChangeReason.SESSION_STARTED);
+                    cb.onAdapterStateChanged(AdapterState.STATE_ENABLED_ACTIVE,
+                            StateChangeReason.SESSION_STARTED);
                 } catch (RemoteException e) {
                     // Nothing to do
                 }
@@ -291,7 +267,7 @@
         doAnswer(registerAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any());
 
         adapterStateListener.register(getExecutor(), callback);
-        verify(callback).onStateChanged(true,
+        verify(callback).onStateChanged(AdapterStateCallback.STATE_ENABLED_ACTIVE,
                 AdapterStateCallback.STATE_CHANGED_REASON_SESSION_STARTED);
     }
 
@@ -302,10 +278,11 @@
         AdapterStateCallback callback2 = mock(AdapterStateCallback.class);
 
         adapterStateListener.register(getExecutor(), callback1);
-        adapterStateListener.onAdapterStateChanged(true, StateChangeReason.SYSTEM_BOOT);
+        adapterStateListener.onAdapterStateChanged(AdapterState.STATE_ENABLED_ACTIVE,
+                StateChangeReason.SYSTEM_BOOT);
 
         adapterStateListener.register(getExecutor(), callback2);
-        verify(callback2).onStateChanged(true,
+        verify(callback2).onStateChanged(AdapterStateCallback.STATE_ENABLED_ACTIVE,
                 AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_BOOT);
     }
 }
diff --git a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
index 5de6d42..24267e4 100644
--- a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
+++ b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
@@ -57,7 +57,8 @@
         RangingManager rangingManager = new RangingManager(adapter);
         RangingSession.Callback callback = mock(RangingSession.Callback.class);
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
-        verify(adapter, times(1)).openRanging(any(), eq(rangingManager), eq(PARAMS));
+        verify(adapter, times(1)).openRanging(
+                eq(ATTRIBUTION_SOURCE), any(), any(), any());
     }
 
     @Test
@@ -80,11 +81,13 @@
 
         RangingManager rangingManager = new RangingManager(adapter);
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
-        verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(1)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
 
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
-        verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(2)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
 
         rangingManager.onRangingOpened(sessionHandle1);
@@ -106,7 +109,8 @@
                 ArgumentCaptor.forClass(SessionHandle.class);
 
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
-        verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(1)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle handle = sessionHandleCaptor.getValue();
 
         rangingManager.onRangingOpened(handle);
@@ -151,11 +155,13 @@
                 ArgumentCaptor.forClass(SessionHandle.class);
 
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
-        verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(1)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
 
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
-        verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(2)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
 
         rangingManager.onRangingClosed(sessionHandle1, REASON, PARAMS);
@@ -178,12 +184,14 @@
 
         RangingManager rangingManager = new RangingManager(adapter);
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
-        verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(1)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
 
         rangingManager.onRangingStarted(sessionHandle1, PARAMS);
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
-        verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(2)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
         rangingManager.onRangingStarted(sessionHandle2, PARAMS);
 
@@ -230,7 +238,8 @@
                 ArgumentCaptor.forClass(SessionHandle.class);
 
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
-        verify(adapter, times(1)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(1)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         SessionHandle handle = sessionHandleCaptor.getValue();
 
         rangingManager.onRangingOpenFailed(handle, reasonIn, PARAMS);
@@ -238,7 +247,8 @@
 
         // Open a new session
         rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
-        verify(adapter, times(2)).openRanging(sessionHandleCaptor.capture(), any(), any());
+        verify(adapter, times(2)).openRanging(
+                eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
         handle = sessionHandleCaptor.getValue();
         rangingManager.onRangingOpened(handle);
 
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 71fc29b..7262ce5 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -198,6 +198,7 @@
     <assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="statsd" />
 
     <assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="gpu_service" />
+    <assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="keystore" />
 
     <split-permission name="android.permission.ACCESS_FINE_LOCATION">
         <new-permission name="android.permission.ACCESS_COARSE_LOCATION" />
@@ -205,9 +206,6 @@
     <split-permission name="android.permission.WRITE_EXTERNAL_STORAGE">
         <new-permission name="android.permission.READ_EXTERNAL_STORAGE" />
     </split-permission>
-    <split-permission name="android.permission.READ_PRIVILEGED_PHONE_STATE">
-        <new-permission name="android.permission.READ_PHONE_STATE" />
-    </split-permission>
     <split-permission name="android.permission.READ_CONTACTS"
                       targetSdk="16">
         <new-permission name="android.permission.READ_CALL_LOG" />
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 5544eb4..e1a0f64 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -153,6 +153,7 @@
         <permission name="android.permission.PACKAGE_USAGE_STATS" />
         <permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
         <permission name="android.permission.MODIFY_AUDIO_ROUTING" />
+        <permission name="android.permission.GET_RUNTIME_PERMISSION_GROUP_MAPPING" />
 
         <!-- For permission hub 2 debugging only -->
         <permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
@@ -344,6 +345,7 @@
         <permission name="android.permission.ACTIVITY_EMBEDDING"/>
         <permission name="android.permission.FORCE_STOP_PACKAGES"/>
         <permission name="android.permission.GET_APP_OPS_STATS"/>
+        <permission name="android.permission.WATCH_APPOPS"/>
         <permission name="android.permission.INSTALL_DYNAMIC_SYSTEM"/>
         <permission name="android.permission.INSTALL_LOCATION_PROVIDER"/>
         <permission name="android.permission.INSTALL_PACKAGES"/>
@@ -458,6 +460,7 @@
         <permission name="android.permission.ACCESS_TV_TUNER" />
         <permission name="android.permission.TUNER_RESOURCE_ACCESS" />
         <!-- Permissions required for CTS test - TVInputManagerTest -->
+        <permission name="android.permission.ACCESS_TUNED_INFO" />
         <permission name="android.permission.TV_INPUT_HARDWARE" />
         <!-- Permission required for CTS test - PrivilegedLocationPermissionTest -->
         <permission name="android.permission.LOCATION_HARDWARE" />
@@ -508,7 +511,7 @@
         <!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
         <permission name="android.permission.SCHEDULE_PRIORITIZED_ALARM" />
         <!-- Permission required for CTS test - SystemMediaRouter2Test -->
-        <permission name="android.permission.MODIFY_AUDIO_ROUTING"/>
+        <permission name="android.permission.MEDIA_CONTENT_CONTROL"/>
         <!-- Permission required for CTS test - CtsPermission5TestCases -->
         <permission name="android.permission.RENOUNCE_PERMISSIONS" />
         <permission name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
@@ -519,7 +522,7 @@
         <permission name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS" />
         <permission name="android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER" />
         <permission name="android.permission.SET_MEDIA_KEY_LISTENER" />
-        <permission name="android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER" />
+        <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
         <!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
         <permission name="android.permission.UPDATE_DEVICE_STATS" />
     </privapp-permissions>
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index 81f1021..9b9511b 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -367,12 +367,6 @@
       "group": "WM_DEBUG_ORIENTATION",
       "at": "com\/android\/server\/wm\/DisplayRotation.java"
     },
-    "-1729340764": {
-      "message": "setFinishTaskBounds(%d): bounds=%s",
-      "level": "DEBUG",
-      "group": "WM_DEBUG_RECENTS_ANIMATIONS",
-      "at": "com\/android\/server\/wm\/RecentsAnimationController.java"
-    },
     "-1715268616": {
       "message": "Last window, removing starting window %s",
       "level": "VERBOSE",
@@ -1705,6 +1699,12 @@
       "group": "WM_ERROR",
       "at": "com\/android\/server\/wm\/WindowManagerService.java"
     },
+    "-163974242": {
+      "message": "setFinishTaskTransaction(%d): transaction=%s",
+      "level": "DEBUG",
+      "group": "WM_DEBUG_RECENTS_ANIMATIONS",
+      "at": "com\/android\/server\/wm\/RecentsAnimationController.java"
+    },
     "-143556958": {
       "message": "resumeNextFocusableActivityWhenRootTaskIsEmpty: %s, go home",
       "level": "DEBUG",
@@ -1735,6 +1735,12 @@
       "group": "WM_DEBUG_IME",
       "at": "com\/android\/server\/wm\/InsetsSourceProvider.java"
     },
+    "-108977760": {
+      "message": "Sandbox max bounds for uid %s to bounds %s. config to never sandbox = %s, config to always sandbox = %s, letterboxing from mismatch with parent bounds = %s, has mCompatDisplayInsets = %s, should create compatDisplayInsets = %s",
+      "level": "DEBUG",
+      "group": "WM_DEBUG_CONFIGURATION",
+      "at": "com\/android\/server\/wm\/ActivityRecord.java"
+    },
     "-106400104": {
       "message": "Preload recents with %s",
       "level": "DEBUG",
@@ -1891,12 +1897,6 @@
       "group": "WM_DEBUG_RECENTS_ANIMATIONS",
       "at": "com\/android\/server\/wm\/RecentsAnimationController.java"
     },
-    "86989930": {
-      "message": "setTaskWindowingMode: moving task=%d to windowingMode=%d toTop=%b",
-      "level": "DEBUG",
-      "group": "WM_DEBUG_TASKS",
-      "at": "com\/android\/server\/wm\/ActivityTaskManagerService.java"
-    },
     "90764070": {
       "message": "Could not report token removal to the window token client.",
       "level": "WARN",
@@ -2887,12 +2887,6 @@
       "group": "WM_DEBUG_BOOT",
       "at": "com\/android\/server\/wm\/WindowManagerService.java"
     },
-    "1237719089": {
-      "message": "Sandbox max bounds for uid %s to bounds %s. letterboxing from mismatch with parent bounds = %s, has mCompatDisplayInsets = %s, should create compatDisplayInsets = %s",
-      "level": "DEBUG",
-      "group": "WM_DEBUG_CONFIGURATION",
-      "at": "com\/android\/server\/wm\/ActivityRecord.java"
-    },
     "1246035185": {
       "message": "stopFreezingDisplayLocked: Returning waitingForConfig=%b, waitingForRemoteRotation=%b, mAppsFreezingScreen=%d, mWindowsFreezingScreen=%d, mClientFreezingScreen=%b, mOpeningApps.size()=%d",
       "level": "DEBUG",
diff --git a/data/keyboards/Vendor_054c_Product_0268.kl b/data/keyboards/Vendor_054c_Product_0268.kl
index b463dd8..08d1c34 100644
--- a/data/keyboards/Vendor_054c_Product_0268.kl
+++ b/data/keyboards/Vendor_054c_Product_0268.kl
@@ -77,3 +77,11 @@
 key 0x123    BUTTON_START
 # PS key
 key 0x2d0    BUTTON_MODE
+
+# SENSORs
+sensor 0x00 ACCELEROMETER X
+sensor 0x01 ACCELEROMETER Y
+sensor 0x02 ACCELEROMETER Z
+sensor 0x03 GYROSCOPE X
+sensor 0x04 GYROSCOPE Y
+sensor 0x05 GYROSCOPE Z
diff --git a/data/keyboards/Vendor_054c_Product_0268_Version_8000.kl b/data/keyboards/Vendor_054c_Product_0268_Version_8000.kl
index 3d93f0f..d281b4b 100644
--- a/data/keyboards/Vendor_054c_Product_0268_Version_8000.kl
+++ b/data/keyboards/Vendor_054c_Product_0268_Version_8000.kl
@@ -55,3 +55,11 @@
 key 0x13b   BUTTON_START
 # PS key
 key 0x13c   BUTTON_MODE
+
+# SENSORs
+sensor 0x00 ACCELEROMETER X
+sensor 0x01 ACCELEROMETER Y
+sensor 0x02 ACCELEROMETER Z
+sensor 0x03 GYROSCOPE X
+sensor 0x04 GYROSCOPE Y
+sensor 0x05 GYROSCOPE Z
diff --git a/data/keyboards/Vendor_054c_Product_0268_Version_8100.kl b/data/keyboards/Vendor_054c_Product_0268_Version_8100.kl
index 3d93f0f..d281b4b 100644
--- a/data/keyboards/Vendor_054c_Product_0268_Version_8100.kl
+++ b/data/keyboards/Vendor_054c_Product_0268_Version_8100.kl
@@ -55,3 +55,11 @@
 key 0x13b   BUTTON_START
 # PS key
 key 0x13c   BUTTON_MODE
+
+# SENSORs
+sensor 0x00 ACCELEROMETER X
+sensor 0x01 ACCELEROMETER Y
+sensor 0x02 ACCELEROMETER Z
+sensor 0x03 GYROSCOPE X
+sensor 0x04 GYROSCOPE Y
+sensor 0x05 GYROSCOPE Z
diff --git a/data/keyboards/Vendor_054c_Product_0268_Version_8111.kl b/data/keyboards/Vendor_054c_Product_0268_Version_8111.kl
index 5fe35f7..3eafea0 100644
--- a/data/keyboards/Vendor_054c_Product_0268_Version_8111.kl
+++ b/data/keyboards/Vendor_054c_Product_0268_Version_8111.kl
@@ -55,3 +55,11 @@
 key 0x13b   BUTTON_START
 # PS key
 key 0x13c   BUTTON_MODE
+
+# SENSORs
+sensor 0x00 ACCELEROMETER X
+sensor 0x01 ACCELEROMETER Y
+sensor 0x02 ACCELEROMETER Z
+sensor 0x03 GYROSCOPE X
+sensor 0x04 GYROSCOPE Y
+sensor 0x05 GYROSCOPE Z
diff --git a/data/keyboards/Virtual.kcm b/data/keyboards/Virtual.kcm
index 9c55a2f..53308e3 100644
--- a/data/keyboards/Virtual.kcm
+++ b/data/keyboards/Virtual.kcm
@@ -25,12 +25,14 @@
     label:                              'A'
     base:                               'a'
     shift, capslock:                    'A'
+    shift+capslock:                     'a'
 }
 
 key B {
     label:                              'B'
     base:                               'b'
     shift, capslock:                    'B'
+    shift+capslock:                     'b'
 }
 
 key C {
@@ -39,12 +41,14 @@
     shift, capslock:                    'C'
     alt:                                '\u00e7'
     shift+alt:                          '\u00c7'
+    shift+capslock:                     'c'
 }
 
 key D {
     label:                              'D'
     base:                               'd'
     shift, capslock:                    'D'
+    shift+capslock:                     'd'
 }
 
 key E {
@@ -52,24 +56,28 @@
     base:                               'e'
     shift, capslock:                    'E'
     alt:                                '\u0301'
+    shift+capslock:                     'e'
 }
 
 key F {
     label:                              'F'
     base:                               'f'
     shift, capslock:                    'F'
+    shift+capslock:                     'f'
 }
 
 key G {
     label:                              'G'
     base:                               'g'
     shift, capslock:                    'G'
+    shift+capslock:                     'g'
 }
 
 key H {
     label:                              'H'
     base:                               'h'
     shift, capslock:                    'H'
+    shift+capslock:                     'h'
 }
 
 key I {
@@ -77,30 +85,35 @@
     base:                               'i'
     shift, capslock:                    'I'
     alt:                                '\u0302'
+    shift+capslock:                     'i'
 }
 
 key J {
     label:                              'J'
     base:                               'j'
     shift, capslock:                    'J'
+    shift+capslock:                     'j'
 }
 
 key K {
     label:                              'K'
     base:                               'k'
     shift, capslock:                    'K'
+    shift+capslock:                     'k'
 }
 
 key L {
     label:                              'L'
     base:                               'l'
     shift, capslock:                    'L'
+    shift+capslock:                     'l'
 }
 
 key M {
     label:                              'M'
     base:                               'm'
     shift, capslock:                    'M'
+    shift+capslock:                     'm'
 }
 
 key N {
@@ -108,30 +121,35 @@
     base:                               'n'
     shift, capslock:                    'N'
     alt:                                '\u0303'
+    shift+capslock:                     'n'
 }
 
 key O {
     label:                              'O'
     base:                               'o'
     shift, capslock:                    'O'
+    shift+capslock:                     'o'
 }
 
 key P {
     label:                              'P'
     base:                               'p'
     shift, capslock:                    'P'
+    shift+capslock:                     'p'
 }
 
 key Q {
     label:                              'Q'
     base:                               'q'
     shift, capslock:                    'Q'
+    shift+capslock:                     'q'
 }
 
 key R {
     label:                              'R'
     base:                               'r'
     shift, capslock:                    'R'
+    shift+capslock:                     'r'
 }
 
 key S {
@@ -139,12 +157,14 @@
     base:                               's'
     shift, capslock:                    'S'
     alt:                                '\u00df'
+    shift+capslock:                     's'
 }
 
 key T {
     label:                              'T'
     base:                               't'
     shift, capslock:                    'T'
+    shift+capslock:                     't'
 }
 
 key U {
@@ -152,36 +172,42 @@
     base:                               'u'
     shift, capslock:                    'U'
     alt:                                '\u0308'
+    shift+capslock:                     'u'
 }
 
 key V {
     label:                              'V'
     base:                               'v'
     shift, capslock:                    'V'
+    shift+capslock:                     'v'
 }
 
 key W {
     label:                              'W'
     base:                               'w'
     shift, capslock:                    'W'
+    shift+capslock:                     'w'
 }
 
 key X {
     label:                              'X'
     base:                               'x'
     shift, capslock:                    'X'
+    shift+capslock:                     'x'
 }
 
 key Y {
     label:                              'Y'
     base:                               'y'
     shift, capslock:                    'Y'
+    shift+capslock:                     'y'
 }
 
 key Z {
     label:                              'Z'
     base:                               'z'
     shift, capslock:                    'Z'
+    shift+capslock:                     'z'
 }
 
 key 0 {
diff --git a/errorprone/java/android/annotation/SdkConstant.java b/errorprone/java/android/annotation/SdkConstant.java
new file mode 100644
index 0000000..0a53186
--- /dev/null
+++ b/errorprone/java/android/annotation/SdkConstant.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.annotation;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates a constant field value should be exported to be used in the SDK tools.
+ * @hide
+ */
+@Target({ ElementType.FIELD })
+@Retention(RetentionPolicy.SOURCE)
+public @interface SdkConstant {
+    public static enum SdkConstantType {
+        ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE;
+    }
+
+    SdkConstantType value();
+}
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java
index f54782d..d1e4309 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java
@@ -26,40 +26,49 @@
 import static com.google.errorprone.matchers.Matchers.methodIsNamed;
 import static com.google.errorprone.matchers.Matchers.staticMethod;
 
+import android.annotation.RequiresPermission;
 import android.annotation.SuppressLint;
 
 import com.google.auto.service.AutoService;
+import com.google.common.base.Objects;
 import com.google.errorprone.BugPattern;
 import com.google.errorprone.VisitorState;
 import com.google.errorprone.bugpatterns.BugChecker;
+import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher;
 import com.google.errorprone.bugpatterns.BugChecker.MethodTreeMatcher;
 import com.google.errorprone.matchers.Description;
 import com.google.errorprone.matchers.Matcher;
 import com.google.errorprone.util.ASTHelpers;
+import com.sun.source.tree.AssignmentTree;
 import com.sun.source.tree.ClassTree;
 import com.sun.source.tree.ExpressionTree;
+import com.sun.source.tree.IdentifierTree;
+import com.sun.source.tree.MemberSelectTree;
 import com.sun.source.tree.MethodInvocationTree;
 import com.sun.source.tree.MethodTree;
+import com.sun.source.tree.NewClassTree;
+import com.sun.source.tree.Tree;
+import com.sun.source.tree.VariableTree;
 import com.sun.source.util.TreeScanner;
 import com.sun.tools.javac.code.Symbol;
 import com.sun.tools.javac.code.Symbol.ClassSymbol;
 import com.sun.tools.javac.code.Symbol.MethodSymbol;
+import com.sun.tools.javac.code.Symbol.VarSymbol;
 import com.sun.tools.javac.code.Type;
 import com.sun.tools.javac.code.Type.ClassType;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Predicate;
 import java.util.regex.Pattern;
 
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Name;
 
 /**
  * Inspects both the client and server side of AIDL interfaces to ensure that
@@ -71,9 +80,8 @@
     name = "AndroidFrameworkRequiresPermission",
     summary = "Verifies that @RequiresPermission annotations are consistent across AIDL",
     severity = WARNING)
-public final class RequiresPermissionChecker extends BugChecker implements MethodTreeMatcher {
-    private static final String ANNOTATION_REQUIRES_PERMISSION = "RequiresPermission";
-
+public final class RequiresPermissionChecker extends BugChecker
+        implements MethodTreeMatcher, MethodInvocationTreeMatcher {
     private static final Matcher<ExpressionTree> ENFORCE_VIA_CONTEXT = methodInvocation(
             instanceMethod()
                     .onDescendantOf("android.content.Context")
@@ -110,6 +118,18 @@
     private static final Matcher<ExpressionTree> RESTORE_CALL = methodInvocation(staticMethod()
             .onClass("android.os.Binder").withSignature("restoreCallingIdentity(long)"));
 
+    private static final Matcher<ExpressionTree> SEND_BROADCAST = methodInvocation(
+            instanceMethod()
+                    .onDescendantOf("android.content.Context")
+                    .withNameMatching(Pattern.compile("^send(Ordered|Sticky)?Broadcast.*$")));
+    private static final Matcher<ExpressionTree> SEND_PENDING_INTENT = methodInvocation(
+            instanceMethod()
+                    .onDescendantOf("android.app.PendingIntent")
+                    .named("send"));
+
+    private static final Matcher<ExpressionTree> INTENT_SET_ACTION = methodInvocation(
+            instanceMethod().onDescendantOf("android.content.Intent").named("setAction"));
+
     @Override
     public Description matchMethod(MethodTree tree, VisitorState state) {
         // Ignore methods without an implementation
@@ -166,7 +186,7 @@
         // to require; yell if we're too broad
         if (!actualPerm.containsAll(expectedPerm)) {
             return buildDescription(tree)
-                    .setMessage("Method  " + method.name.toString() + "() annotated " + expectedPerm
+                    .setMessage("Method " + method.name.toString() + "() annotated " + expectedPerm
                             + " but too wide; only invokes methods requiring " + actualPerm)
                     .build();
         }
@@ -174,6 +194,27 @@
         return Description.NO_MATCH;
     }
 
+    @Override
+    public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
+        if (SEND_BROADCAST.matches(tree, state)) {
+            final ParsedRequiresPermission sourcePerm =
+                    parseBroadcastSourceRequiresPermission(tree, state);
+            final ParsedRequiresPermission targetPerm =
+                    parseBroadcastTargetRequiresPermission(tree, state);
+            if (sourcePerm == null) {
+                return buildDescription(tree)
+                        .setMessage("Failed to resolve broadcast intent action for validation")
+                        .build();
+            } else if (!Objects.equal(sourcePerm, targetPerm)) {
+                return buildDescription(tree)
+                        .setMessage("Broadcast annotated " + sourcePerm + " but protected with "
+                                + targetPerm)
+                        .build();
+            }
+        }
+        return Description.NO_MATCH;
+    }
+
     static class ParsedRequiresPermission {
         final Set<String> allOf = new HashSet<>();
         final Set<String> anyOf = new HashSet<>();
@@ -203,6 +244,16 @@
         }
 
         @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof ParsedRequiresPermission) {
+                final ParsedRequiresPermission other = (ParsedRequiresPermission) obj;
+                return allOf.equals(other.allOf) && anyOf.equals(other.anyOf);
+            } else {
+                return false;
+            }
+        }
+
+        @Override
         public String toString() {
             if (isEmpty()) {
                 return "[none]";
@@ -215,39 +266,145 @@
             return res;
         }
 
+        public static ParsedRequiresPermission from(RequiresPermission perm) {
+            final ParsedRequiresPermission res = new ParsedRequiresPermission();
+            res.addAll(perm);
+            return res;
+        }
+
         public void addAll(ParsedRequiresPermission perm) {
+            if (perm == null) return;
             this.allOf.addAll(perm.allOf);
             this.anyOf.addAll(perm.anyOf);
         }
 
-        public void addAll(AnnotationMirror a) {
-            for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : a
-                    .getElementValues().entrySet()) {
-                if (entry.getKey().getSimpleName().contentEquals("value")) {
-                    maybeAdd(allOf, entry.getValue());
-                } else if (entry.getKey().getSimpleName().contentEquals("allOf")) {
-                    maybeAdd(allOf, entry.getValue());
-                } else if (entry.getKey().getSimpleName().contentEquals("anyOf")) {
-                    maybeAdd(anyOf, entry.getValue());
-                }
-            }
+        public void addAll(RequiresPermission perm) {
+            if (perm == null) return;
+            if (!perm.value().isEmpty()) this.allOf.add(perm.value());
+            if (perm.allOf() != null) this.allOf.addAll(Arrays.asList(perm.allOf()));
+            if (perm.anyOf() != null) this.anyOf.addAll(Arrays.asList(perm.anyOf()));
         }
 
-        private static void maybeAdd(Set<String> set, Object value) {
-            if (value instanceof AnnotationValue) {
-                maybeAdd(set, ((AnnotationValue) value).getValue());
-            } else if (value instanceof String) {
-                set.add((String) value);
-            } else if (value instanceof Collection) {
-                for (Object o : (Collection) value) {
-                    maybeAdd(set, o);
-                }
-            } else {
-                throw new RuntimeException(String.valueOf(value.getClass()));
+        public void addConstValue(Tree tree) {
+            final Object value = ASTHelpers.constValue(tree);
+            if (value != null) {
+                allOf.add(String.valueOf(value));
             }
         }
     }
 
+    private static ExpressionTree findArgumentByParameterName(MethodInvocationTree tree,
+            Predicate<String> paramName) {
+        final MethodSymbol sym = ASTHelpers.getSymbol(tree);
+        final List<VarSymbol> params = sym.getParameters();
+        for (int i = 0; i < params.size(); i++) {
+            if (paramName.test(params.get(i).name.toString())) {
+                return tree.getArguments().get(i);
+            }
+        }
+        return null;
+    }
+
+    private static Name resolveName(ExpressionTree tree) {
+        if (tree instanceof IdentifierTree) {
+            return ((IdentifierTree) tree).getName();
+        } else if (tree instanceof MemberSelectTree) {
+            return resolveName(((MemberSelectTree) tree).getExpression());
+        } else {
+            return null;
+        }
+    }
+
+    private static ParsedRequiresPermission parseIntentAction(NewClassTree tree) {
+        final Optional<? extends ExpressionTree> arg = tree.getArguments().stream().findFirst();
+        if (arg.isPresent()) {
+            return ParsedRequiresPermission.from(
+                    ASTHelpers.getAnnotation(arg.get(), RequiresPermission.class));
+        } else {
+            return null;
+        }
+    }
+
+    private static ParsedRequiresPermission parseIntentAction(MethodInvocationTree tree) {
+        return ParsedRequiresPermission.from(ASTHelpers.getAnnotation(
+                tree.getArguments().get(0), RequiresPermission.class));
+    }
+
+    private static ParsedRequiresPermission parseBroadcastSourceRequiresPermission(
+            MethodInvocationTree methodTree, VisitorState state) {
+        final ExpressionTree arg = findArgumentByParameterName(methodTree,
+                (name) -> name.toLowerCase().contains("intent"));
+        if (arg instanceof IdentifierTree) {
+            final Name argName = ((IdentifierTree) arg).getName();
+            final MethodTree method = state.findEnclosing(MethodTree.class);
+            final AtomicReference<ParsedRequiresPermission> res = new AtomicReference<>();
+            method.accept(new TreeScanner<Void, Void>() {
+                private ParsedRequiresPermission last;
+
+                @Override
+                public Void visitMethodInvocation(MethodInvocationTree tree, Void param) {
+                    if (Objects.equal(methodTree, tree)) {
+                        res.set(last);
+                    } else {
+                        final Name name = resolveName(tree.getMethodSelect());
+                        if (Objects.equal(argName, name)
+                                && INTENT_SET_ACTION.matches(tree, state)) {
+                            last = parseIntentAction(tree);
+                        }
+                    }
+                    return super.visitMethodInvocation(tree, param);
+                }
+
+                @Override
+                public Void visitAssignment(AssignmentTree tree, Void param) {
+                    final Name name = resolveName(tree.getVariable());
+                    final Tree init = tree.getExpression();
+                    if (Objects.equal(argName, name)
+                            && init instanceof NewClassTree) {
+                        last = parseIntentAction((NewClassTree) init);
+                    }
+                    return super.visitAssignment(tree, param);
+                }
+
+                @Override
+                public Void visitVariable(VariableTree tree, Void param) {
+                    final Name name = tree.getName();
+                    final ExpressionTree init = tree.getInitializer();
+                    if (Objects.equal(argName, name)
+                            && init instanceof NewClassTree) {
+                        last = parseIntentAction((NewClassTree) init);
+                    }
+                    return super.visitVariable(tree, param);
+                }
+            }, null);
+            return res.get();
+        }
+        return null;
+    }
+
+    private static ParsedRequiresPermission parseBroadcastTargetRequiresPermission(
+            MethodInvocationTree tree, VisitorState state) {
+        final ExpressionTree arg = findArgumentByParameterName(tree,
+                (name) -> name.toLowerCase().contains("permission"));
+        final ParsedRequiresPermission res = new ParsedRequiresPermission();
+        if (arg != null) {
+            arg.accept(new TreeScanner<Void, Void>() {
+                @Override
+                public Void visitIdentifier(IdentifierTree tree, Void param) {
+                    res.addConstValue(tree);
+                    return super.visitIdentifier(tree, param);
+                }
+
+                @Override
+                public Void visitMemberSelect(MemberSelectTree tree, Void param) {
+                    res.addConstValue(tree);
+                    return super.visitMemberSelect(tree, param);
+                }
+            }, null);
+        }
+        return res;
+    }
+
     private static ParsedRequiresPermission parseRequiresPermissionRecursively(
             MethodInvocationTree tree, VisitorState state) {
         if (ENFORCE_VIA_CONTEXT.matches(tree, state)) {
@@ -276,12 +433,7 @@
 
         final ParsedRequiresPermission res = new ParsedRequiresPermission();
         for (MethodSymbol symbol : symbols) {
-            for (AnnotationMirror a : symbol.getAnnotationMirrors()) {
-                if (a.getAnnotationType().asElement().getSimpleName()
-                        .contentEquals(ANNOTATION_REQUIRES_PERMISSION)) {
-                    res.addAll(a);
-                }
-            }
+            res.addAll(symbol.getAnnotation(RequiresPermission.class));
         }
         return res;
     }
diff --git a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java
index c877230..1679bb6 100644
--- a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java
+++ b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java
@@ -38,6 +38,7 @@
         compilationHelper
                 .addSourceFile("/android/annotation/SystemService.java")
                 .addSourceFile("/android/content/Context.java")
+                .addSourceFile("/android/content/Intent.java")
                 .addSourceFile("/android/foo/IFooService.java")
                 .addSourceFile("/android/os/IInterface.java")
                 .addSourceFile("/android/os/RemoteException.java")
@@ -68,6 +69,7 @@
         compilationHelper
                 .addSourceFile("/android/annotation/SystemService.java")
                 .addSourceFile("/android/content/Context.java")
+                .addSourceFile("/android/content/Intent.java")
                 .addSourceFile("/android/foo/IFooService.java")
                 .addSourceFile("/android/os/IInterface.java")
                 .addSourceFile("/android/os/UserHandle.java")
@@ -98,6 +100,7 @@
         compilationHelper
                 .addSourceFile("/android/annotation/SystemService.java")
                 .addSourceFile("/android/content/Context.java")
+                .addSourceFile("/android/content/Intent.java")
                 .addSourceFile("/android/foo/IFooService.java")
                 .addSourceFile("/android/os/IInterface.java")
                 .addSourceFile("/android/os/UserHandle.java")
@@ -124,6 +127,7 @@
         compilationHelper
                 .addSourceFile("/android/annotation/SystemService.java")
                 .addSourceFile("/android/content/Context.java")
+                .addSourceFile("/android/content/Intent.java")
                 .addSourceFile("/android/foo/IFooService.java")
                 .addSourceFile("/android/os/IInterface.java")
                 .addSourceFile("/android/os/UserHandle.java")
diff --git a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java
index 771258d..388988e 100644
--- a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java
+++ b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java
@@ -81,6 +81,7 @@
         compilationHelper
                 .addSourceFile("/android/annotation/RequiresPermission.java")
                 .addSourceFile("/android/content/Context.java")
+                .addSourceFile("/android/content/Intent.java")
                 .addSourceLines("ColorManager.java",
                         "import android.annotation.RequiresPermission;",
                         "import android.content.Context;",
@@ -139,6 +140,7 @@
         compilationHelper
                 .addSourceFile("/android/annotation/RequiresPermission.java")
                 .addSourceFile("/android/content/Context.java")
+                .addSourceFile("/android/content/Intent.java")
                 .addSourceFile("/android/foo/IColorService.java")
                 .addSourceFile("/android/os/IInterface.java")
                 .addSourceLines("ColorService.java",
@@ -322,4 +324,95 @@
                         "}")
                 .doTest();
     }
+
+    @Test
+    public void testSendBroadcast() {
+        compilationHelper
+                .addSourceFile("/android/annotation/RequiresPermission.java")
+                .addSourceFile("/android/annotation/SdkConstant.java")
+                .addSourceFile("/android/content/Context.java")
+                .addSourceFile("/android/content/Intent.java")
+                .addSourceLines("FooManager.java",
+                        "import android.annotation.RequiresPermission;",
+                        "import android.annotation.SdkConstant;",
+                        "import android.content.Context;",
+                        "import android.content.Intent;",
+                        "public class FooManager {",
+                        "  private static final String PERMISSION_RED = \"red\";",
+                        "  private static final String PERMISSION_BLUE = \"blue\";",
+                        "  @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)",
+                        "  private static final String ACTION_NONE = \"none\";",
+                        "  @RequiresPermission(PERMISSION_RED)",
+                        "  @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)",
+                        "  private static final String ACTION_RED = \"red\";",
+                        "  @RequiresPermission(allOf={PERMISSION_RED,PERMISSION_BLUE})",
+                        "  @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)",
+                        "  private static final String ACTION_RED_BLUE = \"red_blue\";",
+                        "  public void exampleNone(Context context) {",
+                        "    Intent intent = new Intent(ACTION_NONE);",
+                        "    context.sendBroadcast(intent);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcast(intent, PERMISSION_RED);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { PERMISSION_RED });",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { PERMISSION_RED, PERMISSION_BLUE });",
+                        "  }",
+                        "  public void exampleRed(Context context) {",
+                        "    Intent intent = new Intent(FooManager.ACTION_RED);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcast(intent);",
+                        "    context.sendBroadcast(intent, FooManager.PERMISSION_RED);",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { FooManager.PERMISSION_RED });",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { FooManager.PERMISSION_RED, PERMISSION_BLUE });",
+                        "  }",
+                        "  public void exampleRedBlue(Context context) {",
+                        "    Intent intent = new Intent(ACTION_RED_BLUE);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcast(intent);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcast(intent, PERMISSION_RED);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { PERMISSION_RED });",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { PERMISSION_RED, PERMISSION_BLUE });",
+                        "  }",
+                        "  public void exampleUnknown(Context context, Intent intent) {",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcast(intent);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcast(intent, PERMISSION_RED);",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { PERMISSION_RED });",
+                        "    // BUG: Diagnostic contains:",
+                        "    context.sendBroadcastWithMultiplePermissions(intent,",
+                        "        new String[] { PERMISSION_RED, PERMISSION_BLUE });",
+                        "  }",
+                        "  public void exampleReuse(Context context) {",
+                        "    Intent intent = new Intent(ACTION_RED);",
+                        "    context.sendBroadcast(intent, PERMISSION_RED);",
+                        "    intent = new Intent(ACTION_NONE);",
+                        "    context.sendBroadcast(intent);",
+                        "    intent.setAction(ACTION_RED);",
+                        "    context.sendBroadcast(intent, PERMISSION_RED);",
+                        "  }",
+                        "  public void exampleScoped(Context context) {",
+                        "    if (true) {",
+                        "      Intent intent = new Intent(ACTION_RED);",
+                        "      context.sendBroadcast(intent, PERMISSION_RED);",
+                        "    } else {",
+                        "      Intent intent = new Intent(ACTION_NONE);",
+                        "      context.sendBroadcast(intent);",
+                        "    }",
+                        "  }",
+                        "}")
+                .doTest();
+    }
 }
diff --git a/errorprone/tests/res/android/annotation/SdkConstant.java b/errorprone/tests/res/android/annotation/SdkConstant.java
new file mode 100644
index 0000000..0a53186
--- /dev/null
+++ b/errorprone/tests/res/android/annotation/SdkConstant.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.annotation;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates a constant field value should be exported to be used in the SDK tools.
+ * @hide
+ */
+@Target({ ElementType.FIELD })
+@Retention(RetentionPolicy.SOURCE)
+public @interface SdkConstant {
+    public static enum SdkConstantType {
+        ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE;
+    }
+
+    SdkConstantType value();
+}
diff --git a/errorprone/tests/res/android/content/Context.java b/errorprone/tests/res/android/content/Context.java
index 323b8dd..efc4fb1 100644
--- a/errorprone/tests/res/android/content/Context.java
+++ b/errorprone/tests/res/android/content/Context.java
@@ -18,9 +18,22 @@
 
 public class Context {
     public int getUserId() {
-        return 0;
+        throw new UnsupportedOperationException();
     }
 
     public void enforceCallingOrSelfPermission(String permission, String message) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void sendBroadcast(Intent intent) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void sendBroadcast(Intent intent, String receiverPermission) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void sendBroadcastWithMultiplePermissions(Intent intent, String[] receiverPermissions) {
+        throw new UnsupportedOperationException();
     }
 }
diff --git a/errorprone/tests/res/android/content/Intent.java b/errorprone/tests/res/android/content/Intent.java
index 9d22d04..288396e 100644
--- a/errorprone/tests/res/android/content/Intent.java
+++ b/errorprone/tests/res/android/content/Intent.java
@@ -17,4 +17,11 @@
 package android.content;
 
 public class Intent {
+    public Intent(String action) {
+        throw new UnsupportedOperationException();
+    }
+
+    public Intent setAction(String action) {
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java
index 13e2692..7f5b752 100644
--- a/graphics/java/android/graphics/FontListParser.java
+++ b/graphics/java/android/graphics/FontListParser.java
@@ -225,7 +225,14 @@
             }
         }
         String sanitizedName = FILENAME_WHITESPACE_PATTERN.matcher(filename).replaceAll("");
-        String updatedName = findUpdatedFontFile(sanitizedName, updatableFontMap);
+
+        if (postScriptName == null) {
+            // If post script name was not provided, assume the file name is same to PostScript
+            // name.
+            postScriptName = sanitizedName.substring(0, sanitizedName.length() - 4);
+        }
+
+        String updatedName = findUpdatedFontFile(postScriptName, updatableFontMap);
         String filePath;
         String originalPath;
         if (updatedName != null) {
@@ -246,12 +253,7 @@
 
         File file = new File(filePath);
 
-        if (postScriptName == null) {
-            // If post script name was not provided, assume the file name is same to PostScript
-            // name.
-            String name = file.getName();
-            postScriptName = name.substring(0, name.length() - 4);
-        }
+
 
         return new FontConfig.Font(file,
                 originalPath == null ? null : new File(originalPath),
@@ -265,10 +267,10 @@
                 fallbackFor);
     }
 
-    private static String findUpdatedFontFile(String name,
+    private static String findUpdatedFontFile(String psName,
             @Nullable Map<String, File> updatableFontMap) {
         if (updatableFontMap != null) {
-            File updatedFile = updatableFontMap.get(name);
+            File updatedFile = updatableFontMap.get(psName);
             if (updatedFile != null) {
                 return updatedFile.getAbsolutePath();
             }
diff --git a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
index 20cd825..423e66c 100644
--- a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
@@ -48,6 +48,12 @@
         setColorStateList(colorStateList);
     }
 
+    private ColorStateListDrawable(@NonNull ColorStateListDrawableState state) {
+        mState = state;
+        initializeColorDrawable();
+        onStateChange(getState());
+    }
+
     @Override
     public void draw(@NonNull Canvas canvas) {
         mColorDrawable.draw(canvas);
@@ -286,11 +292,6 @@
         }
     }
 
-    private ColorStateListDrawable(@NonNull ColorStateListDrawableState state) {
-        mState = state;
-        initializeColorDrawable();
-    }
-
     private void initializeColorDrawable() {
         mColorDrawable = new ColorDrawable();
         mColorDrawable.setCallback(this);
diff --git a/graphics/java/android/graphics/drawable/RippleAnimationSession.java b/graphics/java/android/graphics/drawable/RippleAnimationSession.java
index 1cd4cf1..60f73b5 100644
--- a/graphics/java/android/graphics/drawable/RippleAnimationSession.java
+++ b/graphics/java/android/graphics/drawable/RippleAnimationSession.java
@@ -39,7 +39,7 @@
 public final class RippleAnimationSession {
     private static final String TAG = "RippleAnimationSession";
     private static final int ENTER_ANIM_DURATION = 450;
-    private static final int EXIT_ANIM_DURATION = 300;
+    private static final int EXIT_ANIM_DURATION = 225;
     private static final long NOISE_ANIMATION_DURATION = 7000;
     private static final long MAX_NOISE_PHASE = NOISE_ANIMATION_DURATION / 120;
     private static final TimeInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index 29fa09d..895cd3e 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -23,6 +23,7 @@
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import android.animation.ValueAnimator;
+import android.annotation.ColorInt;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -960,9 +961,11 @@
         float radius = getComputedRadius();
         RippleAnimationSession.AnimationProperties<Float, Paint> properties;
         RippleShader shader = new RippleShader();
-        final int color = mMaskColorFilter == null
+        // Grab the color for the current state and cut the alpha channel in
+        // half so that the ripple and background together yield full alpha.
+        final int color = clampAlpha(mMaskColorFilter == null
                 ? mState.mColor.getColorForState(getState(), Color.BLACK)
-                : mMaskColorFilter.getColor();
+                : mMaskColorFilter.getColor());
         final int effectColor = mState.mEffectColor.getColorForState(getState(), Color.MAGENTA);
         shader.setColor(color, effectColor);
         shader.setOrigin(cx, cy);
@@ -984,6 +987,13 @@
         return properties;
     }
 
+    private int clampAlpha(@ColorInt int color) {
+        if (Color.alpha(color) > 128) {
+            return  (color & 0x00FFFFFF) | 0x80000000;
+        }
+        return color;
+    }
+
     private boolean shouldUseCanvasProps(Canvas c) {
         return !mForceSoftware && c.isHardwareAccelerated();
     }
@@ -1194,10 +1204,7 @@
 
         // Grab the color for the current state and cut the alpha channel in
         // half so that the ripple and background together yield full alpha.
-        int color = mState.mColor.getColorForState(getState(), Color.BLACK);
-        if (Color.alpha(color) > 128) {
-            color = (color & 0x00FFFFFF) | 0x80000000;
-        }
+        final int color = clampAlpha(mState.mColor.getColorForState(getState(), Color.BLACK));
         final Paint p = mRipplePaint;
 
         if (mMaskColorFilter != null) {
diff --git a/graphics/java/android/graphics/drawable/RippleShader.java b/graphics/java/android/graphics/drawable/RippleShader.java
index a0aa41e..2b4d5b4 100644
--- a/graphics/java/android/graphics/drawable/RippleShader.java
+++ b/graphics/java/android/graphics/drawable/RippleShader.java
@@ -102,8 +102,8 @@
     private static final String SHADER_MAIN = "vec4 main(vec2 p) {\n"
             + "    float fadeIn = subProgress(0., 0.1, in_progress);\n"
             + "    float scaleIn = subProgress(0., 0.45, in_progress);\n"
-            + "    float fadeOutNoise = subProgress(0.5, 1., in_progress);\n"
-            + "    float fadeOutRipple = subProgress(0.5, 0.75, in_progress);\n"
+            + "    float fadeOutNoise = subProgress(0.5, 0.95, in_progress);\n"
+            + "    float fadeOutRipple = subProgress(0.5, 1., in_progress);\n"
             + "    vec2 center = mix(in_touch, in_origin, scaleIn);\n"
             + "    float ring = softRing(p, center, in_maxRadius, scaleIn, 0.45);\n"
             + "    float alpha = min(fadeIn, 1. - fadeOutNoise);\n"
@@ -115,7 +115,7 @@
             + "    float fade = min(fadeIn, 1. - fadeOutRipple);\n"
             + "    vec4 circle = in_color * (softCircle(p, center, in_maxRadius "
             + "      * scaleIn, 0.2) * fade);\n"
-            + "    float mask = in_hasMask == 1. ? sample(in_shader).a > 0. ? 1. : 0. : 1.;\n"
+            + "    float mask = in_hasMask == 1. ? sample(in_shader, p).a > 0. ? 1. : 0. : 1.;\n"
             + "    return mix(circle, in_sparkleColor, sparkle) * mask;\n"
             + "}";
     private static final String SHADER = SHADER_UNIFORMS + SHADER_LIB + SHADER_MAIN;
@@ -210,7 +210,7 @@
     }
 
     public void setResolution(float w, float h, int density) {
-        final float densityScale = density * DisplayMetrics.DENSITY_DEFAULT_SCALE * 1.25f;
+        final float densityScale = density * DisplayMetrics.DENSITY_DEFAULT_SCALE;
         setUniform("in_resolutionScale", new float[] {1f / w, 1f / h});
         setUniform("in_noiseScale", new float[] {densityScale / w, densityScale / h});
     }
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 9298d9fc..4065bd1 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -349,15 +349,19 @@
     private final Rect mTmpBounds = new Rect();
 
     public VectorDrawable() {
-        this(new VectorDrawableState(null), null);
+        this(null, null);
     }
 
     /**
      * The one constructor to rule them all. This is called by all public
      * constructors to set the state and initialize local properties.
      */
-    private VectorDrawable(@NonNull VectorDrawableState state, @Nullable Resources res) {
-        mVectorState = state;
+    private VectorDrawable(@Nullable VectorDrawableState state, @Nullable Resources res) {
+        // As the mutable, not-thread-safe native instance is stored in VectorDrawableState, we
+        // need to always do a defensive copy even if mutate() isn't called. Otherwise
+        // draw() being called on 2 different VectorDrawable instances could still hit the same
+        // underlying native object.
+        mVectorState = new VectorDrawableState(state);
         updateLocalState(res);
     }
 
diff --git a/keystore/java/android/security/AndroidKeyStoreMaintenance.java b/keystore/java/android/security/AndroidKeyStoreMaintenance.java
index 82639de..919a93b 100644
--- a/keystore/java/android/security/AndroidKeyStoreMaintenance.java
+++ b/keystore/java/android/security/AndroidKeyStoreMaintenance.java
@@ -22,6 +22,7 @@
 import android.os.ServiceSpecificException;
 import android.security.maintenance.IKeystoreMaintenance;
 import android.system.keystore2.Domain;
+import android.system.keystore2.KeyDescriptor;
 import android.system.keystore2.ResponseCode;
 import android.util.Log;
 
@@ -33,6 +34,9 @@
     private static final String TAG = "AndroidKeyStoreMaintenance";
 
     public static final int SYSTEM_ERROR = ResponseCode.SYSTEM_ERROR;
+    public static final int INVALID_ARGUMENT = ResponseCode.INVALID_ARGUMENT;
+    public static final int PERMISSION_DENIED = ResponseCode.PERMISSION_DENIED;
+    public static final int KEY_NOT_FOUND = ResponseCode.KEY_NOT_FOUND;
 
     private static IKeystoreMaintenance getService() {
         return IKeystoreMaintenance.Stub.asInterface(
@@ -148,4 +152,35 @@
             Log.e(TAG, "Error while reporting device off body event.", e);
         }
     }
+
+    /**
+     * Migrates a key given by the source descriptor to the location designated by the destination
+     * descriptor.
+     *
+     * @param source - The key to migrate may be specified by Domain.APP, Domain.SELINUX, or
+     *               Domain.KEY_ID. The caller needs the permissions use, delete, and grant for the
+     *               source namespace.
+     * @param destination - The new designation for the key may be specified by Domain.APP or
+     *                    Domain.SELINUX. The caller need the permission rebind for the destination
+     *                    namespace.
+     *
+     * @return * 0 on success
+     *         * KEY_NOT_FOUND if the source did not exists.
+     *         * PERMISSION_DENIED if any of the required permissions was missing.
+     *         * INVALID_ARGUMENT if the destination was occupied or any domain value other than
+     *                   the allowed once were specified.
+     *         * SYSTEM_ERROR if an unexpected error occurred.
+     */
+    public static int migrateKeyNamespace(KeyDescriptor source, KeyDescriptor destination) {
+        try {
+            getService().migrateKeyNamespace(source, destination);
+            return 0;
+        } catch (ServiceSpecificException e) {
+            Log.e(TAG, "migrateKeyNamespace failed", e);
+            return e.errorCode;
+        } catch (Exception e) {
+            Log.e(TAG, "Can not connect to keystore", e);
+            return SYSTEM_ERROR;
+        }
+    }
 }
diff --git a/keystore/java/android/security/AppUriAuthenticationPolicy.java b/keystore/java/android/security/AppUriAuthenticationPolicy.java
index df79912..b3a8971 100644
--- a/keystore/java/android/security/AppUriAuthenticationPolicy.java
+++ b/keystore/java/android/security/AppUriAuthenticationPolicy.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.Activity;
 import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -27,6 +28,7 @@
 import org.xmlpull.v1.XmlSerializer;
 
 import java.io.IOException;
+import java.security.Principal;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -89,6 +91,13 @@
          * <p>
          * If this method is called with a package name and URI that was previously added, the
          * previous alias will be overwritten.
+         * <p>
+         * When the system tries to determine which alias to return to a requesting app calling
+         * {@code KeyChain.choosePrivateKeyAlias}, it will choose the alias whose associated URI
+         * exactly matches the URI provided in {@link KeyChain#choosePrivateKeyAlias(
+         * Activity, KeyChainAliasCallback, String[], Principal[], Uri, String)} or the URI
+         * built from the host and port provided in {@link KeyChain#choosePrivateKeyAlias(
+         * Activity, KeyChainAliasCallback, String[], Principal[], String, int, String)}.
          *
          * @param appPackageName The app's package name to authenticate the user to.
          * @param uri            The URI to authenticate the user to.
diff --git a/keystore/java/android/security/Authorization.java b/keystore/java/android/security/Authorization.java
index bd72d45..00219e7 100644
--- a/keystore/java/android/security/Authorization.java
+++ b/keystore/java/android/security/Authorization.java
@@ -74,16 +74,19 @@
      * @param locked            - whether it is a lock (true) or unlock (false) event
      * @param syntheticPassword - if it is an unlock event with the password, pass the synthetic
      *                            password provided by the LockSettingService
+     * @param unlockingSids     - KeyMint secure user IDs that should be permitted to unlock
+     *                            UNLOCKED_DEVICE_REQUIRED keys.
      *
      * @return 0 if successful or a {@code ResponseCode}.
      */
     public static int onLockScreenEvent(@NonNull boolean locked, @NonNull int userId,
-            @Nullable byte[] syntheticPassword) {
+            @Nullable byte[] syntheticPassword, @Nullable long[] unlockingSids) {
         try {
             if (locked) {
-                getService().onLockScreenEvent(LockScreenEvent.LOCK, userId, null);
+                getService().onLockScreenEvent(LockScreenEvent.LOCK, userId, null, unlockingSids);
             } else {
-                getService().onLockScreenEvent(LockScreenEvent.UNLOCK, userId, syntheticPassword);
+                getService().onLockScreenEvent(
+                        LockScreenEvent.UNLOCK, userId, syntheticPassword, unlockingSids);
             }
             return 0;
         } catch (RemoteException | NullPointerException e) {
diff --git a/keystore/java/android/security/IKeyChainService.aidl b/keystore/java/android/security/IKeyChainService.aidl
index 091f579..6d3d84c 100644
--- a/keystore/java/android/security/IKeyChainService.aidl
+++ b/keystore/java/android/security/IKeyChainService.aidl
@@ -66,7 +66,8 @@
     boolean isCredentialManagementApp(String packageName);
 
     // APIs used by KeyChainActivity
-    void setGrant(int uid, String alias, boolean value);
+    // setGrant may fail with value=false when ungrant operation fails in KeyStore.
+    boolean setGrant(int uid, String alias, boolean value);
     boolean hasGrant(int uid, String alias);
 
     // API used by Wifi
diff --git a/keystore/java/android/security/keystore/KeyProperties.java b/keystore/java/android/security/keystore/KeyProperties.java
index 682d12a..d9a7994 100644
--- a/keystore/java/android/security/keystore/KeyProperties.java
+++ b/keystore/java/android/security/keystore/KeyProperties.java
@@ -904,6 +904,7 @@
     @IntDef(prefix = { "NAMESPACE_" }, value = {
             NAMESPACE_APPLICATION,
             NAMESPACE_WIFI,
+            NAMESPACE_LOCKSETTINGS,
     })
     public @interface Namespace {}
 
@@ -925,6 +926,13 @@
     public static final int NAMESPACE_WIFI = 102;
 
     /**
+     * The namespace identifier for the LOCKSETTINGS Keystore namespace.
+     * This must be kept in sync with system/sepolicy/private/keystore2_key_contexts
+     * @hide
+     */
+    public static final int NAMESPACE_LOCKSETTINGS = 103;
+
+    /**
      * For legacy support, translate namespaces into known UIDs.
      * @hide
      */
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
index 9d8a5ef..e808c5c 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
@@ -579,7 +579,11 @@
     protected final byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen)
             throws IllegalBlockSizeException, BadPaddingException {
         if (mCipher != null) {
-            return mCipher.doFinal(input, inputOffset, inputLen);
+            if (input == null && inputLen == 0) {
+                return mCipher.doFinal();
+            } else {
+                return mCipher.doFinal(input, inputOffset, inputLen);
+            }
         }
 
         if (mCachedException != null) {
diff --git a/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java b/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
index 0006b92..850c551 100644
--- a/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
+++ b/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
@@ -40,6 +40,7 @@
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
 /**
  * Assorted utility methods for implementing crypto operations on top of KeyStore.
@@ -49,6 +50,7 @@
 abstract class KeyStoreCryptoOperationUtils {
 
     private static volatile SecureRandom sRng;
+    private static final Random sRandom = new Random();
 
     private KeyStoreCryptoOperationUtils() {}
 
@@ -211,7 +213,7 @@
         } else {
             // Keystore won't give us an operation challenge if the operation doesn't
             // need user authorization. So we make our own.
-            return Math.randomLongInternal();
+            return sRandom.nextLong();
         }
     }
 }
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/SampleExtensionImpl.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/SampleExtensionImpl.java
index ce9be6a..a0d5b00 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/SampleExtensionImpl.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/SampleExtensionImpl.java
@@ -69,21 +69,15 @@
                 new ResourceConfigDisplayFeatureProducer(context)
         ));
 
-        mDevicePostureProducer.addDataChangedCallback(this::onDevicePostureChanged);
+        mDevicePostureProducer.addDataChangedCallback(this::onDisplayFeaturesChanged);
         mDisplayFeatureProducer.addDataChangedCallback(this::onDisplayFeaturesChanged);
     }
 
-    private void onDevicePostureChanged() {
-        updateDeviceState(new ExtensionDeviceState(getDevicePosture()));
-
-        // Trigger a change in display features as the posture will be used in place of the feature
-        // state if the state is left unset by the producer.
-        onDisplayFeaturesChanged();
-    }
-
-    private int getDevicePosture() {
+    private int getFeatureState(DisplayFeature feature) {
+        Integer featureState = feature.getState();
         Optional<Integer> posture = mDevicePostureProducer.getData();
-        return posture.orElse(ExtensionDeviceState.POSTURE_UNKNOWN);
+        int fallbackPosture = posture.orElse(ExtensionFoldingFeature.STATE_FLAT);
+        return featureState == null ? fallbackPosture : featureState;
     }
 
     private void onDisplayFeaturesChanged() {
@@ -115,17 +109,14 @@
 
         Optional<List<DisplayFeature>> storedFeatures = mDisplayFeatureProducer.getData();
         if (storedFeatures.isPresent()) {
-            int posture = getDevicePosture();
 
             for (DisplayFeature baseFeature : storedFeatures.get()) {
                 Rect featureRect = baseFeature.getRect();
                 rotateRectToDisplayRotation(displayId, featureRect);
                 transformToWindowSpaceRect(activity, featureRect);
 
-                Integer featureState = baseFeature.getState();
-
                 features.add(new ExtensionFoldingFeature(featureRect, baseFeature.getType(),
-                        featureState == null ? posture : featureState));
+                        getFeatureState(baseFeature)));
             }
         }
         return features;
@@ -141,7 +132,6 @@
             mSettingsDisplayFeatureProducer.unregisterObserversIfNeeded();
         }
 
-        onDevicePostureChanged();
         onDisplayFeaturesChanged();
     }
 }
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/StubExtension.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/StubExtension.java
index b0895ef..6a53efe 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/StubExtension.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/StubExtension.java
@@ -31,7 +31,6 @@
 
     private ExtensionCallback mExtensionCallback;
     private final Set<Activity> mWindowLayoutChangeListenerActivities = new HashSet<>();
-    private boolean mDeviceStateChangeListenerRegistered;
 
     StubExtension() {
     }
@@ -53,18 +52,6 @@
         this.onListenersChanged();
     }
 
-    @Override
-    public void onDeviceStateListenersChanged(boolean isEmpty) {
-        this.mDeviceStateChangeListenerRegistered = !isEmpty;
-        this.onListenersChanged();
-    }
-
-    void updateDeviceState(ExtensionDeviceState newState) {
-        if (this.mExtensionCallback != null) {
-            mExtensionCallback.onDeviceStateChanged(newState);
-        }
-    }
-
     void updateWindowLayout(@NonNull Activity activity,
             @NonNull ExtensionWindowLayoutInfo newLayout) {
         if (this.mExtensionCallback != null) {
@@ -78,8 +65,7 @@
     }
 
     protected boolean hasListeners() {
-        return !mWindowLayoutChangeListenerActivities.isEmpty()
-                || mDeviceStateChangeListenerRegistered;
+        return !mWindowLayoutChangeListenerActivities.isEmpty();
     }
 
     protected abstract void onListenersChanged();
diff --git a/libs/WindowManager/Jetpack/window-extensions-release.aar b/libs/WindowManager/Jetpack/window-extensions-release.aar
index 7b306b0..be6652d 100644
--- a/libs/WindowManager/Jetpack/window-extensions-release.aar
+++ b/libs/WindowManager/Jetpack/window-extensions-release.aar
Binary files differ
diff --git a/libs/WindowManager/Jetpack/window-sidecar-release.aar b/libs/WindowManager/Jetpack/window-sidecar-release.aar
index 50f101d..9d6baee 100644
--- a/libs/WindowManager/Jetpack/window-sidecar-release.aar
+++ b/libs/WindowManager/Jetpack/window-sidecar-release.aar
Binary files differ
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp
index 18f019d..9aaef3b 100644
--- a/libs/WindowManager/Shell/Android.bp
+++ b/libs/WindowManager/Shell/Android.bp
@@ -129,6 +129,4 @@
     ],
     kotlincflags: ["-Xjvm-default=enable"],
     manifest: "AndroidManifest.xml",
-
-    min_sdk_version: "26",
 }
diff --git a/libs/WindowManager/Shell/lint-baseline.xml b/libs/WindowManager/Shell/lint-baseline.xml
deleted file mode 100644
index 06094ff..0000000
--- a/libs/WindowManager/Shell/lint-baseline.xml
+++ /dev/null
@@ -1,5471 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.1.0" client="cli" variant="all" version="4.1.0">
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        return mRootTaskInfo != null ? mRootTaskInfo.taskId : INVALID_TASK_ID;"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="73"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        return mTaskInfo1 != null ? mTaskInfo1.taskId : INVALID_TASK_ID;"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="77"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        return mTaskInfo2 != null ? mTaskInfo2.taskId : INVALID_TASK_ID;"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="81"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = task1.taskId; long protoLogParam1 = task2.taskId; String protoLogParam2 = String.valueOf(this); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -742394458, 5, null, protoLogParam0, protoLogParam1, protoLogParam2); "
-        errorLine2="                                                                                                                ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="89"
-            column="113"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = task1.taskId; long protoLogParam1 = task2.taskId; String protoLogParam2 = String.valueOf(this); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -742394458, 5, null, protoLogParam0, protoLogParam1, protoLogParam2); "
-        errorLine2="                                                                                                                                                    ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="89"
-            column="149"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="                b -> b.setParent(mRootTaskLeash), mDisplayImeController);"
-        errorLine2="                       ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="105"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mRootTaskInfo == null || taskInfo.taskId == mRootTaskInfo.taskId) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="151"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mRootTaskInfo == null || taskInfo.taskId == mRootTaskInfo.taskId) {"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="151"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.taskId == getTaskId1()) {"
-        errorLine2="                   ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="154"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.taskId == getTaskId2()) {"
-        errorLine2="                   ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="157"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            throw new IllegalStateException(&quot;Unknown task=&quot; + taskInfo.taskId);"
-        errorLine2="                                                              ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="161"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="            t.setLayer(dividerLeash, Integer.MAX_VALUE)"
-        errorLine2="              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="172"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (taskInfo.taskId == getRootTaskId()) {"
-        errorLine2="            ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="186"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.taskId == getTaskId1()) {"
-        errorLine2="                   ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="202"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.taskId == getTaskId2()) {"
-        errorLine2="                   ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="204"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            throw new IllegalStateException(&quot;Unknown task=&quot; + taskInfo.taskId);"
-        errorLine2="                                                              ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="207"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (taskInfo.taskId == getRootTaskId()) {"
-        errorLine2="            ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="213"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mController.unpair(mRootTaskInfo.taskId, false /* releaseToPool */);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="215"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.taskId == getTaskId1() || taskInfo.taskId == getTaskId2()) {"
-        errorLine2="                   ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="216"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.taskId == getTaskId1() || taskInfo.taskId == getTaskId2()) {"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="216"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mController.unpair(mRootTaskInfo.taskId);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="217"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="            b.setParent(mRootTaskLeash);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="224"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="            b.setParent(mTaskLeash1);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="226"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="            b.setParent(mTaskLeash2);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="228"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            pw.println(innerPrefix + &quot;1 taskId=&quot; + mTaskInfo1.taskId"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="242"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            pw.println(innerPrefix + &quot;2 taskId=&quot; + mTaskInfo2.taskId"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="246"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                .setLayer(dividerLeash, Integer.MAX_VALUE)"
-        errorLine2="                 ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java"
-            line="291"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.content.LocusId`"
-        errorLine1="        mLocusId = locus != null ? new LocusId(locus) : null;"
-        errorLine2="                                   ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="177"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.service.notification.StatusBarNotification#getUid`"
-        errorLine1="        mAppUid = entry.getStatusBarNotification().getUid();"
-        errorLine2="                                                   ~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="449"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 31 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#getConversationShortcutInfo`"
-        errorLine1="            mShortcutInfo = entry.getRanking().getConversationShortcutInfo();"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="453"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.app.NotificationChannel#isImportantConversation`"
-        errorLine1="                        entry.getRanking().getChannel().isImportantConversation();"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="457"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.app.Notification.BubbleMetadata#getShortcutId`"
-        errorLine1="            mMetadataShortcutId = entry.getBubbleMetadata().getShortcutId();"
-        errorLine2="                                                            ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="461"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDesiredHeight`"
-        errorLine1="            mDesiredHeight = entry.getBubbleMetadata().getDesiredHeight();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="463"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDesiredHeightResId`"
-        errorLine1="            mDesiredHeightResId = entry.getBubbleMetadata().getDesiredHeightResId();"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="464"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIcon`"
-        errorLine1="            mIcon = entry.getBubbleMetadata().getIcon();"
-        errorLine2="                                              ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="465"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`"
-        errorLine1="                mIntent = entry.getBubbleMetadata().getIntent();"
-        errorLine2="                                                    ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="471"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`"
-        errorLine1="            } else if (mIntent != null &amp;&amp; entry.getBubbleMetadata().getIntent() == null) {"
-        errorLine2="                                                                    ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="475"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getDeleteIntent`"
-        errorLine1="            mDeleteIntent = entry.getBubbleMetadata().getDeleteIntent();"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="481"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.app.Notification.MessagingStyle.Message#getMessagesFromBundleArray`"
-        errorLine1="                        Notification.MessagingStyle.Message.getMessagesFromBundleArray("
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="856"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.app.Notification.MessagingStyle.Message#getSenderPerson`"
-        errorLine1="                    Person sender = latestMessage.getSenderPerson();"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="864"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.app.Person#getName`"
-        errorLine1="                    bubbleMessage.senderName = sender != null ? sender.getName() : null;"
-        errorLine2="                                                                       ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="865"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.app.Person#getIcon`"
-        errorLine1="                    bubbleMessage.senderIcon = sender != null ? sender.getIcon() : null;"
-        errorLine2="                                                                       ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java"
-            line="867"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                    if (task.taskId == b.getTaskId()) {"
-        errorLine2="                        ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
-            line="357"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
-        errorLine1="        mWmLayoutParams.setFitInsetsTypes(0);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
-            line="553"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
-        errorLine1="        mWmLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
-            line="558"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getAutoExpandBubble`"
-        errorLine1="                    &amp;&amp; !notif.getBubbleMetadata().getAutoExpandBubble())"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
-            line="842"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#canBubble`"
-        errorLine1="            if (isActiveBubble &amp;&amp; !mTmpRanking.canBubble()) {"
-        errorLine2="                                               ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
-            line="919"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification.BubbleMetadata#getIntent`"
-        errorLine1="                ? entry.getBubbleMetadata().getIntent()"
-        errorLine2="                                            ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
-            line="1217"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.app.Notification.BubbleMetadata#getShortcutId`"
-        errorLine1="                &amp;&amp; entry.getBubbleMetadata().getShortcutId() != null) {"
-        errorLine2="                                             ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java"
-            line="1220"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.LocusId#getId`"
-        errorLine1="                    b.locusId?.id"
-        errorLine2="                               ~~">
-        <location
-            file="frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt"
-            line="85"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification#getLocusId`"
-        errorLine1="        return mSbn.getNotification().getLocusId();"
-        errorLine2="                                      ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java"
-            line="81"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.app.Notification#getBubbleMetadata`"
-        errorLine1="        return getStatusBarNotification().getNotification().getBubbleMetadata();"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java"
-            line="87"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.service.notification.NotificationListenerService.Ranking#canBubble`"
-        errorLine1="        return mRanking.canBubble();"
-        errorLine2="                        ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEntry.java"
-            line="115"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.graphics.Bitmap#createBitmap`"
-        errorLine1="            Bitmap snapshot = Bitmap.createBitmap(p);"
-        errorLine2="                                     ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
-            line="428"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 31 (current min is 26): `android.graphics.Bitmap#getHardwareBuffer`"
-        errorLine1="            return new SurfaceControl.ScreenshotHardwareBuffer(snapshot.getHardwareBuffer(),"
-        errorLine2="                                                                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
-            line="429"
-            column="73"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
-        errorLine1="        if (mTaskView == null || mTaskView.getSurfaceControl() == null) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
-            line="432"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
-        errorLine1="                mTaskView.getSurfaceControl(),"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
-            line="436"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="                ? mExpandedViewContainerLocation[1] - mPositioner.getInsets().top"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java"
-            line="636"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.graphics.Outline#setPath`"
-        errorLine1="            outline.setPath(rectPath);"
-        errorLine2="                    ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java"
-            line="504"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
-        errorLine1="                if (ic.getType() == Icon.TYPE_URI"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java"
-            line="65"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
-        errorLine1="                        || ic.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java"
-            line="66"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getUri`"
-        errorLine1="                            ic.getUri(),"
-        errorLine2="                               ~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java"
-            line="68"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        getContext().getDisplay().getMetrics(displayMetrics);"
-        errorLine2="                     ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java"
-            line="143"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`"
-        errorLine1="        WindowMetrics windowMetrics = mWindowManager.getCurrentWindowMetrics();"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="93"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`"
-        errorLine1="        WindowInsets metricInsets = windowMetrics.getWindowInsets();"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="97"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsetsIgnoringVisibility`"
-        errorLine1="        Insets insets = metricInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="99"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`"
-        errorLine1="        Insets insets = metricInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()"
-        errorLine2="                                                                                   ~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="99"
-            column="84"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#statusBars`"
-        errorLine1="                | WindowInsets.Type.statusBars()"
-        errorLine2="                                    ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="100"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`"
-        errorLine1="                | WindowInsets.Type.displayCutout());"
-        errorLine2="                                    ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="101"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`"
-        errorLine1="                    + &quot; bounds: &quot; + windowMetrics.getBounds()"
-        errorLine2="                                                  ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="107"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`"
-        errorLine1="        updateInternal(orientation, insets, windowMetrics.getBounds());"
-        errorLine2="                                                          ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="110"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="        mPositionRect.left += mInsets.left;"
-        errorLine2="                              ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="134"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="        mPositionRect.top += mInsets.top;"
-        errorLine2="                             ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="135"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
-        errorLine1="        mPositionRect.right -= mInsets.right;"
-        errorLine2="                               ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="136"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
-        errorLine1="        mPositionRect.bottom -= mInsets.bottom;"
-        errorLine2="                                ~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="137"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`"
-        errorLine1="            WindowInsets metricInsets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="156"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`"
-        errorLine1="            WindowInsets metricInsets = mWindowManager.getCurrentWindowMetrics().getWindowInsets();"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="156"
-            column="82"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsetsIgnoringVisibility`"
-        errorLine1="            Insets navBarInsets = metricInsets.getInsetsIgnoringVisibility("
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="157"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`"
-        errorLine1="                    WindowInsets.Type.navigationBars());"
-        errorLine2="                                      ~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="158"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="            int newInsetLeft = mInsets.left;"
-        errorLine2="                               ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="159"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
-        errorLine1="            int newInsetRight = mInsets.right;"
-        errorLine2="                                ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="160"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="                mPositionRect.left -= navBarInsets.left;"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="162"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="                newInsetLeft -= navBarInsets.left;"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="163"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
-        errorLine1="                mPositionRect.right += navBarInsets.right;"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="165"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
-        errorLine1="                newInsetRight -= navBarInsets.right;"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="166"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.graphics.Insets#of`"
-        errorLine1="            mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);"
-        errorLine2="                             ~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="168"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
-        errorLine1="            mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);"
-        errorLine2="                                                                          ~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="168"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="            mInsets = Insets.of(newInsetLeft, mInsets.top, newInsetRight, mInsets.bottom);"
-        errorLine2="                                              ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="168"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `new android.graphics.PointF`"
-        errorLine1="            mRestingStackPosition = new PointF(position);"
-        errorLine2="                                    ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java"
-            line="229"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#getAnimationMatrix`"
-        errorLine1="        pw.println(mExpandedViewContainer.getAnimationMatrix());"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="295"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setSystemGestureExclusionRects`"
-        errorLine1="            mBubbleContainer.setSystemGestureExclusionRects(mSystemGestureExclusionRects);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="1427"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setSystemGestureExclusionRects`"
-        errorLine1="            mBubbleContainer.setSystemGestureExclusionRects(Collections.emptyList());"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="1430"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="                        mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix))"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="1750"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="                        mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix))"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="1775"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="        mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="1863"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="                        mExpandedViewContainer.setAnimationMatrix("
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="1894"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="                    mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="1986"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="        mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="2074"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="                        mExpandedViewContainer.setAnimationMatrix(mExpandedViewContainerMatrix);"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="2091"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.View#setAnimationMatrix`"
-        errorLine1="        mExpandedViewContainer.setAnimationMatrix(null);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="2118"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="        int leftPadding = insets.left + mExpandedViewPadding;"
-        errorLine2="                          ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="2696"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
-        errorLine1="        int rightPadding = insets.right + mExpandedViewPadding;"
-        errorLine2="                           ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java"
-            line="2697"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
-        errorLine1="        if (icon.getType() == Icon.TYPE_URI || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {"
-        errorLine2="                 ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java"
-            line="220"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getType`"
-        errorLine1="        if (icon.getType() == Icon.TYPE_URI || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {"
-        errorLine2="                                                    ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java"
-            line="220"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.graphics.drawable.Icon#getUri`"
-        errorLine1="                    icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java"
-            line="222"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java"
-            line="119"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="        t.setAlpha(leash, transformation.getAlpha());"
-        errorLine2="          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java"
-            line="237"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java"
-            line="239"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="279"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#ime`"
-        errorLine1="            if ((types &amp; WindowInsets.Type.ime()) == 0) {"
-        errorLine2="                                           ~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="285"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#ime`"
-        errorLine1="            if ((types &amp; WindowInsets.Type.ime()) == 0) {"
-        errorLine2="                                           ~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="294"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                t.setAlpha(mImeSourceControl.getLeash(), alpha);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="396"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="398"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    t.setAlpha(mImeSourceControl.getLeash(), alpha);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="420"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    t.apply();"
-        errorLine2="                      ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="424"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                        t.setAlpha(mImeSourceControl.getLeash(), 1.f);"
-        errorLine2="                          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="439"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    t.apply();"
-        errorLine2="                      ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java"
-            line="446"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetLeft`"
-        errorLine1="            outInsets.left += displayCutout.getSafeInsetLeft();"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="313"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetTop`"
-        errorLine1="            outInsets.top += displayCutout.getSafeInsetTop();"
-        errorLine2="                                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="314"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetRight`"
-        errorLine1="            outInsets.right += displayCutout.getSafeInsetRight();"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="315"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 26): `android.view.DisplayCutout#getSafeInsetBottom`"
-        errorLine1="            outInsets.bottom += displayCutout.getSafeInsetBottom();"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="316"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
-        errorLine1="        final Insets waterfallInsets = rotateInsets(cutout.getWaterfallInsets(), rotation);"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="358"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
-        errorLine1="        int leftInset = Math.max(cutout.getWaterfallInsets().left,"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="405"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="        int leftInset = Math.max(cutout.getWaterfallInsets().left,"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="405"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectLeft`"
-        errorLine1="                findCutoutInsetForSide(displaySize, cutout.getBoundingRectLeft(), Gravity.LEFT));"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="406"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
-        errorLine1="        int topInset = Math.max(cutout.getWaterfallInsets().top,"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="407"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="        int topInset = Math.max(cutout.getWaterfallInsets().top,"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="407"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectTop`"
-        errorLine1="                findCutoutInsetForSide(displaySize, cutout.getBoundingRectTop(), Gravity.TOP));"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="408"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
-        errorLine1="        int rightInset = Math.max(cutout.getWaterfallInsets().right,"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="409"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
-        errorLine1="        int rightInset = Math.max(cutout.getWaterfallInsets().right,"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="409"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectRight`"
-        errorLine1="                findCutoutInsetForSide(displaySize, cutout.getBoundingRectRight(), Gravity.RIGHT));"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="410"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.DisplayCutout#getWaterfallInsets`"
-        errorLine1="        int bottomInset = Math.max(cutout.getWaterfallInsets().bottom,"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="411"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
-        errorLine1="        int bottomInset = Math.max(cutout.getWaterfallInsets().bottom,"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="411"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.DisplayCutout#getBoundingRectBottom`"
-        errorLine1="                findCutoutInsetForSide(displaySize, cutout.getBoundingRectBottom(),"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayLayout.java"
-            line="412"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            t.apply();"
-        errorLine2="              ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java"
-            line="343"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java"
-            line="359"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            t.apply();"
-        errorLine2="              ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
-            line="406"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
-            line="731"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
-            line="800"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
-            line="878"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            t.setAlpha(dim, alpha);"
-        errorLine2="              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
-            line="1065"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
-            line="1106"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            t.apply();"
-        errorLine2="              ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java"
-            line="1171"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
-        errorLine1="        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerWindowManager.java"
-            line="64"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="    private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
-            line="73"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#createWindowContext`"
-        errorLine1="                .createWindowContext(TYPE_APPLICATION_OVERLAY, null);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
-            line="89"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
-        errorLine1="        layoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
-            line="101"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
-        errorLine1="        layoutParams.setFitInsetsTypes(0);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
-            line="102"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="            mTransaction.reparent(dragSurface, null);"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
-            line="229"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            mTransaction.apply();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java"
-            line="230"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="        final int iw = w - insets.left - insets.right;"
-        errorLine2="                           ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
-            line="126"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#right`"
-        errorLine1="        final int iw = w - insets.left - insets.right;"
-        errorLine2="                                         ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
-            line="126"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#bottom`"
-        errorLine1="        final int ih = h - insets.top - insets.bottom;"
-        errorLine2="                                        ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
-            line="127"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="        final int ih = h - insets.top - insets.bottom;"
-        errorLine2="                           ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
-            line="127"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#left`"
-        errorLine1="        final int l = insets.left;"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
-            line="128"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="        final int t = insets.top;"
-        errorLine2="                      ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
-            line="129"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                runningTaskId = task.taskId;"
-        errorLine2="                                ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java"
-            line="279"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`"
-        errorLine1="    private Insets mInsets = Insets.NONE;"
-        errorLine2="                             ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
-            line="59"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsets`"
-        errorLine1="        mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
-            line="76"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`"
-        errorLine1="        mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());"
-        errorLine2="                                                            ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
-            line="76"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#systemBars`"
-        errorLine1="        mInsets = insets.getInsets(Type.systemBars() | Type.displayCutout());"
-        errorLine2="                                        ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java"
-            line="76"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 31 (current min is 26): `com.google.android.collect.Sets#newHashSet`"
-        errorLine1="        return Sets.newHashSet("
-        errorLine2="                    ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java"
-            line="498"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mLeashByTaskId.get(taskInfo.taskId) != null) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="53"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            throw new IllegalStateException(&quot;Task appeared more than once: #&quot; + taskInfo.taskId);"
-        errorLine2="                                                                                ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="54"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, -1501874464, 1, null, protoLogParam0); "
-        errorLine2="                                                                                                                ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="56"
-            column="113"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        mLeashByTaskId.put(taskInfo.taskId, leash);"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="58"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            t.setAlpha(leash, 1f);"
-        errorLine2="              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="66"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="75"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mLeashByTaskId.get(taskInfo.taskId) == null) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="88"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            Slog.e(TAG, &quot;Task already vanished: #&quot; + taskInfo.taskId);"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="89"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        mLeashByTaskId.remove(taskInfo.taskId);"
-        errorLine2="                              ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="92"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, 564235578, 1, null, protoLogParam0); "
-        errorLine2="                                                                                                                ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="93"
-            column="113"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
-        errorLine1="        if (!mLeashByTaskId.contains(taskId)) {"
-        errorLine2="                            ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="99"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="        b.setParent(mLeashByTaskId.get(taskId));"
-        errorLine2="          ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java"
-            line="102"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.os.Handler#hasCallbacks`"
-        errorLine1="        return mHandler.hasCallbacks(r);"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/HandlerExecutor.java"
-            line="55"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="                final SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="86"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="90"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="        final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="107"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="            final SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="121"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="        final SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="167"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`"
-        errorLine1="            return Insets.NONE;"
-        errorLine2="                   ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="185"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.Display#getCutout`"
-        errorLine1="        DisplayCutout cutout = display.getCutout();"
-        errorLine2="                                       ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="187"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.graphics.Insets#of`"
-        errorLine1="        Insets insets = cutout != null ? Insets.of(cutout.getSafeInsets()) : Insets.NONE;"
-        errorLine2="                                                ~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="188"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#NONE`"
-        errorLine1="        Insets insets = cutout != null ? Insets.of(cutout.getSafeInsets()) : Insets.NONE;"
-        errorLine2="                                                                             ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="188"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 31 (current min is 26): `android.graphics.Rect#inset`"
-        errorLine1="            mCurrentDisplayBounds.inset(mCurrentCutoutInsets);"
-        errorLine2="                                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="239"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="            if (mCurrentCutoutInsets.top != 0) {"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="244"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.Insets#top`"
-        errorLine1="                mCurrentDisplayBounds.top = Math.max(mStatusBarHeight, mCurrentCutoutInsets.top);"
-        errorLine2="                                                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="245"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizer.java"
-            line="287"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
-        errorLine1="                mContext.getResources().getFloat("
-        errorLine2="                                        ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenController.java"
-            line="465"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1362429294, 4, null, protoLogParam0, protoLogParam1); "
-        errorLine2="                                                                                                                                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="129"
-            column="166"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 982027396, 4, null, protoLogParam0, protoLogParam1); "
-        errorLine2="                                                                                                                                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="134"
-            column="166"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { String protoLogParam0 = String.valueOf(TAG); long protoLogParam1 = taskInfo.taskId; long protoLogParam2 = winMode; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -298656957, 20, null, protoLogParam0, protoLogParam1, protoLogParam2); "
-        errorLine2="                                                                                                                                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="139"
-            column="166"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="                        .setParent(mPrimarySurface).setColorLayer()"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="150"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
-        errorLine1="                        .setName(&quot;Primary Divider Dim&quot;)"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="151"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="153"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="                        .setParent(mSecondarySurface).setColorLayer()"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="155"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
-        errorLine1="                        .setName(&quot;Secondary Divider Dim&quot;)"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="156"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="158"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                t.setLayer(mPrimaryDim, Integer.MAX_VALUE);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="160"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                t.setLayer(mSecondaryDim, Integer.MAX_VALUE);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="162"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="164"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mPositionByTaskId.remove(taskInfo.taskId);"
-        errorLine2="                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="173"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                mLeashByTaskId.remove(taskInfo.taskId);"
-        errorLine2="                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="175"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="192"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                if (taskInfo.positionInParent.equals(mPositionByTaskId.get(taskInfo.taskId))) {"
-        errorLine2="                                                                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="211"
-            column="76"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mPositionByTaskId.put(taskInfo.taskId, new Point(taskInfo.positionInParent));"
-        errorLine2="                                  ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="218"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        mLeashByTaskId.put(taskInfo.taskId, leash);"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="223"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        mPositionByTaskId.put(taskInfo.taskId, new Point(taskInfo.positionInParent));"
-        errorLine2="                              ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="224"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="231"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                t.setAlpha(leash, 1f);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="242"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                final SurfaceControl leash = mLeashByTaskId.get(taskInfo.taskId);"
-        errorLine2="                                                                ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="322"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
-        errorLine1="        if (!mLeashByTaskId.contains(taskId)) {"
-        errorLine2="                            ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="339"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="        b.setParent(mLeashByTaskId.get(taskId));"
-        errorLine2="          ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="342"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mPrimary != null) pw.println(innerPrefix + &quot;mPrimary.taskId=&quot; + mPrimary.taskId);"
-        errorLine2="                                                                            ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="351"
-            column="77"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mSecondary != null) pw.println(innerPrefix + &quot;mSecondary.taskId=&quot; + mSecondary.taskId);"
-        errorLine2="                                                                                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTaskListener.java"
-            line="352"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                                &amp;&amp; triggerTask.parentTaskId == mListener.mPrimary.taskId)"
-        errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="94"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="132"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="133"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            transaction.setAlpha(leash, end);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="136"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="137"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="180"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="185"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    t.setAlpha(parentChange.getLeash(), 1.f);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="245"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="                    t.reparent(leash, info.getRootLeash());"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="248"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                    t.setLayer(leash, info.getChanges().size() - i);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="249"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="                    mFinishTransaction.reparent(leash, parentChange.getLeash());"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="251"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                    t.setLayer(leash, info.getChanges().size() + 1);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="281"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    t.setAlpha(leash, 0.f);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="294"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="316"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        mFinishTransaction.apply();"
-        errorLine2="                           ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java"
-            line="334"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.os.VibrationEffect#createPredefined`"
-        errorLine1="            vibrator.vibrate(VibrationEffect.createPredefined(effectId))"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~">
-        <location
-            file="frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt"
-            line="465"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
-        errorLine1="            mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java"
-            line="141"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    tx.apply();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java"
-            line="286"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    tx.apply();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java"
-            line="295"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
-        errorLine1="        mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="101"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="                        .setParent(mParentLeash)"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="152"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setBufferSize`"
-        errorLine1="                        .setBufferSize(mBkgBounds.width(), mBkgBounds.height())"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="153"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setFormat`"
-        errorLine1="                        .setFormat(PixelFormat.RGB_888)"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="155"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setOpaque`"
-        errorLine1="                        .setOpaque(true)"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="156"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
-        errorLine1="                        .setName(&quot;one-handed-background-panel&quot;)"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="157"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="159"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="            transaction.setLayer(mBackgroundSurface, -1 /* at bottom-most layer */)"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="179"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    .apply();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="182"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.remove(mBackgroundSurface).apply();"
-        errorLine2="                                                   ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java"
-            line="197"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.accessibility.AccessibilityManager#getRecommendedTimeoutMillis`"
-        errorLine1="                                .getRecommendedTimeoutMillis(mOneHandedTimeout * 1000"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java"
-            line="150"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.os.RemoteException#rethrowFromSystemServer`"
-        errorLine1="            throw e.rethrowFromSystemServer();"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java"
-            line="574"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
-        errorLine1="        mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java"
-            line="130"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        tx.apply();"
-        errorLine2="           ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java"
-            line="241"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="        tx.setAlpha(leash, alpha);"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSurfaceTransactionHelper.java"
-            line="57"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager#getCurrentWindowMetrics`"
-        errorLine1="        mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java"
-            line="101"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getBounds`"
-        errorLine1="        mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();"
-        errorLine2="                                                               ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java"
-            line="101"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
-        errorLine1="        lp.setFitInsetsTypes(0 /* types */);"
-        errorLine2="           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java"
-            line="200"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
-        errorLine1="            mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
-            line="244"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    tx.apply();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
-            line="399"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    tx.apply();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
-            line="413"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    tx.apply();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
-            line="499"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    tx.apply();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
-            line="518"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    tx.apply();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java"
-            line="532"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
-        errorLine1="        mDefaultAspectRatio = res.getFloat("
-        errorLine2="                                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
-            line="77"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
-        errorLine1="        mMinAspectRatio = res.getFloat("
-        errorLine2="                              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
-            line="93"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
-        errorLine1="        mMaxAspectRatio = res.getFloat("
-        errorLine2="                              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
-            line="95"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
-        errorLine1="        mDefaultSizePercent = res.getFloat("
-        errorLine2="                                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
-            line="97"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
-        errorLine1="        mMaxAspectRatioForMinSize = res.getFloat("
-        errorLine2="                                        ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsAlgorithm.java"
-            line="99"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mPipBoundsState.setDisplayLayout(new DisplayLayout(mContext, mContext.getDisplay()));"
-        errorLine2="                                                                              ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java"
-            line="337"
-            column="79"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        onDisplayChanged(new DisplayLayout(mContext, mContext.getDisplay()),"
-        errorLine2="                                                              ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java"
-            line="428"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
-        errorLine1="        lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java"
-            line="247"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
-        errorLine1="        lp.setFitInsetsTypes(0 /* types */);"
-        errorLine2="           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java"
-            line="248"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.accessibility.AccessibilityManager#getRecommendedTimeoutMillis`"
-        errorLine1="        int recommendedTimeout = mAccessibilityManager.getRecommendedTimeoutMillis(delay,"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuView.java"
-            line="506"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mContext.getDisplay().getRealSize(mMaxSize);"
-        errorLine2="                 ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="142"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
-        errorLine1="                mDownPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="388"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
-        errorLine1="                mDownPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));"
-        errorLine2="                                                           ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="388"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
-        errorLine1="                mDownSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));"
-        errorLine2="                                        ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="389"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
-        errorLine1="                mDownSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));"
-        errorLine2="                                                                  ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="389"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
-        errorLine1="            float x0 = ev.getRawX(mFirstIndex);"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="403"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
-        errorLine1="            float y0 = ev.getRawY(mFirstIndex);"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="404"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
-        errorLine1="            float x1 = ev.getRawX(mSecondIndex);"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="405"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
-        errorLine1="            float y1 = ev.getRawY(mSecondIndex);"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java"
-            line="406"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="        tx.setAlpha(leash, alpha);"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
-            line="66"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 31 (current min is 26): `android.graphics.Matrix#IDENTITY_MATRIX`"
-        errorLine1="        tx.setMatrix(leash, Matrix.IDENTITY_MATRIX, mTmpFloat9)"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
-            line="166"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="        t.reparent(snapshot, parent);"
-        errorLine2="          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
-            line="188"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="        t.setLayer(snapshot, Integer.MAX_VALUE);"
-        errorLine2="          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
-            line="189"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java"
-            line="191"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Method reference requires API level 29 (current min is 26): `SurfaceControl.Transaction::new`"
-        errorLine1="        mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="238"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="                .getAnimator(mTaskInfo, mLeash, mPipBoundsState.getBounds(), 1f, 0f)"
-        errorLine2="                             ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="397"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="        mPipUiEventLoggerLogger.setTaskInfo(mTaskInfo);"
-        errorLine2="                                            ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="431"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            tx.setAlpha(mLeash, 0f);"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="462"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            tx.apply();"
-        errorLine2="               ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="464"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="        tx.setAlpha(mLeash, 0f);"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="502"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        tx.apply();"
-        errorLine2="           ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="503"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="                    .getAnimator(mTaskInfo, mLeash, destinationBounds, 0f, 1f)"
-        errorLine2="                                 ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="506"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            tx.apply();"
-        errorLine2="               ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="820"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            tx.apply();"
-        errorLine2="               ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="858"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    transaction.setAlpha(snapshotSurface, alpha);"
-        errorLine2="                                ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="991"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    transaction.apply();"
-        errorLine2="                                ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="992"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                        tx.apply();"
-        errorLine2="                           ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="1000"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="                .getAnimator(mTaskInfo, mLeash, baseBounds, currentBounds, destinationBounds,"
-        errorLine2="                             ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java"
-            line="1082"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mContext.getDisplay().getRealSize(displaySize);"
-        errorLine2="                 ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java"
-            line="380"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="                    int displayRotation = mContext.getDisplay().getRotation();"
-        errorLine2="                                                   ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java"
-            line="674"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
-        errorLine1="                float x = ev.getRawX(pointerIndex);"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
-            line="138"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
-        errorLine1="                float y = ev.getRawY(pointerIndex);"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
-            line="139"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
-        errorLine1="                    mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));"
-        errorLine2="                                      ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
-            line="174"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
-        errorLine1="                    mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));"
-        errorLine2="                                                                   ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
-            line="174"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawX`"
-        errorLine1="                mLastTouch.set(ev.getRawX(pointerIndex), ev.getRawY(pointerIndex));"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
-            line="197"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.MotionEvent#getRawY`"
-        errorLine1="                mLastTouch.set(ev.getRawX(pointerIndex), ev.getRawY(pointerIndex));"
-        errorLine2="                                                            ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchState.java"
-            line="197"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="                return startEnterAnimation(change.getTaskInfo(), change.getLeash(), t);"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
-            line="79"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
-        errorLine1="        setBoundsStateForEntry(taskInfo.topActivity, taskInfo.pictureInPictureParams,"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
-            line="105"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            t.setAlpha(leash, 0f);"
-        errorLine2="              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
-            line="118"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            t.apply();"
-        errorLine2="              ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java"
-            line="119"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
-        errorLine1="        if (taskInfo != null &amp;&amp; taskInfo.topActivity != null) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java"
-            line="44"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
-        errorLine1="            mPackageName = taskInfo.topActivity.getPackageName();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUiEventLogger.java"
-            line="45"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="        b.setParent(sc);"
-        errorLine2="          ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java"
-            line="97"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#baseIntent`"
-        errorLine1="                if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = info.getTaskInfo().taskId; String protoLogParam1 = String.valueOf(info.getTaskInfo().baseIntent); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1683614271, 1, null, protoLogParam0, protoLogParam1); "
-        errorLine2="                                                                                                                                                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="168"
-            column="187"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = info.getTaskInfo().taskId; String protoLogParam1 = String.valueOf(info.getTaskInfo().baseIntent); com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -1683614271, 1, null, protoLogParam0, protoLogParam1); "
-        errorLine2="                                                                                                                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="168"
-            column="121"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final int taskId = info.getTaskInfo().taskId;"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="333"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="        notifyLocusVisibilityIfNeeded(info.getTaskInfo());"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="341"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 157713005, 1, null, protoLogParam0); }"
-        errorLine2="                                                                                                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="348"
-            column="117"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            final TaskAppearedInfo data = mTasks.get(taskInfo.taskId);"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="349"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));"
-        errorLine2="                       ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="352"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="            notifyLocusVisibilityIfNeeded(taskInfo);"
-        errorLine2="                                          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="358"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="            if (updated || !taskInfo.equalsForSizeCompat(data.getTaskInfo())) {"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="359"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, 980952660, 1, null, protoLogParam0); }"
-        errorLine2="                                                                                                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="369"
-            column="117"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TASK_ORG_enabled) { long protoLogParam0 = taskInfo.taskId; com.android.wm.shell.protolog.ShellProtoLogImpl.v(WM_SHELL_TASK_ORG, -880817403, 1, null, protoLogParam0); }"
-        errorLine2="                                                                                                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="380"
-            column="117"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            final int taskId = taskInfo.taskId;"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="381"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `RunningTaskInfo` to `TaskInfo` requires API level 29 (current min is 26)"
-        errorLine1="            notifyLocusVisibilityIfNeeded(taskInfo);"
-        errorLine2="                                          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="387"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`"
-        errorLine1="        final int taskId = taskInfo.taskId;"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="417"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`"
-        errorLine1="                mVisibleTasksWithLocusId.remove(taskInfo.taskId);"
-        errorLine2="                                                ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="437"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mSizeCompatUI.onSizeCompatInfoChanged(taskInfo.displayId, taskInfo.taskId,"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="466"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        mSizeCompatUI.onSizeCompatInfoChanged(taskInfo.displayId, taskInfo.taskId,"
-        errorLine2="                                                                  ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="472"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final int taskId = runningTaskInfo.taskId;"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java"
-            line="483"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
-        errorLine1="        } else if (mActiveLayouts.contains(taskId)) {"
-        errorLine2="                                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIController.java"
-            line="96"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="            t.setLayer(leash, Integer.MAX_VALUE);"
-        errorLine2="              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUILayout.java"
-            line="314"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
-        errorLine1="                .setName(&quot;SizeCompatUILeash&quot;)"
-        errorLine2="                 ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="63"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
-        errorLine1="        mLeash = builder.build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="67"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="        b.setParent(mLeash);"
-        errorLine2="          ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="68"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);"
-        errorLine2="                                                                  ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="78"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);"
-        errorLine2="                                                                  ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="94"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`"
-        errorLine1="            mViewHost.release();"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="108"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            new SurfaceControl.Transaction().remove(mLeash).apply();"
-        errorLine2="                                                            ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="113"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="            new SurfaceControl.Transaction().remove(mLeash).apply();"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sizecompatui/SizeCompatUIWindowManager.java"
-            line="113"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 31 (current min is 26): `android.window.SplashScreenView#getIconView`"
-        errorLine1="        final View iconView = mSplashScreenView.getIconView();"
-        errorLine2="                                                ~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
-            line="158"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.graphics.Paint#setBlendMode`"
-        errorLine1="                mVanishPaint.setBlendMode(BlendMode.MODULATE);"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
-            line="247"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.graphics.BlendMode#MODULATE`"
-        errorLine1="                mVanishPaint.setBlendMode(BlendMode.MODULATE);"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
-            line="247"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            tx.apply();"
-        errorLine2="               ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
-            line="284"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            tx.apply();"
-        errorLine2="               ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
-            line="303"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#release`"
-        errorLine1="            mFirstWindowSurface.release();"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java"
-            line="304"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager#getMaximumWindowMetrics`"
-        errorLine1="                .getMaximumWindowMetrics()"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
-            line="256"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowMetrics#getWindowInsets`"
-        errorLine1="                .getWindowInsets()"
-        errorLine2="                 ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
-            line="257"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets#getInsets`"
-        errorLine1="                .getInsets(WindowInsets.Type.navigationBars()"
-        errorLine2="                 ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
-            line="258"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#navigationBars`"
-        errorLine1="                .getInsets(WindowInsets.Type.navigationBars()"
-        errorLine2="                                             ~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
-            line="258"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#statusBars`"
-        errorLine1="                        | WindowInsets.Type.statusBars()"
-        errorLine2="                                            ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
-            line="259"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#displayCutout`"
-        errorLine1="                        | WindowInsets.Type.displayCutout()).toRect();"
-        errorLine2="                                            ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java"
-            line="260"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    t.setAlpha(parentChange.getLeash(), 1.f);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="116"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="                    t.reparent(leash, info.getRootLeash());"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="119"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                    t.setLayer(leash, info.getChanges().size() - i);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="120"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="                    mFinishTransaction.reparent(leash, parentChange.getLeash());"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="122"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    t.setAlpha(leash, 0.f);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="158"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="164"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            mFinishTransaction.apply();"
-        errorLine2="                               ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="198"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            transaction.setAlpha(leash, start * (1.f - fraction) + end * fraction);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="222"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="223"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            transaction.setAlpha(leash, end);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="226"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="227"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="270"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            transaction.apply();"
-        errorLine2="                        ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java"
-            line="275"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
-        errorLine1="                .setName(TAG)"
-        errorLine2="                 ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
-            line="101"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
-        errorLine1="        mLeash = builder.build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
-            line="105"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="        b.setParent(mLeash);"
-        errorLine2="          ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
-            line="106"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mViewHost = new SurfaceControlViewHost(mContext, mContext.getDisplay(), this);"
-        errorLine2="                                                                  ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
-            line="116"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`"
-        errorLine1="            mViewHost.release();"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
-            line="145"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            new SurfaceControl.Transaction().remove(mLeash).apply();"
-        errorLine2="                                                            ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
-            line="150"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="            new SurfaceControl.Transaction().remove(mLeash).apply();"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java"
-            line="150"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 31 (current min is 26): `com.google.android.collect.Sets#newHashSet`"
-        errorLine1="        return Sets.newHashSet("
-        errorLine2="                    ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java"
-            line="692"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                            .setLayer(dividerLeash, Integer.MAX_VALUE)"
-        errorLine2="                             ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="399"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                .setLayer(dividerLeash, Integer.MAX_VALUE)"
-        errorLine2="                 ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="515"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                &amp;&amp; taskInfo.parentTaskId == mMainStage.mRootTaskInfo.taskId) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="570"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                &amp;&amp; taskInfo.parentTaskId == mSideStage.mRootTaskInfo.taskId) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="573"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            if (com.android.wm.shell.protolog.ShellProtoLogCache.WM_SHELL_TRANSITIONS_enabled) { long protoLogParam0 = triggerTask.taskId; String protoLogParam1 = String.valueOf(transitTypeToString(type)); long protoLogParam2 = mMainStage.getChildCount(); long protoLogParam3 = mSideStage.getChildCount(); com.android.wm.shell.protolog.ShellProtoLogImpl.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, 165317020, 81, &quot;  split is active so using split&quot; + &quot;Transition to handle request. triggerTask=%d type=%s mainChildren=%d&quot; + &quot; sideChildren=%d&quot;, protoLogParam0, protoLogParam1, protoLogParam2, protoLogParam3); "
-        errorLine2="                                                                                                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="597"
-            column="120"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                    if (!stage.containsTask(taskInfo.taskId)) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="655"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                                + &quot; with &quot; + taskInfo.taskId + &quot; before startAnimation().&quot;);"
-        errorLine2="                                             ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="657"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                    if (stage.containsTask(taskInfo.taskId)) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="660"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                                + &quot; with &quot; + taskInfo.taskId + &quot; before startAnimation().&quot;);"
-        errorLine2="                                             ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="662"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            if (!mMainStage.containsTask(mainChild.getTaskInfo().taskId)) {"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="732"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                        + &quot; to have been called with &quot; + mainChild.getTaskInfo().taskId"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="734"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            if (!mSideStage.containsTask(sideChild.getTaskInfo().taskId)) {"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="737"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                        + &quot; to have been called with &quot; + sideChild.getTaskInfo().taskId"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="739"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="            t.setAlpha(leash, 1.f);"
-        errorLine2="              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="820"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="            t.setLayer(leash, Integer.MAX_VALUE);"
-        errorLine2="              ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java"
-            line="821"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
-        errorLine1="        return mChildrenTaskInfo.contains(taskId);"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="85"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="96"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            final int taskId = taskInfo.taskId;"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="97"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mRootTaskInfo.taskId == taskInfo.taskId) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="116"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mRootTaskInfo.taskId == taskInfo.taskId) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="116"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="118"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);"
-        errorLine2="                                  ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="119"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */,"
-        errorLine2="                                                ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="120"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                        taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */);"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="124"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final int taskId = taskInfo.taskId;"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="140"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mRootTaskInfo.taskId == taskId) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="141"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
-        errorLine1="        } else if (mChildrenTaskInfo.contains(taskId)) {"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="144"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mRootTaskInfo.taskId == taskId) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="161"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="            b.setParent(mRootLeash);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="162"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.SparseArray#contains`"
-        errorLine1="        } else if (mChildrenLeashes.contains(taskId)) {"
-        errorLine2="                                    ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="163"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="            b.setParent(mChildrenLeashes.get(taskId));"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="164"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                t.setAlpha(leash, 1f);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java"
-            line="194"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final int taskId = taskInfo.taskId;"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
-            line="131"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                    + Integer.toHexString(theme) + &quot; task= &quot; + taskInfo.taskId);"
-        errorLine2="                                                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
-            line="141"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `SplashScreenView` to `View` requires API level 31 (current min is 26)"
-        errorLine1="                    win.setContentView(sView);"
-        errorLine2="                                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
-            line="280"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `SplashScreenView` to `View` requires API level 31 (current min is 26)"
-        errorLine1="                    win.setContentView(sView);"
-        errorLine2="                                       ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
-            line="284"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final int taskId = startingWindowInfo.taskInfo.taskId;"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java"
-            line="309"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                final TaskSnapshot snapshot = getTaskSnapshot(windowInfo.taskInfo.taskId);"
-        errorLine2="                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java"
-            line="162"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                    Slog.d(TAG, &quot;isSnapshotCompatible no snapshot &quot; + windowInfo.taskInfo.taskId);"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java"
-            line="180"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="                mTaskLaunchingCallback.accept(runningTaskInfo.taskId, suggestionType);"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java"
-            line="238"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="                mInFlight.onTransactionReady(mInFlight.mId, new SurfaceControl.Transaction());"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java"
-            line="55"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java"
-            line="114"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        t.apply();"
-        errorLine2="          ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SyncTransactionQueue.java"
-            line="125"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.SurfaceControlViewHost#release`"
-        errorLine1="        root.release();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
-            line="121"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
-        errorLine1="                  .setName(&quot;SystemWindowLeash&quot;)"
-        errorLine2="                   ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
-            line="278"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="                  .setParent(mRootSurface)"
-        errorLine2="                   ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
-            line="280"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
-        errorLine1="                  .setCallsite(&quot;SysUiWIndowManager#attachToParentSurface&quot;).build();"
-        errorLine2="                                                                           ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
-            line="281"
-            column="76"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="            b.setParent(leash);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
-            line="285"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="                new SurfaceControl.Transaction().remove(mLeashForWindow.get(token))"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
-            line="293"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    .apply();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java"
-            line="294"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        final int taskId = runningTaskInfo.taskId;"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="151"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
-        errorLine1="        layoutParams.layoutInDisplayCutoutMode = attrs.layoutInDisplayCutoutMode;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="186"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 28 (current min is 26): `android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode`"
-        errorLine1="        layoutParams.layoutInDisplayCutoutMode = attrs.layoutInDisplayCutoutMode;"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="186"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#getFitInsetsTypes`"
-        errorLine1="        layoutParams.setFitInsetsTypes(attrs.getFitInsetsTypes());"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="187"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsTypes`"
-        errorLine1="        layoutParams.setFitInsetsTypes(attrs.getFitInsetsTypes());"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="187"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#getFitInsetsSides`"
-        errorLine1="        layoutParams.setFitInsetsSides(attrs.getFitInsetsSides());"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="188"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsSides`"
-        errorLine1="        layoutParams.setFitInsetsSides(attrs.getFitInsetsSides());"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="188"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#isFitInsetsIgnoringVisibility`"
-        errorLine1="        layoutParams.setFitInsetsIgnoringVisibility(attrs.isFitInsetsIgnoringVisibility());"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="189"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowManager.LayoutParams#setFitInsetsIgnoringVisibility`"
-        errorLine1="        layoutParams.setFitInsetsIgnoringVisibility(attrs.isFitInsetsIgnoringVisibility());"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="189"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
-        errorLine1="        if (runningTaskInfo.taskDescription != null) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="208"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
-        errorLine1="            taskDescription = runningTaskInfo.taskDescription;"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="209"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="        mTransaction = new SurfaceControl.Transaction();"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="271"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.view.WindowInsets.Type#systemBars`"
-        errorLine1="        return state.calculateInsets(frame, WindowInsets.Type.systemBars(),"
-        errorLine2="                                                              ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="328"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setName`"
-        errorLine1="                .setName(mTitle + &quot; - task-snapshot-surface&quot;)"
-        errorLine2="                 ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="374"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setBufferSize`"
-        errorLine1="                .setBufferSize(buffer.getWidth(), buffer.getHeight())"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="375"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setFormat`"
-        errorLine1="                .setFormat(buffer.getFormat())"
-        errorLine2="                 ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="376"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="                .setParent(mSurfaceControl)"
-        errorLine2="                 ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="377"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#build`"
-        errorLine1="                .build();"
-        errorLine2="                 ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="379"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        mTransaction.apply();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="406"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 31 (current min is 26): `android.graphics.Rect#inset`"
-        errorLine1="        rect.inset((int) (insets.left * scaleX),"
-        errorLine2="             ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java"
-            line="435"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        onTaskMovedToFront(taskInfo.taskId);"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TaskStackListenerCallback.java"
-            line="52"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `new android.util.CloseGuard`"
-        errorLine1="    private final CloseGuard mGuard = new CloseGuard();"
-        errorLine2="                                      ~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="73"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="    private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="81"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.CloseGuard#open`"
-        errorLine1="        mGuard.open(&quot;release&quot;);"
-        errorLine2="               ~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="99"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.CloseGuard#warnIfOpen`"
-        errorLine1="                mGuard.warnIfOpen();"
-        errorLine2="                       ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="204"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.util.CloseGuard#close`"
-        errorLine1="        mGuard.close();"
-        errorLine2="               ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="218"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            final int taskId = mTaskInfo.taskId;"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="239"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="            mTransaction.reparent(mTaskLeash, getSurfaceControl())"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="255"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
-        errorLine1="            mTransaction.reparent(mTaskLeash, getSurfaceControl())"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="255"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    .apply();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="257"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
-        errorLine1="        if (taskInfo.taskDescription != null) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="266"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
-        errorLine1="            setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="267"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            final int taskId = taskInfo.taskId;"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="271"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            final int taskId = taskInfo.taskId;"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="284"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="        mTransaction.reparent(mTaskLeash, null).apply();"
-        errorLine2="                                                ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="292"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="        mTransaction.reparent(mTaskLeash, null).apply();"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="292"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
-        errorLine1="        if (taskInfo.taskDescription != null) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="298"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskDescription`"
-        errorLine1="            setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="299"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="            final int taskId = taskInfo.taskId;"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="307"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        if (mTaskInfo.taskId != taskId) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="316"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Builder#setParent`"
-        errorLine1="        b.setParent(mTaskLeash);"
-        errorLine2="          ~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="319"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.ActivityManager.RunningTaskInfo#taskId`"
-        errorLine1="        return &quot;TaskView&quot; + &quot;:&quot; + (mTaskInfo != null ? mTaskInfo.taskId : &quot;null&quot;);"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="331"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="            mTransaction.reparent(mTaskLeash, getSurfaceControl())"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="349"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceView#getSurfaceControl`"
-        errorLine1="            mTransaction.reparent(mTaskLeash, getSurfaceControl())"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="349"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                    .apply();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="351"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            mTransaction.reparent(mTaskLeash, null).apply();"
-        errorLine2="                                                    ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="374"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="            mTransaction.reparent(mTaskLeash, null).apply();"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java"
-            line="374"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="            return new SurfaceControl.Transaction();"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TransactionPool.java"
-            line="36"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.content.res.Resources#getFloat`"
-        errorLine1="                context.getResources().getFloat("
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="117"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
-        errorLine1="        if (info.getRootLeash().isValid()) {"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="231"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    t.setAlpha(leash, 1.f);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="247"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#reparent`"
-        errorLine1="                t.reparent(leash, info.getRootLeash());"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="256"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                    t.setLayer(leash, zSplitLine + info.getChanges().size() - i);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="266"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                        t.setAlpha(leash, 1.f);"
-        errorLine2="                          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="270"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                        t.setAlpha(leash, 0.f);"
-        errorLine2="                          ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="272"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                    t.setLayer(leash, zSplitLine - i);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="276"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setAlpha`"
-        errorLine1="                    t.setAlpha(leash, 1.f);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="277"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                    t.setLayer(leash, zSplitLine - i);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="282"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                    t.setLayer(leash, zSplitLine + info.getChanges().size() - i);"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="285"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#setLayer`"
-        errorLine1="                t.setLayer(leash, zSplitLine + info.getChanges().size() - i);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="288"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
-        errorLine1="        if (!info.getRootLeash().isValid()) {"
-        errorLine2="                                 ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="304"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="            t.apply();"
-        errorLine2="              ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java"
-            line="309"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.graphics.Outline#setPath`"
-        errorLine1="        outline.setPath(mTriangularPath);"
-        errorLine2="                ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/common/TriangleShape.java"
-            line="75"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mPipBoundsState.setDisplayLayout(new DisplayLayout(context, context.getDisplay()));"
-        errorLine2="                                                                            ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
-            line="147"
-            column="77"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#taskId`"
-        errorLine1="        mPinnedTaskId = pinnedTask.taskId;"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
-            line="283"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 26): `android.app.TaskInfo#topActivity`"
-        errorLine1="        mPipNotificationController.show(pinnedTask.topActivity.getPackageName());"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
-            line="287"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level R (current min is 26): `android.content.Context#getDisplay`"
-        errorLine1="        mContext.getDisplay().getDisplayInfo(displayInfo);"
-        errorLine2="                 ~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java"
-            line="348"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="                SurfaceControl.Transaction t = new SurfaceControl.Transaction();"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java"
-            line="134"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl.Transaction#apply`"
-        errorLine1="                t.apply();"
-        errorLine2="                  ~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java"
-            line="136"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `android.view.SurfaceControl#isValid`"
-        errorLine1="        if (out != null &amp;&amp; out.isValid()) {"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java"
-            line="188"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 29 (current min is 26): `new android.view.SurfaceControl.Transaction`"
-        errorLine1="                final SurfaceControl.Transaction sft = new SurfaceControl.Transaction();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="out/.intermediates/frameworks/base/libs/WindowManager/Shell/wm_shell_protolog_src/gen/wm_shell_protolog.srcjar!/frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java"
-            line="326"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
-        errorLine1="        android:bottomLeftRadius=&quot;?android:attr/dialogCornerRadius&quot;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
-            line="21"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
-        errorLine1="        android:topLeftRadius=&quot;?android:attr/dialogCornerRadius&quot;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
-            line="22"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
-        errorLine1="        android:bottomRightRadius=&quot;?android:attr/dialogCornerRadius&quot;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
-            line="23"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="`?android:attr/dialogCornerRadius` requires API level 28 (current min is 26)"
-        errorLine1="        android:topRightRadius=&quot;?android:attr/dialogCornerRadius&quot;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="frameworks/base/libs/WindowManager/Shell/res/drawable/rounded_bg_full.xml"
-            line="24"
-            column="9"/>
-    </issue>
-
-</issues>
diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml
index a138fee..e8757b5 100644
--- a/libs/WindowManager/Shell/res/values/config.xml
+++ b/libs/WindowManager/Shell/res/values/config.xml
@@ -52,9 +52,6 @@
      when the PIP menu is shown in center. -->
     <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string>
 
-    <!-- maximum animation duration for the icon when entering the starting window -->
-    <integer name="max_starting_window_intro_icon_anim_duration">1000</integer>
-
     <!-- Animation duration when exit starting window: icon going away -->
     <integer name="starting_window_icon_exit_anim_duration">166</integer>
 
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 3ced8d3..ef731235 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -178,7 +178,9 @@
     <dimen name="bubble_stack_user_education_side_inset">72dp</dimen>
 
     <!-- The width/height of the icon view on staring surface. -->
-    <dimen name="starting_surface_icon_size">108dp</dimen>
+    <dimen name="starting_surface_icon_size">160dp</dimen>
+    <!-- The default width/height of the icon on the spec of adaptive icon drawable. -->
+    <dimen name="default_icon_size">108dp</dimen>
 
     <!-- The width/height of the size compat restart button. -->
     <dimen name="size_compat_button_size">48dp</dimen>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java
index b6d408a..eb82c6d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java
@@ -23,7 +23,6 @@
 import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG;
 
 import android.app.ActivityManager;
-import android.app.ActivityTaskManager;
 import android.graphics.Rect;
 import android.view.SurfaceControl;
 import android.window.WindowContainerToken;
@@ -89,11 +88,11 @@
         ProtoLog.v(WM_SHELL_TASK_ORG, "pair task1=%d task2=%d in AppPair=%s",
                 task1.taskId, task2.taskId, this);
 
-        if ((!task1.isResizeable || !task2.isResizeable)
-                && !ActivityTaskManager.supportsNonResizableMultiWindow()) {
+        if (!task1.supportsMultiWindow || !task2.supportsMultiWindow) {
             ProtoLog.e(WM_SHELL_TASK_ORG,
-                    "Can't pair unresizeable tasks task1.isResizeable=%b task1.isResizeable=%b",
-                    task1.isResizeable, task2.isResizeable);
+                    "Can't pair tasks that doesn't support multi window, "
+                            + "task1.supportsMultiWindow=%b, task2.supportsMultiWindow=%b",
+                    task1.supportsMultiWindow, task2.supportsMultiWindow);
             return false;
         }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index 0a15d84..f6e92ef 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -165,7 +165,8 @@
      * Create a bubble with limited information based on given {@link ShortcutInfo}.
      * Note: Currently this is only being used when the bubble is persisted to disk.
      */
-    Bubble(@NonNull final String key, @NonNull final ShortcutInfo shortcutInfo,
+    @VisibleForTesting(visibility = PRIVATE)
+    public Bubble(@NonNull final String key, @NonNull final ShortcutInfo shortcutInfo,
             final int desiredHeight, final int desiredHeightResId, @Nullable final String title,
             int taskId, @Nullable final String locus, Executor mainExecutor) {
         Objects.requireNonNull(key);
@@ -188,7 +189,7 @@
     }
 
     @VisibleForTesting(visibility = PRIVATE)
-    Bubble(@NonNull final BubbleEntry entry,
+    public Bubble(@NonNull final BubbleEntry entry,
             @Nullable final Bubbles.SuppressionChangedListener listener,
             final Bubbles.PendingIntentCanceledListener intentCancelListener,
             Executor mainExecutor) {
@@ -718,7 +719,8 @@
 
     private int getUid(final Context context) {
         if (mAppUid != -1) return mAppUid;
-        final PackageManager pm = context.getPackageManager();
+        final PackageManager pm = BubbleController.getPackageManagerForUser(context,
+                mUser.getIdentifier());
         if (pm == null) return -1;
         try {
             final ApplicationInfo info = pm.getApplicationInfo(mShortcutInfo.getPackage(), 0);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index dca5985..6a0f061 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -48,9 +48,11 @@
 import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
+import android.content.pm.UserInfo;
 import android.content.res.Configuration;
 import android.graphics.PixelFormat;
 import android.graphics.PointF;
+import android.graphics.Rect;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
@@ -64,10 +66,12 @@
 import android.util.Log;
 import android.util.Pair;
 import android.util.Slog;
+import android.util.SparseArray;
 import android.util.SparseSetArray;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
+import android.window.WindowContainerTransaction;
 
 import androidx.annotation.MainThread;
 import androidx.annotation.Nullable;
@@ -77,6 +81,8 @@
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.WindowManagerShellWrapper;
+import com.android.wm.shell.common.DisplayChangeController;
+import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TaskStackListenerCallback;
@@ -129,6 +135,7 @@
     private final WindowManager mWindowManager;
     private final TaskStackListenerImpl mTaskStackListener;
     private final ShellTaskOrganizer mTaskOrganizer;
+    private final DisplayController mDisplayController;
 
     // Used to post to main UI thread
     private final ShellExecutor mMainExecutor;
@@ -144,6 +151,8 @@
 
     // Tracks the id of the current (foreground) user.
     private int mCurrentUserId;
+    // Current profiles of the user (e.g. user with a workprofile)
+    private SparseArray<UserInfo> mCurrentProfiles;
     // Saves notification keys of active bubbles when users are switched.
     private final SparseSetArray<String> mSavedBubbleKeysPerUser;
 
@@ -153,8 +162,8 @@
     // Callback that updates BubbleOverflowActivity on data change.
     @Nullable private BubbleData.Listener mOverflowListener = null;
 
-    // Only load overflow data from disk once
-    private boolean mOverflowDataLoaded = false;
+    // Typically only load once & after user switches
+    private boolean mOverflowDataLoadNeeded = true;
 
     /**
      * When the shade status changes to SHADE (from anything but SHADE, like LOCKED) we'll select
@@ -167,25 +176,21 @@
     /** Whether or not the BubbleStackView has been added to the WindowManager. */
     private boolean mAddedToWindowManager = false;
 
-    /** Last known orientation, used to detect orientation changes in {@link #onConfigChanged}. */
-    private int mOrientation = Configuration.ORIENTATION_UNDEFINED;
-
-    /**
-     * Last known screen density, used to detect display size changes in {@link #onConfigChanged}.
-     */
+    /** Saved screen density, used to detect display size changes in {@link #onConfigChanged}. */
     private int mDensityDpi = Configuration.DENSITY_DPI_UNDEFINED;
 
-    /**
-     * Last known font scale, used to detect font size changes in {@link #onConfigChanged}.
-     */
+    /** Saved screen bounds, used to detect screen size changes in {@link #onConfigChanged}. **/
+    private Rect mScreenBounds = new Rect();
+
+    /** Saved font scale, used to detect font size changes in {@link #onConfigChanged}. */
     private float mFontScale = 0;
 
-    /** Last known direction, used to detect layout direction changes @link #onConfigChanged}. */
+    /** Saved direction, used to detect layout direction changes @link #onConfigChanged}. */
     private int mLayoutDirection = View.LAYOUT_DIRECTION_UNDEFINED;
 
     private boolean mInflateSynchronously;
 
-    /** true when user is in status bar unlock shade. */
+    /** True when user is in status bar unlock shade. */
     private boolean mIsStatusBarShade = true;
 
     /**
@@ -201,6 +206,7 @@
             TaskStackListenerImpl taskStackListener,
             UiEventLogger uiEventLogger,
             ShellTaskOrganizer organizer,
+            DisplayController displayController,
             ShellExecutor mainExecutor,
             Handler mainHandler) {
         BubbleLogger logger = new BubbleLogger(uiEventLogger);
@@ -209,7 +215,8 @@
         return new BubbleController(context, data, synchronizer, floatingContentCoordinator,
                 new BubbleDataRepository(context, launcherApps, mainExecutor),
                 statusBarService, windowManager, windowManagerShellWrapper, launcherApps,
-                logger, taskStackListener, organizer, positioner, mainExecutor, mainHandler);
+                logger, taskStackListener, organizer, positioner, displayController, mainExecutor,
+                mainHandler);
     }
 
     /**
@@ -229,6 +236,7 @@
             TaskStackListenerImpl taskStackListener,
             ShellTaskOrganizer organizer,
             BubblePositioner positioner,
+            DisplayController displayController,
             ShellExecutor mainExecutor,
             Handler mainHandler) {
         mContext = context;
@@ -252,6 +260,7 @@
         mBubbleData = data;
         mSavedBubbleKeysPerUser = new SparseSetArray<>();
         mBubbleIconFactory = new BubbleIconFactory(context);
+        mDisplayController = displayController;
     }
 
     public void initialize() {
@@ -283,7 +292,6 @@
             e.printStackTrace();
         }
 
-
         mBubbleData.setCurrentUserId(mCurrentUserId);
 
         mTaskOrganizer.addLocusIdListener((taskId, locus, visible) ->
@@ -362,6 +370,23 @@
                 }
             }
         });
+
+        mDisplayController.addDisplayChangingController(
+                new DisplayChangeController.OnDisplayChangingListener() {
+                    @Override
+                    public void onRotateDisplay(int displayId, int fromRotation, int toRotation,
+                            WindowContainerTransaction t) {
+                        // This is triggered right before the rotation is applied
+                        if (fromRotation != toRotation) {
+                            mBubblePositioner.setRotation(toRotation);
+                            if (mStackView != null) {
+                                // Layout listener set on stackView will update the positioner
+                                // once the rotation is applied
+                                mStackView.onOrientationChanged();
+                            }
+                        }
+                    }
+                });
     }
 
     @VisibleForTesting
@@ -468,14 +493,31 @@
         updateStack();
     }
 
-    private void onUserChanged(int newUserId) {
+    /** Called when the current user changes. */
+    @VisibleForTesting
+    public void onUserChanged(int newUserId) {
         saveBubbles(mCurrentUserId);
-        mBubbleData.dismissAll(DISMISS_USER_CHANGED);
-        restoreBubbles(newUserId);
         mCurrentUserId = newUserId;
+
+        mBubbleData.dismissAll(DISMISS_USER_CHANGED);
+        mBubbleData.clearOverflow();
+        mOverflowDataLoadNeeded = true;
+
+        restoreBubbles(newUserId);
         mBubbleData.setCurrentUserId(newUserId);
     }
 
+    /** Called when the profiles for the current user change. **/
+    public void onCurrentProfilesChanged(SparseArray<UserInfo> currentProfiles) {
+        mCurrentProfiles = currentProfiles;
+    }
+
+    /** Whether this userId belongs to the current user. */
+    private boolean isCurrentProfile(int userId) {
+        return userId == UserHandle.USER_ALL
+                || (mCurrentProfiles != null && mCurrentProfiles.get(userId) != null);
+    }
+
     /**
      * Sets whether to perform inflation on the same thread as the caller. This method should only
      * be used in tests, not in production.
@@ -556,6 +598,7 @@
         mWmLayoutParams.setTitle("Bubbles!");
         mWmLayoutParams.packageName = mContext.getPackageName();
         mWmLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+        mWmLayoutParams.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
 
         try {
             mAddedToWindowManager = true;
@@ -563,7 +606,7 @@
             mStackView.addView(mBubbleScrim);
             mWindowManager.addView(mStackView, mWmLayoutParams);
             // Position info is dependent on us being attached to a window
-            mBubblePositioner.update(mOrientation);
+            mBubblePositioner.update();
         } catch (IllegalStateException e) {
             // This means the stack has already been added. This shouldn't happen...
             e.printStackTrace();
@@ -639,7 +682,7 @@
             });
         });
         // Finally, remove the entries for this user now that bubbles are restored.
-        mSavedBubbleKeysPerUser.remove(mCurrentUserId);
+        mSavedBubbleKeysPerUser.remove(userId);
     }
 
     private void updateForThemeChanges() {
@@ -660,16 +703,13 @@
 
     private void onConfigChanged(Configuration newConfig) {
         if (mBubblePositioner != null) {
-            // This doesn't trigger any changes, always update it
-            mBubblePositioner.update(newConfig.orientation);
+            mBubblePositioner.update();
         }
         if (mStackView != null && newConfig != null) {
-            if (newConfig.orientation != mOrientation) {
-                mOrientation = newConfig.orientation;
-                mStackView.onOrientationChanged();
-            }
-            if (newConfig.densityDpi != mDensityDpi) {
+            if (newConfig.densityDpi != mDensityDpi
+                    || !newConfig.windowConfiguration.getBounds().equals(mScreenBounds)) {
                 mDensityDpi = newConfig.densityDpi;
+                mScreenBounds.set(newConfig.windowConfiguration.getBounds());
                 mBubbleIconFactory = new BubbleIconFactory(mContext);
                 mStackView.onDisplaySizeChanged();
             }
@@ -804,12 +844,12 @@
      * Fills the overflow bubbles by loading them from disk.
      */
     void loadOverflowBubblesFromDisk() {
-        if (!mBubbleData.getOverflowBubbles().isEmpty() || mOverflowDataLoaded) {
+        if (!mBubbleData.getOverflowBubbles().isEmpty() && !mOverflowDataLoadNeeded) {
             // we don't need to load overflow bubbles from disk if it is already in memory
             return;
         }
-        mOverflowDataLoaded = true;
-        mDataRepository.loadBubbles((bubbles) -> {
+        mOverflowDataLoadNeeded = false;
+        mDataRepository.loadBubbles(mCurrentUserId, (bubbles) -> {
             bubbles.forEach(bubble -> {
                 if (mBubbleData.hasAnyBubbleWithKey(bubble.getKey())) {
                     // if the bubble is already active, there's no need to push it to overflow
@@ -911,6 +951,12 @@
             Pair<BubbleEntry, Boolean> entryData = entryDataByKey.get(key);
             BubbleEntry entry = entryData.first;
             boolean shouldBubbleUp = entryData.second;
+
+            if (entry != null && !isCurrentProfile(
+                    entry.getStatusBarNotification().getUser().getIdentifier())) {
+                return;
+            }
+
             rankingMap.getRanking(key, mTmpRanking);
             boolean isActiveBubble = mBubbleData.hasAnyBubbleWithKey(key);
             if (isActiveBubble && !mTmpRanking.canBubble()) {
@@ -1428,6 +1474,13 @@
         }
 
         @Override
+        public void onCurrentProfilesChanged(SparseArray<UserInfo> currentProfiles) {
+            mMainExecutor.execute(() -> {
+                BubbleController.this.onCurrentProfilesChanged(currentProfiles);
+            });
+        }
+
+        @Override
         public void onConfigChanged(Configuration newConfig) {
             mMainExecutor.execute(() -> {
                 BubbleController.this.onConfigChanged(newConfig);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index f6e6b8f3..6f526ec 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -510,7 +510,8 @@
                         || reason == Bubbles.DISMISS_NO_LONGER_BUBBLE
                         || reason == Bubbles.DISMISS_BLOCKED
                         || reason == Bubbles.DISMISS_SHORTCUT_REMOVED
-                        || reason == Bubbles.DISMISS_PACKAGE_REMOVED)) {
+                        || reason == Bubbles.DISMISS_PACKAGE_REMOVED
+                        || reason == Bubbles.DISMISS_USER_CHANGED)) {
 
                 Bubble b = getOverflowBubbleWithKey(key);
                 if (DEBUG_BUBBLE_DATA) {
@@ -574,6 +575,7 @@
             Log.d(TAG, "Overflowing: " + bubble);
         }
         mLogger.logOverflowAdd(bubble, reason);
+        mOverflowBubbles.remove(bubble);
         mOverflowBubbles.add(0, bubble);
         mStateChange.addedOverflowBubble = bubble;
         bubble.stopInflation();
@@ -642,6 +644,16 @@
         }
     }
 
+    /**
+     * Removes all bubbles from the overflow, called when the user changes.
+     */
+    public void clearOverflow() {
+        while (!mOverflowBubbles.isEmpty()) {
+            doRemove(mOverflowBubbles.get(0).getKey(), Bubbles.DISMISS_USER_CHANGED);
+        }
+        dispatchPendingChanges();
+    }
+
     private void dispatchPendingChanges() {
         if (mListener != null && mStateChange.anythingChanged()) {
             mListener.applyUpdate(mStateChange);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt
index bfacd1c..9d9e442 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleDataRepository.kt
@@ -58,7 +58,8 @@
      */
     fun addBubbles(@UserIdInt userId: Int, bubbles: List<Bubble>) {
         if (DEBUG) Log.d(TAG, "adding ${bubbles.size} bubbles")
-        val entities = transform(userId, bubbles).also(volatileRepository::addBubbles)
+        val entities = transform(bubbles).also {
+            b -> volatileRepository.addBubbles(userId, b) }
         if (entities.isNotEmpty()) persistToDisk()
     }
 
@@ -67,14 +68,15 @@
      */
     fun removeBubbles(@UserIdInt userId: Int, bubbles: List<Bubble>) {
         if (DEBUG) Log.d(TAG, "removing ${bubbles.size} bubbles")
-        val entities = transform(userId, bubbles).also(volatileRepository::removeBubbles)
+        val entities = transform(bubbles).also {
+            b -> volatileRepository.removeBubbles(userId, b) }
         if (entities.isNotEmpty()) persistToDisk()
     }
 
-    private fun transform(userId: Int, bubbles: List<Bubble>): List<BubbleEntity> {
+    private fun transform(bubbles: List<Bubble>): List<BubbleEntity> {
         return bubbles.mapNotNull { b ->
             BubbleEntity(
-                    userId,
+                    b.user.identifier,
                     b.packageName,
                     b.metadataShortcutId ?: return@mapNotNull null,
                     b.key,
@@ -116,10 +118,11 @@
     /**
      * Load bubbles from disk.
      * @param cb The callback to be run after the bubbles are loaded.  This callback is always made
-     *           on the main thread of the hosting process.
+     *           on the main thread of the hosting process. The callback is only run if there are
+     *           bubbles.
      */
     @SuppressLint("WrongConstant")
-    fun loadBubbles(cb: (List<Bubble>) -> Unit) = ioScope.launch {
+    fun loadBubbles(userId: Int, cb: (List<Bubble>) -> Unit) = ioScope.launch {
         /**
          * Load BubbleEntity from disk.
          * e.g.
@@ -129,8 +132,9 @@
          *     BubbleEntity(0, "com.example.messenger", "id-1")
          * ]
          */
-        val entities = persistentRepository.readFromDisk()
-        volatileRepository.addBubbles(entities)
+        val entitiesByUser = persistentRepository.readFromDisk()
+        val entities = entitiesByUser.get(userId) ?: return@launch
+        volatileRepository.addBubbles(userId, entities)
         /**
          * Extract userId/packageName from these entities.
          * e.g.
@@ -139,9 +143,10 @@
          * ]
          */
         val shortcutKeys = entities.map { ShortcutKey(it.userId, it.packageName) }.toSet()
+
         /**
-         * Retrieve shortcuts with given userId/packageName combination, then construct a mapping
-         * from the userId/packageName pair to a list of associated ShortcutInfo.
+         * Retrieve shortcuts with given userId/packageName combination, then construct a
+         * mapping from the userId/packageName pair to a list of associated ShortcutInfo.
          * e.g.
          * {
          *     ShortcutKey(0, "com.example.messenger") -> [
@@ -161,21 +166,23 @@
                             .setQueryFlags(SHORTCUT_QUERY_FLAG), UserHandle.of(key.userId))
                     ?: emptyList()
         }.groupBy { ShortcutKey(it.userId, it.`package`) }
-        // For each entity loaded from xml, find the corresponding ShortcutInfo then convert them
-        // into Bubble.
+        // For each entity loaded from xml, find the corresponding ShortcutInfo then convert
+        // them into Bubble.
         val bubbles = entities.mapNotNull { entity ->
             shortcutMap[ShortcutKey(entity.userId, entity.packageName)]
                     ?.firstOrNull { shortcutInfo -> entity.shortcutId == shortcutInfo.id }
-                    ?.let { shortcutInfo -> Bubble(
-                            entity.key,
-                            shortcutInfo,
-                            entity.desiredHeight,
-                            entity.desiredHeightResId,
-                            entity.title,
-                            entity.taskId,
-                            entity.locus,
-                            mainExecutor
-                    ) }
+                    ?.let { shortcutInfo ->
+                        Bubble(
+                                entity.key,
+                                shortcutInfo,
+                                entity.desiredHeight,
+                                entity.desiredHeightResId,
+                                entity.title,
+                                entity.taskId,
+                                entity.locus,
+                                mainExecutor
+                        )
+                    }
         }
         mainExecutor.execute { cb(bubbles) }
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
index fe3f9ef..e64ed6a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
@@ -29,6 +29,8 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.launcher3.icons.BaseIconFactory;
 import com.android.launcher3.icons.BitmapInfo;
 import com.android.launcher3.icons.ShadowGenerator;
@@ -39,11 +41,12 @@
  * We are not using Launcher's IconFactory because bubbles only runs on the UI thread,
  * so there is no need to manage a pool across multiple threads.
  */
+@VisibleForTesting
 public class BubbleIconFactory extends BaseIconFactory {
 
     private int mBadgeSize;
 
-    protected BubbleIconFactory(Context context) {
+    public BubbleIconFactory(Context context) {
         super(context, context.getResources().getConfiguration().densityDpi,
                 context.getResources().getDimensionPixelSize(R.dimen.individual_bubble_size));
         mBadgeSize = mContext.getResources().getDimensionPixelSize(
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java
index 8ee2b40..f7c7285 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java
@@ -220,18 +220,25 @@
                     Log.d(TAG, "remove: " + toRemove);
                 }
                 toRemove.cleanupViews();
-                final int i = mOverflowBubbles.indexOf(toRemove);
+                final int indexToRemove = mOverflowBubbles.indexOf(toRemove);
                 mOverflowBubbles.remove(toRemove);
-                mAdapter.notifyItemRemoved(i);
+                mAdapter.notifyItemRemoved(indexToRemove);
             }
 
             Bubble toAdd = update.addedOverflowBubble;
             if (toAdd != null) {
+                final int indexToAdd = mOverflowBubbles.indexOf(toAdd);
                 if (DEBUG_OVERFLOW) {
-                    Log.d(TAG, "add: " + toAdd);
+                    Log.d(TAG, "add: " + toAdd + " prevIndex: " + indexToAdd);
                 }
-                mOverflowBubbles.add(0, toAdd);
-                mAdapter.notifyItemInserted(0);
+                if (indexToAdd > 0) {
+                    mOverflowBubbles.remove(toAdd);
+                    mOverflowBubbles.add(0, toAdd);
+                    mAdapter.notifyItemMoved(indexToAdd, 0);
+                } else {
+                    mOverflowBubbles.add(0, toAdd);
+                    mAdapter.notifyItemInserted(0);
+                }
             }
 
             updateEmptyStateVisibility();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
index 1562e4b..a81c2d8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
@@ -20,13 +20,13 @@
 
 import android.annotation.IntDef;
 import android.content.Context;
-import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Insets;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.util.Log;
+import android.view.Surface;
 import android.view.View;
 import android.view.WindowInsets;
 import android.view.WindowManager;
@@ -65,7 +65,7 @@
     private Context mContext;
     private WindowManager mWindowManager;
     private Rect mPositionRect;
-    private int mOrientation;
+    private @Surface.Rotation int mRotation = Surface.ROTATION_0;
     private Insets mInsets;
 
     private int mBubbleSize;
@@ -82,14 +82,18 @@
     public BubblePositioner(Context context, WindowManager windowManager) {
         mContext = context;
         mWindowManager = windowManager;
-        update(Configuration.ORIENTATION_UNDEFINED);
+        update();
+    }
+
+    public void setRotation(int rotation) {
+        mRotation = rotation;
     }
 
     /**
-     * Updates orientation, available space, and inset information. Call this when config changes
+     * Available space and inset information. Call this when config changes
      * occur or when added to a window.
      */
-    public void update(int orientation) {
+    public void update() {
         WindowMetrics windowMetrics = mWindowManager.getCurrentWindowMetrics();
         if (windowMetrics == null) {
             return;
@@ -102,12 +106,12 @@
 
         if (BubbleDebugConfig.DEBUG_POSITIONER) {
             Log.w(TAG, "update positioner:"
-                    + " landscape= " + (orientation == Configuration.ORIENTATION_LANDSCAPE)
+                    + " rotation= " + mRotation
                     + " insets: " + insets
                     + " bounds: " + windowMetrics.getBounds()
                     + " showingInTaskbar: " + mShowingInTaskbar);
         }
-        updateInternal(orientation, insets, windowMetrics.getBounds());
+        updateInternal(mRotation, insets, windowMetrics.getBounds());
     }
 
     /**
@@ -122,12 +126,12 @@
         mTaskbarIconSize =  iconSize;
         mTaskbarPosition = taskbarPosition;
         mTaskbarSize = taskbarSize;
-        update(mOrientation);
+        update();
     }
 
     @VisibleForTesting
-    public void updateInternal(int orientation, Insets insets, Rect bounds) {
-        mOrientation = orientation;
+    public void updateInternal(int rotation, Insets insets, Rect bounds) {
+        mRotation = rotation;
         mInsets = insets;
 
         mPositionRect = new Rect(bounds);
@@ -189,7 +193,7 @@
      * @return whether the device is in landscape orientation.
      */
     public boolean isLandscape() {
-        return mOrientation == Configuration.ORIENTATION_LANDSCAPE;
+        return mRotation == Surface.ROTATION_90 || mRotation == Surface.ROTATION_270;
     }
 
     /**
@@ -200,8 +204,7 @@
      * to the left or right side.
      */
     public boolean showBubblesVertically() {
-        return mOrientation == Configuration.ORIENTATION_LANDSCAPE
-                || mShowingInTaskbar;
+        return isLandscape() || mShowingInTaskbar;
     }
 
     /** Size of the bubble account for badge & dot. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 64bd245..0f5d0ef 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -884,6 +884,7 @@
 
         mOrientationChangedListener =
                 (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
+                    mPositioner.update();
                     onDisplaySizeChanged();
                     mExpandedAnimationController.updateResources();
                     mStackAnimationController.updateResources();
@@ -1214,11 +1215,12 @@
         updateExpandedViewTheme();
     }
 
-    /** Respond to the phone being rotated by repositioning the stack and hiding any flyouts. */
+    /**
+     * Respond to the phone being rotated by repositioning the stack and hiding any flyouts.
+     * This is called prior to the rotation occurring, any values that should be updated
+     * based on the new rotation should occur in {@link #mOrientationChangedListener}.
+     */
     public void onOrientationChanged() {
-        Resources res = getContext().getResources();
-        mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
-
         mRelativeStackPositionBeforeRotation = new RelativeStackPosition(
                 mPositioner.getRestingPosition(),
                 mStackAnimationController.getAllowableStackPositionRegion());
@@ -1261,6 +1263,10 @@
         mStackAnimationController.updateResources();
         mDismissView.updateResources();
         mMagneticTarget.setMagneticFieldRadiusPx(mBubbleSize * 2);
+        mStackAnimationController.setStackPosition(
+                new RelativeStackPosition(
+                        mPositioner.getRestingPosition(),
+                        mStackAnimationController.getAllowableStackPositionRegion()));
     }
 
     @Override
@@ -1598,6 +1604,7 @@
             // can start fresh.
             cancelAllExpandCollapseSwitchAnimations();
         }
+        showManageMenu(false /* show */);
 
         // If we're expanded, screenshot the currently expanded bubble (before expanding the newly
         // selected bubble) so we can animate it out.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
index c5a712e..fc53ef26 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
@@ -39,6 +39,7 @@
 import android.view.LayoutInflater;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.graphics.ColorUtils;
 import com.android.launcher3.icons.BitmapInfo;
@@ -118,7 +119,8 @@
     /**
      * Info necessary to render a bubble.
      */
-    static class BubbleViewInfo {
+    @VisibleForTesting
+    public static class BubbleViewInfo {
         BadgedImageView imageView;
         BubbleExpandedView expandedView;
         ShortcutInfo shortcutInfo;
@@ -129,8 +131,9 @@
         Path dotPath;
         Bubble.FlyoutMessage flyoutMessage;
 
+        @VisibleForTesting
         @Nullable
-        static BubbleViewInfo populate(Context c, BubbleController controller,
+        public static BubbleViewInfo populate(Context c, BubbleController controller,
                 BubbleStackView stackView, BubbleIconFactory iconFactory, Bubble b,
                 boolean skipInflation) {
             BubbleViewInfo info = new BubbleViewInfo();
@@ -152,7 +155,8 @@
             }
 
             // App name & app icon
-            PackageManager pm = c.getPackageManager();
+            PackageManager pm = BubbleController.getPackageManagerForUser(c,
+                    b.getUser().getIdentifier());
             ApplicationInfo appInfo;
             Drawable badgedIcon;
             Drawable appIcon;
@@ -217,10 +221,16 @@
     static Drawable loadSenderAvatar(@NonNull final Context context, @Nullable final Icon icon) {
         Objects.requireNonNull(context);
         if (icon == null) return null;
-        if (icon.getType() == Icon.TYPE_URI || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {
-            context.grantUriPermission(context.getPackageName(),
-                    icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        try {
+            if (icon.getType() == Icon.TYPE_URI
+                    || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {
+                context.grantUriPermission(context.getPackageName(),
+                        icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            }
+            return icon.loadDrawable(context);
+        } catch (Exception e) {
+            Log.w(TAG, "loadSenderAvatar failed: " + e.getMessage());
+            return null;
         }
-        return icon.loadDrawable(context);
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
index 1bfb619..a93ce01 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
@@ -21,12 +21,14 @@
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
+import android.content.pm.UserInfo;
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.os.Looper;
 import android.service.notification.NotificationListenerService.RankingMap;
 import android.util.ArraySet;
 import android.util.Pair;
+import android.util.SparseArray;
 import android.view.View;
 
 import androidx.annotation.IntDef;
@@ -214,6 +216,13 @@
     void onUserChanged(int newUserId);
 
     /**
+     * Called when the current user profiles change.
+     *
+     * @param currentProfiles the user infos for the current profile.
+     */
+    void onCurrentProfilesChanged(SparseArray<UserInfo> currentProfiles);
+
+    /**
      * Called when config changed.
      *
      * @param newConfig the new config.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepository.kt
index 66a75af..130790a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepository.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepository.kt
@@ -18,6 +18,7 @@
 import android.content.Context
 import android.util.AtomicFile
 import android.util.Log
+import android.util.SparseArray
 import java.io.File
 import java.io.FileOutputStream
 import java.io.IOException
@@ -27,8 +28,8 @@
     private val bubbleFile: AtomicFile = AtomicFile(File(context.filesDir,
             "overflow_bubbles.xml"), "overflow-bubbles")
 
-    fun persistsToDisk(bubbles: List<BubbleEntity>): Boolean {
-        if (DEBUG) Log.d(TAG, "persisting ${bubbles.size} bubbles")
+    fun persistsToDisk(bubbles: SparseArray<List<BubbleEntity>>): Boolean {
+        if (DEBUG) Log.d(TAG, "persisting ${bubbles.size()} bubbles")
         synchronized(bubbleFile) {
             val stream: FileOutputStream = try { bubbleFile.startWrite() } catch (e: IOException) {
                 Log.e(TAG, "Failed to save bubble file", e)
@@ -37,7 +38,7 @@
             try {
                 writeXml(stream, bubbles)
                 bubbleFile.finishWrite(stream)
-                if (DEBUG) Log.d(TAG, "persisted ${bubbles.size} bubbles")
+                if (DEBUG) Log.d(TAG, "persisted ${bubbles.size()} bubbles")
                 return true
             } catch (e: Exception) {
                 Log.e(TAG, "Failed to save bubble file, restoring backup", e)
@@ -47,13 +48,13 @@
         return false
     }
 
-    fun readFromDisk(): List<BubbleEntity> {
+    fun readFromDisk(): SparseArray<List<BubbleEntity>> {
         synchronized(bubbleFile) {
-            if (!bubbleFile.exists()) return emptyList()
+            if (!bubbleFile.exists()) return SparseArray()
             try { return bubbleFile.openRead().use(::readXml) } catch (e: Throwable) {
                 Log.e(TAG, "Failed to open bubble file", e)
             }
-            return emptyList()
+            return SparseArray()
         }
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepository.kt
index 7f0b165..a5267d8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepository.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepository.kt
@@ -17,6 +17,7 @@
 
 import android.content.pm.LauncherApps
 import android.os.UserHandle
+import android.util.SparseArray
 import com.android.internal.annotations.VisibleForTesting
 import com.android.wm.shell.bubbles.ShortcutKey
 
@@ -27,10 +28,11 @@
  * manipulation.
  */
 class BubbleVolatileRepository(private val launcherApps: LauncherApps) {
+
     /**
-     * An ordered set of bubbles based on their natural ordering.
+     * Set of bubbles per user. Each set of bubbles is ordered by recency.
      */
-    private var entities = mutableSetOf<BubbleEntity>()
+    private var entitiesByUser = SparseArray<MutableList<BubbleEntity>>()
 
     /**
      * The capacity of the cache.
@@ -39,19 +41,43 @@
     var capacity = CAPACITY
 
     /**
-     * Returns a snapshot of all the bubbles.
+     * Returns a snapshot of all the bubbles, a map of the userId to bubble list.
      */
-    val bubbles: List<BubbleEntity>
+    val bubbles: SparseArray<List<BubbleEntity>>
         @Synchronized
-        get() = entities.toList()
+        get() {
+            val map = SparseArray<List<BubbleEntity>>()
+            for (i in 0 until entitiesByUser.size()) {
+                val k = entitiesByUser.keyAt(i)
+                val v = entitiesByUser.valueAt(i)
+                map.put(k, v.toList())
+            }
+            return map
+        }
+
+    /**
+     * Returns the entity list of the provided user's bubbles or creates one if it doesn't exist.
+     */
+    @Synchronized
+    fun getEntities(userId: Int): MutableList<BubbleEntity> {
+        val entities = entitiesByUser.get(userId)
+        return when (entities) {
+            null -> mutableListOf<BubbleEntity>().also {
+                entitiesByUser.put(userId, it)
+            }
+            else -> entities
+        }
+    }
 
     /**
      * Add the bubbles to memory and perform a de-duplication. In case a bubble already exists,
      * it will be moved to the last.
      */
     @Synchronized
-    fun addBubbles(bubbles: List<BubbleEntity>) {
+    fun addBubbles(userId: Int, bubbles: List<BubbleEntity>) {
         if (bubbles.isEmpty()) return
+        // Get the list for this user
+        var entities = getEntities(userId)
         // Verify the size of given bubbles is within capacity, otherwise trim down to capacity
         val bubblesInRange = bubbles.takeLast(capacity)
         // To ensure natural ordering of the bubbles, removes bubbles which already exist
@@ -61,16 +87,17 @@
         if (overflowCount > 0) {
             // Uncache ShortcutInfo of bubbles that will be removed due to capacity
             uncache(entities.take(overflowCount))
-            entities = entities.drop(overflowCount).toMutableSet()
+            entities = entities.drop(overflowCount).toMutableList()
         }
         entities.addAll(bubblesInRange)
+        entitiesByUser.put(userId, entities)
         cache(uniqueBubbles)
     }
 
     @Synchronized
-    fun removeBubbles(bubbles: List<BubbleEntity>) =
+    fun removeBubbles(userId: Int, bubbles: List<BubbleEntity>) =
             uncache(bubbles.filter { b: BubbleEntity ->
-                entities.removeIf { e: BubbleEntity -> b.key == e.key } })
+                getEntities(userId).removeIf { e: BubbleEntity -> b.key == e.key } })
 
     private fun cache(bubbles: List<BubbleEntity>) {
         bubbles.groupBy { ShortcutKey(it.userId, it.packageName) }.forEach { (key, bubbles) ->
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelper.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelper.kt
index a74445b..f4fa183 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelper.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelper.kt
@@ -16,6 +16,8 @@
 package com.android.wm.shell.bubbles.storage
 
 import android.app.ActivityTaskManager.INVALID_TASK_ID
+import android.os.UserHandle
+import android.util.SparseArray
 import android.util.Xml
 import com.android.internal.util.FastXmlSerializer
 import com.android.internal.util.XmlUtils
@@ -26,8 +28,8 @@
 import java.io.OutputStream
 import java.nio.charset.StandardCharsets
 
-// TODO: handle version changes gracefully
-private const val CURRENT_VERSION = 1
+// If this number increases, consider bubbles might be restored even with differences in XML.
+private const val CURRENT_VERSION = 2
 
 private const val TAG_BUBBLES = "bs"
 private const val ATTR_VERSION = "v"
@@ -46,13 +48,20 @@
  * Writes the bubbles in xml format into given output stream.
  */
 @Throws(IOException::class)
-fun writeXml(stream: OutputStream, bubbles: List<BubbleEntity>) {
+fun writeXml(stream: OutputStream, bubbles: SparseArray<List<BubbleEntity>>) {
     val serializer: XmlSerializer = FastXmlSerializer()
     serializer.setOutput(stream, StandardCharsets.UTF_8.name())
     serializer.startDocument(null, true)
     serializer.startTag(null, TAG_BUBBLES)
     serializer.attribute(null, ATTR_VERSION, CURRENT_VERSION.toString())
-    bubbles.forEach { b -> writeXmlEntry(serializer, b) }
+    for (i in 0 until bubbles.size()) {
+        val k = bubbles.keyAt(i)
+        val v = bubbles.valueAt(i)
+        serializer.startTag(null, TAG_BUBBLES)
+        serializer.attribute(null, ATTR_USER_ID, k.toString())
+        v.forEach { b -> writeXmlEntry(serializer, b) }
+        serializer.endTag(null, TAG_BUBBLES)
+    }
     serializer.endTag(null, TAG_BUBBLES)
     serializer.endDocument()
 }
@@ -84,16 +93,39 @@
 /**
  * Reads the bubbles from xml file.
  */
-fun readXml(stream: InputStream): List<BubbleEntity> {
-    val bubbles = mutableListOf<BubbleEntity>()
+fun readXml(stream: InputStream): SparseArray<List<BubbleEntity>> {
+    val bubbles = SparseArray<List<BubbleEntity>>()
     val parser: XmlPullParser = Xml.newPullParser()
     parser.setInput(stream, StandardCharsets.UTF_8.name())
     XmlUtils.beginDocument(parser, TAG_BUBBLES)
-    val version = parser.getAttributeWithName(ATTR_VERSION)?.toInt()
-    if (version != null && version == CURRENT_VERSION) {
+    val veryOuterDepth = parser.depth
+    val version = parser.getAttributeWithName(ATTR_VERSION)?.toInt() ?: return bubbles
+    if (version == CURRENT_VERSION) {
+        while (XmlUtils.nextElementWithin(parser, veryOuterDepth)) {
+            val uid = parser.getAttributeWithName(ATTR_USER_ID) ?: continue
+            val outerDepth = parser.depth
+            val userBubbles = mutableListOf<BubbleEntity>()
+            while (XmlUtils.nextElementWithin(parser, outerDepth)) {
+                userBubbles.add(readXmlEntry(parser) ?: continue)
+            }
+            if (!userBubbles.isEmpty()) {
+                bubbles.put(uid.toInt(), userBubbles.toList())
+            }
+        }
+    } else if (version == 1) {
+        // upgrade v1 to v2 format
         val outerDepth = parser.depth
+        val userBubbles = mutableListOf<BubbleEntity>()
         while (XmlUtils.nextElementWithin(parser, outerDepth)) {
-            bubbles.add(readXmlEntry(parser) ?: continue)
+            // We can't tell which profile the bubble was for, so we'll only copy the main users'
+            // bubbles on upgrade.
+            val b = readXmlEntry(parser)
+            if (b != null && b.userId == UserHandle.USER_SYSTEM) {
+                userBubbles.add(b)
+            }
+        }
+        if (!userBubbles.isEmpty()) {
+            bubbles.put(UserHandle.USER_SYSTEM, userBubbles.toList())
         }
     }
     return bubbles
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
index b9fdaa1..442e7a4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
@@ -110,6 +110,10 @@
             return false;
         }
 
+        if (mDoubleTapDetector.onTouchEvent(event)) {
+            return true;
+        }
+
         final int action = event.getAction() & MotionEvent.ACTION_MASK;
         final boolean isLandscape = isLandscape();
         // Using raw xy to prevent lost track of motion events while moving divider bar.
@@ -136,21 +140,22 @@
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
                 mVelocityTracker.addMovement(event);
+                releaseTouching();
+
+                if (!mMoving) break;
+
                 mVelocityTracker.computeCurrentVelocity(1000 /* units */);
                 final float velocity = isLandscape
                         ? mVelocityTracker.getXVelocity()
                         : mVelocityTracker.getYVelocity();
-                releaseTouching();
-                mMoving = false;
-
                 final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos;
                 final DividerSnapAlgorithm.SnapTarget snapTarget =
                         mSplitLayout.findSnapTarget(position, velocity, false /* hardDismiss */);
                 mSplitLayout.snapToTarget(position, snapTarget);
+                mMoving = false;
                 break;
         }
 
-        mDoubleTapDetector.onTouchEvent(event);
         return true;
     }
 
@@ -229,7 +234,7 @@
             if (mSplitLayout != null) {
                 mSplitLayout.onDoubleTappedDivider();
             }
-            return false;
+            return true;
         }
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index b64c796..d318a5a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -231,6 +231,7 @@
     }
 
     private void flingDividePosition(int from, int to) {
+        if (from == to) return;
         ValueAnimator animator = ValueAnimator
                 .ofInt(from, to)
                 .setDuration(250);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java
index 57a9dd2..23171bb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerImeController.java
@@ -109,8 +109,9 @@
         return mSplits.mSplitScreenController.getSplitLayout();
     }
 
-    private boolean isDividerVisible() {
-        return mSplits.mSplitScreenController.isDividerVisible();
+    private boolean isDividerHidden() {
+        final DividerView view = mSplits.mSplitScreenController.getDividerView();
+        return view == null || view.isHidden();
     }
 
     private boolean getSecondaryHasFocus(int displayId) {
@@ -143,7 +144,7 @@
     @ImeAnimationFlags
     public int onImeStartPositioning(int displayId, int hiddenTop, int shownTop,
             boolean imeShouldShow, boolean imeIsFloating, SurfaceControl.Transaction t) {
-        if (!isDividerVisible()) {
+        if (isDividerHidden()) {
             return 0;
         }
         mHiddenTop = hiddenTop;
@@ -263,7 +264,7 @@
     @Override
     public void onImePositionChanged(int displayId, int imeTop,
             SurfaceControl.Transaction t) {
-        if (mAnimation != null || !isDividerVisible() || mPaused) {
+        if (mAnimation != null || isDividerHidden() || mPaused) {
             // Not synchronized with IME anymore, so return.
             return;
         }
@@ -275,7 +276,7 @@
     @Override
     public void onImeEndPositioning(int displayId, boolean cancelled,
             SurfaceControl.Transaction t) {
-        if (mAnimation != null || !isDividerVisible() || mPaused) {
+        if (mAnimation != null || isDividerHidden() || mPaused) {
             // Not synchronized with IME anymore, so return.
             return;
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
index a18d106..60f7ee2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java
@@ -49,7 +49,6 @@
 import android.view.View;
 import android.view.View.OnTouchListener;
 import android.view.ViewConfiguration;
-import android.view.ViewRootImpl;
 import android.view.ViewTreeObserver.InternalInsetsInfo;
 import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
 import android.view.WindowManager;
@@ -524,9 +523,10 @@
             case MotionEvent.ACTION_CANCEL:
                 mVelocityTracker.addMovement(event);
 
+                if (!mMoving) break;
+
                 x = (int) event.getRawX();
                 y = (int) event.getRawY();
-
                 mVelocityTracker.computeCurrentVelocity(1000);
                 int position = calculatePosition(x, y);
                 stopDragging(position, isHorizontalDivision() ? mVelocityTracker.getYVelocity()
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java
index 27c56fd..d9409ec 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/LegacySplitScreenTransitions.java
@@ -30,7 +30,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
-import android.app.ActivityTaskManager;
 import android.app.WindowConfiguration;
 import android.graphics.Rect;
 import android.os.IBinder;
@@ -92,11 +91,10 @@
                         // is nothing behind it.
                         ((type == TRANSIT_CLOSE || type == TRANSIT_TO_BACK)
                                 && triggerTask.parentTaskId == mListener.mPrimary.taskId)
-                        // if a non-resizable is launched when it is not supported in multi window,
+                        // if an activity that is not supported in multi window mode is launched,
                         // we also need to leave split-screen.
                         || ((type == TRANSIT_OPEN || type == TRANSIT_TO_FRONT)
-                                && !triggerTask.isResizeable
-                                && !ActivityTaskManager.supportsNonResizableMultiWindow());
+                                && !triggerTask.supportsMultiWindow);
                 // In both cases, dismiss the primary
                 if (shouldDismiss) {
                     WindowManagerProxy.buildDismissSplit(out, mListener,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java
index 5a2ef56..1072845 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/WindowManagerProxy.java
@@ -46,7 +46,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.function.BooleanSupplier;
 
 /**
  * Proxy to simplify calls into window manager/activity manager
@@ -209,17 +208,10 @@
             return false;
         }
         ActivityManager.RunningTaskInfo topHomeTask = null;
-        // One-time lazy wrapper to avoid duplicated IPC in loop. Not store as class variable
-        // because the value can be changed at runtime.
-        final BooleanSupplier supportsNonResizableMultiWindow =
-                createSupportsNonResizableMultiWindowSupplier();
         for (int i = rootTasks.size() - 1; i >= 0; --i) {
             final ActivityManager.RunningTaskInfo rootTask = rootTasks.get(i);
-            // Check whether to move resizeable task to split secondary.
-            // Also, we have an exception for non-resizable home because we will minimize to show
-            // it.
-            if (!rootTask.isResizeable && rootTask.topActivityType != ACTIVITY_TYPE_HOME
-                    && !supportsNonResizableMultiWindow.getAsBoolean()) {
+            // Check whether the task can be moved to split secondary.
+            if (!rootTask.supportsMultiWindow && rootTask.topActivityType != ACTIVITY_TYPE_HOME) {
                 continue;
             }
             // Only move fullscreen tasks to split secondary.
@@ -364,21 +356,6 @@
         outWct.setFocusable(tiles.mPrimary.token, true /* focusable */);
     }
 
-    /** Creates a lazy wrapper to get whether it supports non-resizable in multi window. */
-    private static BooleanSupplier createSupportsNonResizableMultiWindowSupplier() {
-        return new BooleanSupplier() {
-            private Boolean mSupportsNonResizableMultiWindow;
-            @Override
-            public boolean getAsBoolean() {
-                if (mSupportsNonResizableMultiWindow == null) {
-                    mSupportsNonResizableMultiWindow =
-                            ActivityTaskManager.supportsNonResizableMultiWindow();
-                }
-                return mSupportsNonResizableMultiWindow;
-            }
-        };
-    }
-
     /**
      * Utility to apply a sync transaction serially with other sync transactions.
      *
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java
index 625f4b8..04ec391 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java
@@ -21,6 +21,10 @@
 import static android.view.Display.DEFAULT_DISPLAY;
 
 import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission;
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_ACTIVE;
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_ENTERING;
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_EXITING;
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_NONE;
 
 import android.annotation.BinderThread;
 import android.content.ComponentName;
@@ -62,8 +66,7 @@
 /**
  * Manages and manipulates the one handed states, transitions, and gesture for phones.
  */
-public class OneHandedController implements RemoteCallable<OneHandedController>,
-        OneHandedTransitionCallback {
+public class OneHandedController implements RemoteCallable<OneHandedController> {
     private static final String TAG = "OneHandedController";
 
     private static final String ONE_HANDED_MODE_OFFSET_PERCENTAGE =
@@ -75,7 +78,6 @@
 
     private volatile boolean mIsOneHandedEnabled;
     private volatile boolean mIsSwipeToNotificationEnabled;
-    private volatile boolean mIsTransitioning;
     private boolean mTaskChangeToExit;
     private boolean mLockedDisabled;
     private int mUserId;
@@ -89,6 +91,7 @@
     private final OneHandedAccessibilityUtil mOneHandedAccessibilityUtil;
     private final OneHandedTimeoutHandler mTimeoutHandler;
     private final OneHandedTouchHandler mTouchHandler;
+    private final OneHandedState mState;
     private final OneHandedTutorialHandler mTutorialHandler;
     private final OneHandedUiEventLogger mOneHandedUiEventLogger;
     private final TaskStackListenerImpl mTaskStackListener;
@@ -162,6 +165,19 @@
                 }
             };
 
+    private final OneHandedTransitionCallback mTransitionCallBack =
+            new OneHandedTransitionCallback() {
+                @Override
+                public void onStartFinished(Rect bounds) {
+                    mState.setState(STATE_ACTIVE);
+                }
+
+                @Override
+                public void onStopFinished(Rect bounds) {
+                    mState.setState(STATE_NONE);
+                }
+            };
+
     private final TaskStackListenerCallback mTaskStackListenerCallback =
             new TaskStackListenerCallback() {
                 @Override
@@ -200,8 +216,9 @@
         OneHandedSettingsUtil settingsUtil = new OneHandedSettingsUtil();
         OneHandedAccessibilityUtil accessibilityUtil = new OneHandedAccessibilityUtil(context);
         OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor);
+        OneHandedState transitionState = new OneHandedState();
         OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context,
-                windowManager, mainExecutor);
+                displayLayout, windowManager, mainExecutor);
         OneHandedAnimationController animationController =
                 new OneHandedAnimationController(context);
         OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler,
@@ -218,7 +235,7 @@
                 ServiceManager.getService(Context.OVERLAY_SERVICE));
         return new OneHandedController(context, displayController,
                 oneHandedBackgroundPanelOrganizer, organizer, touchHandler, tutorialHandler,
-                gestureHandler, settingsUtil, accessibilityUtil, timeoutHandler,
+                gestureHandler, settingsUtil, accessibilityUtil, timeoutHandler, transitionState,
                 oneHandedUiEventsLogger, overlayManager, taskStackListener, mainExecutor,
                 mainHandler);
     }
@@ -234,6 +251,7 @@
             OneHandedSettingsUtil settingsUtil,
             OneHandedAccessibilityUtil oneHandedAccessibilityUtil,
             OneHandedTimeoutHandler timeoutHandler,
+            OneHandedState state,
             OneHandedUiEventLogger uiEventsLogger,
             IOverlayManager overlayManager,
             TaskStackListenerImpl taskStackListener,
@@ -246,6 +264,7 @@
         mDisplayAreaOrganizer = displayAreaOrganizer;
         mDisplayController = displayController;
         mTouchHandler = touchHandler;
+        mState = state;
         mTutorialHandler = tutorialHandler;
         mGestureHandler = gestureHandler;
         mOverlayManager = overlayManager;
@@ -330,26 +349,27 @@
 
     @VisibleForTesting
     void startOneHanded() {
-        if (isLockedDisabled() || mIsTransitioning) {
+        if (isLockedDisabled()) {
             Slog.d(TAG, "Temporary lock disabled");
             return;
         }
+        if (mState.isTransitioning() || mState.isInOneHanded()) {
+            return;
+        }
         final int currentRotation = mDisplayAreaOrganizer.getDisplayLayout().rotation();
         if (currentRotation != Surface.ROTATION_0 && currentRotation != Surface.ROTATION_180) {
             Slog.w(TAG, "One handed mode only support portrait mode");
             return;
         }
-        if (!mDisplayAreaOrganizer.isInOneHanded()) {
-            mIsTransitioning = true;
-            final int yOffSet = Math.round(
-                    mDisplayAreaOrganizer.getDisplayLayout().height() * mOffSetFraction);
-            mOneHandedAccessibilityUtil.announcementForScreenReader(
-                    mOneHandedAccessibilityUtil.getOneHandedStartDescription());
-            mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
-            mTimeoutHandler.resetTimer();
-            mOneHandedUiEventLogger.writeEvent(
-                    OneHandedUiEventLogger.EVENT_ONE_HANDED_TRIGGER_GESTURE_IN);
-        }
+        mState.setState(STATE_ENTERING);
+        final int yOffSet = Math.round(
+                mDisplayAreaOrganizer.getDisplayLayout().height() * mOffSetFraction);
+        mOneHandedAccessibilityUtil.announcementForScreenReader(
+                mOneHandedAccessibilityUtil.getOneHandedStartDescription());
+        mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
+        mTimeoutHandler.resetTimer();
+        mOneHandedUiEventLogger.writeEvent(
+                OneHandedUiEventLogger.EVENT_ONE_HANDED_TRIGGER_GESTURE_IN);
     }
 
     @VisibleForTesting
@@ -358,14 +378,15 @@
     }
 
     private void stopOneHanded(int uiEvent) {
-        if (mDisplayAreaOrganizer.isInOneHanded() && !mIsTransitioning) {
-            mIsTransitioning = true;
-            mOneHandedAccessibilityUtil.announcementForScreenReader(
-                    mOneHandedAccessibilityUtil.getOneHandedStopDescription());
-            mDisplayAreaOrganizer.scheduleOffset(0, 0);
-            mTimeoutHandler.removeTimer();
-            mOneHandedUiEventLogger.writeEvent(uiEvent);
+        if (mState.isTransitioning() || mState.getState() == STATE_NONE) {
+            return;
         }
+        mState.setState(STATE_EXITING);
+        mOneHandedAccessibilityUtil.announcementForScreenReader(
+                mOneHandedAccessibilityUtil.getOneHandedStopDescription());
+        mDisplayAreaOrganizer.scheduleOffset(0, 0);
+        mTimeoutHandler.removeTimer();
+        mOneHandedUiEventLogger.writeEvent(uiEvent);
     }
 
     private void setThreeButtonModeEnabled(boolean enabled) {
@@ -388,7 +409,7 @@
         mDisplayAreaOrganizer.registerTransitionCallback(mGestureHandler);
         mDisplayAreaOrganizer.registerTransitionCallback(mTutorialHandler);
         mDisplayAreaOrganizer.registerTransitionCallback(mBackgroundPanelOrganizer);
-        mDisplayAreaOrganizer.registerTransitionCallback(this);
+        mDisplayAreaOrganizer.registerTransitionCallback(mTransitionCallBack);
         if (mTaskChangeToExit) {
             mTaskStackListener.addListener(mTaskStackListenerCallback);
         }
@@ -432,6 +453,7 @@
         final DisplayLayout newDisplayLayout = mDisplayController.getDisplayLayout(displayId);
         mDisplayAreaOrganizer.setDisplayLayout(newDisplayLayout);
         mGestureHandler.onDisplayChanged(newDisplayLayout);
+        mTutorialHandler.onDisplayChanged(newDisplayLayout);
     }
 
     private ContentObserver getObserver(Runnable onChangeRunnable) {
@@ -523,8 +545,8 @@
     }
 
     private void updateOneHandedEnabled() {
-        if (mDisplayAreaOrganizer.isInOneHanded()) {
-            stopOneHanded();
+        if (mState.getState() == STATE_ENTERING || mState.getState() == STATE_ACTIVE) {
+            mMainExecutor.execute(() -> stopOneHanded());
         }
 
         mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled);
@@ -615,8 +637,6 @@
         pw.println(mLockedDisabled);
         pw.print(innerPrefix + "mUserId=");
         pw.println(mUserId);
-        pw.print(innerPrefix + "mIsTransitioning=");
-        pw.println(mIsTransitioning);
 
         if (mBackgroundPanelOrganizer != null) {
             mBackgroundPanelOrganizer.dump(pw);
@@ -638,6 +658,10 @@
             mTimeoutHandler.dump(pw);
         }
 
+        if (mState != null) {
+            mState.dump(pw);
+        }
+
         if (mTutorialHandler != null) {
             mTutorialHandler.dump(pw);
         }
@@ -663,26 +687,6 @@
     }
 
     /**
-     * TODO(b/185558765) To implement a state machine for One-Handed transition state machine.
-     * ONE_HANDDE_STATE_TRANSITION {
-     * STATE_DEFAULT,
-     * STATE_TRANSITIONING,
-     * STATE_ENTER_ONE_HANED,
-     * STATE_EXIT_ONE_HANDED
-     * }
-     * and we need to align the state to launcher3 quick steps through SysuiProxy.
-     */
-    @Override
-    public void onStartFinished(Rect bounds) {
-        mIsTransitioning = false;
-    }
-
-    @Override
-    public void onStopFinished(Rect bounds) {
-        mIsTransitioning = false;
-    }
-
-    /**
      * The interface for calls from outside the Shell, within the host process.
      */
     @ExternalThread
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java
index d1b3f1a..4b4d934 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java
@@ -65,7 +65,6 @@
     private final Rect mDefaultDisplayBounds = new Rect();
     private final OneHandedSettingsUtil mOneHandedSettingsUtil;
 
-    private boolean mIsInOneHanded;
     private int mEnterExitAnimationDurationMs;
 
     private ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaTokenMap = new ArrayMap();
@@ -82,6 +81,14 @@
                 @Override
                 public void onOneHandedAnimationStart(
                         OneHandedAnimationController.OneHandedTransitionAnimator animator) {
+                    final boolean isEntering = animator.getTransitionDirection()
+                            == TRANSITION_DIRECTION_TRIGGER;
+                    if (!mTransitionCallbacks.isEmpty()) {
+                        for (int i = mTransitionCallbacks.size() - 1; i >= 0; i--) {
+                            final OneHandedTransitionCallback cb = mTransitionCallbacks.get(i);
+                            cb.onStartTransition(isEntering);
+                        }
+                    }
                 }
 
                 @Override
@@ -260,31 +267,20 @@
     @VisibleForTesting
     void finishOffset(int offset,
             @OneHandedAnimationController.TransitionDirection int direction) {
-        // Only finishOffset() can update mIsInOneHanded to ensure the state is handle in sequence,
-        // the flag *MUST* be updated before dispatch mTransitionCallbacks
-        mIsInOneHanded = (offset > 0 || direction == TRANSITION_DIRECTION_TRIGGER);
         mLastVisualDisplayBounds.offsetTo(0,
                 direction == TRANSITION_DIRECTION_TRIGGER ? offset : 0);
         for (int i = mTransitionCallbacks.size() - 1; i >= 0; i--) {
-            final OneHandedTransitionCallback callback = mTransitionCallbacks.get(i);
+            final OneHandedTransitionCallback cb = mTransitionCallbacks.get(i);
+            cb.onStartTransition(false /* isTransitioning */);
             if (direction == TRANSITION_DIRECTION_TRIGGER) {
-                callback.onStartFinished(getLastVisualDisplayBounds());
+                cb.onStartFinished(getLastVisualDisplayBounds());
             } else {
-                callback.onStopFinished(getLastVisualDisplayBounds());
+                cb.onStopFinished(getLastVisualDisplayBounds());
             }
         }
     }
 
     /**
-     * The latest state of one handed mode
-     *
-     * @return true Currently is in one handed mode, otherwise is not in one handed mode
-     */
-    public boolean isInOneHanded() {
-        return mIsInOneHanded;
-    }
-
-    /**
      * The latest visual bounds of displayArea translated
      *
      * @return Rect latest finish_offset
@@ -328,8 +324,6 @@
     void dump(@NonNull PrintWriter pw) {
         final String innerPrefix = "  ";
         pw.println(TAG + "states: ");
-        pw.print(innerPrefix + "mIsInOneHanded=");
-        pw.println(mIsInOneHanded);
         pw.print(innerPrefix + "mDisplayLayout.rotation()=");
         pw.println(mDisplayLayout.rotation());
         pw.print(innerPrefix + "mDisplayAreaTokenMap=");
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedState.java
new file mode 100644
index 0000000..cc87443
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedState.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.onehanded;
+
+import android.annotation.IntDef;
+
+import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ Represents current OHM state by following steps, a generic CUJ is
+ STATE_NONE -> STATE_ENTERING -> STATE_ACTIVE -> STATE_EXITING -> STATE_NONE
+ */
+public class OneHandedState {
+    /** DEFAULT STATE after OHM feature initialized. */
+    public static final int STATE_NONE = 0x00000000;
+    /** The state flag set when user trigger OHM. */
+    public static final int STATE_ENTERING = 0x00000001;
+    /** The state flag set when transitioning */
+    public static final int STATE_ACTIVE = 0x00000002;
+    /** The state flag set when user stop OHM feature. */
+    public static final int STATE_EXITING = 0x00000004;
+
+    @IntDef(prefix = { "STATE_" }, value =  {
+            STATE_NONE,
+            STATE_ENTERING,
+            STATE_ACTIVE,
+            STATE_EXITING
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @interface State {}
+
+    public OneHandedState() {
+        sCurrentState = STATE_NONE;
+    }
+
+    @State
+    private static int sCurrentState = STATE_NONE;
+
+    private static final String TAG = OneHandedState.class.getSimpleName();
+
+    /**
+     * Gets current transition state of One handed mode.
+     *
+     * @return The bitwise flags representing current states.
+     */
+    public @State int getState() {
+        return sCurrentState;
+    }
+
+    /**
+     * Is the One handed mode is in transitioning state.
+     * @return true if One handed mode is in transitioning states.
+     */
+    public boolean isTransitioning() {
+        return sCurrentState == STATE_ENTERING || sCurrentState == STATE_EXITING;
+    }
+
+    /**
+     * Is the One handed mode active state.
+     * @return true if One handed mode is active state.
+     */
+    public boolean isInOneHanded() {
+        return sCurrentState == STATE_ACTIVE;
+    }
+
+    /**
+     * Sets new state for One handed mode feature.
+     * @param newState The bitwise value to represent current transition states.
+     */
+    public void setState(@State int newState) {
+        sCurrentState = newState;
+    }
+
+    /** Dumps internal state. */
+    public void dump(PrintWriter pw) {
+        final String innerPrefix = "  ";
+        pw.println(TAG + "states: ");
+        pw.println(innerPrefix + "sCurrentState=" + sCurrentState);
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTransitionCallback.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTransitionCallback.java
index 3af7c4b..e829186 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTransitionCallback.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTransitionCallback.java
@@ -24,6 +24,12 @@
  */
 public interface OneHandedTransitionCallback {
     /**
+     * Called when one handed mode entering or exiting transition starting
+     */
+    default void onStartTransition(boolean isEntering) {
+    }
+
+    /**
      * Called when start one handed transition finished
      */
     default void onStartFinished(Rect bounds) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java
index b445917..7a3f34d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java
@@ -33,6 +33,7 @@
 import androidx.annotation.NonNull;
 
 import com.android.wm.shell.R;
+import com.android.wm.shell.common.DisplayLayout;
 import com.android.wm.shell.common.ShellExecutor;
 
 import java.io.PrintWriter;
@@ -50,9 +51,10 @@
     private static final int MAX_TUTORIAL_SHOW_COUNT = 2;
     private final WindowManager mWindowManager;
     private final String mPackageName;
-    private final Rect mDisplaySize;
+    private final float mTutorialHeightRatio;
 
     private Context mContext;
+    private Rect mDisplayBounds;
     private View mTutorialView;
     private ContentResolver mContentResolver;
     private boolean mCanShowTutorial;
@@ -94,23 +96,22 @@
         }
     };
 
-    public OneHandedTutorialHandler(Context context, WindowManager windowManager,
-            ShellExecutor mainExecutor) {
+    public OneHandedTutorialHandler(Context context, DisplayLayout displayLayout,
+            WindowManager windowManager, ShellExecutor mainExecutor) {
         mContext = context;
         mWindowManager = windowManager;
-        mDisplaySize = windowManager.getCurrentWindowMetrics().getBounds();
         mPackageName = context.getPackageName();
         mContentResolver = context.getContentResolver();
-        mCanShowTutorial = (Settings.Secure.getInt(mContentResolver,
-                Settings.Secure.ONE_HANDED_TUTORIAL_SHOW_COUNT, 0) >= MAX_TUTORIAL_SHOW_COUNT)
-                ? false : true;
-        mIsOneHandedMode = false;
         final float offsetPercentageConfig = context.getResources().getFraction(
                 R.fraction.config_one_handed_offset, 1, 1);
         final int sysPropPercentageConfig = SystemProperties.getInt(
                 ONE_HANDED_MODE_OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f));
-        mTutorialAreaHeight = Math.round(
-                mDisplaySize.height() * (sysPropPercentageConfig / 100.0f));
+        mTutorialHeightRatio = sysPropPercentageConfig / 100.0f;
+        onDisplayChanged(displayLayout);
+        mCanShowTutorial = (Settings.Secure.getInt(mContentResolver,
+                Settings.Secure.ONE_HANDED_TUTORIAL_SHOW_COUNT, 0) >= MAX_TUTORIAL_SHOW_COUNT)
+                ? false : true;
+        mIsOneHandedMode = false;
 
         mainExecutor.execute(() -> {
             recreateTutorialView(mContext);
@@ -131,6 +132,20 @@
         mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET;
     }
 
+    /**
+     * Called when onDisplayAdded() or onDisplayRemoved() callback
+     * @param displayLayout The latest {@link DisplayLayout} representing current displayId
+     */
+    public void onDisplayChanged(DisplayLayout displayLayout) {
+        // Ensure the mDisplayBounds is portrait, due to OHM only support on portrait
+        if (displayLayout.height() > displayLayout.width()) {
+            mDisplayBounds = new Rect(0, 0, displayLayout.width(), displayLayout.height());
+        } else {
+            mDisplayBounds = new Rect(0, 0, displayLayout.height(), displayLayout.width());
+        }
+        mTutorialAreaHeight = Math.round(mDisplayBounds.height() * mTutorialHeightRatio);
+    }
+
     private void recreateTutorialView(Context context) {
         mTutorialView = LayoutInflater.from(context).inflate(R.layout.one_handed_tutorial,
                 null);
@@ -190,7 +205,7 @@
      */
     private WindowManager.LayoutParams getTutorialTargetLayoutParams() {
         final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
-                mDisplaySize.width(), mTutorialAreaHeight, 0, 0,
+                mDisplayBounds.width(), mTutorialAreaHeight, 0, 0,
                 WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
                 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                     | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
@@ -207,8 +222,8 @@
         pw.println(TAG + " states: ");
         pw.print(innerPrefix + "mTriggerState=");
         pw.println(mTriggerState);
-        pw.print(innerPrefix + "mDisplaySize=");
-        pw.println(mDisplaySize);
+        pw.print(innerPrefix + "mDisplayBounds=");
+        pw.println(mDisplayBounds);
         pw.print(innerPrefix + "mTutorialAreaHeight=");
         pw.println(mTutorialAreaHeight);
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
index 8ac9a7a..ca05ff4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java
@@ -427,35 +427,43 @@
                 Rect baseValue, Rect startValue, Rect endValue, Rect sourceHintRect,
                 @PipAnimationController.TransitionDirection int direction, float startingAngle,
                 @Surface.Rotation int rotationDelta) {
+            final boolean isOutPipDirection = isOutPipDirection(direction);
+
             // Just for simplicity we'll interpolate between the source rect hint insets and empty
             // insets to calculate the window crop
             final Rect initialSourceValue;
-            if (isOutPipDirection(direction)) {
+            if (isOutPipDirection) {
                 initialSourceValue = new Rect(endValue);
             } else {
                 initialSourceValue = new Rect(baseValue);
             }
 
+            final Rect rotatedEndRect;
+            final Rect lastEndRect;
+            final Rect initialContainerRect;
+            if (rotationDelta == ROTATION_90 || rotationDelta == ROTATION_270) {
+                lastEndRect = new Rect(endValue);
+                rotatedEndRect = new Rect(endValue);
+                // Rotate the end bounds according to the rotation delta because the display will
+                // be rotated to the same orientation.
+                rotateBounds(rotatedEndRect, initialSourceValue, rotationDelta);
+                // Use the rect that has the same orientation as the hint rect.
+                initialContainerRect = isOutPipDirection ? rotatedEndRect : initialSourceValue;
+            } else {
+                rotatedEndRect = lastEndRect = null;
+                initialContainerRect = initialSourceValue;
+            }
+
             final Rect sourceHintRectInsets;
             if (sourceHintRect == null) {
                 sourceHintRectInsets = null;
             } else {
-                sourceHintRectInsets = new Rect(sourceHintRect.left - initialSourceValue.left,
-                        sourceHintRect.top - initialSourceValue.top,
-                        initialSourceValue.right - sourceHintRect.right,
-                        initialSourceValue.bottom - sourceHintRect.bottom);
+                sourceHintRectInsets = new Rect(sourceHintRect.left - initialContainerRect.left,
+                        sourceHintRect.top - initialContainerRect.top,
+                        initialContainerRect.right - sourceHintRect.right,
+                        initialContainerRect.bottom - sourceHintRect.bottom);
             }
-            final Rect sourceInsets = new Rect(0, 0, 0, 0);
-
-            final Rect rotatedEndRect;
-            if (rotationDelta == ROTATION_90 || rotationDelta == ROTATION_270) {
-                // Rotate the end bounds according to the rotation delta because the display will
-                // be rotated to the same orientation.
-                rotatedEndRect = new Rect(endValue);
-                rotateBounds(rotatedEndRect, endValue, rotationDelta);
-            } else {
-                rotatedEndRect = null;
-            }
+            final Rect zeroInsets = new Rect(0, 0, 0, 0);
 
             // construct new Rect instances in case they are recycled
             return new PipTransitionAnimator<Rect>(taskInfo, leash, ANIM_TYPE_BOUNDS,
@@ -472,8 +480,8 @@
                     final Rect end = getEndValue();
                     if (rotatedEndRect != null) {
                         // Animate the bounds in a different orientation. It only happens when
-                        // leaving PiP to fullscreen.
-                        applyRotation(tx, leash, fraction, start, end, rotatedEndRect);
+                        // switching between PiP and fullscreen.
+                        applyRotation(tx, leash, fraction, start, end);
                         return;
                     }
                     Rect bounds = mRectEvaluator.evaluate(fraction, start, end);
@@ -481,20 +489,13 @@
                     setCurrentValue(bounds);
                     if (inScaleTransition() || sourceHintRect == null) {
 
-                        if (isOutPipDirection(direction)) {
+                        if (isOutPipDirection) {
                             getSurfaceTransactionHelper().scale(tx, leash, end, bounds);
                         } else {
                             getSurfaceTransactionHelper().scale(tx, leash, base, bounds, angle);
                         }
                     } else {
-                        final Rect insets;
-                        if (isOutPipDirection(direction)) {
-                            insets = mInsetsEvaluator.evaluate(fraction, sourceHintRectInsets,
-                                    sourceInsets);
-                        } else {
-                            insets = mInsetsEvaluator.evaluate(fraction, sourceInsets,
-                                    sourceHintRectInsets);
-                        }
+                        final Rect insets = computeInsets(fraction);
                         getSurfaceTransactionHelper().scaleAndCrop(tx, leash,
                                 initialSourceValue, bounds, insets);
                     }
@@ -502,9 +503,17 @@
                 }
 
                 private void applyRotation(SurfaceControl.Transaction tx, SurfaceControl leash,
-                        float fraction, Rect start, Rect end, Rect rotatedEndRect) {
+                        float fraction, Rect start, Rect end) {
+                    if (!end.equals(lastEndRect)) {
+                        // If the end bounds are changed during animating (e.g. shelf height), the
+                        // rotated end bounds also need to be updated.
+                        rotatedEndRect.set(endValue);
+                        rotateBounds(rotatedEndRect, initialSourceValue, rotationDelta);
+                        lastEndRect.set(end);
+                    }
                     final Rect bounds = mRectEvaluator.evaluate(fraction, start, rotatedEndRect);
                     setCurrentValue(bounds);
+                    final Rect insets = computeInsets(fraction);
                     final float degree, x, y;
                     if (rotationDelta == ROTATION_90) {
                         degree = 90 * fraction;
@@ -515,11 +524,21 @@
                         x = fraction * (end.left - start.left) + start.left;
                         y = fraction * (end.bottom - start.top) + start.top;
                     }
-                    getSurfaceTransactionHelper().rotateAndScaleWithCrop(tx, leash, bounds,
-                            rotatedEndRect, degree, x, y);
+                    getSurfaceTransactionHelper().rotateAndScaleWithCrop(tx, leash,
+                            initialContainerRect, bounds, insets, degree, x, y, isOutPipDirection,
+                            rotationDelta == ROTATION_270 /* clockwise */);
                     tx.apply();
                 }
 
+                private Rect computeInsets(float fraction) {
+                    if (sourceHintRectInsets == null) {
+                        return zeroInsets;
+                    }
+                    final Rect startRect = isOutPipDirection ? sourceHintRectInsets : zeroInsets;
+                    final Rect endRect = isOutPipDirection ? zeroInsets : sourceHintRectInsets;
+                    return mInsetsEvaluator.evaluate(fraction, startRect, endRect);
+                }
+
                 @Override
                 void onStartTransaction(SurfaceControl leash, SurfaceControl.Transaction tx) {
                     getSurfaceTransactionHelper()
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java
index e3594d0..561dff0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java
@@ -19,10 +19,14 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.ActivityTaskManager;
+import android.app.PictureInPictureUiState;
 import android.content.ComponentName;
 import android.content.Context;
 import android.graphics.Point;
 import android.graphics.Rect;
+import android.os.RemoteException;
+import android.util.Log;
 import android.util.Size;
 import android.view.Display;
 
@@ -185,7 +189,18 @@
 
     /** Dictate where PiP currently should be stashed, if at all. */
     public void setStashed(@StashType int stashedState) {
+        if (mStashedState == stashedState) {
+            return;
+        }
+
         mStashedState = stashedState;
+        try {
+            ActivityTaskManager.getService().onPictureInPictureStateChanged(
+                    new PictureInPictureUiState(stashedState != STASH_TYPE_NONE /* isStashed */)
+            );
+        } catch (RemoteException e) {
+            Log.e(TAG, "Unable to set alert PiP state change.");
+        }
     }
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java
index 3af0ff0..9713962 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMediaController.java
@@ -21,6 +21,7 @@
 
 import android.annotation.DrawableRes;
 import android.annotation.StringRes;
+import android.annotation.SuppressLint;
 import android.app.PendingIntent;
 import android.app.RemoteAction;
 import android.content.BroadcastReceiver;
@@ -210,13 +211,16 @@
     /**
      * Gets the set of media actions currently available.
      */
+    // This is due to using PlaybackState#isActive, which is added in API 31.
+    // It can be removed when min_sdk of the app is set to 31 or greater.
+    @SuppressLint("NewApi")
     private List<RemoteAction> getMediaActions() {
         if (mMediaController == null || mMediaController.getPlaybackState() == null) {
             return Collections.emptyList();
         }
 
         ArrayList<RemoteAction> mediaActions = new ArrayList<>();
-        boolean isPlaying = mMediaController.getPlaybackState().isActiveState();
+        boolean isPlaying = mMediaController.getPlaybackState().isActive();
         long actions = mMediaController.getPlaybackState().getActions();
 
         // Prev action
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java
index 582ff21..2b79539 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipSurfaceTransactionHelper.java
@@ -21,6 +21,7 @@
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.graphics.RectF;
+import android.os.SystemProperties;
 import android.view.SurfaceControl;
 
 import com.android.wm.shell.R;
@@ -42,7 +43,8 @@
 
     public PipSurfaceTransactionHelper(Context context) {
         final Resources res = context.getResources();
-        mEnableCornerRadius = res.getBoolean(R.bool.config_pipEnableRoundCorner);
+        mEnableCornerRadius = res.getBoolean(R.bool.config_pipEnableRoundCorner)
+            || SystemProperties.getBoolean("debug.sf.enable_hole_punch_pip", false);
     }
 
     /**
@@ -135,23 +137,41 @@
      * @return same {@link PipSurfaceTransactionHelper} instance for method chaining
      */
     public PipSurfaceTransactionHelper rotateAndScaleWithCrop(SurfaceControl.Transaction tx,
-            SurfaceControl leash, Rect sourceBounds, Rect destinationBounds, float degrees,
-            float positionX, float positionY) {
+            SurfaceControl leash, Rect sourceBounds, Rect destinationBounds, Rect insets,
+            float degrees, float positionX, float positionY, boolean isExpanding,
+            boolean clockwise) {
         mTmpDestinationRect.set(sourceBounds);
-        final int dw = destinationBounds.width();
-        final int dh = destinationBounds.height();
+        mTmpDestinationRect.inset(insets);
+        final int srcW = mTmpDestinationRect.width();
+        final int srcH = mTmpDestinationRect.height();
+        final int destW = destinationBounds.width();
+        final int destH = destinationBounds.height();
         // Scale by the short side so there won't be empty area if the aspect ratio of source and
         // destination are different.
-        final float scale = dw <= dh
-                ? (float) sourceBounds.width() / dw
-                : (float) sourceBounds.height() / dh;
+        final float scale = srcW <= srcH ? (float) destW / srcW : (float) destH / srcH;
+        final Rect crop = mTmpDestinationRect;
+        crop.set(0, 0, destW, destH);
         // Inverse scale for crop to fit in screen coordinates.
-        mTmpDestinationRect.scale(1 / scale);
-        mTmpTransform.setRotate(degrees);
-        mTmpTransform.postScale(scale, scale);
+        crop.scale(1 / scale);
+        crop.offset(insets.left, insets.top);
+        if (isExpanding) {
+            // Expand bounds (shrink insets) in source orientation.
+            positionX -= insets.left * scale;
+            positionY -= insets.top * scale;
+        } else {
+            // Shrink bounds (expand insets) in destination orientation.
+            if (clockwise) {
+                positionX -= insets.top * scale;
+                positionY -= insets.left * scale;
+            } else {
+                positionX += insets.top * scale;
+                positionY += insets.left * scale;
+            }
+        }
+        mTmpTransform.setScale(scale, scale);
+        mTmpTransform.postRotate(degrees);
         mTmpTransform.postTranslate(positionX, positionY);
-        tx.setMatrix(leash, mTmpTransform, mTmpFloat9)
-                .setWindowCrop(leash, mTmpDestinationRect.width(), mTmpDestinationRect.height());
+        tx.setMatrix(leash, mTmpTransform, mTmpFloat9).setWindowCrop(leash, crop);
         return this;
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index e66be66..4ce6c9e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -20,6 +20,8 @@
 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.util.RotationUtils.deltaRotation;
+import static android.util.RotationUtils.rotateBounds;
 
 import static com.android.wm.shell.ShellTaskOrganizer.TASK_LISTENER_TYPE_PIP;
 import static com.android.wm.shell.ShellTaskOrganizer.taskListenerTypeToString;
@@ -50,8 +52,10 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.os.RemoteException;
+import android.os.SystemClock;
 import android.util.Log;
 import android.util.Rational;
 import android.view.Display;
@@ -94,6 +98,12 @@
         DisplayController.OnDisplaysChangedListener {
     private static final String TAG = PipTaskOrganizer.class.getSimpleName();
     private static final boolean DEBUG = false;
+    /**
+     * The alpha type is set for swiping to home. But the swiped task may not enter PiP. And if
+     * another task enters PiP by non-swipe ways, e.g. call API in foreground or switch to 3-button
+     * navigation, then the alpha type is unexpected.
+     */
+    private static final int ONE_SHOT_ALPHA_ANIMATION_TIMEOUT_MS = 1000;
 
     // Not a complete set of states but serves what we want right now.
     private enum State {
@@ -127,6 +137,7 @@
         }
     }
 
+    private final Context mContext;
     private final SyncTransactionQueue mSyncTransactionQueue;
     private final PipBoundsState mPipBoundsState;
     private final PipBoundsAlgorithm mPipBoundsAlgorithm;
@@ -160,8 +171,20 @@
         public void onPipAnimationEnd(TaskInfo taskInfo, SurfaceControl.Transaction tx,
                 PipAnimationController.PipTransitionAnimator animator) {
             final int direction = animator.getTransitionDirection();
-            finishResize(tx, animator.getDestinationBounds(), direction,
-                    animator.getAnimationType());
+            final int animationType = animator.getAnimationType();
+            final Rect destinationBounds = animator.getDestinationBounds();
+            if (mWaitForFixedRotation && animationType == ANIM_TYPE_BOUNDS
+                    && direction == TRANSITION_DIRECTION_TO_PIP) {
+                // Notify the display to continue the deferred orientation change.
+                final WindowContainerTransaction wct = new WindowContainerTransaction();
+                wct.scheduleFinishEnterPip(mToken, destinationBounds);
+                mTaskOrganizer.applyTransaction(wct);
+                // The final task bounds will be applied by onFixedRotationFinished so that all
+                // coordinates are in new rotation.
+                mDeferredAnimEndTransaction = tx;
+                return;
+            }
+            finishResize(tx, destinationBounds, direction, animationType);
             sendOnPipTransitionFinished(direction);
             if (direction == TRANSITION_DIRECTION_TO_PIP) {
                 // TODO (b//169221267): Add jank listener for transactions without buffer updates.
@@ -186,10 +209,18 @@
     private SurfaceControl mLeash;
     private State mState = State.UNDEFINED;
     private @PipAnimationController.AnimationType int mOneShotAnimationType = ANIM_TYPE_BOUNDS;
+    private long mLastOneShotAlphaAnimationTime;
     private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory
             mSurfaceControlTransactionFactory;
     private PictureInPictureParams mPictureInPictureParams;
     private IntConsumer mOnDisplayIdChangeCallback;
+    /**
+     * The end transaction of PiP animation for switching between PiP and fullscreen with
+     * orientation change. The transaction should be applied after the display is rotated.
+     */
+    private SurfaceControl.Transaction mDeferredAnimEndTransaction;
+    /** Whether the existing PiP is hidden by alpha. */
+    private boolean mHasFadeOut;
 
     /**
      * If set to {@code true}, the entering animation will be skipped and we will wait for
@@ -203,6 +234,8 @@
      */
     private @Surface.Rotation int mNextRotation;
 
+    private @Surface.Rotation int mCurrentRotation;
+
     /**
      * If set to {@code true}, no entering PiP transition would be kicked off and most likely
      * it's due to the fact that Launcher is handling the transition directly when swiping
@@ -224,6 +257,7 @@
             @NonNull PipUiEventLogger pipUiEventLogger,
             @NonNull ShellTaskOrganizer shellTaskOrganizer,
             @ShellMainThread ShellExecutor mainExecutor) {
+        mContext = context;
         mSyncTransactionQueue = syncTransactionQueue;
         mPipBoundsState = pipBoundsState;
         mPipBoundsAlgorithm = boundsHandler;
@@ -261,10 +295,6 @@
         return mState.isInPip();
     }
 
-    public boolean isDeferringEnterPipAnimation() {
-        return mState.isInPip() && mWaitForFixedRotation;
-    }
-
     /**
      * Returns whether the entry animation is waiting to be started.
      */
@@ -286,6 +316,9 @@
      */
     public void setOneShotAnimationType(@PipAnimationController.AnimationType int animationType) {
         mOneShotAnimationType = animationType;
+        if (animationType == ANIM_TYPE_ALPHA) {
+            mLastOneShotAlphaAnimationTime = SystemClock.uptimeMillis();
+        }
     }
 
     /**
@@ -297,9 +330,6 @@
         mInSwipePipToHomeTransition = true;
         sendOnPipTransitionStarted(TRANSITION_DIRECTION_TO_PIP);
         setBoundsStateForEntry(componentName, pictureInPictureParams, activityInfo);
-        // disable the conflicting transaction from fixed rotation, see also
-        // onFixedRotationStarted and onFixedRotationFinished
-        mWaitForFixedRotation = false;
         return mPipBoundsAlgorithm.getEntryDestinationBounds();
     }
 
@@ -355,6 +385,9 @@
                         : WINDOWING_MODE_FULLSCREEN);
         wct.setBounds(mToken, destinationBounds);
         wct.setBoundsChangeTransaction(mToken, tx);
+        // Set the exiting state first so if there is fixed rotation later, the running animation
+        // won't be interrupted by alpha animation for existing PiP.
+        mState = State.EXITING_PIP;
         mSyncTransactionQueue.queue(wct);
         mSyncTransactionQueue.runInSync(t -> {
             // Make sure to grab the latest source hint rect as it could have been
@@ -362,9 +395,8 @@
             final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
                     mPictureInPictureParams, destinationBounds);
             final PipAnimationController.PipTransitionAnimator<?> animator =
-                    scheduleAnimateResizePip(mPipBoundsState.getBounds(), destinationBounds,
-                    0 /* startingAngle */, sourceHintRect, direction,
-                    animationDurationMs, null /* updateBoundsCallback */);
+                    animateResizePip(mPipBoundsState.getBounds(), destinationBounds, sourceHintRect,
+                            direction, animationDurationMs, 0 /* startingAngle */);
             if (animator != null) {
                 // Even though the animation was started above, re-apply the transaction for the
                 // first frame using the SurfaceControl.Transaction supplied by the
@@ -374,7 +406,6 @@
                 // hint during expansion that causes a visible jank/flash. See b/184166183.
                 animator.applySurfaceControlTransaction(mLeash, t, FRACTION_START);
             }
-            mState = State.EXITING_PIP;
         });
     }
 
@@ -447,29 +478,22 @@
         }
 
         if (mInSwipePipToHomeTransition) {
-            final Rect destinationBounds = mPipBoundsState.getBounds();
-            final SurfaceControl.Transaction tx =
-                    mSurfaceControlTransactionFactory.getTransaction();
-            mSurfaceTransactionHelper.resetScale(tx, mLeash, destinationBounds);
-            mSurfaceTransactionHelper.crop(tx, mLeash, destinationBounds);
-            // animation is finished in the Launcher and here we directly apply the final touch.
-            applyEnterPipSyncTransaction(destinationBounds, () -> {
-                // ensure menu's settled in its final bounds first
-                finishResizeForMenu(destinationBounds);
-                sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP);
-            }, tx);
-            mInSwipePipToHomeTransition = false;
+            if (!mWaitForFixedRotation) {
+                onEndOfSwipePipToHomeTransition();
+            } else {
+                Log.d(TAG, "Defer onTaskAppeared-SwipePipToHome until end of fixed rotation.");
+            }
             return;
         }
 
+        if (mOneShotAnimationType == ANIM_TYPE_ALPHA
+                && SystemClock.uptimeMillis() - mLastOneShotAlphaAnimationTime
+                > ONE_SHOT_ALPHA_ANIMATION_TIMEOUT_MS) {
+            Log.d(TAG, "Alpha animation is expired. Use bounds animation.");
+            mOneShotAnimationType = ANIM_TYPE_BOUNDS;
+        }
         if (mWaitForFixedRotation) {
-            if (DEBUG) Log.d(TAG, "Defer entering PiP animation, fixed rotation is ongoing");
-            // if deferred, hide the surface till fixed rotation is completed
-            final SurfaceControl.Transaction tx =
-                    mSurfaceControlTransactionFactory.getTransaction();
-            tx.setAlpha(mLeash, 0f);
-            tx.show(mLeash);
-            tx.apply();
+            onTaskAppearedWithFixedRotation();
             return;
         }
 
@@ -500,6 +524,27 @@
         }
     }
 
+    private void onTaskAppearedWithFixedRotation() {
+        if (mOneShotAnimationType == ANIM_TYPE_ALPHA) {
+            Log.d(TAG, "Defer entering PiP alpha animation, fixed rotation is ongoing");
+            // If deferred, hide the surface till fixed rotation is completed.
+            final SurfaceControl.Transaction tx =
+                    mSurfaceControlTransactionFactory.getTransaction();
+            tx.setAlpha(mLeash, 0f);
+            tx.show(mLeash);
+            tx.apply();
+            mOneShotAnimationType = ANIM_TYPE_BOUNDS;
+            return;
+        }
+        final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds();
+        final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
+                mPictureInPictureParams, currentBounds);
+        final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
+        animateResizePip(currentBounds, destinationBounds, sourceHintRect,
+                TRANSITION_DIRECTION_TO_PIP, mEnterAnimationDuration, 0 /* startingAngle */);
+        mState = State.ENTERING_PIP;
+    }
+
     /**
      * Called when the display rotation handling is skipped (e.g. when rotation happens while in
      * the middle of an entry transition).
@@ -536,6 +581,20 @@
         }, null /* boundsChangeTransaction */);
     }
 
+    private void onEndOfSwipePipToHomeTransition() {
+        final Rect destinationBounds = mPipBoundsState.getBounds();
+        final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction();
+        mSurfaceTransactionHelper.resetScale(tx, mLeash, destinationBounds);
+        mSurfaceTransactionHelper.crop(tx, mLeash, destinationBounds);
+        // The animation is finished in the Launcher and here we directly apply the final touch.
+        applyEnterPipSyncTransaction(destinationBounds, () -> {
+            // Ensure menu's settled in its final bounds first.
+            finishResizeForMenu(destinationBounds);
+            sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP);
+        }, tx);
+        mInSwipePipToHomeTransition = false;
+    }
+
     private void applyEnterPipSyncTransaction(Rect destinationBounds, Runnable runnable,
             @Nullable SurfaceControl.Transaction boundsChangeTransaction) {
         // PiP menu is attached late in the process here to avoid any artifacts on the leash
@@ -547,7 +606,6 @@
         if (boundsChangeTransaction != null) {
             wct.setBoundsChangeTransaction(mToken, boundsChangeTransaction);
         }
-        wct.scheduleFinishEnterPip(mToken, destinationBounds);
         mSyncTransactionQueue.queue(wct);
         if (runnable != null) {
             mSyncTransactionQueue.runInSync(t -> runnable.run());
@@ -600,7 +658,7 @@
             Log.wtf(TAG, "Unrecognized token: " + token);
             return;
         }
-        mWaitForFixedRotation = false;
+        clearWaitForFixedRotation();
         mInSwipePipToHomeTransition = false;
         mPictureInPictureParams = null;
         mState = State.UNDEFINED;
@@ -617,8 +675,10 @@
     @Override
     public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
         Objects.requireNonNull(mToken, "onTaskInfoChanged requires valid existing mToken");
-        if (mState != State.ENTERED_PIP) {
+        if (mState != State.ENTERED_PIP && mState != State.EXITING_PIP) {
             Log.d(TAG, "Defer onTaskInfoChange in current state: " + mState);
+            // Defer applying PiP parameters if the task is entering PiP to avoid disturbing
+            // the animation.
             mDeferredTaskInfo = info;
             return;
         }
@@ -648,16 +708,60 @@
     public void onFixedRotationStarted(int displayId, int newRotation) {
         mNextRotation = newRotation;
         mWaitForFixedRotation = true;
+
+        if (mState.isInPip()) {
+            // Fade out the existing PiP to avoid jump cut during seamless rotation.
+            fadeExistingPip(false /* show */);
+        }
     }
 
     @Override
     public void onFixedRotationFinished(int displayId) {
-        if (mWaitForFixedRotation && mState.isInPip()) {
-            final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
-            // schedule a regular animation to ensure all the callbacks are still being sent
-            enterPipWithAlphaAnimation(destinationBounds, 0 /* durationMs */);
+        if (!mWaitForFixedRotation) {
+            return;
         }
+        if (mState == State.TASK_APPEARED) {
+            if (mInSwipePipToHomeTransition) {
+                onEndOfSwipePipToHomeTransition();
+            } else {
+                // Schedule a regular animation to ensure all the callbacks are still being sent.
+                enterPipWithAlphaAnimation(mPipBoundsAlgorithm.getEntryDestinationBounds(),
+                        mEnterAnimationDuration);
+            }
+        } else if (mState == State.ENTERED_PIP && mHasFadeOut) {
+            fadeExistingPip(true /* show */);
+        } else if (mState == State.ENTERING_PIP && mDeferredAnimEndTransaction != null) {
+            final PipAnimationController.PipTransitionAnimator<?> animator =
+                    mPipAnimationController.getCurrentAnimator();
+            final Rect destinationBounds = animator.getDestinationBounds();
+            mPipBoundsState.setBounds(destinationBounds);
+            applyEnterPipSyncTransaction(destinationBounds, () -> {
+                finishResizeForMenu(destinationBounds);
+                sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP);
+            }, mDeferredAnimEndTransaction);
+        }
+        clearWaitForFixedRotation();
+    }
+
+    private void fadeExistingPip(boolean show) {
+        final float alphaStart = show ? 0 : 1;
+        final float alphaEnd = show ? 1 : 0;
+        mPipAnimationController
+                .getAnimator(mTaskInfo, mLeash, mPipBoundsState.getBounds(), alphaStart, alphaEnd)
+                .setTransitionDirection(TRANSITION_DIRECTION_SAME)
+                .setDuration(show ? mEnterAnimationDuration : mExitAnimationDuration)
+                .start();
+        mHasFadeOut = !show;
+    }
+
+    private void clearWaitForFixedRotation() {
         mWaitForFixedRotation = false;
+        mDeferredAnimEndTransaction = null;
+    }
+
+    @Override
+    public void onDisplayConfigurationChanged(int displayId, Configuration newConfig) {
+        mCurrentRotation = newConfig.windowConfiguration.getRotation();
     }
 
     /**
@@ -686,7 +790,11 @@
                 mPipAnimationController.getCurrentAnimator();
         if (animator == null || !animator.isRunning()
                 || animator.getTransitionDirection() != TRANSITION_DIRECTION_TO_PIP) {
-            if (mState.isInPip() && fromRotation && !mWaitForFixedRotation) {
+            final boolean rotatingPip = mState.isInPip() && fromRotation;
+            if (rotatingPip && mWaitForFixedRotation && mHasFadeOut) {
+                // The position will be used by fade-in animation when the fixed rotation is done.
+                mPipBoundsState.setBounds(destinationBoundsOut);
+            } else if (rotatingPip) {
                 // Update bounds state to final destination first. It's important to do this
                 // before finishing & cancelling the transition animation so that the MotionHelper
                 // bounds are synchronized to the destination bounds when the animation ends.
@@ -737,7 +845,17 @@
         final Rect newDestinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds();
         if (newDestinationBounds.equals(currentDestinationBounds)) return;
         if (animator.getAnimationType() == ANIM_TYPE_BOUNDS) {
-            animator.updateEndValue(newDestinationBounds);
+            if (mWaitForFixedRotation) {
+                // The new destination bounds are in next rotation (DisplayLayout has been rotated
+                // in computeRotatedBounds). The animation runs in previous rotation so the end
+                // bounds need to be transformed.
+                final Rect displayBounds = mPipBoundsState.getDisplayBounds();
+                final Rect rotatedEndBounds = new Rect(newDestinationBounds);
+                rotateBounds(rotatedEndBounds, displayBounds, mNextRotation, mCurrentRotation);
+                animator.updateEndValue(rotatedEndBounds);
+            } else {
+                animator.updateEndValue(newDestinationBounds);
+            }
         }
         animator.setDestinationBounds(newDestinationBounds);
         destinationBoundsOut.set(newDestinationBounds);
@@ -1050,7 +1168,6 @@
             // activity windowing mode set by WM, and set the task bounds to the final bounds
             taskBounds = destinationBounds;
             wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
-            wct.scheduleFinishEnterPip(mToken, destinationBounds);
         } else if (isOutPipDirection(direction)) {
             // If we are animating to fullscreen or split screen, then we need to reset the
             // override bounds on the task to ensure that the task "matches" the parent's bounds.
@@ -1096,8 +1213,12 @@
             return null;
         }
         final int rotationDelta = mWaitForFixedRotation
-                ? ((mNextRotation - mPipBoundsState.getDisplayLayout().rotation()) + 4) % 4
+                ? deltaRotation(mCurrentRotation, mNextRotation)
                 : Surface.ROTATION_0;
+        if (rotationDelta != Surface.ROTATION_0) {
+            sourceHintRect = computeRotatedBounds(rotationDelta, direction, destinationBounds,
+                    sourceHintRect);
+        }
         Rect baseBounds = direction == TRANSITION_DIRECTION_SNAP_AFTER_RESIZE
                 ? mPipBoundsState.getBounds() : currentBounds;
         final PipAnimationController.PipTransitionAnimator<?> animator = mPipAnimationController
@@ -1107,9 +1228,35 @@
                 .setPipAnimationCallback(mPipAnimationCallback)
                 .setDuration(durationMs)
                 .start();
+        if (rotationDelta != Surface.ROTATION_0 && direction == TRANSITION_DIRECTION_TO_PIP) {
+            // The destination bounds are used for the end rect of animation and the final bounds
+            // after animation finishes. So after the animation is started, the destination bounds
+            // can be updated to new rotation (computeRotatedBounds has changed the DisplayLayout
+            // without affecting the animation.
+            animator.setDestinationBounds(mPipBoundsAlgorithm.getEntryDestinationBounds());
+        }
         return animator;
     }
 
+    /** Computes destination bounds in old rotation and returns source hint rect if available. */
+    private @Nullable Rect computeRotatedBounds(int rotationDelta, int direction,
+            Rect outDestinationBounds, Rect sourceHintRect) {
+        if (direction == TRANSITION_DIRECTION_TO_PIP) {
+            mPipBoundsState.getDisplayLayout().rotateTo(mContext.getResources(), mNextRotation);
+            final Rect displayBounds = mPipBoundsState.getDisplayBounds();
+            outDestinationBounds.set(mPipBoundsAlgorithm.getEntryDestinationBounds());
+            // Transform the destination bounds to current display coordinates.
+            rotateBounds(outDestinationBounds, displayBounds, mNextRotation, mCurrentRotation);
+        } else if (direction == TRANSITION_DIRECTION_LEAVE_PIP) {
+            final Rect rotatedDestinationBounds = new Rect(outDestinationBounds);
+            rotateBounds(rotatedDestinationBounds, mPipBoundsState.getDisplayBounds(),
+                    rotationDelta);
+            return PipBoundsAlgorithm.getValidSourceHintRect(mPictureInPictureParams,
+                    rotatedDestinationBounds);
+        }
+        return sourceHintRect;
+    }
+
     /**
      * Sync with {@link LegacySplitScreenController} on destination bounds if PiP is going to split
      * screen.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
index f505e60..b881fea 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java
@@ -114,13 +114,17 @@
      */
     private final DisplayChangeController.OnDisplayChangingListener mRotationController = (
             int displayId, int fromRotation, int toRotation, WindowContainerTransaction t) -> {
-        if (!mPipTaskOrganizer.isInPip()
-                || mPipBoundsState.getDisplayLayout().rotation() == toRotation
-                || mPipTaskOrganizer.isDeferringEnterPipAnimation()
-                || mPipTaskOrganizer.isEntryScheduled()) {
-            // Skip if the same rotation has been set or we aren't in PIP or haven't actually
-            // entered PIP yet. We still need to update the display layout in the bounds handler
-            // in this case.
+        if (mPipBoundsState.getDisplayLayout().rotation() == toRotation) {
+            // The same rotation may have been set by auto PiP-able or fixed rotation. So notify
+            // the change with fromRotation=false to apply the rotated destination bounds from
+            // PipTaskOrganizer#onMovementBoundsChanged.
+            updateMovementBounds(null, false /* fromRotation */,
+                    false /* fromImeAdjustment */, false /* fromShelfAdjustment */, t);
+            return;
+        }
+        if (!mPipTaskOrganizer.isInPip() || mPipTaskOrganizer.isEntryScheduled()) {
+            // Update display layout and bounds handler if we aren't in PIP or haven't actually
+            // entered PIP yet.
             onDisplayRotationChangedNotInPip(mContext, toRotation);
             // do not forget to update the movement bounds as well.
             updateMovementBounds(mPipBoundsState.getNormalBounds(), true /* fromRotation */,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuView.java
index 3c25a13..a57e8cd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMenuView.java
@@ -44,6 +44,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.util.Log;
 import android.util.Pair;
@@ -131,7 +132,8 @@
         inflate(context, R.layout.pip_menu, this);
 
         final boolean enableCornerRadius = mContext.getResources()
-                .getBoolean(R.bool.config_pipEnableRoundCorner);
+                .getBoolean(R.bool.config_pipEnableRoundCorner)
+                || SystemProperties.getBoolean("debug.sf.enable_hole_punch_pip", false);
         mBackgroundDrawable = enableCornerRadius
                 ? mContext.getDrawable(R.drawable.pip_menu_background)
                 : new ColorDrawable(Color.BLACK);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
index 0a148c4..c2ec1c5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
@@ -232,7 +232,8 @@
         }
     }
 
-    private void onInputEvent(InputEvent ev) {
+    @VisibleForTesting
+    void onInputEvent(InputEvent ev) {
         // Don't allow resize when PiP is stashed.
         if (mPipBoundsState.isStashed()) {
             return;
@@ -366,7 +367,8 @@
         return mIsSysUiStateValid;
     }
 
-    private void onPinchResize(MotionEvent ev) {
+    @VisibleForTesting
+    void onPinchResize(MotionEvent ev) {
         int action = ev.getActionMasked();
 
         if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
@@ -411,7 +413,7 @@
             if (!mThresholdCrossed
                     && (distanceBetween(mDownSecondPoint, mLastSecondPoint) > mTouchSlop
                             || distanceBetween(mDownPoint, mLastPoint) > mTouchSlop)) {
-                mInputMonitor.pilferPointers();
+                pilferPointers();
                 mThresholdCrossed = true;
                 // Reset the down to begin resizing from this point
                 mDownPoint.set(mLastPoint);
@@ -548,6 +550,17 @@
         return mUserResizeBounds;
     }
 
+    @VisibleForTesting
+    Rect getLastResizeBounds() {
+        return mLastResizeBounds;
+    }
+
+    @VisibleForTesting
+    void pilferPointers() {
+        mInputMonitor.pilferPointers();
+    }
+
+
     @VisibleForTesting public void updateMaxSize(int maxX, int maxY) {
         mMaxSize.set(maxX, maxY);
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
index f29d4f5..6d96312 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java
@@ -625,6 +625,7 @@
             }
 
             mMenuController.handlePointerEvent(cloneEvent);
+            cloneEvent.recycle();
         }
 
         return true;
@@ -871,7 +872,8 @@
                     mMotionHelper.flingToSnapTarget(vel.x, vel.y,
                             this::flingEndAction /* endAction */);
                 }
-            } else if (mTouchState.isDoubleTap() && !mPipBoundsState.isStashed()) {
+            } else if (mTouchState.isDoubleTap() && !mPipBoundsState.isStashed()
+                    && mMenuState != MENU_STATE_FULL) {
                 // If using pinch to zoom, double-tap functions as resizing between max/min size
                 if (mPipResizeGestureHandler.isUsingPinchToZoom()) {
                     final boolean toExpand = mPipBoundsState.getBounds().width()
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index c91a92a..efaa269 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -337,6 +337,7 @@
             final WindowContainerTransaction wct = new WindowContainerTransaction();
             // Make the stages adjacent to each other so they occlude what's behind them.
             wct.setAdjacentRoots(mMainStage.mRootTaskInfo.token, mSideStage.mRootTaskInfo.token);
+            wct.setLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
             mTaskOrganizer.applyTransaction(wct);
         }
     }
@@ -346,6 +347,7 @@
             final WindowContainerTransaction wct = new WindowContainerTransaction();
             // Deactivate the main stage if it no longer has a root task.
             mMainStage.deactivate(wct);
+            wct.clearLaunchAdjacentFlagRoot(mSideStage.mRootTaskInfo.token);
             mTaskOrganizer.applyTransaction(wct);
         }
     }
@@ -449,6 +451,7 @@
             final WindowContainerTransaction wct = new WindowContainerTransaction();
             // Make sure the main stage is active.
             mMainStage.activate(getMainStageBounds(), wct);
+            mSideStage.setBounds(getSideStageBounds(), wct);
             mTaskOrganizer.applyTransaction(wct);
         }
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
index 147f2e2..1d3a60b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
@@ -18,7 +18,6 @@
 
 import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
-import static android.os.UserHandle.getUserHandleForUid;
 
 import android.annotation.ColorInt;
 import android.annotation.NonNull;
@@ -68,11 +67,12 @@
     // For example, an icon with the foreground 108*108 opaque pixels and it's background
     // also 108*108 pixels, then do not enlarge this icon if only need to show foreground icon.
     private static final float ENLARGE_FOREGROUND_ICON_THRESHOLD = (72f * 72f) / (108f * 108f);
+    private static final float NO_BACKGROUND_SCALE = 1.3f;
     private final Context mContext;
     private final IconProvider mIconProvider;
-    private final int mMaxAnimatableIconDuration;
 
     private int mIconSize;
+    private int mDefaultIconSize;
     private int mBrandingImageWidth;
     private int mBrandingImageHeight;
     private final int mAppRevealDuration;
@@ -84,11 +84,10 @@
     private final SplashScreenWindowAttrs mTmpAttrs = new SplashScreenWindowAttrs();
     private final Handler mSplashscreenWorkerHandler;
 
-    SplashscreenContentDrawer(Context context, int maxAnimatableIconDuration,
-            int iconExitAnimDuration, int appRevealAnimDuration, TransactionPool pool) {
+    SplashscreenContentDrawer(Context context, int iconExitAnimDuration, int appRevealAnimDuration,
+            TransactionPool pool) {
         mContext = context;
         mIconProvider = new IconProvider(context);
-        mMaxAnimatableIconDuration = maxAnimatableIconDuration;
         mAppRevealDuration = appRevealAnimDuration;
         mIconExitDuration = iconExitAnimDuration;
         mTransactionPool = pool;
@@ -109,11 +108,12 @@
      * view on background thread so the view and the drawable can be create and pre-draw in
      * parallel.
      *
+     * @param emptyView Create a splash screen view without icon on it.
      * @param consumer Receiving the SplashScreenView object, which will also be executed
      *                 on splash screen thread. Note that the view can be null if failed.
      */
-    void createContentView(Context context, int splashScreenResId, ActivityInfo info,
-            int taskId, Consumer<SplashScreenView> consumer) {
+    void createContentView(Context context, boolean emptyView, int splashScreenResId,
+            ActivityInfo info, int taskId, Consumer<SplashScreenView> consumer) {
         mSplashscreenWorkerHandler.post(() -> {
             SplashScreenView contentView;
             try {
@@ -121,7 +121,7 @@
                         context, splashScreenResId);
                 if (contentView == null) {
                     Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "makeSplashScreenContentView");
-                    contentView = makeSplashScreenContentView(context, info);
+                    contentView = makeSplashScreenContentView(context, info, emptyView);
                     Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
                 }
             } catch (RuntimeException e) {
@@ -136,6 +136,8 @@
     private void updateDensity() {
         mIconSize = mContext.getResources().getDimensionPixelSize(
                 com.android.wm.shell.R.dimen.starting_surface_icon_size);
+        mDefaultIconSize = mContext.getResources().getDimensionPixelSize(
+                com.android.wm.shell.R.dimen.default_icon_size);
         mBrandingImageWidth = mContext.getResources().getDimensionPixelSize(
                 com.android.wm.shell.R.dimen.starting_surface_brand_image_width);
         mBrandingImageHeight = mContext.getResources().getDimensionPixelSize(
@@ -190,34 +192,20 @@
         }
     }
 
-    private SplashScreenView makeSplashScreenContentView(Context context, ActivityInfo ai) {
+    private SplashScreenView makeSplashScreenContentView(Context context, ActivityInfo ai,
+            boolean emptyView) {
         updateDensity();
 
         getWindowAttrs(context, mTmpAttrs);
         final StartingWindowViewBuilder builder = new StartingWindowViewBuilder();
-        final int animationDuration;
-        Drawable iconDrawable;
-        if (mTmpAttrs.mReplaceIcon != null) {
-            iconDrawable = mTmpAttrs.mReplaceIcon;
-            animationDuration = Math.max(0,
-                    Math.min(mTmpAttrs.mAnimationDuration, mMaxAnimatableIconDuration));
-        } else {
-            iconDrawable = mIconProvider.getIconForUI(
-                    ai, getUserHandleForUid(ai.applicationInfo.uid));
-            if (iconDrawable == null) {
-                iconDrawable = context.getPackageManager().getDefaultActivityIcon();
-            }
-            animationDuration = 0;
-        }
         final int themeBGColor = peekWindowBGColor(context);
         // TODO (b/173975965) Tracking the performance on improved splash screen.
         return builder
                 .setContext(context)
                 .setWindowBGColor(themeBGColor)
-                .setIconDrawable(iconDrawable)
-                .setIconAnimationDuration(animationDuration)
-                .setBrandingDrawable(mTmpAttrs.mBrandingImage)
-                .setIconBackground(mTmpAttrs.mIconBgColor).build();
+                .makeEmptyView(emptyView)
+                .setActivityInfo(ai)
+                .build();
     }
 
     private static void getWindowAttrs(Context context, SplashScreenWindowAttrs attrs) {
@@ -253,11 +241,9 @@
     }
 
     private class StartingWindowViewBuilder {
-        private Drawable mIconDrawable;
-        private int mIconAnimationDuration;
+        private ActivityInfo mActivityInfo;
         private Context mContext;
-        private Drawable mBrandingDrawable;
-        private @ColorInt int mIconBackground;
+        private boolean mEmptyView;
 
         // result
         private boolean mBuildComplete = false;
@@ -272,26 +258,14 @@
             return this;
         }
 
-        StartingWindowViewBuilder setIconDrawable(Drawable iconDrawable) {
-            mIconDrawable = iconDrawable;
+        StartingWindowViewBuilder makeEmptyView(boolean empty) {
+            mEmptyView = empty;
             mBuildComplete = false;
             return this;
         }
 
-        StartingWindowViewBuilder setIconAnimationDuration(int iconAnimationDuration) {
-            mIconAnimationDuration = iconAnimationDuration;
-            mBuildComplete = false;
-            return this;
-        }
-
-        StartingWindowViewBuilder setBrandingDrawable(Drawable branding) {
-            mBrandingDrawable = branding;
-            mBuildComplete = false;
-            return this;
-        }
-
-        StartingWindowViewBuilder setIconBackground(int color) {
-            mIconBackground = color;
+        StartingWindowViewBuilder setActivityInfo(ActivityInfo ai) {
+            mActivityInfo = ai;
             mBuildComplete = false;
             return this;
         }
@@ -306,40 +280,66 @@
             if (mBuildComplete) {
                 return mCachedResult;
             }
-            if (mContext == null) {
+            if (mContext == null || mActivityInfo == null) {
                 Slog.e(TAG, "Unable to create StartingWindowView, lack of materials!");
                 return null;
             }
 
-            if (!processAdaptiveIcon() && mIconDrawable != null) {
-                if (DEBUG) {
-                    Slog.d(TAG, "The icon is not an AdaptiveIconDrawable");
+            Drawable iconDrawable;
+            final int animationDuration;
+            final int iconSize;
+            if (mEmptyView) {
+                // empty splash screen case
+                animationDuration = 0;
+                iconSize = 0;
+            } else if (mTmpAttrs.mReplaceIcon != null) {
+                // replaced icon, don't process
+                iconDrawable = mTmpAttrs.mReplaceIcon;
+                animationDuration = mTmpAttrs.mAnimationDuration;
+                createIconDrawable(iconDrawable, mIconSize);
+                iconSize = mIconSize;
+            } else {
+                final float iconScale =  (float) mIconSize / (float) mDefaultIconSize;
+                iconDrawable = mIconProvider.getIcon(mActivityInfo);
+                if (iconDrawable == null) {
+                    iconDrawable = mContext.getPackageManager().getDefaultActivityIcon();
                 }
-                createIconDrawable(mIconDrawable, mIconSize);
+                if (!processAdaptiveIcon(iconDrawable, iconScale)) {
+                    if (DEBUG) {
+                        Slog.d(TAG, "The icon is not an AdaptiveIconDrawable");
+                    }
+                    // TODO process legacy icon(bitmap)
+                    final Drawable tempIcon = loadIconByDensity(iconDrawable, iconScale);
+                    createIconDrawable(tempIcon, mIconSize);
+                }
+                animationDuration = 0;
+                iconSize = (int) (0.5 + mIconSize * mScale);
             }
-            final int iconSize = mFinalIconDrawable != null ? (int) (mIconSize * mScale) : 0;
-            mCachedResult = fillViewWithIcon(mContext, iconSize, mFinalIconDrawable);
+
+            mCachedResult = fillViewWithIcon(iconSize, mFinalIconDrawable, animationDuration);
             mBuildComplete = true;
             return mCachedResult;
         }
 
         private void createIconDrawable(Drawable iconDrawable, int iconSize) {
             mFinalIconDrawable = SplashscreenIconDrawableFactory.makeIconDrawable(
-                    mIconBackground != Color.TRANSPARENT ? mIconBackground : mThemeColor,
+                    mTmpAttrs.mIconBgColor != Color.TRANSPARENT
+                            ? mTmpAttrs.mIconBgColor : mThemeColor,
                     iconDrawable, iconSize, mSplashscreenWorkerHandler);
         }
 
-        private boolean processAdaptiveIcon() {
-            if (!(mIconDrawable instanceof AdaptiveIconDrawable)) {
+        private boolean processAdaptiveIcon(Drawable iconDrawable, float iconScale) {
+            if (!(iconDrawable instanceof AdaptiveIconDrawable)) {
                 return false;
             }
 
             Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "processAdaptiveIcon");
-            final AdaptiveIconDrawable adaptiveIconDrawable = (AdaptiveIconDrawable) mIconDrawable;
+            final AdaptiveIconDrawable adaptiveIconDrawable =
+                    (AdaptiveIconDrawable) iconDrawable;
             final DrawableColorTester backIconTester =
                     new DrawableColorTester(adaptiveIconDrawable.getBackground());
 
-            final Drawable iconForeground = adaptiveIconDrawable.getForeground();
+            Drawable iconForeground = adaptiveIconDrawable.getForeground();
             final DrawableColorTester foreIconTester =
                     new DrawableColorTester(iconForeground, true /* filterTransparent */);
 
@@ -365,7 +365,9 @@
             // B. The background of the adaptive icon is similar to the theme color, or
             // C. The background of the adaptive icon is grayscale, and the foreground of the
             // adaptive icon forms a certain contrast with the theme color.
-            if (!backComplex && (isRgbSimilarInHsv(mThemeColor, backMainColor)
+            // D. Didn't specify icon background color.
+            if (!backComplex && mTmpAttrs.mIconBgColor == Color.TRANSPARENT
+                    && (isRgbSimilarInHsv(mThemeColor, backMainColor)
                     || (backIconTester.isGrayscale()
                     && !isRgbSimilarInHsv(mThemeColor, foreMainColor)))) {
                 if (DEBUG) {
@@ -373,8 +375,13 @@
                 }
                 // Reference AdaptiveIcon description, outer is 108 and inner is 72, so we
                 // should enlarge the size 108/72 if we only draw adaptiveIcon's foreground.
-                if (foreIconTester.nonTransparentRatio() < ENLARGE_FOREGROUND_ICON_THRESHOLD) {
-                    mScale = 1.5f;
+                final float noBgScale =
+                        foreIconTester.nonTransparentRatio() < ENLARGE_FOREGROUND_ICON_THRESHOLD
+                                ? NO_BACKGROUND_SCALE : 1f;
+                final Drawable tempIcon = loadIconByDensity(iconDrawable, iconScale * noBgScale);
+                if (tempIcon instanceof AdaptiveIconDrawable) {
+                    mScale = noBgScale;
+                    iconForeground = ((AdaptiveIconDrawable) tempIcon).getForeground();
                 }
                 // Using AdaptiveIconDrawable here can help keep the shape consistent with the
                 // current settings.
@@ -384,30 +391,44 @@
                 if (DEBUG) {
                     Slog.d(TAG, "makeSplashScreenContentView: draw whole icon");
                 }
-                createIconDrawable(adaptiveIconDrawable, mIconSize);
+                final Drawable tempIcon = loadIconByDensity(iconDrawable, iconScale);
+                createIconDrawable(tempIcon, mIconSize);
             }
             Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
             return true;
         }
 
-        private SplashScreenView fillViewWithIcon(Context context,
-                int iconSize, Drawable iconDrawable) {
-            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
-            final SplashScreenView.Builder builder = new SplashScreenView.Builder(context);
-            builder.setIconSize(iconSize).setBackgroundColor(mThemeColor)
-                    .setIconBackground(mIconBackground);
-            if (iconDrawable != null) {
-                builder.setCenterViewDrawable(iconDrawable);
+        private Drawable loadIconByDensity(Drawable baseDrawable, float scale) {
+            if (scale == 1 && baseDrawable != null) {
+                return baseDrawable;
             }
-            builder.setAnimationDurationMillis(mIconAnimationDuration);
-            if (mBrandingDrawable != null) {
-                builder.setBrandingDrawable(mBrandingDrawable, mBrandingImageWidth,
+            final int densityDpi = mContext.getResources().getDisplayMetrics().densityDpi;
+            final int updateDpi = (int) (0.5f + scale * densityDpi);
+            return  mIconProvider.getIcon(mActivityInfo, updateDpi);
+        }
+
+        private SplashScreenView fillViewWithIcon(int iconSize, Drawable iconDrawable,
+                int animationDuration) {
+            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
+            final SplashScreenView.Builder builder = new SplashScreenView.Builder(mContext);
+            builder.setBackgroundColor(mThemeColor);
+            if (iconDrawable != null) {
+                builder.setIconSize(iconSize)
+                        .setIconBackground(mTmpAttrs.mIconBgColor)
+                        .setCenterViewDrawable(iconDrawable)
+                        .setAnimationDurationMillis(animationDuration);
+            }
+            if (mTmpAttrs.mBrandingImage != null) {
+                builder.setBrandingDrawable(mTmpAttrs.mBrandingImage, mBrandingImageWidth,
                         mBrandingImageHeight);
             }
             final SplashScreenView splashScreenView = builder.build();
             if (DEBUG) {
                 Slog.d(TAG, "fillViewWithIcon surfaceWindowView " + splashScreenView);
             }
+            if (mEmptyView) {
+                splashScreenView.setNotCopyable();
+            }
             splashScreenView.makeSystemUIColorsTransparent();
             Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
             return splashScreenView;
@@ -418,6 +439,18 @@
         if (a == b) {
             return true;
         }
+        final float lumA = Color.luminance(a);
+        final float lumB = Color.luminance(b);
+        final float contrastRatio = lumA > lumB
+                ? (lumA + 0.05f) / (lumB + 0.05f) : (lumB + 0.05f) / (lumA + 0.05f);
+        if (DEBUG) {
+            Slog.d(TAG, "isRgbSimilarInHsv a: " + Integer.toHexString(a)
+                    + " b " + Integer.toHexString(b) + " contrast ratio: " + contrastRatio);
+        }
+        if (contrastRatio < 2) {
+            return true;
+        }
+
         final float[] aHsv = new float[3];
         final float[] bHsv = new float[3];
         Color.colorToHSV(a, aHsv);
@@ -428,14 +461,18 @@
 
         // Calculate the difference between two colors based on the HSV dimensions.
         final float normalizeH = minAngle / 180f;
-        final double square = Math.pow(normalizeH, 2)
-                + Math.pow(aHsv[1] - bHsv[1], 2)
-                + Math.pow(aHsv[2] - bHsv[2], 2);
+        final double squareH = Math.pow(normalizeH, 2);
+        final double squareS = Math.pow(aHsv[1] - bHsv[1], 2);
+        final double squareV = Math.pow(aHsv[2] - bHsv[2], 2);
+        final double square = squareH + squareS + squareV;
         final double mean = square / 3;
         final double root = Math.sqrt(mean);
         if (DEBUG) {
-            Slog.d(TAG, "hsvDiff " + minAngle + " a: " + Integer.toHexString(a)
-                    + " b " + Integer.toHexString(b) + " ah " + aHsv[0] + " bh " + bHsv[0]
+            Slog.d(TAG, "hsvDiff " + minAngle
+                    + " ah " + aHsv[0] + " bh " + bHsv[0]
+                    + " as " + aHsv[1] + " bs " + bHsv[1]
+                    + " av " + aHsv[2] + " bv " + bHsv[2]
+                    + " sqH " + squareH + " sqS " + squareS + " sqV " + squareV
                     + " root " + root);
         }
         return root < 0.1;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
index 85845d0..6cbba9f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
@@ -59,6 +59,7 @@
             return new ImmobileIconDrawable((AdaptiveIconDrawable) foregroundDrawable, iconSize,
                     splashscreenWorkerHandler);
         } else {
+            // TODO for legacy icon don't use adaptive icon drawable to wrapper it
             return new ImmobileIconDrawable(new AdaptiveIconDrawable(
                     new ColorDrawable(backgroundColor), foregroundDrawable), iconSize,
                     splashscreenWorkerHandler);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
index 7037d18..6d3eeae 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
@@ -114,14 +114,12 @@
         mContext = context;
         mDisplayManager = mContext.getSystemService(DisplayManager.class);
         mSplashScreenExecutor = splashScreenExecutor;
-        final int maxAnimatableIconDuration = context.getResources().getInteger(
-                com.android.wm.shell.R.integer.max_starting_window_intro_icon_anim_duration);
         final int iconExitAnimDuration = context.getResources().getInteger(
                 com.android.wm.shell.R.integer.starting_window_icon_exit_anim_duration);
         final int appRevealAnimDuration = context.getResources().getInteger(
                 com.android.wm.shell.R.integer.starting_window_app_reveal_anim_duration);
-        mSplashscreenContentDrawer = new SplashscreenContentDrawer(mContext,
-                maxAnimatableIconDuration, iconExitAnimDuration, appRevealAnimDuration, pool);
+        mSplashscreenContentDrawer = new SplashscreenContentDrawer(mContext, iconExitAnimDuration,
+                appRevealAnimDuration, pool);
         mSplashScreenExecutor.execute(() -> mChoreographer = Choreographer.getInstance());
     }
 
@@ -317,46 +315,38 @@
         // 3. Pre-draw the BitmapShader if the icon is immobile on splash screen worker thread, at
         // the same time the splash screen thread should be executing Session#relayout. Blocking the
         // traversal -> draw on splash screen thread until the BitmapShader of the icon is ready.
-        final Runnable setViewSynchronized;
-        if (!emptyView) {
-            // Record whether create splash screen view success, notify to current thread after
-            // create splash screen view finished.
-            final SplashScreenViewSupplier viewSupplier = new SplashScreenViewSupplier();
-            setViewSynchronized = () -> {
-                // waiting for setContentView before relayoutWindow
-                SplashScreenView contentView = viewSupplier.get();
-                final StartingWindowRecord record = mStartingWindowRecords.get(taskId);
-                // if record == null, either the starting window added fail or removed already.
-                if (record != null) {
-                    // if view == null then creation of content view was failed.
-                    if (contentView != null) {
-                        try {
-                            win.setContentView(contentView);
-                            contentView.cacheRootWindow(win);
-                        } catch (RuntimeException e) {
-                            Slog.w(TAG, "failed set content view to starting window "
-                                    + "at taskId: " + taskId, e);
-                            contentView = null;
-                        }
+
+        // Record whether create splash screen view success, notify to current thread after
+        // create splash screen view finished.
+        final SplashScreenViewSupplier viewSupplier = new SplashScreenViewSupplier();
+        final Runnable setViewSynchronized = () -> {
+            // waiting for setContentView before relayoutWindow
+            SplashScreenView contentView = viewSupplier.get();
+            final StartingWindowRecord record = mStartingWindowRecords.get(taskId);
+            // if record == null, either the starting window added fail or removed already.
+            if (record != null) {
+                // if view == null then creation of content view was failed.
+                if (contentView != null) {
+                    try {
+                        win.setContentView(contentView);
+                        contentView.cacheRootWindow(win);
+                    } catch (RuntimeException e) {
+                        Slog.w(TAG, "failed set content view to starting window "
+                                + "at taskId: " + taskId, e);
+                        contentView = null;
                     }
-                    record.setSplashScreenView(contentView);
                 }
-            };
-            mSplashscreenContentDrawer.createContentView(context,
-                    splashscreenContentResId[0], activityInfo, taskId, viewSupplier::setView);
-        } else {
-            setViewSynchronized = null;
-        }
+                record.setSplashScreenView(contentView);
+            }
+        };
+        mSplashscreenContentDrawer.createContentView(context, emptyView,
+                splashscreenContentResId[0], activityInfo, taskId, viewSupplier::setView);
 
         try {
             final View view = win.getDecorView();
             final WindowManager wm = mContext.getSystemService(WindowManager.class);
             postAddWindow(taskId, appToken, view, wm, params);
 
-            // all done
-            if (emptyView) {
-                return;
-            }
             // We use the splash screen worker thread to create SplashScreenView while adding the
             // window, as otherwise Choreographer#doFrame might be delayed on this thread.
             // And since Choreographer#doFrame won't happen immediately after adding the window, if
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java
index e336287..cb7afc7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java
@@ -15,18 +15,10 @@
  */
 package com.android.wm.shell.startingsurface;
 
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
-import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_NONE;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SNAPSHOT;
 import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
-import static android.window.StartingWindowInfo.TYPE_PARAMETER_ACTIVITY_CREATED;
-import static android.window.StartingWindowInfo.TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT;
-import static android.window.StartingWindowInfo.TYPE_PARAMETER_NEW_TASK;
-import static android.window.StartingWindowInfo.TYPE_PARAMETER_PROCESS_RUNNING;
-import static android.window.StartingWindowInfo.TYPE_PARAMETER_SAME_PACKAGE;
-import static android.window.StartingWindowInfo.TYPE_PARAMETER_TASK_SWITCH;
 
 import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission;
 
@@ -68,27 +60,24 @@
  */
 public class StartingWindowController implements RemoteCallable<StartingWindowController> {
     private static final String TAG = StartingWindowController.class.getSimpleName();
+
     // TODO b/183150443 Keep this flag open for a while, several things might need to adjust.
-    static final boolean DEBUG_SPLASH_SCREEN = true;
-    static final boolean DEBUG_TASK_SNAPSHOT = false;
+    public static final boolean DEBUG_SPLASH_SCREEN = true;
+    public static final boolean DEBUG_TASK_SNAPSHOT = false;
 
     private final StartingSurfaceDrawer mStartingSurfaceDrawer;
-    private final StartingTypeChecker mStartingTypeChecker = new StartingTypeChecker();
+    private final StartingWindowTypeAlgorithm mStartingWindowTypeAlgorithm;
 
     private BiConsumer<Integer, Integer> mTaskLaunchingCallback;
     private final StartingSurfaceImpl mImpl = new StartingSurfaceImpl();
     private final Context mContext;
     private final ShellExecutor mSplashScreenExecutor;
 
-    // For Car Launcher
-    public StartingWindowController(Context context, ShellExecutor splashScreenExecutor) {
-        this(context, splashScreenExecutor, new TransactionPool());
-    }
-
     public StartingWindowController(Context context, ShellExecutor splashScreenExecutor,
-            TransactionPool pool) {
+            StartingWindowTypeAlgorithm startingWindowTypeAlgorithm, TransactionPool pool) {
         mContext = context;
         mStartingSurfaceDrawer = new StartingSurfaceDrawer(context, splashScreenExecutor, pool);
+        mStartingWindowTypeAlgorithm = startingWindowTypeAlgorithm;
         mSplashScreenExecutor = splashScreenExecutor;
     }
 
@@ -109,90 +98,6 @@
         return mSplashScreenExecutor;
     }
 
-    private static class StartingTypeChecker {
-
-        private @StartingWindowInfo.StartingWindowType int
-                estimateStartingWindowType(StartingWindowInfo windowInfo) {
-            final int parameter = windowInfo.startingWindowTypeParameter;
-            final boolean newTask = (parameter & TYPE_PARAMETER_NEW_TASK) != 0;
-            final boolean taskSwitch = (parameter & TYPE_PARAMETER_TASK_SWITCH) != 0;
-            final boolean processRunning = (parameter & TYPE_PARAMETER_PROCESS_RUNNING) != 0;
-            final boolean allowTaskSnapshot = (parameter & TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT) != 0;
-            final boolean activityCreated = (parameter & TYPE_PARAMETER_ACTIVITY_CREATED) != 0;
-            final boolean samePackage = (parameter & TYPE_PARAMETER_SAME_PACKAGE) != 0;
-            return estimateStartingWindowType(windowInfo, newTask, taskSwitch,
-                    processRunning, allowTaskSnapshot, activityCreated, samePackage);
-        }
-
-        // reference from ActivityRecord#getStartingWindowType
-        private int estimateStartingWindowType(StartingWindowInfo windowInfo,
-                boolean newTask, boolean taskSwitch, boolean processRunning,
-                boolean allowTaskSnapshot, boolean activityCreated, boolean samePackage) {
-            if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
-                Slog.d(TAG, "preferredStartingWindowType newTask " + newTask
-                        + " taskSwitch " + taskSwitch
-                        + " processRunning " + processRunning
-                        + " allowTaskSnapshot " + allowTaskSnapshot
-                        + " activityCreated " + activityCreated
-                        + " samePackage " + samePackage);
-            }
-            if (windowInfo.taskInfo.topActivityType != ACTIVITY_TYPE_HOME) {
-                if (!processRunning) {
-                    return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
-                }
-                if (newTask) {
-                    if (samePackage) {
-                        return STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
-                    } else {
-                        return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
-                    }
-                }
-                if (taskSwitch && !activityCreated) {
-                    return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
-                }
-            }
-            if (taskSwitch && allowTaskSnapshot) {
-                final TaskSnapshot snapshot = windowInfo.mTaskSnapshot;
-                if (isSnapshotCompatible(windowInfo, snapshot)) {
-                    return STARTING_WINDOW_TYPE_SNAPSHOT;
-                }
-                if (windowInfo.taskInfo.topActivityType != ACTIVITY_TYPE_HOME) {
-                    return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
-                }
-            }
-            return STARTING_WINDOW_TYPE_NONE;
-        }
-
-        /**
-         * Returns {@code true} if the task snapshot is compatible with this activity (at least the
-         * rotation must be the same).
-         */
-        private boolean isSnapshotCompatible(StartingWindowInfo windowInfo, TaskSnapshot snapshot) {
-            if (snapshot == null) {
-                if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
-                    Slog.d(TAG, "isSnapshotCompatible no snapshot " + windowInfo.taskInfo.taskId);
-                }
-                return false;
-            }
-            if (!snapshot.getTopActivityComponent().equals(windowInfo.taskInfo.topActivity)) {
-                if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
-                    Slog.d(TAG, "isSnapshotCompatible obsoleted snapshot "
-                            + windowInfo.taskInfo.topActivity);
-                }
-                return false;
-            }
-
-            final int taskRotation = windowInfo.taskInfo.configuration
-                    .windowConfiguration.getRotation();
-            final int snapshotRotation = snapshot.getRotation();
-            if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
-                Slog.d(TAG, "isSnapshotCompatible rotation " + taskRotation
-                        + " snapshot " + snapshotRotation);
-            }
-            return taskRotation == snapshotRotation;
-        }
-    }
-
     /*
      * Registers the starting window listener.
      *
@@ -212,7 +117,8 @@
     public void addStartingWindow(StartingWindowInfo windowInfo, IBinder appToken) {
         mSplashScreenExecutor.execute(() -> {
             Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "addStartingWindow");
-            final int suggestionType = mStartingTypeChecker.estimateStartingWindowType(
+
+            final int suggestionType = mStartingWindowTypeAlgorithm.getSuggestedWindowType(
                     windowInfo);
             final RunningTaskInfo runningTaskInfo = windowInfo.taskInfo;
             if (mTaskLaunchingCallback != null && shouldSendToListener(suggestionType)) {
@@ -228,8 +134,10 @@
                 final TaskSnapshot snapshot = windowInfo.mTaskSnapshot;
                 mStartingSurfaceDrawer.makeTaskSnapshotWindow(windowInfo, appToken,
                         snapshot);
+            } else /* suggestionType == STARTING_WINDOW_TYPE_NONE */ {
+                // Don't add a staring window.
             }
-            // If prefer don't show, then don't show!
+
             Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
         });
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowTypeAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowTypeAlgorithm.java
new file mode 100644
index 0000000..de221ed
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowTypeAlgorithm.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.startingsurface;
+
+import android.window.StartingWindowInfo;
+
+/**
+ * Used by {@link StartingWindowController} for determining the type of a new starting window.
+ */
+public interface StartingWindowTypeAlgorithm {
+    /**
+     * @return suggested type for the given window.
+     */
+    @StartingWindowInfo.StartingWindowType
+    int getSuggestedWindowType(StartingWindowInfo windowInfo);
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
index e9ce2ad..b468462 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
@@ -38,6 +38,7 @@
 import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 
 import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES;
@@ -52,8 +53,10 @@
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.GraphicBuffer;
 import android.graphics.Matrix;
 import android.graphics.Paint;
+import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.graphics.RectF;
@@ -68,7 +71,6 @@
 import android.view.InputChannel;
 import android.view.InsetsSourceControl;
 import android.view.InsetsState;
-import android.view.Surface;
 import android.view.SurfaceControl;
 import android.view.SurfaceSession;
 import android.view.View;
@@ -122,11 +124,9 @@
     private static final Point TMP_SURFACE_SIZE = new Point();
 
     private final Window mWindow;
-    private final Surface mSurface;
     private final Runnable mClearWindowHandler;
     private final ShellExecutor mSplashScreenExecutor;
-    private SurfaceControl mSurfaceControl;
-    private SurfaceControl mChildSurfaceControl;
+    private final SurfaceControl mSurfaceControl;
     private final IWindowSession mSession;
     private final Rect mTaskBounds;
     private final Rect mFrame = new Rect();
@@ -179,7 +179,7 @@
         // Setting as trusted overlay to let touches pass through. This is safe because this
         // window is controlled by the system.
         layoutParams.privateFlags = (windowPrivateFlags & PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS)
-                | PRIVATE_FLAG_TRUSTED_OVERLAY;
+                | PRIVATE_FLAG_TRUSTED_OVERLAY | PRIVATE_FLAG_USE_BLAST;
         layoutParams.token = appToken;
         layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
         layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
@@ -259,7 +259,6 @@
             int currentOrientation, int activityType, InsetsState topWindowInsetsState,
             Runnable clearWindowHandler, ShellExecutor splashScreenExecutor) {
         mSplashScreenExecutor = splashScreenExecutor;
-        mSurface = new Surface();
         mSession = WindowManagerGlobal.getWindowSession();
         mWindow = new Window();
         mWindow.setSession(mSession);
@@ -336,7 +335,6 @@
     }
 
     private void drawSnapshot() {
-        mSurface.copyFrom(mSurfaceControl);
         if (DEBUG) {
             Slog.d(TAG, "Drawing snapshot surface sizeMismatch= " + mSizeMismatch);
         }
@@ -357,15 +355,14 @@
     }
 
     private void drawSizeMatchSnapshot() {
-        mSurface.attachAndQueueBufferWithColorSpace(mSnapshot.getHardwareBuffer(),
-                mSnapshot.getColorSpace());
-        mSurface.release();
+        GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(
+                mSnapshot.getHardwareBuffer());
+        mTransaction.setBuffer(mSurfaceControl, graphicBuffer)
+                .setColorSpace(mSurfaceControl, mSnapshot.getColorSpace())
+                .apply();
     }
 
     private void drawSizeMismatchSnapshot() {
-        if (!mSurface.isValid()) {
-            throw new IllegalStateException("mSurface does not hold a valid surface.");
-        }
         final HardwareBuffer buffer = mSnapshot.getHardwareBuffer();
         final SurfaceSession session = new SurfaceSession();
 
@@ -376,26 +373,24 @@
                 - ((float) mFrame.width() / mFrame.height())) > 0.01f;
 
         // Keep a reference to it such that it doesn't get destroyed when finalized.
-        mChildSurfaceControl = new SurfaceControl.Builder(session)
+        SurfaceControl childSurfaceControl = new SurfaceControl.Builder(session)
                 .setName(mTitle + " - task-snapshot-surface")
-                .setBufferSize(buffer.getWidth(), buffer.getHeight())
+                .setBLASTLayer()
                 .setFormat(buffer.getFormat())
                 .setParent(mSurfaceControl)
                 .setCallsite("TaskSnapshotWindow.drawSizeMismatchSnapshot")
                 .build();
-        Surface surface = new Surface();
-        surface.copyFrom(mChildSurfaceControl);
 
         final Rect frame;
         // We can just show the surface here as it will still be hidden as the parent is
         // still hidden.
-        mTransaction.show(mChildSurfaceControl);
+        mTransaction.show(childSurfaceControl);
         if (aspectRatioMismatch) {
             // Clip off ugly navigation bar.
             final Rect crop = calculateSnapshotCrop();
             frame = calculateSnapshotFrame(crop);
-            mTransaction.setWindowCrop(mChildSurfaceControl, crop);
-            mTransaction.setPosition(mChildSurfaceControl, frame.left, frame.top);
+            mTransaction.setWindowCrop(childSurfaceControl, crop);
+            mTransaction.setPosition(childSurfaceControl, frame.left, frame.top);
             mTmpSnapshotSize.set(crop);
             mTmpDstFrame.set(frame);
         } else {
@@ -407,18 +402,23 @@
 
         // Scale the mismatch dimensions to fill the task bounds
         mSnapshotMatrix.setRectToRect(mTmpSnapshotSize, mTmpDstFrame, Matrix.ScaleToFit.FILL);
-        mTransaction.setMatrix(mChildSurfaceControl, mSnapshotMatrix, mTmpFloat9);
-
-        mTransaction.apply();
-        surface.attachAndQueueBufferWithColorSpace(buffer, mSnapshot.getColorSpace());
-        surface.release();
+        mTransaction.setMatrix(childSurfaceControl, mSnapshotMatrix, mTmpFloat9);
+        GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(
+                mSnapshot.getHardwareBuffer());
+        mTransaction.setColorSpace(childSurfaceControl, mSnapshot.getColorSpace());
+        mTransaction.setBuffer(childSurfaceControl, graphicBuffer);
 
         if (aspectRatioMismatch) {
-            final Canvas c = mSurface.lockCanvas(null);
+            GraphicBuffer background = GraphicBuffer.create(mFrame.width(), mFrame.height(),
+                    PixelFormat.RGBA_8888,
+                    GraphicBuffer.USAGE_HW_TEXTURE | GraphicBuffer.USAGE_HW_COMPOSER
+                            | GraphicBuffer.USAGE_SW_WRITE_RARELY);
+            final Canvas c = background.lockCanvas();
             drawBackgroundAndBars(c, frame);
-            mSurface.unlockCanvasAndPost(c);
-            mSurface.release();
+            background.unlockCanvasAndPost(c);
+            mTransaction.setBuffer(mSurfaceControl, background);
         }
+        mTransaction.apply();
     }
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java
new file mode 100644
index 0000000..9948e7d
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/phone/PhoneStartingWindowTypeAlgorithm.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.startingsurface.phone;
+
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_NONE;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SNAPSHOT;
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_ACTIVITY_CREATED;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_NEW_TASK;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_PROCESS_RUNNING;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_SAME_PACKAGE;
+import static android.window.StartingWindowInfo.TYPE_PARAMETER_TASK_SWITCH;
+
+import static com.android.wm.shell.startingsurface.StartingWindowController.DEBUG_SPLASH_SCREEN;
+import static com.android.wm.shell.startingsurface.StartingWindowController.DEBUG_TASK_SNAPSHOT;
+
+import android.util.Slog;
+import android.window.StartingWindowInfo;
+import android.window.TaskSnapshot;
+
+import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
+
+/**
+ * Algorithm for determining the type of a new starting window on handheld devices.
+ * At the moment also used on Android Auto.
+ */
+public class PhoneStartingWindowTypeAlgorithm implements StartingWindowTypeAlgorithm {
+    private static final String TAG = PhoneStartingWindowTypeAlgorithm.class.getSimpleName();
+
+    @Override
+    public int getSuggestedWindowType(StartingWindowInfo windowInfo) {
+        final int parameter = windowInfo.startingWindowTypeParameter;
+        final boolean newTask = (parameter & TYPE_PARAMETER_NEW_TASK) != 0;
+        final boolean taskSwitch = (parameter & TYPE_PARAMETER_TASK_SWITCH) != 0;
+        final boolean processRunning = (parameter & TYPE_PARAMETER_PROCESS_RUNNING) != 0;
+        final boolean allowTaskSnapshot = (parameter & TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT) != 0;
+        final boolean activityCreated = (parameter & TYPE_PARAMETER_ACTIVITY_CREATED) != 0;
+        final boolean samePackage = (parameter & TYPE_PARAMETER_SAME_PACKAGE) != 0;
+        final boolean topIsHome = windowInfo.taskInfo.topActivityType == ACTIVITY_TYPE_HOME;
+
+        if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
+            Slog.d(TAG, "preferredStartingWindowType newTask " + newTask
+                    + " taskSwitch " + taskSwitch
+                    + " processRunning " + processRunning
+                    + " allowTaskSnapshot " + allowTaskSnapshot
+                    + " activityCreated " + activityCreated
+                    + " samePackage " + samePackage
+                    + " topIsHome " + topIsHome);
+        }
+        if (!topIsHome) {
+            if (!processRunning) {
+                return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+            }
+            if (newTask) {
+                if (samePackage) {
+                    return STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
+                } else {
+                    return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+                }
+            }
+            if (taskSwitch && !activityCreated) {
+                return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+            }
+        }
+        if (taskSwitch && allowTaskSnapshot) {
+            if (isSnapshotCompatible(windowInfo)) {
+                return STARTING_WINDOW_TYPE_SNAPSHOT;
+            }
+            if (!topIsHome) {
+                return STARTING_WINDOW_TYPE_SPLASH_SCREEN;
+            }
+        }
+        return STARTING_WINDOW_TYPE_NONE;
+    }
+
+
+    /**
+     * Returns {@code true} if the task snapshot is compatible with this activity (at least the
+     * rotation must be the same).
+     */
+    private boolean isSnapshotCompatible(StartingWindowInfo windowInfo) {
+        final TaskSnapshot snapshot = windowInfo.mTaskSnapshot;
+        if (snapshot == null) {
+            if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
+                Slog.d(TAG, "isSnapshotCompatible no snapshot " + windowInfo.taskInfo.taskId);
+            }
+            return false;
+        }
+        if (!snapshot.getTopActivityComponent().equals(windowInfo.taskInfo.topActivity)) {
+            if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
+                Slog.d(TAG, "isSnapshotCompatible obsoleted snapshot "
+                        + windowInfo.taskInfo.topActivity);
+            }
+            return false;
+        }
+
+        final int taskRotation = windowInfo.taskInfo.configuration
+                .windowConfiguration.getRotation();
+        final int snapshotRotation = snapshot.getRotation();
+        if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
+            Slog.d(TAG, "isSnapshotCompatible rotation " + taskRotation
+                    + " snapshot " + snapshotRotation);
+        }
+        return taskRotation == snapshotRotation;
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/tv/TvStartingWindowTypeAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/tv/TvStartingWindowTypeAlgorithm.java
new file mode 100644
index 0000000..6e7dec5
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/tv/TvStartingWindowTypeAlgorithm.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.startingsurface.tv;
+
+import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
+
+import android.window.StartingWindowInfo;
+
+import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
+
+/**
+ * Algorithm for determining the type of a new starting window on Android TV.
+ * For now we always show empty splash screens on Android TV.
+ */
+public class TvStartingWindowTypeAlgorithm implements StartingWindowTypeAlgorithm {
+    @Override
+    public int getSuggestedWindowType(StartingWindowInfo windowInfo) {
+        // For now we want to always show empty splash screens on TV.
+        return STARTING_WINDOW_TYPE_EMPTY_SPLASH_SCREEN;
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index b29b18b..c6fb5af 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -18,9 +18,14 @@
 
 import static android.view.WindowManager.TRANSIT_CHANGE;
 import static android.view.WindowManager.TRANSIT_CLOSE;
+import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
+import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
 import static android.view.WindowManager.TRANSIT_OPEN;
+import static android.view.WindowManager.TRANSIT_RELAUNCH;
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
+import static android.window.TransitionInfo.FLAG_IS_VOICE_INTERACTION;
+import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
 import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
 import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
 
@@ -64,6 +69,7 @@
     /** Keeps track of the currently-running animations associated with each transition. */
     private final ArrayMap<IBinder, ArrayList<Animator>> mAnimations = new ArrayMap<>();
 
+    private final Rect mInsets = new Rect(0, 0, 0, 0);
     private float mTransitionAnimationScaleSetting = 1.0f;
 
     DefaultTransitionHandler(@NonNull TransactionPool transactionPool, Context context,
@@ -111,7 +117,7 @@
             // Don't animate anything that isn't independent.
             if (!TransitionInfo.isIndependent(change, info)) continue;
 
-            Animation a = loadAnimation(info.getType(), change);
+            Animation a = loadAnimation(info.getType(), info.getFlags(), change);
             if (a != null) {
                 startAnimInternal(animations, a, change.getLeash(), onAnimFinish);
             }
@@ -135,47 +141,69 @@
     }
 
     @Nullable
-    private Animation loadAnimation(int type, TransitionInfo.Change change) {
+    private Animation loadAnimation(int type, int flags, TransitionInfo.Change change) {
         // TODO(b/178678389): It should handle more type animation here
         Animation a = null;
 
         final boolean isOpening = Transitions.isOpeningType(type);
-        final int mode = change.getMode();
-        final int flags = change.getFlags();
+        final int changeMode = change.getMode();
+        final int changeFlags = change.getFlags();
 
-        if (mode == TRANSIT_OPEN && isOpening) {
-            if ((flags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
+        if (type == TRANSIT_RELAUNCH) {
+            a = mTransitionAnimation.createRelaunchAnimation(
+                    change.getStartAbsBounds(), mInsets, change.getEndAbsBounds());
+        } else if (type == TRANSIT_KEYGUARD_GOING_AWAY) {
+            a = mTransitionAnimation.loadKeyguardExitAnimation(flags,
+                    (changeFlags & FLAG_SHOW_WALLPAPER) != 0);
+        } else if (type == TRANSIT_KEYGUARD_UNOCCLUDE) {
+            a = mTransitionAnimation.loadKeyguardUnoccludeAnimation();
+        } else if (changeMode == TRANSIT_OPEN && isOpening) {
+            if ((changeFlags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
                 // This received a transferred starting window, so don't animate
                 return null;
             }
 
-            if (change.getTaskInfo() != null) {
+            if ((changeFlags & FLAG_IS_VOICE_INTERACTION) != 0) {
+                a = mTransitionAnimation.loadVoiceActivityOpenAnimation(true /** enter */);
+            } else if (change.getTaskInfo() != null) {
                 a = mTransitionAnimation.loadDefaultAnimationAttr(
                         R.styleable.WindowAnimation_taskOpenEnterAnimation);
             } else {
-                a = mTransitionAnimation.loadDefaultAnimationRes((flags & FLAG_TRANSLUCENT) == 0
+                a = mTransitionAnimation.loadDefaultAnimationRes(
+                        (changeFlags & FLAG_TRANSLUCENT) == 0
                         ? R.anim.activity_open_enter : R.anim.activity_translucent_open_enter);
             }
-        } else if (mode == TRANSIT_TO_FRONT && isOpening) {
-            if ((flags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
+        } else if (changeMode == TRANSIT_TO_FRONT && isOpening) {
+            if ((changeFlags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
                 // This received a transferred starting window, so don't animate
                 return null;
             }
 
-            a = mTransitionAnimation.loadDefaultAnimationAttr(
-                    R.styleable.WindowAnimation_taskToFrontEnterAnimation);
-        } else if (mode == TRANSIT_CLOSE && !isOpening) {
-            if (change.getTaskInfo() != null) {
+            if ((changeFlags & FLAG_IS_VOICE_INTERACTION) != 0) {
+                a = mTransitionAnimation.loadVoiceActivityOpenAnimation(true /** enter */);
+            } else {
+                a = mTransitionAnimation.loadDefaultAnimationAttr(
+                        R.styleable.WindowAnimation_taskToFrontEnterAnimation);
+            }
+        } else if (changeMode == TRANSIT_CLOSE && !isOpening) {
+            if ((changeFlags & FLAG_IS_VOICE_INTERACTION) != 0) {
+                a = mTransitionAnimation.loadVoiceActivityExitAnimation(false /** enter */);
+            } else if (change.getTaskInfo() != null) {
                 a = mTransitionAnimation.loadDefaultAnimationAttr(
                         R.styleable.WindowAnimation_taskCloseExitAnimation);
             } else {
-                a = mTransitionAnimation.loadDefaultAnimationRes((flags & FLAG_TRANSLUCENT) == 0
+                a = mTransitionAnimation.loadDefaultAnimationRes(
+                        (changeFlags & FLAG_TRANSLUCENT) == 0
                         ? R.anim.activity_close_exit : R.anim.activity_translucent_close_exit);
             }
-        } else if (mode == TRANSIT_TO_BACK && !isOpening) {
-            a = mTransitionAnimation.loadDefaultAnimationAttr(
-                    R.styleable.WindowAnimation_taskToBackExitAnimation);
-        } else if (mode == TRANSIT_CHANGE) {
+        } else if (changeMode == TRANSIT_TO_BACK && !isOpening) {
+            if ((changeFlags & FLAG_IS_VOICE_INTERACTION) != 0) {
+                a = mTransitionAnimation.loadVoiceActivityExitAnimation(false /** enter */);
+            } else {
+                a = mTransitionAnimation.loadDefaultAnimationAttr(
+                        R.styleable.WindowAnimation_taskToBackExitAnimation);
+            }
+        } else if (changeMode == TRANSIT_CHANGE) {
             // In the absence of a specific adapter, we just want to keep everything stationary.
             a = new AlphaAnimation(1.f, 1.f);
             a.setDuration(TransitionAnimation.DEFAULT_APP_TRANSITION_DURATION);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
index 71fd917..4da6664 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java
@@ -82,18 +82,39 @@
             if (mRemote.asBinder() != null) {
                 mRemote.asBinder().linkToDeath(remoteDied, 0 /* flags */);
             }
-            mRemote.startAnimation(info, t, cb);
+            mRemote.startAnimation(transition, info, t, cb);
         } catch (RemoteException e) {
+            Log.e(Transitions.TAG, "Error running remote transition.", e);
             if (mRemote.asBinder() != null) {
                 mRemote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */);
             }
-            Log.e(Transitions.TAG, "Error running remote transition.", e);
             finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
         }
         return true;
     }
 
     @Override
+    public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
+            @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
+            @NonNull Transitions.TransitionFinishCallback finishCallback) {
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Using registered One-shot remote"
+                + " transition %s for %s.", mRemote, transition);
+
+        IRemoteTransitionFinishedCallback cb = new IRemoteTransitionFinishedCallback.Stub() {
+            @Override
+            public void onTransitionFinished(WindowContainerTransaction wct) {
+                mMainExecutor.execute(
+                        () -> finishCallback.onTransitionFinished(wct, null /* wctCB */));
+            }
+        };
+        try {
+            mRemote.mergeAnimation(transition, info, t, mergeTarget, cb);
+        } catch (RemoteException e) {
+            Log.e(Transitions.TAG, "Error merging remote transition.", e);
+        }
+    }
+
+    @Override
     @Nullable
     public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
             @Nullable TransitionRequestInfo request) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java
index 8876e5f..9bfb261 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java
@@ -16,8 +16,6 @@
 
 package com.android.wm.shell.transition;
 
-import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission;
-
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.os.IBinder;
@@ -52,7 +50,7 @@
     private final ShellExecutor mMainExecutor;
 
     /** Includes remotes explicitly requested by, eg, ActivityOptions */
-    private final ArrayMap<IBinder, IRemoteTransition> mPendingRemotes = new ArrayMap<>();
+    private final ArrayMap<IBinder, IRemoteTransition> mRequestedRemotes = new ArrayMap<>();
 
     /** Ordered by specificity. Last filters will be checked first */
     private final ArrayList<Pair<TransitionFilter, IRemoteTransition>> mFilters =
@@ -63,9 +61,7 @@
                 @Override
                 @BinderThread
                 public void binderDied() {
-                    mMainExecutor.execute(() -> {
-                        mFilters.clear();
-                    });
+                    mMainExecutor.execute(() -> mFilters.clear());
                 }
             };
 
@@ -97,10 +93,15 @@
     }
 
     @Override
+    public void onTransitionMerged(@NonNull IBinder transition) {
+        mRequestedRemotes.remove(transition);
+    }
+
+    @Override
     public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction t,
             @NonNull Transitions.TransitionFinishCallback finishCallback) {
-        IRemoteTransition pendingRemote = mPendingRemotes.remove(transition);
+        IRemoteTransition pendingRemote = mRequestedRemotes.get(transition);
         if (pendingRemote == null) {
             ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition %s doesn't have "
                     + "explicit remote, search filters for match for %s", transition, info);
@@ -110,6 +111,8 @@
                         mFilters.get(i));
                 if (mFilters.get(i).first.matches(info)) {
                     pendingRemote = mFilters.get(i).second;
+                    // Add to requested list so that it can be found for merge requests.
+                    mRequestedRemotes.put(transition, pendingRemote);
                     break;
                 }
             }
@@ -122,8 +125,10 @@
         final IRemoteTransition remote = pendingRemote;
         final IBinder.DeathRecipient remoteDied = () -> {
             Log.e(Transitions.TAG, "Remote transition died, finishing");
-            mMainExecutor.execute(
-                    () -> finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */));
+            mMainExecutor.execute(() -> {
+                mRequestedRemotes.remove(transition);
+                finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
+            });
         };
         IRemoteTransitionFinishedCallback cb = new IRemoteTransitionFinishedCallback.Stub() {
             @Override
@@ -131,20 +136,23 @@
                 if (remote.asBinder() != null) {
                     remote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */);
                 }
-                mMainExecutor.execute(
-                        () -> finishCallback.onTransitionFinished(wct, null /* wctCB */));
+                mMainExecutor.execute(() -> {
+                    mRequestedRemotes.remove(transition);
+                    finishCallback.onTransitionFinished(wct, null /* wctCB */);
+                });
             }
         };
         try {
             if (remote.asBinder() != null) {
                 remote.asBinder().linkToDeath(remoteDied, 0 /* flags */);
             }
-            remote.startAnimation(info, t, cb);
+            remote.startAnimation(transition, info, t, cb);
         } catch (RemoteException e) {
+            Log.e(Transitions.TAG, "Error running remote transition.", e);
             if (remote.asBinder() != null) {
                 remote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */);
             }
-            Log.e(Transitions.TAG, "Error running remote transition.", e);
+            mRequestedRemotes.remove(transition);
             mMainExecutor.execute(
                     () -> finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */));
         }
@@ -152,12 +160,42 @@
     }
 
     @Override
+    public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
+            @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
+            @NonNull Transitions.TransitionFinishCallback finishCallback) {
+        final IRemoteTransition remote = mRequestedRemotes.get(mergeTarget);
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Attempt merge %s into %s",
+                transition, remote);
+        if (remote == null) return;
+
+        IRemoteTransitionFinishedCallback cb = new IRemoteTransitionFinishedCallback.Stub() {
+            @Override
+            public void onTransitionFinished(WindowContainerTransaction wct) {
+                mMainExecutor.execute(() -> {
+                    if (!mRequestedRemotes.containsKey(mergeTarget)) {
+                        Log.e(TAG, "Merged transition finished after it's mergeTarget (the "
+                                + "transition it was supposed to merge into). This usually means "
+                                + "that the mergeTarget's RemoteTransition impl erroneously "
+                                + "accepted/ran the merge request after finishing the mergeTarget");
+                    }
+                    finishCallback.onTransitionFinished(wct, null /* wctCB */);
+                });
+            }
+        };
+        try {
+            remote.mergeAnimation(transition, info, t, mergeTarget, cb);
+        } catch (RemoteException e) {
+            Log.e(Transitions.TAG, "Error attempting to merge remote transition.", e);
+        }
+    }
+
+    @Override
     @Nullable
     public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
             @Nullable TransitionRequestInfo request) {
         IRemoteTransition remote = request.getRemoteTransition();
         if (remote == null) return null;
-        mPendingRemotes.put(transition, remote);
+        mRequestedRemotes.put(transition, remote);
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "RemoteTransition directly requested"
                 + " for %s: %s", transition, remote);
         return new WindowContainerTransaction();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 64dc47f..3251abc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -35,7 +35,6 @@
 import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.provider.Settings;
-import android.util.ArrayMap;
 import android.util.Log;
 import android.view.SurfaceControl;
 import android.view.WindowManager;
@@ -91,11 +90,16 @@
     private float mTransitionAnimationScaleSetting = 1.0f;
 
     private static final class ActiveTransition {
-        TransitionHandler mFirstHandler = null;
+        IBinder mToken = null;
+        TransitionHandler mHandler = null;
+        boolean mMerged = false;
+        TransitionInfo mInfo = null;
+        SurfaceControl.Transaction mStartT = null;
+        SurfaceControl.Transaction mFinishT = null;
     }
 
-    /** Keeps track of currently tracked transitions and all the animations associated with each */
-    private final ArrayMap<IBinder, ActiveTransition> mActiveTransitions = new ArrayMap<>();
+    /** Keeps track of currently playing transitions in the order of receipt. */
+    private final ArrayList<ActiveTransition> mActiveTransitions = new ArrayList<>();
 
     public Transitions(@NonNull WindowOrganizer organizer, @NonNull TransactionPool pool,
             @NonNull Context context, @NonNull ShellExecutor mainExecutor,
@@ -226,7 +230,7 @@
      * type, their transit mode, and their destination z-order.
      */
     private static void setupStartState(@NonNull TransitionInfo info,
-            @NonNull SurfaceControl.Transaction t) {
+            @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) {
         boolean isOpening = isOpeningType(info.getType());
         if (info.getRootLeash().isValid()) {
             t.show(info.getRootLeash());
@@ -270,6 +274,8 @@
                         t.setAlpha(leash, 1.f);
                     } else {
                         t.setAlpha(leash, 0.f);
+                        // fix alpha in finish transaction in case the animator itself no-ops.
+                        finishT.setAlpha(leash, 1.f);
                     }
                 } else {
                     // put on bottom and leave it visible
@@ -290,16 +296,24 @@
         }
     }
 
+    private int findActiveTransition(IBinder token) {
+        for (int i = mActiveTransitions.size() - 1; i >= 0; --i) {
+            if (mActiveTransitions.get(i).mToken == token) return i;
+        }
+        return -1;
+    }
+
     @VisibleForTesting
     void onTransitionReady(@NonNull IBinder transitionToken, @NonNull TransitionInfo info,
-            @NonNull SurfaceControl.Transaction t) {
+            @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) {
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "onTransitionReady %s: %s",
                 transitionToken, info);
-        final ActiveTransition active = mActiveTransitions.get(transitionToken);
-        if (active == null) {
+        final int activeIdx = findActiveTransition(transitionToken);
+        if (activeIdx < 0) {
             throw new IllegalStateException("Got transitionReady for non-active transition "
                     + transitionToken + ". expecting one of "
-                    + Arrays.toString(mActiveTransitions.keySet().toArray()));
+                    + Arrays.toString(mActiveTransitions.stream().map(
+                            activeTransition -> activeTransition.mToken).toArray()));
         }
         if (!info.getRootLeash().isValid()) {
             // Invalid root-leash implies that the transition is empty/no-op, so just do
@@ -307,30 +321,62 @@
             ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Invalid root leash (%s): %s",
                     transitionToken, info);
             t.apply();
-            onFinish(transitionToken, null /* wct */, null /* wctCB */);
+            onAbort(transitionToken);
             return;
         }
 
-        setupStartState(info, t);
+        final ActiveTransition active = mActiveTransitions.get(activeIdx);
+        active.mInfo = info;
+        active.mStartT = t;
+        active.mFinishT = finishT;
+        if (activeIdx > 0) {
+            // This is now playing at the same time as an existing animation, so try merging it.
+            attemptMergeTransition(mActiveTransitions.get(0), active);
+            return;
+        }
+        // The normal case, just play it.
+        playTransition(active);
+    }
 
-        final TransitionFinishCallback finishCb = (wct, cb) -> onFinish(transitionToken, wct, cb);
-        // If a handler chose to uniquely run this animation, try delegating to it.
-        if (active.mFirstHandler != null) {
+    /**
+     * Attempt to merge by delegating the transition start to the handler of the currently
+     * playing transition.
+     */
+    void attemptMergeTransition(@NonNull ActiveTransition playing,
+            @NonNull ActiveTransition merging) {
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition %s ready while"
+                + " another transition %s is still animating. Notify the animating transition"
+                + " in case they can be merged", merging.mToken, playing.mToken);
+        playing.mHandler.mergeAnimation(merging.mToken, merging.mInfo, merging.mStartT,
+                playing.mToken, (wct, cb) -> onFinish(merging.mToken, wct, cb));
+    }
+
+    boolean startAnimation(@NonNull ActiveTransition active, TransitionHandler handler) {
+        return handler.startAnimation(active.mToken, active.mInfo, active.mStartT,
+                (wct, cb) -> onFinish(active.mToken, wct, cb));
+    }
+
+    void playTransition(@NonNull ActiveTransition active) {
+        setupStartState(active.mInfo, active.mStartT, active.mFinishT);
+
+        // If a handler already chose to run this animation, try delegating to it first.
+        if (active.mHandler != null) {
             ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " try firstHandler %s",
-                    active.mFirstHandler);
-            if (active.mFirstHandler.startAnimation(transitionToken, info, t, finishCb)) {
+                    active.mHandler);
+            if (startAnimation(active, active.mHandler)) {
                 ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by firstHandler");
                 return;
             }
         }
         // Otherwise give every other handler a chance (in order)
         for (int i = mHandlers.size() - 1; i >= 0; --i) {
-            if (mHandlers.get(i) == active.mFirstHandler) continue;
+            if (mHandlers.get(i) == active.mHandler) continue;
             ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " try handler %s",
                     mHandlers.get(i));
-            if (mHandlers.get(i).startAnimation(transitionToken, info, t, finishCb)) {
+            if (startAnimation(active, mHandlers.get(i))) {
                 ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by %s",
                         mHandlers.get(i));
+                active.mHandler = mHandlers.get(i);
                 return;
             }
         }
@@ -338,23 +384,107 @@
                 "This shouldn't happen, maybe the default handler is broken.");
     }
 
-    private void onFinish(IBinder transition, @Nullable WindowContainerTransaction wct,
+    /** Special version of finish just for dealing with no-op/invalid transitions. */
+    private void onAbort(IBinder transition) {
+        final int activeIdx = findActiveTransition(transition);
+        if (activeIdx < 0) return;
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
+                "Transition animation aborted due to no-op, notifying core %s", transition);
+        mActiveTransitions.remove(activeIdx);
+        mOrganizer.finishTransition(transition, null /* wct */, null /* wctCB */);
+    }
+
+    private void onFinish(IBinder transition,
+            @Nullable WindowContainerTransaction wct,
             @Nullable WindowContainerTransactionCallback wctCB) {
-        if (!mActiveTransitions.containsKey(transition)) {
-            Log.e(TAG, "Trying to finish a non-running transition. Maybe remote crashed?");
+        int activeIdx = findActiveTransition(transition);
+        if (activeIdx < 0) {
+            Log.e(TAG, "Trying to finish a non-running transition. Either remote crashed or "
+                    + " a handler didn't properly deal with a merge.", new RuntimeException());
+            return;
+        } else if (activeIdx > 0) {
+            // This transition was merged.
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition was merged: %s",
+                    transition);
+            final ActiveTransition active = mActiveTransitions.get(activeIdx);
+            active.mMerged = true;
+            if (active.mHandler != null) {
+                active.mHandler.onTransitionMerged(active.mToken);
+            }
             return;
         }
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
-                "Transition animations finished, notifying core %s", transition);
-        mActiveTransitions.remove(transition);
+                "Transition animation finished, notifying core %s", transition);
+        // Merge all relevant transactions together
+        SurfaceControl.Transaction fullFinish = mActiveTransitions.get(activeIdx).mFinishT;
+        for (int iA = activeIdx + 1; iA < mActiveTransitions.size(); ++iA) {
+            final ActiveTransition toMerge = mActiveTransitions.get(iA);
+            if (!toMerge.mMerged) break;
+            // Include start. It will be a no-op if it was already applied. Otherwise, we need it
+            // to maintain consistent state.
+            fullFinish.merge(mActiveTransitions.get(iA).mStartT);
+            fullFinish.merge(mActiveTransitions.get(iA).mFinishT);
+        }
+        fullFinish.apply();
+        // Now perform all the finishes.
+        mActiveTransitions.remove(activeIdx);
         mOrganizer.finishTransition(transition, wct, wctCB);
+        while (activeIdx < mActiveTransitions.size()) {
+            if (!mActiveTransitions.get(activeIdx).mMerged) break;
+            ActiveTransition merged = mActiveTransitions.remove(activeIdx);
+            mOrganizer.finishTransition(merged.mToken, null /* wct */, null /* wctCB */);
+        }
+        if (mActiveTransitions.size() <= activeIdx) {
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "All active transition animations "
+                    + "finished");
+            return;
+        }
+        // Start animating the next active transition
+        final ActiveTransition next = mActiveTransitions.get(activeIdx);
+        if (next.mInfo == null) {
+            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Pending transition after one"
+                    + " finished, but it isn't ready yet.");
+            return;
+        }
+        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Pending transitions after one"
+                + " finished, so start the next one.");
+        playTransition(next);
+        // Now try to merge the rest of the transitions (re-acquire activeIdx since next may have
+        // finished immediately)
+        activeIdx = findActiveTransition(next.mToken);
+        if (activeIdx < 0) {
+            // This means 'next' finished immediately and thus re-entered this function. Since
+            // that is the case, just return here since all relevant logic has already run in the
+            // re-entered call.
+            return;
+        }
+
+        // This logic is also convoluted because 'next' may finish immediately in response to any of
+        // the merge requests (eg. if it decided to "cancel" itself).
+        int mergeIdx = activeIdx + 1;
+        while (mergeIdx < mActiveTransitions.size()) {
+            ActiveTransition mergeCandidate = mActiveTransitions.get(mergeIdx);
+            if (mergeCandidate.mMerged) {
+                throw new IllegalStateException("Can't merge a transition after not-merging"
+                        + " a preceding one.");
+            }
+            attemptMergeTransition(next, mergeCandidate);
+            mergeIdx = findActiveTransition(mergeCandidate.mToken);
+            if (mergeIdx < 0) {
+                // This means 'next' finished immediately and thus re-entered this function. Since
+                // that is the case, just return here since all relevant logic has already run in
+                // the re-entered call.
+                return;
+            }
+            ++mergeIdx;
+        }
     }
 
     void requestStartTransition(@NonNull IBinder transitionToken,
             @Nullable TransitionRequestInfo request) {
         ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition requested: %s %s",
                 transitionToken, request);
-        if (mActiveTransitions.containsKey(transitionToken)) {
+        if (findActiveTransition(transitionToken) >= 0) {
             throw new RuntimeException("Transition already started " + transitionToken);
         }
         final ActiveTransition active = new ActiveTransition();
@@ -362,23 +492,23 @@
         for (int i = mHandlers.size() - 1; i >= 0; --i) {
             wct = mHandlers.get(i).handleRequest(transitionToken, request);
             if (wct != null) {
-                active.mFirstHandler = mHandlers.get(i);
+                active.mHandler = mHandlers.get(i);
                 break;
             }
         }
-        IBinder transition = mOrganizer.startTransition(
+        active.mToken = mOrganizer.startTransition(
                 request.getType(), transitionToken, wct);
-        mActiveTransitions.put(transition, active);
+        mActiveTransitions.add(active);
     }
 
     /** Start a new transition directly. */
     public IBinder startTransition(@WindowManager.TransitionType int type,
             @NonNull WindowContainerTransaction wct, @Nullable TransitionHandler handler) {
         final ActiveTransition active = new ActiveTransition();
-        active.mFirstHandler = handler;
-        IBinder transition = mOrganizer.startTransition(type, null /* token */, wct);
-        mActiveTransitions.put(transition, active);
-        return transition;
+        active.mHandler = handler;
+        active.mToken = mOrganizer.startTransition(type, null /* token */, wct);
+        mActiveTransitions.add(active);
+        return active.mToken;
     }
 
     /**
@@ -415,6 +545,32 @@
                 @NonNull TransitionFinishCallback finishCallback);
 
         /**
+         * Attempts to merge a different transition's animation into an animation that this handler
+         * is currently playing. If a merge is not possible/supported, this should be a no-op.
+         *
+         * This gets called if another transition becomes ready while this handler is still playing
+         * an animation. This is called regardless of whether this handler claims to support that
+         * particular transition or not.
+         *
+         * When this happens, there are 2 options:
+         *  1. Do nothing. This effectively rejects the merge request. This is the "safest" option.
+         *  2. Merge the incoming transition into this one. The implementation is up to this
+         *     handler. To indicate that this handler has "consumed" the merge transition, it
+         *     must call the finishCallback immediately, or at-least before the original
+         *     transition's finishCallback is called.
+         *
+         * @param transition This is the transition that wants to be merged.
+         * @param info Information about what is changing in the transition.
+         * @param t Contains surface changes that resulted from the transition.
+         * @param mergeTarget This is the transition that we are attempting to merge with (ie. the
+         *                    one this handler is currently already animating).
+         * @param finishCallback Call this if merged. This MUST be called on main thread.
+         */
+        default void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
+                @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
+                @NonNull TransitionFinishCallback finishCallback) { }
+
+        /**
          * Potentially handles a startTransition request.
          *
          * @param transition The transition whose start is being requested.
@@ -427,6 +583,12 @@
                 @NonNull TransitionRequestInfo request);
 
         /**
+         * Called when a transition which was already "claimed" by this handler has been merged
+         * into another animation. Gives this handler a chance to clean-up any expectations.
+         */
+        default void onTransitionMerged(@NonNull IBinder transition) { }
+
+        /**
          * Sets transition animation scale settings value to handler.
          *
          * @param scale The setting value of transition animation scale.
@@ -438,10 +600,10 @@
     private class TransitionPlayerImpl extends ITransitionPlayer.Stub {
         @Override
         public void onTransitionReady(IBinder iBinder, TransitionInfo transitionInfo,
-                SurfaceControl.Transaction transaction) throws RemoteException {
-            mMainExecutor.execute(() -> {
-                Transitions.this.onTransitionReady(iBinder, transitionInfo, transaction);
-            });
+                SurfaceControl.Transaction t, SurfaceControl.Transaction finishT)
+                throws RemoteException {
+            mMainExecutor.execute(() -> Transitions.this.onTransitionReady(
+                    iBinder, transitionInfo, t, finishT));
         }
 
         @Override
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt
index 6494f89..91d51de 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt
@@ -74,12 +74,6 @@
     @Test
     fun dockedStackDividerBecomesVisible() = testSpec.dockedStackDividerBecomesVisible()
 
-    @FlakyTest(bugId = 178531736)
-    @Test
-    // b/178531736
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
     @Presubmit
     @Test
     fun navBarWindowIsAlwaysVisible() = testSpec.navBarWindowIsAlwaysVisible()
@@ -88,12 +82,6 @@
     @Test
     fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsAlwaysVisible()
 
-    @FlakyTest(bugId = 178531736)
-    @Test
-    // b/178531736
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-        super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @Presubmit
     @Test
     fun appWindowIsVisible() {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenLaunchToSide.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenLaunchToSide.kt
index 9000f22..f975ed9 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenLaunchToSide.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenLaunchToSide.kt
@@ -83,13 +83,6 @@
     // b/169271943
     fun dockedStackDividerBecomesVisible() = testSpec.dockedStackDividerBecomesVisible()
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    // TODO(b/178447631) Remove Splash Screen from white list when flicker lib
-    //                   add a wait for splash screen be gone
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
     @Presubmit
     @Test
     fun appWindowBecomesVisible() = testSpec.appWindowBecomesVisible(secondaryApp.defaultWindowName)
@@ -102,11 +95,6 @@
     @Test
     fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsAlwaysVisible()
 
-    @Presubmit
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-        super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt
index 7d22d4d..58e9204 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt
@@ -19,14 +19,12 @@
 import android.platform.test.annotations.Postsubmit
 import android.provider.Settings
 import android.view.Surface
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
 import com.android.server.wm.flicker.FlickerTestParameter
 import com.android.server.wm.flicker.FlickerTestParameterFactory
 import com.android.server.wm.flicker.dsl.FlickerBuilder
 import com.android.server.wm.flicker.helpers.canSplitScreen
-import com.android.server.wm.flicker.helpers.openQuickstep
 import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
 import com.android.wm.shell.flicker.dockedStackDividerIsInvisible
 import com.android.wm.shell.flicker.helpers.SplitScreenHelper
@@ -65,7 +63,6 @@
                 }
             }
             transitions {
-                device.openQuickstep(wmHelper)
                 if (device.canSplitScreen(wmHelper)) {
                     Assert.fail("Non-resizeable app should not enter split screen")
                 }
@@ -97,25 +94,9 @@
                 prevSupportNonResizableInMultiWindow)
     }
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-        super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @Test
     fun dockedStackDividerIsInvisible() = testSpec.dockedStackDividerIsInvisible()
 
-    @Test
-    fun appWindowIsVisible() {
-        testSpec.assertWmEnd {
-            isInvisible(nonResizeableApp.defaultWindowName)
-        }
-    }
-
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt
index 9b4a103..91ca7c1 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Postsubmit
 import android.provider.Settings
 import android.view.Surface
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
 import com.android.server.wm.flicker.FlickerTestParameter
@@ -92,15 +91,6 @@
                 prevSupportNonResizableInMultiWindow)
     }
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-            super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-            super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @Test
     fun dockedStackDividerIsVisible() = testSpec.dockedStackDividerIsVisible()
 
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitLegacySplitScreenFromBottom.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitLegacySplitScreenFromBottom.kt
index 64cc853..faf7aa7 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitLegacySplitScreenFromBottom.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitLegacySplitScreenFromBottom.kt
@@ -78,12 +78,6 @@
     @Test
     fun layerBecomesInvisible() = testSpec.layerBecomesInvisible(DOCKED_STACK_DIVIDER)
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-    }
-
     @FlakyTest
     @Test
     fun appWindowBecomesInVisible() =
@@ -97,11 +91,6 @@
     @Test
     fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsAlwaysVisible()
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-        super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt
index 2e11551..8845777 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt
@@ -82,11 +82,6 @@
     @Test
     fun layerBecomesInvisible() = testSpec.layerBecomesInvisible(splitScreenApp.defaultWindowName)
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
     @FlakyTest
     @Test
     fun appWindowBecomesInVisible() =
@@ -100,11 +95,6 @@
     @Test
     fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsAlwaysVisible()
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-        super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt
index 8923845..968aff1 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Postsubmit
 import android.provider.Settings
 import android.view.Surface
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
 import com.android.server.wm.flicker.FlickerTestParameter
@@ -96,16 +95,6 @@
                 prevSupportNonResizableInMultiWindow)
     }
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-            super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-            super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @Test
     fun resizableAppLayerBecomesInvisible() =
             testSpec.layerBecomesInvisible(splitScreenApp.defaultWindowName)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt
index 2f5e0bd..8d20673 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Postsubmit
 import android.provider.Settings
 import android.view.Surface
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
 import com.android.server.wm.flicker.FlickerTestParameter
@@ -94,16 +93,6 @@
                 prevSupportNonResizableInMultiWindow)
     }
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-            super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-            super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @Test
     fun nonResizableAppLayerBecomesVisible() =
             testSpec.layerBecomesVisible(nonResizeableApp.defaultWindowName)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt
index a42774d..4e291d9 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Postsubmit
 import android.provider.Settings
 import android.view.Surface
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
 import com.android.server.wm.flicker.FlickerTestParameter
@@ -97,16 +96,6 @@
                 prevSupportNonResizableInMultiWindow)
     }
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-            super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @Test
     fun resizableAppLayerBecomesInvisible() =
             testSpec.layerBecomesInvisible(splitScreenApp.defaultWindowName)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt
index 14f6dee..880dc55 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt
@@ -19,7 +19,6 @@
 import android.platform.test.annotations.Postsubmit
 import android.provider.Settings
 import android.view.Surface
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
 import com.android.server.wm.flicker.FlickerTestParameter
@@ -95,16 +94,6 @@
                 prevSupportNonResizableInMultiWindow)
     }
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-            super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @Test
     fun nonResizableAppLayerBecomesVisible() =
             testSpec.layerBecomesVisible(nonResizeableApp.defaultWindowName)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenRotateTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenRotateTransition.kt
index 08d5db0..1e89a25 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenRotateTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenRotateTransition.kt
@@ -17,13 +17,11 @@
 package com.android.wm.shell.flicker.legacysplitscreen
 
 import android.view.Surface
-import androidx.test.filters.FlakyTest
 import com.android.server.wm.flicker.FlickerTestParameter
 import com.android.server.wm.flicker.dsl.FlickerBuilder
 import com.android.server.wm.flicker.helpers.openQuickStepAndClearRecentAppsFromOverview
 import com.android.server.wm.flicker.helpers.setRotation
 import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
-import org.junit.Test
 
 abstract class LegacySplitScreenRotateTransition(
     testSpec: FlickerTestParameter
@@ -46,16 +44,4 @@
                 }
             }
         }
-
-    @FlakyTest
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-    }
-
-    @FlakyTest
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
-        super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-    }
 }
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt
index 39f4ce2..976668e 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt
@@ -118,11 +118,6 @@
     fun statusBarLayerRotatesScales() =
         testSpec.statusBarLayerRotatesScales(testSpec.config.endRotation)
 
-    @FlakyTest
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
     @Presubmit
     @Test
     fun statusBarLayerIsAlwaysVisible() = testSpec.statusBarLayerIsAlwaysVisible()
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt
index e13056c..8684ba5 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt
@@ -18,9 +18,9 @@
 
 import android.app.Instrumentation
 import android.content.Context
-import android.platform.test.annotations.Presubmit
 import android.support.test.launcherhelper.LauncherStrategyFactory
 import android.view.Surface
+import androidx.test.filters.FlakyTest
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.server.wm.flicker.FlickerBuilderProvider
 import com.android.server.wm.flicker.FlickerTestParameter
@@ -102,7 +102,7 @@
             }
         }
 
-    @Presubmit
+    @FlakyTest(bugId = 178447631)
     @Test
     open fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
         testSpec.assertWm {
@@ -110,7 +110,7 @@
         }
     }
 
-    @Presubmit
+    @FlakyTest(bugId = 178447631)
     @Test
     open fun visibleLayersShownMoreThanOneConsecutiveEntry() {
         testSpec.assertLayers {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt
index 7cf30ec..69520c2 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt
@@ -65,11 +65,6 @@
             WindowManagerStateHelper.SPLASH_SCREEN_NAME,
             WindowManagerStateHelper.SNAPSHOT_WINDOW_NAME)
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() =
-        super.visibleWindowsShownMoreThanOneConsecutiveEntry()
-
     @FlakyTest
     @Test
     fun appWindowBecomesVisible() = testSpec.appWindowBecomesVisible(splitScreenApp.getPackage())
@@ -90,11 +85,6 @@
     @Test
     fun layerBecomesVisible() = testSpec.layerBecomesVisible(splitScreenApp.getPackage())
 
-    @FlakyTest(bugId = 178447631)
-    @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
     @FlakyTest(bugId = 151179149)
     @Test
     fun focusChanges() = testSpec.focusChanges(splitScreenApp.`package`,
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt
index 33ade38..ecbb887 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt
@@ -104,13 +104,6 @@
     @Test
     fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsAlwaysVisible()
 
-    @Test
-    override fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
-        testSpec.assertWm {
-            this.visibleWindowsShownMoreThanOneConsecutiveEntry()
-        }
-    }
-
     @FlakyTest(bugId = 156223549)
     @Test
     fun topAppWindowIsAlwaysVisible() {
@@ -145,10 +138,6 @@
         testSpec.statusBarLayerRotatesScales(testSpec.config.endRotation)
 
     @Test
-    override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
-        super.visibleLayersShownMoreThanOneConsecutiveEntry()
-
-    @Test
     fun topAppLayerIsAlwaysVisible() {
         testSpec.assertLayers {
             this.isVisible(sSimpleActivity)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
index 2609258..a7e1d0f 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
@@ -47,6 +47,12 @@
             }
         }
 
+    @FlakyTest
+    @Test
+    override fun noUncoveredRegions() {
+        super.noUncoveredRegions()
+    }
+
     @Presubmit
     @Test
     fun pipAppWindowAlwaysVisible() {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt
index 0d686f5..fb7dac3 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt
@@ -71,7 +71,7 @@
             }
         }
 
-    @Presubmit
+    @FlakyTest(bugId = 185400889)
     @Test
     override fun noUncoveredRegions() = testSpec.noUncoveredRegions(testSpec.config.startRotation,
         testSpec.config.endRotation, allStates = false)
@@ -88,7 +88,7 @@
         testSpec.statusBarLayerRotatesScales(testSpec.config.startRotation,
             testSpec.config.endRotation)
 
-    @Presubmit
+    @FlakyTest(bugId = 185400889)
     @Test
     fun appLayerRotates_StartingBounds() {
         testSpec.assertLayersStart {
@@ -97,7 +97,7 @@
         }
     }
 
-    @Presubmit
+    @FlakyTest(bugId = 185400889)
     @Test
     fun appLayerRotates_EndingBounds() {
         testSpec.assertLayersEnd {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java
index b0de029..2b5cd60 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java
@@ -69,6 +69,7 @@
         info.configuration.windowConfiguration.setActivityType(mActivityType);
         info.token = mToken;
         info.isResizeable = true;
+        info.supportsMultiWindow = true;
         return info;
     }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
index 9a80a55..2bb7204 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
@@ -19,6 +19,8 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import static junit.framework.TestCase.assertEquals;
+
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
@@ -799,6 +801,15 @@
         assertExpandedChangedTo(false);
     }
 
+    @Test
+    public void test_addToOverflow_doesntAllowDupes() {
+        assertEquals(0, mBubbleData.getOverflowBubbles().size());
+        mBubbleData.overflowBubble(Bubbles.DISMISS_AGED, mBubbleA1);
+        mBubbleData.overflowBubble(Bubbles.DISMISS_AGED, mBubbleA1);
+        mBubbleData.overflowBubble(Bubbles.DISMISS_AGED, mBubbleA1);
+        assertEquals(1, mBubbleData.getOverflowBubbles().size());
+    }
+
     private void verifyUpdateReceived() {
         verify(mListener).applyUpdate(mUpdateCaptor.capture());
         reset(mListener);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepositoryTest.kt
index 2f064ac..0972cf2 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepositoryTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubblePersistentRepositoryTest.kt
@@ -18,8 +18,10 @@
 
 import android.app.ActivityTaskManager.INVALID_TASK_ID
 import android.testing.AndroidTestingRunner
+import android.util.SparseArray
 import androidx.test.filters.SmallTest
 import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.bubbles.storage.BubbleXmlHelperTest.Companion.sparseArraysEqual
 import junit.framework.Assert.assertEquals
 import junit.framework.Assert.assertNotNull
 import junit.framework.Assert.assertTrue
@@ -31,19 +33,32 @@
 @RunWith(AndroidTestingRunner::class)
 class BubblePersistentRepositoryTest : ShellTestCase() {
 
-    private val bubbles = listOf(
-            // user, package, shortcut, notification key, height, res-height, title, taskId, locusId
-            BubbleEntity(0, "com.example.messenger", "shortcut-1", "key-1", 120, 0, null, 1, null),
-            BubbleEntity(10, "com.example.chat", "alice and bob", "key-2", 0, 16537428, "title",
-                    2, null),
-            BubbleEntity(0, "com.example.messenger", "shortcut-2", "key-3", 120, 0, null,
-                    INVALID_TASK_ID, "key-3")
+    // user, package, shortcut, notification key, height, res-height, title, taskId, locusId
+    private val user0Bubbles = listOf(
+            BubbleEntity(0, "com.example.messenger", "shortcut-1", "0k1", 120, 0, null, 1, null),
+            BubbleEntity(10, "com.example.chat", "alice and bob", "0k2", 0, 16537428, "title", 2,
+                    null),
+            BubbleEntity(0, "com.example.messenger", "shortcut-2", "0k3", 120, 0, null,
+                    INVALID_TASK_ID, null)
     )
+
+    private val user1Bubbles = listOf(
+            BubbleEntity(1, "com.example.messenger", "shortcut-1", "1k1", 120, 0, null, 3, null),
+            BubbleEntity(12, "com.example.chat", "alice and bob", "1k2", 0, 16537428, "title", 4,
+                    null),
+            BubbleEntity(1, "com.example.messenger", "shortcut-2", "1k3", 120, 0, null,
+                    INVALID_TASK_ID, null)
+    )
+
+    private val bubbles = SparseArray<List<BubbleEntity>>()
+
     private lateinit var repository: BubblePersistentRepository
 
     @Before
     fun setup() {
         repository = BubblePersistentRepository(mContext)
+        bubbles.put(0, user0Bubbles)
+        bubbles.put(1, user1Bubbles)
     }
 
     @Test
@@ -51,9 +66,9 @@
         // Verify read before write doesn't cause FileNotFoundException
         val actual = repository.readFromDisk()
         assertNotNull(actual)
-        assertTrue(actual.isEmpty())
+        assertEquals(actual.size(), 0)
 
         repository.persistsToDisk(bubbles)
-        assertEquals(bubbles, repository.readFromDisk())
+        assertTrue(sparseArraysEqual(bubbles, repository.readFromDisk()))
     }
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepositoryTest.kt
index 03aa6c2..bfdf520 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepositoryTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleVolatileRepositoryTest.kt
@@ -21,32 +21,40 @@
 import android.os.UserHandle
 import android.testing.AndroidTestingRunner
 import androidx.test.filters.SmallTest
+import org.junit.Test
 import com.android.wm.shell.ShellTestCase
 import junit.framework.Assert.assertEquals
 import org.junit.Before
-import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.reset
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
 class BubbleVolatileRepositoryTest : ShellTestCase() {
 
     private val user0 = UserHandle.of(0)
-    private val user10 = UserHandle.of(10)
+    private val user10_managed = UserHandle.of(10) // In test, acts as workprofile of user0
+    private val user11 = UserHandle.of(11)
 
     // user, package, shortcut, notification key, height, res-height, title, taskId, locusId
-    private val bubble1 = BubbleEntity(0, "com.example.messenger", "shortcut-1", "key-1", 120, 0,
-            null, 1, null)
+    private val bubble1 = BubbleEntity(0, "com.example.messenger", "shortcut-1",
+            "0key-1", 120, 0, null, 1, null)
     private val bubble2 = BubbleEntity(10, "com.example.chat", "alice and bob",
-            "key-2", 0, 16537428, "title", 2, null)
-    private val bubble3 = BubbleEntity(0, "com.example.messenger", "shortcut-2", "key-3", 120, 0,
-            null, INVALID_TASK_ID, "key-3")
+            "10key-2", 0, 16537428, "title", 2, null)
+    private val bubble3 = BubbleEntity(0, "com.example.messenger", "shortcut-2",
+            "0key-3", 120, 0, null, INVALID_TASK_ID, null)
 
-    private val bubbles = listOf(bubble1, bubble2, bubble3)
+    private val bubble11 = BubbleEntity(11, "com.example.messenger",
+            "shortcut-1", "01key-1", 120, 0, null, 3)
+    private val bubble12 = BubbleEntity(11, "com.example.chat", "alice and bob",
+            "11key-2", 0, 16537428, "title", INVALID_TASK_ID)
+
+    private val user0bubbles = listOf(bubble1, bubble2, bubble3)
+    private val user11bubbles = listOf(bubble11, bubble12)
 
     private lateinit var repository: BubbleVolatileRepository
     private lateinit var launcherApps: LauncherApps
@@ -59,51 +67,74 @@
 
     @Test
     fun testAddBubbles() {
-        repository.addBubbles(bubbles)
-        assertEquals(bubbles, repository.bubbles)
+        repository.addBubbles(user0.identifier, user0bubbles)
+        repository.addBubbles(user11.identifier, user11bubbles)
+
+        assertEquals(user0bubbles, repository.getEntities(user0.identifier).toList())
+        assertEquals(user11bubbles, repository.getEntities(user11.identifier).toList())
+
         verify(launcherApps).cacheShortcuts(eq(PKG_MESSENGER),
                 eq(listOf("shortcut-1", "shortcut-2")), eq(user0),
                 eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
         verify(launcherApps).cacheShortcuts(eq(PKG_CHAT),
-                eq(listOf("alice and bob")), eq(user10),
+                eq(listOf("alice and bob")), eq(user10_managed),
                 eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
 
-        repository.addBubbles(listOf(bubble1))
-        assertEquals(listOf(bubble2, bubble3, bubble1), repository.bubbles)
-        verifyNoMoreInteractions(launcherApps)
+        verify(launcherApps).cacheShortcuts(eq(PKG_MESSENGER),
+                eq(listOf("shortcut-1")), eq(user11),
+                eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
+        verify(launcherApps).cacheShortcuts(eq(PKG_CHAT),
+                eq(listOf("alice and bob")), eq(user11),
+                eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
+
+        repository.addBubbles(user0.identifier, listOf(bubble1))
+        assertEquals(listOf(bubble2, bubble3, bubble1), repository.getEntities(user0.identifier))
+
+        repository.addBubbles(user11.identifier, listOf(bubble12))
+        assertEquals(listOf(bubble11, bubble12), repository.getEntities(user11.identifier))
+
+        Mockito.verifyNoMoreInteractions(launcherApps)
     }
 
     @Test
     fun testRemoveBubbles() {
-        repository.addBubbles(bubbles)
-        assertEquals(bubbles, repository.bubbles)
+        repository.addBubbles(user0.identifier, user0bubbles)
+        repository.addBubbles(user11.identifier, user11bubbles)
 
-        repository.removeBubbles(listOf(bubble3))
-        assertEquals(listOf(bubble1, bubble2), repository.bubbles)
+        repository.removeBubbles(user0.identifier, listOf(bubble3))
+        assertEquals(listOf(bubble1, bubble2), repository.getEntities(user0.identifier).toList())
         verify(launcherApps).uncacheShortcuts(eq(PKG_MESSENGER),
                 eq(listOf("shortcut-2")), eq(user0),
                 eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
+
+        reset(launcherApps)
+
+        repository.removeBubbles(user11.identifier, listOf(bubble12))
+        assertEquals(listOf(bubble11), repository.getEntities(user11.identifier).toList())
+        verify(launcherApps).uncacheShortcuts(eq(PKG_CHAT),
+                eq(listOf("alice and bob")), eq(user11),
+                eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
     }
 
     @Test
     fun testAddAndRemoveBubblesWhenExceedingCapacity() {
         repository.capacity = 2
         // push bubbles beyond capacity
-        repository.addBubbles(bubbles)
+        repository.addBubbles(user0.identifier, user0bubbles)
         // verify it is trim down to capacity
-        assertEquals(listOf(bubble2, bubble3), repository.bubbles)
+        assertEquals(listOf(bubble2, bubble3), repository.getEntities(user0.identifier).toList())
         verify(launcherApps).cacheShortcuts(eq(PKG_MESSENGER),
                 eq(listOf("shortcut-2")), eq(user0),
                 eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
         verify(launcherApps).cacheShortcuts(eq(PKG_CHAT),
-                eq(listOf("alice and bob")), eq(user10),
+                eq(listOf("alice and bob")), eq(user10_managed),
                 eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
 
-        repository.addBubbles(listOf(bubble1))
-        // verify the oldest bubble is popped
-        assertEquals(listOf(bubble3, bubble1), repository.bubbles)
+        repository.addBubbles(user0.identifier, listOf(bubble1))
+        // verify the oldest bubble is popped 2, 3
+        assertEquals(listOf(bubble3, bubble1), repository.getEntities(user0.identifier).toList())
         verify(launcherApps).uncacheShortcuts(eq(PKG_CHAT),
-                eq(listOf("alice and bob")), eq(user10),
+                eq(listOf("alice and bob")), eq(user10_managed),
                 eq(LauncherApps.FLAG_CACHE_BUBBLE_SHORTCUTS))
     }
 
@@ -111,14 +142,14 @@
     fun testAddBubbleMatchesByKey() {
         val bubble = BubbleEntity(0, "com.example.pkg", "shortcut-id", "key", 120, 0, "title",
                 1, null)
-        repository.addBubbles(listOf(bubble))
-        assertEquals(bubble, repository.bubbles.get(0))
+        repository.addBubbles(user0.identifier, listOf(bubble))
+        assertEquals(bubble, repository.getEntities(user0.identifier).get(0))
 
         // Same key as first bubble but different entry
         val bubbleModified = BubbleEntity(0, "com.example.pkg", "shortcut-id", "key", 120, 0,
-                "different title", 2, null)
-        repository.addBubbles(listOf(bubbleModified))
-        assertEquals(bubbleModified, repository.bubbles.get(0))
+                "different title", 2)
+        repository.addBubbles(user0.identifier, listOf(bubbleModified))
+        assertEquals(bubbleModified, repository.getEntities(user0.identifier).get(0))
     }
 }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelperTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelperTest.kt
index 8d719e7..4ab9f87 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelperTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/storage/BubbleXmlHelperTest.kt
@@ -18,10 +18,12 @@
 
 import android.app.ActivityTaskManager.INVALID_TASK_ID
 import android.testing.AndroidTestingRunner
+import android.util.SparseArray
 import androidx.test.filters.SmallTest
 import com.android.wm.shell.ShellTestCase
 import junit.framework.Assert.assertEquals
 import junit.framework.Assert.assertTrue
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import java.io.ByteArrayInputStream
@@ -31,21 +33,65 @@
 @RunWith(AndroidTestingRunner::class)
 class BubbleXmlHelperTest : ShellTestCase() {
 
-    private val bubbles = listOf(
-            // user, package, shortcut, notification key, height, res-height, title, taskId, locusId
-            BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1", 120, 0, null, 1),
-            BubbleEntity(10, "com.example.chat", "alice and bob", "k2", 0, 16537428, "title",
-                    2, null),
-            BubbleEntity(0, "com.example.messenger", "shortcut-2", "k3", 120, 0, null,
+    private val user0Bubbles = listOf(
+            BubbleEntity(0, "com.example.messenger", "shortcut-1", "0k1", 120, 0, null, 1),
+            BubbleEntity(10, "com.example.chat", "alice and bob", "0k2", 0, 16537428, "title", 2,
+                    null),
+            BubbleEntity(0, "com.example.messenger", "shortcut-2", "0k3", 120, 0, null,
                     INVALID_TASK_ID, "l3")
     )
 
+    private val user1Bubbles = listOf(
+            BubbleEntity(1, "com.example.messenger", "shortcut-1", "1k1", 120, 0, null, 3),
+            BubbleEntity(12, "com.example.chat", "alice and bob", "1k2", 0, 16537428, "title", 4,
+                    null),
+            BubbleEntity(1, "com.example.messenger", "shortcut-2", "1k3", 120, 0, null,
+                    INVALID_TASK_ID, "l4")
+    )
+
+    private val bubbles = SparseArray<List<BubbleEntity>>()
+
+    // Checks that the contents of the two sparse arrays are the same.
+    companion object {
+        fun sparseArraysEqual(
+            one: SparseArray<List<BubbleEntity>>?,
+            two: SparseArray<List<BubbleEntity>>?
+        ): Boolean {
+            if (one == null && two == null) return true
+            if ((one == null) != (two == null)) return false
+            if (one!!.size() != two!!.size()) return false
+            for (i in 0 until one.size()) {
+                val k1 = one.keyAt(i)
+                val v1 = one.valueAt(i)
+                val k2 = two.keyAt(i)
+                val v2 = two.valueAt(i)
+                if (k1 != k2 && v1 != v2) {
+                    return false
+                }
+            }
+            return true
+        }
+    }
+
+    @Before
+    fun setup() {
+        bubbles.put(0, user0Bubbles)
+        bubbles.put(1, user1Bubbles)
+    }
+
     @Test
     fun testWriteXml() {
         val expectedEntries = """
-<bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" h="120" hid="0" tid="1" />
-<bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" h="0" hid="16537428" t="title" tid="2" />
-<bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" h="120" hid="0" tid="-1" l="l3" />
+<bs uid="0">
+<bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="0k1" h="120" hid="0" tid="1" />
+<bb uid="10" pkg="com.example.chat" sid="alice and bob" key="0k2" h="0" hid="16537428" t="title" tid="2" />
+<bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="0k3" h="120" hid="0" tid="-1" l="l3" />
+</bs>
+<bs uid="1">
+<bb uid="1" pkg="com.example.messenger" sid="shortcut-1" key="1k1" h="120" hid="0" tid="3" />
+<bb uid="12" pkg="com.example.chat" sid="alice and bob" key="1k2" h="0" hid="16537428" t="title" tid="4" />
+<bb uid="1" pkg="com.example.messenger" sid="shortcut-2" key="1k3" h="120" hid="0" tid="-1" l="l4" />
+</bs>
         """.trimIndent()
         ByteArrayOutputStream().use {
             writeXml(it, bubbles)
@@ -59,19 +105,26 @@
     fun testReadXml() {
         val src = """
 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
-<bs v="1">
-<bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" h="120" hid="0" tid="1" />
-<bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" h="0" hid="16537428" t="title" tid="2" />
-<bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" h="120" hid="0" tid="-1" l="l3" />
+<bs v="2">
+<bs uid="0">
+<bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="0k1" h="120" hid="0" tid="1" />
+<bb uid="10" pkg="com.example.chat" sid="alice and bob" key="0k2" h="0" hid="16537428" t="title" tid="2" />
+<bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="0k3" h="120" hid="0" tid="-1" l="l3" />
+</bs>
+<bs uid="1">
+<bb uid="1" pkg="com.example.messenger" sid="shortcut-1" key="1k1" h="120" hid="0" tid="3" />
+<bb uid="12" pkg="com.example.chat" sid="alice and bob" key="1k2" h="0" hid="16537428" t="title" tid="4" />
+<bb uid="1" pkg="com.example.messenger" sid="shortcut-2" key="1k3" h="120" hid="0" tid="-1" l="l4" />
+</bs>
 </bs>
         """.trimIndent()
         val actual = readXml(ByteArrayInputStream(src.toByteArray(Charsets.UTF_8)))
-        assertEquals("failed parsing bubbles from xml\n$src", bubbles, actual)
+        assertTrue("failed parsing bubbles from xml\n$src", sparseArraysEqual(bubbles, actual))
     }
 
-    // TODO: We should handle upgrades gracefully but this is v1
+    // V0 -> V1 happened prior to release / during dogfood so nothing is saved
     @Test
-    fun testUpgradeDropsPreviousData() {
+    fun testUpgradeFromV0DropsPreviousData() {
         val src = """
 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
 <bs>
@@ -81,7 +134,7 @@
 </bs>
         """.trimIndent()
         val actual = readXml(ByteArrayInputStream(src.toByteArray(Charsets.UTF_8)))
-        assertEquals("failed parsing bubbles from xml\n$src", emptyList<BubbleEntity>(), actual)
+        assertEquals("failed parsing bubbles from xml\n$src", 0, actual.size())
     }
 
     /**
@@ -91,24 +144,25 @@
      */
     @Test
     fun testReadXMLWithoutTaskId() {
-        val expectedBubbles = listOf(
-                BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1", 120, 0, null,
-                        INVALID_TASK_ID),
-                BubbleEntity(10, "com.example.chat", "alice and bob", "k2", 0, 16537428, "title",
-                        INVALID_TASK_ID),
-                BubbleEntity(0, "com.example.messenger", "shortcut-2", "k3", 120, 0, null,
-                        INVALID_TASK_ID)
-        )
+        val expectedBubbles = SparseArray<List<BubbleEntity>>()
+        expectedBubbles.put(0, listOf(
+                        BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1", 120, 0,
+                                null, INVALID_TASK_ID),
+                        BubbleEntity(0, "com.example.messenger", "shortcut-2", "k3", 120, 0,
+                                null, INVALID_TASK_ID))
+                )
         val src = """
 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
-<bs v="1">
+<bs v="2">
+<bs uid="0">
 <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" h="120" hid="0" />
-<bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" h="0" hid="16537428" t="title" />
 <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" h="120" hid="0" />
 </bs>
+</bs>
         """.trimIndent()
         val actual = readXml(ByteArrayInputStream(src.toByteArray(Charsets.UTF_8)))
-        assertEquals("failed parsing bubbles from xml\n$src", expectedBubbles, actual)
+        assertTrue("failed parsing bubbles from xml\n$src",
+                sparseArraysEqual(expectedBubbles, actual))
     }
 
     /**
@@ -117,23 +171,45 @@
      */
     @Test
     fun testXMLWithoutLocusToLocus() {
-        val expectedBubbles = listOf(
-            BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1", 120, 0, null,
-                    INVALID_TASK_ID, null),
-            BubbleEntity(10, "com.example.chat", "alice and bob", "k2", 0, 16537428, "title",
-                    INVALID_TASK_ID, null),
-            BubbleEntity(0, "com.example.messenger", "shortcut-2", "k3", 120, 0, null,
-                    INVALID_TASK_ID, null)
+        val expectedBubbles = SparseArray<List<BubbleEntity>>()
+        expectedBubbles.put(0, listOf(
+                BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1", 120, 0,
+                        null, INVALID_TASK_ID),
+                BubbleEntity(0, "com.example.messenger", "shortcut-2", "k3", 120, 0,
+                        null, INVALID_TASK_ID))
         )
         val src = """
 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
 <bs v="1">
 <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" h="120" hid="0" />
-<bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" h="0" hid="16537428" t="title" />
 <bb uid="0" pkg="com.example.messenger" sid="shortcut-2" key="k3" h="120" hid="0" />
 </bs>
         """.trimIndent()
         val actual = readXml(ByteArrayInputStream(src.toByteArray(Charsets.UTF_8)))
-        assertEquals("failed parsing bubbles from xml\n$src", expectedBubbles, actual)
+        assertTrue("failed parsing bubbles from xml\n$src",
+                sparseArraysEqual(expectedBubbles, actual))
+    }
+
+    @Test
+    fun testUpgradeToV2SavesPreviousData() {
+        val src = """
+ <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+ <bs v="1">
+ <bb uid="0" pkg="com.example.messenger" sid="shortcut-1" key="k1" h="120" hid="0" />
+ <bb uid="10" pkg="com.example.chat" sid="alice and bob" key="k2" h="0" hid="16537428" t="title" />
+ <bb uid="2" pkg="com.example.messenger" sid="shortcut-2" key="k3" h="120" hid="0" />
+  <bb uid="0" pkg="com.example.messenger" sid="shortcut-4" key="k4" h="0" hid="16537428" />
+ </bs>
+        """.trimIndent()
+        val expectedBubbles = SparseArray<List<BubbleEntity>>()
+        expectedBubbles.put(0, listOf(
+                BubbleEntity(0, "com.example.messenger", "shortcut-1", "k1", 120, 0,
+                        null, INVALID_TASK_ID, null),
+                BubbleEntity(0, "com.example.messenger", "shortcut-4", "k4", 0, 16537428,
+                        null, INVALID_TASK_ID, null))
+        )
+        val actual = readXml(ByteArrayInputStream(src.toByteArray(Charsets.UTF_8)))
+        assertTrue("failed parsing bubbles from xml\n$src",
+                sparseArraysEqual(expectedBubbles, actual))
     }
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java
index 105bd82..c1282c9 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java
@@ -16,6 +16,9 @@
 
 package com.android.wm.shell.onehanded;
 
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_ENTERING;
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_NONE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -61,6 +64,7 @@
     OneHandedAccessibilityUtil mOneHandedAccessibilityUtil;
     OneHandedController mSpiedOneHandedController;
     OneHandedTimeoutHandler mSpiedTimeoutHandler;
+    OneHandedState mSpiedTransitionState;
 
     @Mock
     DisplayController mMockDisplayController;
@@ -99,9 +103,9 @@
         mDisplay = mContext.getDisplay();
         mDisplayLayout = new DisplayLayout(mContext, mDisplay);
         mSpiedTimeoutHandler = spy(new OneHandedTimeoutHandler(mMockShellMainExecutor));
+        mSpiedTransitionState = spy(new OneHandedState());
 
         when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
         when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
         when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash);
         when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any(), anyInt())).thenReturn(
@@ -129,6 +133,7 @@
                 mMockSettingsUitl,
                 mOneHandedAccessibilityUtil,
                 mSpiedTimeoutHandler,
+                mSpiedTransitionState,
                 mMockUiEventLogger,
                 mMockOverlayManager,
                 mMockTaskStackListener,
@@ -139,18 +144,13 @@
 
     @Test
     public void testDefaultShouldNotInOneHanded() {
-        final OneHandedAnimationController animationController = new OneHandedAnimationController(
-                mContext);
-        OneHandedDisplayAreaOrganizer displayAreaOrganizer = new OneHandedDisplayAreaOrganizer(
-                mContext, mDisplayLayout, mMockSettingsUitl, animationController,
-                mMockTutorialHandler, mMockBackgroundOrganizer, mMockShellMainExecutor);
-
-        assertThat(displayAreaOrganizer.isInOneHanded()).isFalse();
+        // Assert default transition state is STATE_NONE
+        assertThat(mSpiedTransitionState.getState()).isEqualTo(STATE_NONE);
     }
 
     @Test
     public void testStartOneHandedShouldTriggerScheduleOffset() {
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
+        mSpiedTransitionState.setState(STATE_NONE);
         mSpiedOneHandedController.setOneHandedEnabled(true);
         mSpiedOneHandedController.startOneHanded();
 
@@ -160,7 +160,7 @@
     @Test
     public void testStartOneHandedShouldNotTriggerScheduleOffset() {
         mSpiedOneHandedController.setOneHandedEnabled(true);
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true);
+        mSpiedTransitionState.setState(STATE_ENTERING);
         mSpiedOneHandedController.startOneHanded();
 
         verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
@@ -168,7 +168,7 @@
 
     @Test
     public void testStopOneHanded() {
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
+        mSpiedTransitionState.setState(STATE_NONE);
         mSpiedOneHandedController.stopOneHanded();
 
         verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
@@ -192,7 +192,7 @@
 
     @Test
     public void testStopOneHandedShouldRemoveTimer() {
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true);
+        mSpiedTransitionState.setState(STATE_ENTERING);
         mSpiedOneHandedController.stopOneHanded();
 
         verify(mSpiedTimeoutHandler, atLeastOnce()).removeTimer();
@@ -280,7 +280,7 @@
 
     @Test
     public void testKeyguardShowingLockOneHandedDisabled() {
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
+        mSpiedTransitionState.setState(STATE_NONE);
         mSpiedOneHandedController.setOneHandedEnabled(true);
         mSpiedOneHandedController.setLockedDisabled(true /* locked */, false /* enabled */);
         mSpiedOneHandedController.startOneHanded();
@@ -290,7 +290,7 @@
 
     @Test
     public void testResetKeyguardShowingLockOneHandedDisabled() {
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
+        mSpiedTransitionState.setState(STATE_NONE);
         mSpiedOneHandedController.setOneHandedEnabled(true);
         mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
         mSpiedOneHandedController.startOneHanded();
@@ -302,7 +302,7 @@
     public void testRotation90CanNotStartOneHanded() {
         final DisplayLayout landscapeDisplayLayout = new DisplayLayout(mDisplayLayout);
         landscapeDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_90);
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
+        mSpiedTransitionState.setState(STATE_NONE);
         when(mMockDisplayAreaOrganizer.getDisplayLayout()).thenReturn(landscapeDisplayLayout);
         mSpiedOneHandedController.setOneHandedEnabled(true);
         mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
@@ -315,7 +315,7 @@
     public void testRotation180CanStartOneHanded() {
         final DisplayLayout testDisplayLayout = new DisplayLayout(mDisplayLayout);
         testDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_180);
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
+        mSpiedTransitionState.setState(STATE_NONE);
         when(mMockDisplayAreaOrganizer.getDisplayLayout()).thenReturn(testDisplayLayout);
         mSpiedOneHandedController.setOneHandedEnabled(true);
         mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
@@ -328,7 +328,7 @@
     public void testRotation270CanNotStartOneHanded() {
         final DisplayLayout testDisplayLayout = new DisplayLayout(mDisplayLayout);
         testDisplayLayout.rotateTo(mContext.getResources(), Surface.ROTATION_270);
-        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
+        mSpiedTransitionState.setState(STATE_NONE);
         when(mMockDisplayAreaOrganizer.getDisplayLayout()).thenReturn(testDisplayLayout);
         mSpiedOneHandedController.setOneHandedEnabled(true);
         mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedStateTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedStateTest.java
new file mode 100644
index 0000000..89aae65
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedStateTest.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.wm.shell.onehanded;
+
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_ACTIVE;
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_ENTERING;
+import static com.android.wm.shell.onehanded.OneHandedState.STATE_EXITING;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.om.IOverlayManager;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.testing.AndroidTestingRunner;
+import android.util.ArrayMap;
+import android.view.Display;
+import android.view.SurfaceControl;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.wm.shell.common.DisplayController;
+import com.android.wm.shell.common.DisplayLayout;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.TaskStackListenerImpl;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class OneHandedStateTest extends OneHandedTestCase {
+    private int mCurrentUser = UserHandle.myUserId();
+
+    Display mDisplay;
+    DisplayLayout mDisplayLayout;
+    OneHandedAccessibilityUtil mOneHandedAccessibilityUtil;
+    OneHandedController mSpiedOneHandedController;
+    OneHandedTimeoutHandler mSpiedTimeoutHandler;
+    OneHandedState mSpiedState;
+
+    @Mock
+    DisplayController mMockDisplayController;
+    @Mock
+    OneHandedBackgroundPanelOrganizer mMockBackgroundOrganizer;
+    @Mock
+    OneHandedDisplayAreaOrganizer mMockDisplayAreaOrganizer;
+    @Mock
+    OneHandedTouchHandler mMockTouchHandler;
+    @Mock
+    OneHandedTutorialHandler mMockTutorialHandler;
+    @Mock
+    OneHandedGestureHandler mMockGestureHandler;
+    @Mock
+    OneHandedSettingsUtil mMockSettingsUitl;
+    @Mock
+    OneHandedUiEventLogger mMockUiEventLogger;
+    @Mock
+    IOverlayManager mMockOverlayManager;
+    @Mock
+    TaskStackListenerImpl mMockTaskStackListener;
+    @Mock
+    ShellExecutor mMockShellMainExecutor;
+    @Mock
+    SurfaceControl mMockLeash;
+    @Mock
+    Handler mMockShellMainHandler;
+
+    final boolean mDefaultEnabled = true;
+    final boolean mDefaultSwipeToNotificationEnabled = false;
+    final boolean mDefaultTapAppToExitEnabled = true;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mDisplay = mContext.getDisplay();
+        mDisplayLayout = new DisplayLayout(mContext, mDisplay);
+        mSpiedTimeoutHandler = spy(new OneHandedTimeoutHandler(mMockShellMainExecutor));
+        mSpiedState = spy(new OneHandedState());
+
+        when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
+        when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
+        when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash);
+        when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any(), anyInt())).thenReturn(
+                mDefaultEnabled);
+        when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any(), anyInt())).thenReturn(
+                OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS);
+        when(mMockSettingsUitl.getSettingsTapsAppToExit(any(), anyInt())).thenReturn(
+                mDefaultTapAppToExitEnabled);
+        when(mMockSettingsUitl.getSettingsSwipeToNotificationEnabled(any(), anyInt())).thenReturn(
+                mDefaultSwipeToNotificationEnabled);
+
+        when(mMockDisplayAreaOrganizer.getLastDisplayBounds()).thenReturn(
+                new Rect(0, 0, mDisplayLayout.width(), mDisplayLayout.height()));
+        when(mMockDisplayAreaOrganizer.getDisplayLayout()).thenReturn(mDisplayLayout);
+
+        mOneHandedAccessibilityUtil = new OneHandedAccessibilityUtil(mContext);
+        mSpiedOneHandedController = spy(new OneHandedController(
+                mContext,
+                mMockDisplayController,
+                mMockBackgroundOrganizer,
+                mMockDisplayAreaOrganizer,
+                mMockTouchHandler,
+                mMockTutorialHandler,
+                mMockGestureHandler,
+                mMockSettingsUitl,
+                mOneHandedAccessibilityUtil,
+                mSpiedTimeoutHandler,
+                mSpiedState,
+                mMockUiEventLogger,
+                mMockOverlayManager,
+                mMockTaskStackListener,
+                mMockShellMainExecutor,
+                mMockShellMainHandler)
+        );
+    }
+
+    @Test
+    public void testState_stateEntering_isTransitioning() {
+        mSpiedState.setState(STATE_ENTERING);
+
+        assertThat(mSpiedState.isTransitioning()).isTrue();
+    }
+
+    @Test
+    public void testState_stateExiting_isTransitioning() {
+        mSpiedState.setState(STATE_EXITING);
+
+        assertThat(mSpiedState.isTransitioning()).isTrue();
+    }
+
+    @Test
+    public void testInEnteringState_shouldSkipDupTrigger() {
+        when(mSpiedState.getState()).thenReturn(STATE_ENTERING);
+        when(mSpiedState.isTransitioning()).thenReturn(true);
+        when(mSpiedState.isInOneHanded()).thenReturn(false);
+        mSpiedOneHandedController.startOneHanded();
+
+        verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
+    }
+
+    @Test
+    public void testInActiveState_shouldSkipDupTrigger() {
+        when(mSpiedState.getState()).thenReturn(STATE_ACTIVE);
+        when(mSpiedState.isTransitioning()).thenReturn(false);
+        when(mSpiedState.isInOneHanded()).thenReturn(true);
+        mSpiedOneHandedController.startOneHanded();
+
+        verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
+    }
+
+    @Test
+    public void testInActiveState_canExit() {
+        when(mSpiedState.getState()).thenReturn(STATE_ACTIVE);
+        when(mSpiedState.isTransitioning()).thenReturn(false);
+        mSpiedOneHandedController.stopOneHanded();
+
+        verify(mSpiedState).setState(STATE_EXITING);
+    }
+
+    @Test
+    public void testInEnteringState_shouldSkipExitAction() {
+        when(mSpiedState.getState()).thenReturn(STATE_ENTERING);
+        when(mSpiedState.isTransitioning()).thenReturn(true);
+        mSpiedOneHandedController.stopOneHanded();
+
+        verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
+    }
+
+    @Test
+    public void testInExitingState_shouldSkipStartAction() {
+        when(mSpiedState.getState()).thenReturn(STATE_EXITING);
+        when(mSpiedState.isTransitioning()).thenReturn(true);
+        mSpiedOneHandedController.startOneHanded();
+
+        verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
+    }
+
+    @Test
+    public void testInExitingState_shouldSkipStopAction() {
+        when(mSpiedState.getState()).thenReturn(STATE_EXITING);
+        when(mSpiedState.isTransitioning()).thenReturn(true);
+        mSpiedOneHandedController.stopOneHanded();
+
+        verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
+    }
+
+    @Test
+    public void testInActiveState_disableOHM_shouldStopOHM() {
+        when(mSpiedState.getState()).thenReturn(STATE_ACTIVE);
+        when(mSpiedState.isTransitioning()).thenReturn(false);
+        when(mSpiedState.isInOneHanded()).thenReturn(true);
+        mSpiedOneHandedController.setOneHandedEnabled(false);
+
+        verify(mMockShellMainExecutor).execute(any());
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java
index 06a6671..b82a8ca 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java
@@ -41,6 +41,7 @@
 public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
     OneHandedTimeoutHandler mTimeoutHandler;
     OneHandedController mOneHandedController;
+    OneHandedState mSpiedTransitionState;
 
     @Mock
     OneHandedGestureHandler mMockGestureHandler;
@@ -73,6 +74,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor);
+        mSpiedTransitionState = new OneHandedState();
 
         when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
         mOneHandedController = new OneHandedController(
@@ -86,6 +88,7 @@
                 mMockSettingsUtil,
                 mMockAccessibilityUtil,
                 mTimeoutHandler,
+                mSpiedTransitionState,
                 mMockUiEventLogger,
                 mMockOverlayManager,
                 mMockTaskStackListener,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java
index 63b9413..882d382 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipAnimationControllerTest.java
@@ -18,6 +18,7 @@
 
 import static android.util.RotationUtils.rotateBounds;
 import static android.view.Surface.ROTATION_0;
+import static android.view.Surface.ROTATION_270;
 import static android.view.Surface.ROTATION_90;
 
 import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_LEAVE_PIP;
@@ -133,17 +134,30 @@
 
     @Test
     public void pipTransitionAnimator_rotatedEndValue() {
+        final DummySurfaceControlTx tx = new DummySurfaceControlTx();
         final Rect startBounds = new Rect(200, 700, 400, 800);
         final Rect endBounds = new Rect(0, 0, 500, 1000);
-        final PipAnimationController.PipTransitionAnimator<?> animator = mPipAnimationController
+        // Fullscreen to PiP.
+        PipAnimationController.PipTransitionAnimator<?> animator = mPipAnimationController
                 .getAnimator(mTaskInfo, mLeash, null, startBounds, endBounds, null,
-                        TRANSITION_DIRECTION_TO_PIP, 0, ROTATION_90);
+                        TRANSITION_DIRECTION_LEAVE_PIP, 0, ROTATION_90);
         // Apply fraction 1 to compute the end value.
-        animator.applySurfaceControlTransaction(mLeash, new DummySurfaceControlTx(), 1);
+        animator.applySurfaceControlTransaction(mLeash, tx, 1);
         final Rect rotatedEndBounds = new Rect(endBounds);
         rotateBounds(rotatedEndBounds, endBounds, ROTATION_90);
 
         assertEquals("Expect 90 degree rotated bounds", rotatedEndBounds, animator.mCurrentValue);
+
+        // PiP to fullscreen.
+        startBounds.set(0, 0, 1000, 500);
+        endBounds.set(200, 100, 400, 500);
+        animator = mPipAnimationController.getAnimator(mTaskInfo, mLeash, startBounds, startBounds,
+                endBounds, null, TRANSITION_DIRECTION_TO_PIP, 0, ROTATION_270);
+        animator.applySurfaceControlTransaction(mLeash, tx, 1);
+        rotatedEndBounds.set(endBounds);
+        rotateBounds(rotatedEndBounds, startBounds, ROTATION_270);
+
+        assertEquals("Expect 270 degree rotated bounds", rotatedEndBounds, animator.mCurrentValue);
     }
 
     @Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java
index dea24d3..a6215d3 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipBoundsStateTest.java
@@ -38,6 +38,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.function.Consumer;
+
 /**
  * Tests for {@link PipBoundsState}.
  */
@@ -178,4 +180,20 @@
         mPipBoundsState.setOverrideMinSize(new Size(15, 10));
         assertEquals(10, mPipBoundsState.getOverrideMinEdgeSize());
     }
+
+    @Test
+    public void testSetBounds_updatesPipExclusionBounds() {
+        final Consumer<Rect> callback = mock(Consumer.class);
+        final Rect currentBounds = new Rect(10, 10, 20, 15);
+        final Rect newBounds = new Rect(50, 50, 100, 75);
+        mPipBoundsState.setBounds(currentBounds);
+
+        mPipBoundsState.setPipExclusionBoundsChangeCallback(callback);
+        // Setting the listener immediately calls back with the current bounds.
+        verify(callback).accept(currentBounds);
+
+        mPipBoundsState.setBounds(newBounds);
+        // Updating the bounds makes the listener call back back with the new rect.
+        verify(callback).accept(newBounds);
+    }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java
index 5df391f..9d7c82b 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java
@@ -19,6 +19,7 @@
 import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_TO_PIP;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -31,6 +32,7 @@
 import android.app.PictureInPictureParams;
 import android.content.ComponentName;
 import android.content.pm.ActivityInfo;
+import android.graphics.Rect;
 import android.os.RemoteException;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
@@ -222,6 +224,16 @@
         assertEquals(minSize, mPipBoundsState.getOverrideMinSize());
     }
 
+    @Test
+    public void onTaskVanished_clearsPipBounds() {
+        mSpiedPipTaskOrganizer.onTaskAppeared(createTaskInfo(mComponent1,
+                createPipParams(null)), null /* leash */);
+        mPipBoundsState.setBounds(new Rect(100, 100, 200, 150));
+
+        mSpiedPipTaskOrganizer.onTaskVanished(createTaskInfo(mComponent1, createPipParams(null)));
+        assertTrue(mPipBoundsState.getBounds().isEmpty());
+    }
+
     private void preparePipTaskOrg() {
         final DisplayInfo info = new DisplayInfo();
         mPipBoundsState.setDisplayLayout(new DisplayLayout(info,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
new file mode 100644
index 0000000..dd10aa7
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.pip.phone;
+
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyFloat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.graphics.Rect;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.MotionEvent;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.wm.shell.ShellTestCase;
+import com.android.wm.shell.common.FloatingContentCoordinator;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.pip.PipBoundsAlgorithm;
+import com.android.wm.shell.pip.PipBoundsState;
+import com.android.wm.shell.pip.PipSnapAlgorithm;
+import com.android.wm.shell.pip.PipTaskOrganizer;
+import com.android.wm.shell.pip.PipTransitionController;
+import com.android.wm.shell.pip.PipUiEventLogger;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Unit tests against {@link PipResizeGestureHandler}
+ */
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+public class PipResizeGestureHandlerTest extends ShellTestCase {
+    private static final int STEP_SIZE = 40;
+    private final MotionEvent.PointerProperties[] mPp = new MotionEvent.PointerProperties[2];
+
+    @Mock
+    private PhonePipMenuController mPhonePipMenuController;
+
+    @Mock
+    private PipTaskOrganizer mPipTaskOrganizer;
+
+    @Mock
+    private PipDismissTargetHandler mPipDismissTargetHandler;
+
+    @Mock
+    private PipTransitionController mMockPipTransitionController;
+
+    @Mock
+    private FloatingContentCoordinator mFloatingContentCoordinator;
+
+    @Mock
+    private PipUiEventLogger mPipUiEventLogger;
+
+    @Mock
+    private ShellExecutor mMainExecutor;
+
+    private PipResizeGestureHandler mPipResizeGestureHandler;
+
+    private PipBoundsState mPipBoundsState;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mPipBoundsState = new PipBoundsState(mContext);
+        final PipSnapAlgorithm pipSnapAlgorithm = new PipSnapAlgorithm();
+        final PipBoundsAlgorithm pipBoundsAlgorithm = new PipBoundsAlgorithm(mContext,
+                mPipBoundsState, pipSnapAlgorithm);
+        final PipMotionHelper motionHelper = new PipMotionHelper(mContext, mPipBoundsState,
+                mPipTaskOrganizer, mPhonePipMenuController, pipSnapAlgorithm,
+                mMockPipTransitionController, mFloatingContentCoordinator);
+        mPipResizeGestureHandler = new PipResizeGestureHandler(mContext, pipBoundsAlgorithm,
+                mPipBoundsState, motionHelper, mPipTaskOrganizer, mPipDismissTargetHandler,
+                (Rect bounds) -> new Rect(), () -> {}, mPipUiEventLogger, mPhonePipMenuController,
+                mMainExecutor) {
+            @Override
+            public void pilferPointers() {
+                // Overridden just to avoid calling into InputMonitor.
+            }
+        };
+
+        for (int i = 0; i < 2; i++) {
+            MotionEvent.PointerProperties pointerProperty = new MotionEvent.PointerProperties();
+            pointerProperty.id = i;
+            pointerProperty.toolType = MotionEvent.TOOL_TYPE_FINGER;
+            mPp[i] = pointerProperty;
+        }
+
+        mPipResizeGestureHandler.init();
+        mPipResizeGestureHandler.onSystemUiStateChanged(true);
+    }
+
+    @Test
+    public void twoInput_triggersPinchResize_getBigger() {
+        assertTrue(mPipResizeGestureHandler.isUsingPinchToZoom());
+
+        int topLeft = 200;
+        int bottomRight = 500;
+        mPipBoundsState.setBounds(new Rect(topLeft, topLeft, bottomRight, bottomRight));
+
+        // Start inside the PiP bounds first.
+        topLeft += STEP_SIZE;
+        bottomRight -= STEP_SIZE;
+        MotionEvent downEvent =
+                obtainMotionEvent(MotionEvent.ACTION_POINTER_DOWN, topLeft, bottomRight);
+        assertTrue(mPipResizeGestureHandler.willStartResizeGesture(downEvent));
+
+        // Slowly move outward.
+        topLeft -= STEP_SIZE;
+        bottomRight += STEP_SIZE;
+        MotionEvent moveEvent1 = obtainMotionEvent(MotionEvent.ACTION_MOVE, topLeft, bottomRight);
+        mPipResizeGestureHandler.onPinchResize(moveEvent1);
+
+        // Move outward more.
+        topLeft -= STEP_SIZE;
+        bottomRight += STEP_SIZE;
+        MotionEvent moveEvent2 = obtainMotionEvent(MotionEvent.ACTION_MOVE, topLeft, bottomRight);
+        mPipResizeGestureHandler.onPinchResize(moveEvent2);
+
+        verify(mPipTaskOrganizer, times(2))
+                .scheduleUserResizePip(any(), any(), anyFloat(), any());
+
+        MotionEvent upEvent = obtainMotionEvent(MotionEvent.ACTION_UP, topLeft, bottomRight);
+        mPipResizeGestureHandler.onPinchResize(upEvent);
+
+        verify(mPipTaskOrganizer, times(1))
+                .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any());
+
+        assertTrue("The new size should be bigger than the original PiP size.",
+                mPipResizeGestureHandler.getLastResizeBounds().width()
+                        > mPipBoundsState.getBounds().width());
+    }
+
+    @Test
+    public void twoInput_triggersPinchResize_getSmaller() {
+        assertTrue(mPipResizeGestureHandler.isUsingPinchToZoom());
+
+        int topLeft = 200;
+        int bottomRight = 500;
+        mPipBoundsState.setBounds(new Rect(topLeft, topLeft, bottomRight, bottomRight));
+
+
+        topLeft += STEP_SIZE;
+        bottomRight -= STEP_SIZE;
+        MotionEvent downEvent =
+                obtainMotionEvent(MotionEvent.ACTION_POINTER_DOWN, topLeft, bottomRight);
+        assertTrue(mPipResizeGestureHandler.willStartResizeGesture(downEvent));
+
+        topLeft += STEP_SIZE;
+        bottomRight -= STEP_SIZE;
+        MotionEvent moveEvent1 = obtainMotionEvent(MotionEvent.ACTION_MOVE, topLeft, bottomRight);
+        mPipResizeGestureHandler.onPinchResize(moveEvent1);
+
+        topLeft += STEP_SIZE;
+        bottomRight -= STEP_SIZE;
+        MotionEvent moveEvent2 = obtainMotionEvent(MotionEvent.ACTION_MOVE, topLeft, bottomRight);
+        mPipResizeGestureHandler.onPinchResize(moveEvent2);
+
+        verify(mPipTaskOrganizer, times(2))
+                .scheduleUserResizePip(any(), any(), anyFloat(), any());
+
+        MotionEvent upEvent = obtainMotionEvent(MotionEvent.ACTION_UP, topLeft, bottomRight);
+        mPipResizeGestureHandler.onPinchResize(upEvent);
+
+        verify(mPipTaskOrganizer, times(1))
+                .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any());
+
+        assertTrue("The new size should be smaller than the original PiP size.",
+                mPipResizeGestureHandler.getLastResizeBounds().width()
+                        < mPipBoundsState.getBounds().width());
+    }
+
+    private MotionEvent obtainMotionEvent(int action, int topLeft, int bottomRight) {
+        final MotionEvent.PointerCoords[] pc = new MotionEvent.PointerCoords[2];
+        for (int i = 0; i < 2; i++) {
+            MotionEvent.PointerCoords pointerCoord = new MotionEvent.PointerCoords();
+            if (i == 0) {
+                pointerCoord.x = topLeft;
+                pointerCoord.y = topLeft;
+            } else {
+                pointerCoord.x = bottomRight;
+                pointerCoord.y = bottomRight;
+            }
+            pc[i] = pointerCoord;
+        }
+        return MotionEvent.obtain(0 /* downTime */,
+                System.currentTimeMillis(),
+                action,
+                2 /* pointerCount */,
+                mPp,
+                pc,
+                0 /* metaState */,
+                0 /* buttonState */,
+                0 /* xPrecision */,
+                0 /* yPrecision */,
+                0 /* deviceId */,
+                0 /* edgeFlags */,
+                0 /* source */,
+                0 /* flags */);
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
index 18642fc..08ac2a6 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java
@@ -332,11 +332,18 @@
         final WindowContainerTransaction mRemoteFinishWCT = new WindowContainerTransaction();
 
         @Override
-        public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
-                IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
+        public void startAnimation(IBinder transition, TransitionInfo info,
+                SurfaceControl.Transaction t, IRemoteTransitionFinishedCallback finishCallback)
+                throws RemoteException {
             mCalled = true;
             finishCallback.onTransitionFinished(mRemoteFinishWCT);
         }
+
+        @Override
+        public void mergeAnimation(IBinder transition, TransitionInfo info,
+                SurfaceControl.Transaction t, IBinder mergeTarget,
+                IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
+        }
     }
 
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
index c1733de..2d2ab2c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
@@ -107,7 +107,8 @@
         verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any());
         TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
                 .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
-        transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class));
+        transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
         assertEquals(1, mDefaultHandler.activeCount());
         mDefaultHandler.finishAll();
         mMainExecutor.flushAll();
@@ -155,7 +156,8 @@
         transitions.requestStartTransition(transitToken,
                 new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
         verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), isNull());
-        transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class));
+        transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
         assertEquals(1, mDefaultHandler.activeCount());
         assertEquals(0, testHandler.activeCount());
         mDefaultHandler.finishAll();
@@ -168,7 +170,8 @@
                 new TransitionRequestInfo(TRANSIT_OPEN, mwTaskInfo, null /* remote */));
         verify(mOrganizer, times(1)).startTransition(
                 eq(TRANSIT_OPEN), eq(transitToken), eq(handlerWCT));
-        transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class));
+        transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
         assertEquals(1, mDefaultHandler.activeCount());
         assertEquals(0, testHandler.activeCount());
         mDefaultHandler.finishAll();
@@ -185,7 +188,8 @@
                 eq(TRANSIT_CHANGE), eq(transitToken), eq(handlerWCT));
         TransitionInfo change = new TransitionInfoBuilder(TRANSIT_CHANGE)
                 .addChange(TRANSIT_CHANGE).build();
-        transitions.onTransitionReady(transitToken, change, mock(SurfaceControl.Transaction.class));
+        transitions.onTransitionReady(transitToken, change, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
         assertEquals(0, mDefaultHandler.activeCount());
         assertEquals(1, testHandler.activeCount());
         assertEquals(0, topHandler.activeCount());
@@ -203,11 +207,18 @@
         final WindowContainerTransaction remoteFinishWCT = new WindowContainerTransaction();
         IRemoteTransition testRemote = new IRemoteTransition.Stub() {
             @Override
-            public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+            public void startAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t,
                     IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
                 remoteCalled[0] = true;
                 finishCallback.onTransitionFinished(remoteFinishWCT);
             }
+
+            @Override
+            public void mergeAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t, IBinder mergeTarget,
+                    IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
+            }
         };
         IBinder transitToken = new Binder();
         transitions.requestStartTransition(transitToken,
@@ -215,7 +226,8 @@
         verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any());
         TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
                 .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
-        transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class));
+        transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
         assertEquals(0, mDefaultHandler.activeCount());
         assertTrue(remoteCalled[0]);
         mDefaultHandler.finishAll();
@@ -269,11 +281,18 @@
         final boolean[] remoteCalled = new boolean[]{false};
         IRemoteTransition testRemote = new IRemoteTransition.Stub() {
             @Override
-            public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+            public void startAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t,
                     IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
                 remoteCalled[0] = true;
                 finishCallback.onTransitionFinished(null /* wct */);
             }
+
+            @Override
+            public void mergeAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t, IBinder mergeTarget,
+                    IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
+            }
         };
 
         TransitionFilter filter = new TransitionFilter();
@@ -290,7 +309,8 @@
         verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any());
         TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
                 .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
-        transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class));
+        transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
         assertEquals(0, mDefaultHandler.activeCount());
         assertTrue(remoteCalled[0]);
         mDefaultHandler.finishAll();
@@ -308,11 +328,18 @@
         final WindowContainerTransaction remoteFinishWCT = new WindowContainerTransaction();
         IRemoteTransition testRemote = new IRemoteTransition.Stub() {
             @Override
-            public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+            public void startAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t,
                     IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
                 remoteCalled[0] = true;
                 finishCallback.onTransitionFinished(remoteFinishWCT);
             }
+
+            @Override
+            public void mergeAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t, IBinder mergeTarget,
+                    IRemoteTransitionFinishedCallback finishCallback) throws RemoteException {
+            }
         };
 
         final int transitType = TRANSIT_FIRST_CUSTOM + 1;
@@ -336,6 +363,86 @@
                 mock(SurfaceControl.Transaction.class), testFinish));
     }
 
+    @Test
+    public void testTransitionQueueing() {
+        Transitions transitions = new Transitions(mOrganizer, mTransactionPool, mContext,
+                mMainExecutor, mAnimExecutor);
+        transitions.replaceDefaultHandlerForTest(mDefaultHandler);
+
+        IBinder transitToken1 = new Binder();
+        transitions.requestStartTransition(transitToken1,
+                new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
+        TransitionInfo info1 = new TransitionInfoBuilder(TRANSIT_OPEN)
+                .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
+        transitions.onTransitionReady(transitToken1, info1, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
+        assertEquals(1, mDefaultHandler.activeCount());
+
+        IBinder transitToken2 = new Binder();
+        transitions.requestStartTransition(transitToken2,
+                new TransitionRequestInfo(TRANSIT_CLOSE, null /* trigger */, null /* remote */));
+        TransitionInfo info2 = new TransitionInfoBuilder(TRANSIT_CLOSE)
+                .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
+        transitions.onTransitionReady(transitToken2, info2, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
+        // default handler doesn't merge by default, so it shouldn't increment active count.
+        assertEquals(1, mDefaultHandler.activeCount());
+        assertEquals(0, mDefaultHandler.mergeCount());
+        verify(mOrganizer, times(0)).finishTransition(eq(transitToken1), any(), any());
+        verify(mOrganizer, times(0)).finishTransition(eq(transitToken2), any(), any());
+
+        mDefaultHandler.finishAll();
+        mMainExecutor.flushAll();
+        // first transition finished
+        verify(mOrganizer, times(1)).finishTransition(eq(transitToken1), any(), any());
+        verify(mOrganizer, times(0)).finishTransition(eq(transitToken2), any(), any());
+        // But now the "queued" transition is running
+        assertEquals(1, mDefaultHandler.activeCount());
+
+        mDefaultHandler.finishAll();
+        mMainExecutor.flushAll();
+        verify(mOrganizer, times(1)).finishTransition(eq(transitToken2), any(), any());
+    }
+
+    @Test
+    public void testTransitionMerging() {
+        Transitions transitions = new Transitions(mOrganizer, mTransactionPool, mContext,
+                mMainExecutor, mAnimExecutor);
+        mDefaultHandler.setSimulateMerge(true);
+        transitions.replaceDefaultHandlerForTest(mDefaultHandler);
+
+        IBinder transitToken1 = new Binder();
+        transitions.requestStartTransition(transitToken1,
+                new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
+        TransitionInfo info1 = new TransitionInfoBuilder(TRANSIT_OPEN)
+                .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
+        transitions.onTransitionReady(transitToken1, info1, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
+        assertEquals(1, mDefaultHandler.activeCount());
+
+        IBinder transitToken2 = new Binder();
+        transitions.requestStartTransition(transitToken2,
+                new TransitionRequestInfo(TRANSIT_CLOSE, null /* trigger */, null /* remote */));
+        TransitionInfo info2 = new TransitionInfoBuilder(TRANSIT_CLOSE)
+                .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
+        transitions.onTransitionReady(transitToken2, info2, mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class));
+        // it should still only have 1 active, but then show 1 merged
+        assertEquals(1, mDefaultHandler.activeCount());
+        assertEquals(1, mDefaultHandler.mergeCount());
+        verify(mOrganizer, times(0)).finishTransition(eq(transitToken1), any(), any());
+        // We don't tell organizer it is finished yet (since we still want to maintain ordering)
+        verify(mOrganizer, times(0)).finishTransition(eq(transitToken2), any(), any());
+
+        mDefaultHandler.finishAll();
+        mMainExecutor.flushAll();
+        // transition + merged all finished.
+        verify(mOrganizer, times(1)).finishTransition(eq(transitToken1), any(), any());
+        verify(mOrganizer, times(1)).finishTransition(eq(transitToken2), any(), any());
+        // Make sure nothing was queued
+        assertEquals(0, mDefaultHandler.activeCount());
+    }
+
     class TransitionInfoBuilder {
         final TransitionInfo mInfo;
 
@@ -364,7 +471,9 @@
     }
 
     class TestTransitionHandler implements Transitions.TransitionHandler {
-        final ArrayList<Transitions.TransitionFinishCallback> mFinishes = new ArrayList<>();
+        ArrayList<Transitions.TransitionFinishCallback> mFinishes = new ArrayList<>();
+        final ArrayList<IBinder> mMerged = new ArrayList<>();
+        boolean mSimulateMerge = false;
 
         @Override
         public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
@@ -374,6 +483,15 @@
             return true;
         }
 
+        @Override
+        public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
+                @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
+                @NonNull Transitions.TransitionFinishCallback finishCallback) {
+            if (!mSimulateMerge) return;
+            mMerged.add(transition);
+            finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
+        }
+
         @Nullable
         @Override
         public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
@@ -381,16 +499,25 @@
             return null;
         }
 
+        void setSimulateMerge(boolean sim) {
+            mSimulateMerge = sim;
+        }
+
         void finishAll() {
-            for (int i = mFinishes.size() - 1; i >= 0; --i) {
-                mFinishes.get(i).onTransitionFinished(null /* wct */, null /* wctCB */);
+            final ArrayList<Transitions.TransitionFinishCallback> finishes = mFinishes;
+            mFinishes = new ArrayList<>();
+            for (int i = finishes.size() - 1; i >= 0; --i) {
+                finishes.get(i).onTransitionFinished(null /* wct */, null /* wctCB */);
             }
-            mFinishes.clear();
         }
 
         int activeCount() {
             return mFinishes.size();
         }
+
+        int mergeCount() {
+            return mMerged.size();
+        }
     }
 
     private static SurfaceControl createMockSurface(boolean valid) {
diff --git a/libs/androidfw/LoadedArsc.cpp b/libs/androidfw/LoadedArsc.cpp
index 2a70f0d..cb620cc 100644
--- a/libs/androidfw/LoadedArsc.cpp
+++ b/libs/androidfw/LoadedArsc.cpp
@@ -70,9 +70,6 @@
 
 }  // namespace
 
-LoadedPackage::LoadedPackage() = default;
-LoadedPackage::~LoadedPackage() = default;
-
 // Precondition: The header passed in has already been verified, so reading any fields and trusting
 // the ResChunk_header is safe.
 static bool VerifyResTableType(incfs::map_ptr<ResTable_type> header) {
diff --git a/libs/androidfw/include/androidfw/AssetManager2.h b/libs/androidfw/include/androidfw/AssetManager2.h
index 119f531..10666ad 100644
--- a/libs/androidfw/include/androidfw/AssetManager2.h
+++ b/libs/androidfw/include/androidfw/AssetManager2.h
@@ -94,6 +94,7 @@
   };
 
   AssetManager2();
+  explicit AssetManager2(AssetManager2&& other) = default;
 
   // Sets/resets the underlying ApkAssets for this AssetManager. The ApkAssets
   // are not owned by the AssetManager, and must have a longer lifetime.
diff --git a/libs/androidfw/include/androidfw/LoadedArsc.h b/libs/androidfw/include/androidfw/LoadedArsc.h
index d9225cd..3b222c5 100644
--- a/libs/androidfw/include/androidfw/LoadedArsc.h
+++ b/libs/androidfw/include/androidfw/LoadedArsc.h
@@ -153,8 +153,6 @@
   static std::unique_ptr<const LoadedPackage> Load(const Chunk& chunk,
                                                    package_property_t property_flags);
 
-  ~LoadedPackage();
-
   // Finds the entry with the specified type name and entry name. The names are in UTF-16 because
   // the underlying ResStringPool API expects this. For now this is acceptable, but since
   // the default policy in AAPT2 is to build UTF-8 string pools, this needs to change.
@@ -275,7 +273,7 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(LoadedPackage);
 
-  LoadedPackage();
+  LoadedPackage() = default;
 
   ResStringPool type_string_pool_;
   ResStringPool key_string_pool_;
diff --git a/libs/androidfw/include/androidfw/MutexGuard.h b/libs/androidfw/include/androidfw/MutexGuard.h
index 64924f4..6fc6d64 100644
--- a/libs/androidfw/include/androidfw/MutexGuard.h
+++ b/libs/androidfw/include/androidfw/MutexGuard.h
@@ -18,6 +18,7 @@
 #define ANDROIDFW_MUTEXGUARD_H
 
 #include <mutex>
+#include <optional>
 #include <type_traits>
 
 #include "android-base/macros.h"
@@ -47,34 +48,32 @@
   static_assert(!std::is_pointer<T>::value, "T must not be a raw pointer");
 
  public:
-  explicit Guarded() : guarded_() {
+  Guarded() : guarded_(std::in_place, T()) {
   }
 
-  template <typename U = T>
-  explicit Guarded(const T& guarded,
-                   typename std::enable_if<std::is_copy_constructible<U>::value>::type = void())
-      : guarded_(guarded) {
+  explicit Guarded(const T& guarded) : guarded_(std::in_place, guarded) {
   }
 
-  template <typename U = T>
-  explicit Guarded(T&& guarded,
-                   typename std::enable_if<std::is_move_constructible<U>::value>::type = void())
-      : guarded_(std::move(guarded)) {
+  explicit Guarded(T&& guarded) : guarded_(std::in_place, std::forward<T>(guarded)) {
+  }
+
+  ~Guarded() {
+    std::lock_guard<std::mutex> scoped_lock(lock_);
+    guarded_.reset();
   }
 
  private:
   friend class ScopedLock<T>;
-
   DISALLOW_COPY_AND_ASSIGN(Guarded);
 
   std::mutex lock_;
-  T guarded_;
+  std::optional<T> guarded_;
 };
 
 template <typename T>
 class ScopedLock {
  public:
-  explicit ScopedLock(Guarded<T>& guarded) : lock_(guarded.lock_), guarded_(guarded.guarded_) {
+  explicit ScopedLock(Guarded<T>& guarded) : lock_(guarded.lock_), guarded_(*guarded.guarded_) {
   }
 
   T& operator*() {
diff --git a/libs/hwui/effects/StretchEffect.cpp b/libs/hwui/effects/StretchEffect.cpp
index c2642d3..6eb6e1e 100644
--- a/libs/hwui/effects/StretchEffect.cpp
+++ b/libs/hwui/effects/StretchEffect.cpp
@@ -237,7 +237,7 @@
 }
 
 sk_sp<SkRuntimeEffect> StretchEffect::getStretchEffect() {
-    const static SkRuntimeEffect::Result instance = SkRuntimeEffect::Make(stretchShader);
+    const static SkRuntimeEffect::Result instance = SkRuntimeEffect::MakeForShader(stretchShader);
     return instance.effect;
 }
 
diff --git a/libs/hwui/hwui/AnimatedImageThread.cpp b/libs/hwui/hwui/AnimatedImageThread.cpp
index c899003..3d5841d 100644
--- a/libs/hwui/hwui/AnimatedImageThread.cpp
+++ b/libs/hwui/hwui/AnimatedImageThread.cpp
@@ -22,13 +22,16 @@
 namespace uirenderer {
 
 AnimatedImageThread& AnimatedImageThread::getInstance() {
-    static AnimatedImageThread* sInstance = new AnimatedImageThread();
-    return *sInstance;
+    [[clang::no_destroy]] static sp<AnimatedImageThread> sInstance = []() {
+        sp<AnimatedImageThread> thread = sp<AnimatedImageThread>::make();
+        thread->start("AnimatedImageThread");
+        return thread;
+    }();
+    return *sInstance.get();
 }
 
 AnimatedImageThread::AnimatedImageThread() {
     setpriority(PRIO_PROCESS, 0, PRIORITY_NORMAL + PRIORITY_MORE_FAVORABLE);
-    start("AnimatedImageThread");
 }
 
 std::future<AnimatedImageDrawable::Snapshot> AnimatedImageThread::decodeNextFrame(
diff --git a/libs/hwui/hwui/AnimatedImageThread.h b/libs/hwui/hwui/AnimatedImageThread.h
index 9e35374..fac80e5 100644
--- a/libs/hwui/hwui/AnimatedImageThread.h
+++ b/libs/hwui/hwui/AnimatedImageThread.h
@@ -37,6 +37,7 @@
     std::future<AnimatedImageDrawable::Snapshot> reset(const sk_sp<AnimatedImageDrawable>&);
 
 private:
+    friend sp<AnimatedImageThread>;
     AnimatedImageThread();
 };
 
diff --git a/libs/hwui/jni/Shader.cpp b/libs/hwui/jni/Shader.cpp
index 2e4d7f62..9018443 100644
--- a/libs/hwui/jni/Shader.cpp
+++ b/libs/hwui/jni/Shader.cpp
@@ -239,7 +239,8 @@
 
 static jlong RuntimeShader_createShaderBuilder(JNIEnv* env, jobject, jstring sksl) {
     ScopedUtfChars strSksl(env, sksl);
-    auto result = SkRuntimeEffect::Make(SkString(strSksl.c_str()), SkRuntimeEffect::Options{});
+    auto result = SkRuntimeEffect::MakeForShader(SkString(strSksl.c_str()),
+                                                 SkRuntimeEffect::Options{});
     if (result.effect.get() == nullptr) {
         doThrowIAE(env, result.errorText.c_str());
         return 0;
diff --git a/libs/incident/Android.bp b/libs/incident/Android.bp
index f322bff..547d719 100644
--- a/libs/incident/Android.bp
+++ b/libs/incident/Android.bp
@@ -104,7 +104,7 @@
     name: "libincident_test",
     test_config: "AndroidTest.xml",
     defaults: ["libincidentpriv_defaults"],
-    test_suites: ["device-tests", "mts-statsd"],
+    test_suites: ["device-tests"],
     compile_multilib: "both",
     multilib: {
         lib64: {
diff --git a/location/java/android/location/Geocoder.java b/location/java/android/location/Geocoder.java
index 307fb87..51586d7 100644
--- a/location/java/android/location/Geocoder.java
+++ b/location/java/android/location/Geocoder.java
@@ -45,6 +45,10 @@
  * empty list if there no backend service in the platform.  Use the
  * isPresent() method to determine whether a Geocoder implementation
  * exists.
+ *
+ * <p class="note"><strong>Warning:</strong> Geocoding services may provide no guarantees on
+ * availability or accuracy. Results are a best guess, and are not guaranteed to be meaningful or
+ * correct. Do not use this API for any safety-critical or regulatory compliance purpose.
  */
 public final class Geocoder {
 
@@ -95,15 +99,15 @@
     }
 
     /**
-     * Returns an array of Addresses that are known to describe the
-     * area immediately surrounding the given latitude and longitude.
-     * The returned addresses will be localized for the locale
-     * provided to this class's constructor.
+     * Returns an array of Addresses that attempt to describe the area immediately surrounding the
+     * given latitude and longitude. The returned addresses should be localized for the locale
+     * provided to this class's constructor. Results may be obtained by means of a network lookup
+     * and this method may take some time to return, and so should not be called on the main thread.
      *
-     * <p> The returned values may be obtained by means of a network lookup.
-     * The results are a best guess and are not guaranteed to be meaningful or
-     * correct. It may be useful to call this method from a thread separate from your
-     * primary UI thread.
+     * <p class="note"><strong>Warning:</strong> Geocoding services may provide no guarantees on
+     * availability or accuracy. Results are a best guess, and are not guaranteed to be meaningful
+     * or correct. Do <b>NOT</b> use this API for any safety-critical or regulatory compliance
+     * purposes.
      *
      * @param latitude the latitude a point for the search
      * @param longitude the longitude a point for the search
@@ -134,17 +138,17 @@
     }
 
     /**
-     * Returns an array of Addresses that are known to describe the
-     * named location, which may be a place name such as "Dalvik,
-     * Iceland", an address such as "1600 Amphitheatre Parkway,
-     * Mountain View, CA", an airport code such as "SFO", etc..  The
-     * returned addresses will be localized for the locale provided to
-     * this class's constructor.
+     * Returns an array of Addresses that attempt to describe the named location, which may be a
+     * place name such as "Dalvik, Iceland", an address such as "1600 Amphitheatre Parkway, Mountain
+     * View, CA", an airport code such as "SFO", and so forth. The returned addresses should be
+     * localized for the locale provided to this class's constructor. Results may be obtained by
+     * means of a network lookup and this method may take some time to return, and so should not be
+     * called on the main thread.
      *
-     * <p> The query will block and returned values will be obtained by means of a network lookup.
-     * The results are a best guess and are not guaranteed to be meaningful or
-     * correct. It may be useful to call this method from a thread separate from your
-     * primary UI thread.
+     * <p class="note"><strong>Warning:</strong> Geocoding services may provide no guarantees on
+     * availability or accuracy. Results are a best guess, and are not guaranteed to be meaningful
+     * or correct. Do <b>NOT</b> use this API for any safety-critical or regulatory compliance
+     * purposes.
      *
      * @param locationName a user-supplied description of a location
      * @param maxResults max number of results to return. Smaller numbers (1 to 5) are recommended
@@ -161,21 +165,20 @@
     }
 
     /**
-     * Returns an array of Addresses that are known to describe the
-     * named location, which may be a place name such as "Dalvik,
-     * Iceland", an address such as "1600 Amphitheatre Parkway,
-     * Mountain View, CA", an airport code such as "SFO", etc..  The
-     * returned addresses will be localized for the locale provided to
-     * this class's constructor.
+     * Returns an array of Addresses that attempt to describe the named location, which may be a
+     * place name such as "Dalvik, Iceland", an address such as "1600 Amphitheatre Parkway, Mountain
+     * View, CA", an airport code such as "SFO", and so forth. The returned addresses should be
+     * localized for the locale provided to this class's constructor. Results may be obtained by
+     * means of a network lookup and this method may take some time to return, and so should not be
+     * called on the main thread.
      *
-     * <p> You may specify a bounding box for the search results by including
-     * the Latitude and Longitude of the Lower Left point and Upper Right
-     * point of the box.
+     * <p> You may specify a bounding box for the search results by including the latitude and
+     * longitude of the lower left point and upper right point of the box.
      *
-     * <p> The query will block and returned values will be obtained by means of a network lookup.
-     * The results are a best guess and are not guaranteed to be meaningful or
-     * correct. It may be useful to call this method from a thread separate from your
-     * primary UI thread.
+     * <p class="note"><strong>Warning:</strong> Geocoding services may provide no guarantees on
+     * availability or accuracy. Results are a best guess, and are not guaranteed to be meaningful
+     * or correct. Do <b>NOT</b> use this API for any safety-critical or regulatory compliance
+     * purposes.
      *
      * @param locationName a user-supplied description of a location
      * @param maxResults max number of addresses to return. Smaller numbers (1 to 5) are recommended
diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java
index 242d9a3..f446678 100644
--- a/location/java/android/location/GnssMeasurement.java
+++ b/location/java/android/location/GnssMeasurement.java
@@ -1530,6 +1530,10 @@
      *
      * <p>The value does not include the inter-frequency Ionospheric bias.
      *
+     * <p>The sign of the value is defined by the following equation:
+     * <pre>
+     *     corrected pseudorange = raw pseudorange - FullInterSignalBiasNanos</pre>
+     *
      * <p>The value is only available if {@link #hasFullInterSignalBiasNanos()} is {@code true}.
      */
     public double getFullInterSignalBiasNanos() {
@@ -1626,6 +1630,10 @@
      * type in {@link GnssClock#getReferenceConstellationTypeForIsb())</li>
      * </ul>
      *
+     * <p>The sign of the value is defined by the following equation:
+     * <pre>
+     *     corrected pseudorange = raw pseudorange - SatelliteInterSignalBiasNanos</pre>
+     *
      * <p>The value is only available if {@link #hasSatelliteInterSignalBiasNanos()} is {@code
      * true}.
      */
diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java
index 5f8d795..1e8b952 100644
--- a/location/java/android/location/Location.java
+++ b/location/java/android/location/Location.java
@@ -508,15 +508,23 @@
     /**
      * Return the UTC time of this location fix, in milliseconds since epoch (January 1, 1970).
      *
-     * <p>Note that the UTC time on a device is not monotonic; it can jump forwards or backwards
-     * unpredictably, so this time should not be used to calculate time deltas between locations.
-     * Instead prefer {@link #getElapsedRealtimeNanos} for that purpose.
+     * <p>There is no guarantee that different locations have times set from the same clock.
+     * Locations derived from the {@link LocationManager#GPS_PROVIDER} are guaranteed to have their
+     * time set from the clock in use by the satellite constellation that provided the fix.
+     * Locations derived from other providers may use any clock to set their time, though it is most
+     * common to use the device clock (which may be incorrect).
      *
-     * <p>On the other hand, this method is useful for presenting a human readable time to the user,
-     * or for carefully comparing location fixes across reboot or across devices.
+     * <p>Note that the device clock UTC time is not monotonic; it can jump forwards or backwards
+     * unpredictably and may be changed at any time by the user, so this time should not be used to
+     * order or compare locations. Prefer {@link #getElapsedRealtimeNanos} for that purpose, as this
+     * clock is guaranteed to be monotonic.
      *
-     * <p>All locations generated by the {@link LocationManager} are guaranteed to have a UTC time,
-     * however remember that the system time may have changed since the location was generated.
+     * <p>On the other hand, this method may be useful for presenting a human readable time to the
+     * user, or as a heuristic for comparing location fixes across reboot or across devices.
+     *
+     * <p>All locations generated by the {@link LocationManager} are guaranteed to have a UTC time
+     * set, however remember that the device clock may have changed since the location was
+     * generated.
      *
      * @return UTC time of fix, in milliseconds since January 1, 1970.
      */
@@ -534,53 +542,60 @@
     }
 
     /**
-     * Return the time of this fix, in elapsed real-time since system boot.
+     * Return the time of this fix in nanoseconds of elapsed realtime since system boot.
      *
-     * <p>This value can be reliably compared to
-     * {@link android.os.SystemClock#elapsedRealtimeNanos},
-     * to calculate the age of a fix and to compare Location fixes. This
-     * is reliable because elapsed real-time is guaranteed monotonic for
-     * each system boot and continues to increment even when the system
-     * is in deep sleep (unlike {@link #getTime}.
+     * <p>This value can be compared with {@link android.os.SystemClock#elapsedRealtimeNanos}, to
+     * reliably order or compare locations. This is reliable because elapsed realtime is guaranteed
+     * to be monotonic and continues to increment even when the system is in deep sleep (unlike
+     * {@link #getTime}). However, since elapsed realtime is with reference to system boot, it does
+     * not make sense to use this value to order or compare locations across boot cycles.
      *
-     * <p>All locations generated by the {@link LocationManager}
-     * are guaranteed to have a valid elapsed real-time.
+     * <p>All locations generated by the {@link LocationManager} are guaranteed to have a valid
+     * elapsed realtime set.
      *
-     * @return elapsed real-time of fix, in nanoseconds since system boot.
+     * @return elapsed realtime of fix, in nanoseconds since system boot.
      */
     public long getElapsedRealtimeNanos() {
         return mElapsedRealtimeNanos;
     }
 
-    /** @hide */
+    /**
+     * Return the time of this fix in milliseconds of elapsed realtime since system boot.
+     *
+     * @see #getElapsedRealtimeNanos()
+     *
+     * @hide
+     */
     public long getElapsedRealtimeMillis() {
         return NANOSECONDS.toMillis(getElapsedRealtimeNanos());
     }
 
-    /** @hide */
-    public long getElapsedRealtimeAgeNanos(long referenceRealtimeNs) {
-        return referenceRealtimeNs - mElapsedRealtimeNanos;
-    }
-
-    /** @hide */
-    public long getElapsedRealtimeAgeNanos() {
-        return getElapsedRealtimeAgeNanos(SystemClock.elapsedRealtimeNanos());
-    }
-
-    /** @hide */
+    /**
+     * Returns the age of this fix with respect to the current elapsed realtime.
+     *
+     * @see #getElapsedRealtimeNanos()
+     *
+     * @hide
+     */
     public long getElapsedRealtimeAgeMillis() {
         return getElapsedRealtimeAgeMillis(SystemClock.elapsedRealtime());
     }
 
-    /** @hide */
+    /**
+     * Returns the age of this fix with respect to the given elapsed realtime.
+     *
+     * @see #getElapsedRealtimeNanos()
+     *
+     * @hide
+     */
     public long getElapsedRealtimeAgeMillis(long referenceRealtimeMs) {
         return referenceRealtimeMs - NANOSECONDS.toMillis(mElapsedRealtimeNanos);
     }
 
     /**
-     * Set the time of this fix, in elapsed real-time since system boot.
+     * Set the time of this fix, in elapsed realtime since system boot.
      *
-     * @param time elapsed real-time of fix, in nanoseconds since system boot.
+     * @param time elapsed realtime of fix, in nanoseconds since system boot.
      */
     public void setElapsedRealtimeNanos(long time) {
         mElapsedRealtimeNanos = time;
@@ -1143,7 +1158,7 @@
                 s.append(" bAcc=").append(mBearingAccuracyDegrees);
             }
         }
-        if (isFromMockProvider()) {
+        if (isMock()) {
             s.append(" mock");
         }
 
@@ -1293,12 +1308,12 @@
      * and {@link #bearingTo} don't duplicate work.
      */
     private static class BearingDistanceCache {
-        private double mLat1 = 0.0;
-        private double mLon1 = 0.0;
-        private double mLat2 = 0.0;
-        private double mLon2 = 0.0;
-        private float mDistance = 0.0f;
-        private float mInitialBearing = 0.0f;
-        private float mFinalBearing = 0.0f;
+        double mLat1 = 0.0;
+        double mLon1 = 0.0;
+        double mLat2 = 0.0;
+        double mLon2 = 0.0;
+        float mDistance = 0.0f;
+        float mInitialBearing = 0.0f;
+        float mFinalBearing = 0.0f;
     }
 }
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index f1879fc..c1d6725 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -1953,7 +1953,7 @@
 
     /**
      * Sets a new location for the given test provider. This location will be identiable as a mock
-     * location to all clients via {@link Location#isFromMockProvider()}.
+     * location to all clients via {@link Location#isMock()}.
      *
      * <p>The location object must have a minimum number of fields set to be considered valid, as
      * per documentation on {@link Location} class.
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index 3a86786..8fee768 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -326,6 +326,8 @@
     public static final int ENCODING_MPEGH_LC_L4 = 26;
     /** Audio data format: DTS UHD compressed */
     public static final int ENCODING_DTS_UHD = 27;
+    /** Audio data format: DRA compressed */
+    public static final int ENCODING_DRA = 28;
 
     /** @hide */
     public static String toLogFriendlyEncoding(int enc) {
@@ -384,6 +386,8 @@
                 return "ENCODING_MPEGH_LC_L4";
             case ENCODING_DTS_UHD:
                 return "ENCODING_DTS_UHD";
+            case ENCODING_DRA:
+                return "ENCODING_DRA";
             default :
                 return "invalid encoding " + enc;
         }
@@ -434,6 +438,18 @@
     public static final int CHANNEL_OUT_TOP_BACK_CENTER = 0x40000;
     /** @hide */
     public static final int CHANNEL_OUT_TOP_BACK_RIGHT =  0x80000;
+    /** @hide */
+    public static final int CHANNEL_OUT_TOP_SIDE_LEFT = 0x100000;
+    /** @hide */
+    public static final int CHANNEL_OUT_TOP_SIDE_RIGHT = 0x200000;
+    /** @hide */
+    public static final int CHANNEL_OUT_BOTTOM_FRONT_LEFT = 0x400000;
+    /** @hide */
+    public static final int CHANNEL_OUT_BOTTOM_FRONT_CENTER = 0x800000;
+    /** @hide */
+    public static final int CHANNEL_OUT_BOTTOM_FRONT_RIGHT = 0x1000000;
+    /** @hide */
+    public static final int CHANNEL_OUT_LOW_FREQUENCY_2 = 0x2000000;
 
     public static final int CHANNEL_OUT_MONO = CHANNEL_OUT_FRONT_LEFT;
     public static final int CHANNEL_OUT_STEREO = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT);
@@ -463,6 +479,38 @@
             CHANNEL_OUT_SIDE_LEFT | CHANNEL_OUT_SIDE_RIGHT |
             CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT |
             CHANNEL_OUT_LOW_FREQUENCY);
+    /** @hide */
+    public static final int CHANNEL_OUT_5POINT1POINT2 = (CHANNEL_OUT_5POINT1 |
+            CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT);
+    /** @hide */
+    public static final int CHANNEL_OUT_5POINT1POINT4 = (CHANNEL_OUT_5POINT1 |
+            CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_RIGHT |
+            CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT);
+    /** @hide */
+    public static final int CHANNEL_OUT_7POINT1POINT2 = (CHANNEL_OUT_7POINT1_SURROUND |
+            CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT);
+    /** @hide */
+    public static final int CHANNEL_OUT_7POINT1POINT4 = (CHANNEL_OUT_7POINT1_SURROUND |
+            CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_RIGHT |
+            CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT);
+    /** @hide */
+    public static final int CHANNEL_OUT_13POINT_360RA = (
+            CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_FRONT_RIGHT |
+            CHANNEL_OUT_SIDE_LEFT | CHANNEL_OUT_SIDE_RIGHT |
+            CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_CENTER |
+            CHANNEL_OUT_TOP_FRONT_RIGHT |
+            CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT |
+            CHANNEL_OUT_BOTTOM_FRONT_LEFT | CHANNEL_OUT_BOTTOM_FRONT_CENTER |
+            CHANNEL_OUT_BOTTOM_FRONT_RIGHT);
+    /** @hide */
+    public static final int CHANNEL_OUT_22POINT2 = (CHANNEL_OUT_7POINT1POINT4 |
+            CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER |
+            CHANNEL_OUT_BACK_CENTER | CHANNEL_OUT_TOP_CENTER |
+            CHANNEL_OUT_TOP_FRONT_CENTER | CHANNEL_OUT_TOP_BACK_CENTER |
+            CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT |
+            CHANNEL_OUT_BOTTOM_FRONT_LEFT | CHANNEL_OUT_BOTTOM_FRONT_RIGHT |
+            CHANNEL_OUT_BOTTOM_FRONT_CENTER |
+            CHANNEL_OUT_LOW_FREQUENCY_2);
     // CHANNEL_OUT_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_OUT_ALL
 
     /** Minimum value for sample rate,
@@ -620,6 +668,7 @@
             case ENCODING_MPEGH_LC_L3:
             case ENCODING_MPEGH_LC_L4:
             case ENCODING_DTS_UHD:
+            case ENCODING_DRA:
                 return true;
             default:
                 return false;
@@ -656,6 +705,7 @@
             case ENCODING_MPEGH_LC_L3:
             case ENCODING_MPEGH_LC_L4:
             case ENCODING_DTS_UHD:
+            case ENCODING_DRA:
                 return true;
             default:
                 return false;
@@ -695,6 +745,7 @@
             case ENCODING_MPEGH_LC_L3:
             case ENCODING_MPEGH_LC_L4:
             case ENCODING_DTS_UHD:
+            case ENCODING_DRA:
                 return false;
             case ENCODING_INVALID:
             default:
@@ -734,6 +785,7 @@
             case ENCODING_MPEGH_LC_L3:
             case ENCODING_MPEGH_LC_L4:
             case ENCODING_DTS_UHD:
+            case ENCODING_DRA:
                 return false;
             case ENCODING_INVALID:
             default:
@@ -1021,6 +1073,7 @@
                 case ENCODING_MPEGH_LC_L3:
                 case ENCODING_MPEGH_LC_L4:
                 case ENCODING_DTS_UHD:
+                case ENCODING_DRA:
                     mEncoding = encoding;
                     break;
                 case ENCODING_INVALID:
@@ -1248,7 +1301,8 @@
         ENCODING_MPEGH_BL_L4,
         ENCODING_MPEGH_LC_L3,
         ENCODING_MPEGH_LC_L4,
-        ENCODING_DTS_UHD }
+        ENCODING_DTS_UHD,
+        ENCODING_DRA }
     )
     @Retention(RetentionPolicy.SOURCE)
     public @interface Encoding {}
@@ -1268,7 +1322,8 @@
             ENCODING_MPEGH_BL_L4,
             ENCODING_MPEGH_LC_L3,
             ENCODING_MPEGH_LC_L4,
-            ENCODING_DTS_UHD
+            ENCODING_DTS_UHD,
+            ENCODING_DRA
     };
 
     /** @hide */
@@ -1286,7 +1341,8 @@
             ENCODING_MPEGH_BL_L4,
             ENCODING_MPEGH_LC_L3,
             ENCODING_MPEGH_LC_L4,
-            ENCODING_DTS_UHD }
+            ENCODING_DTS_UHD,
+            ENCODING_DRA }
     )
     @Retention(RetentionPolicy.SOURCE)
     public @interface SurroundSoundEncoding {}
@@ -1330,6 +1386,8 @@
                 return "MPEG-H 3D Audio low complexity profile level 4";
             case ENCODING_DTS_UHD:
                 return "DTS UHD";
+            case ENCODING_DRA:
+                return "DRA";
             default:
                 return "Unknown surround sound format";
         }
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 4dc1cca..f2f9a26 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -2846,6 +2846,159 @@
     }
 
     /**
+     * Interface definition of a callback that is notified when the audio mode changes
+     */
+    public interface OnModeChangedListener {
+        /**
+         * Called on the listener to indicate that the audio mode has changed
+         *
+         * @param mode The current audio mode
+         */
+        void onModeChanged(@AudioMode int mode);
+    }
+
+    private final Object mModeListenerLock = new Object();
+    /**
+     * List of listeners for audio mode and their associated Executor.
+     * List is lazy-initialized on first registration
+     */
+    @GuardedBy("mModeListenerLock")
+    private @Nullable ArrayList<ModeListenerInfo> mModeListeners;
+
+    @GuardedBy("mModeListenerLock")
+    private ModeDispatcherStub mModeDispatcherStub;
+
+    private final class ModeDispatcherStub
+            extends IAudioModeDispatcher.Stub {
+
+        @Override
+        public void dispatchAudioModeChanged(int mode) {
+            // make a shallow copy of listeners so callback is not executed under lock
+            final ArrayList<ModeListenerInfo> modeListeners;
+            synchronized (mModeListenerLock) {
+                if (mModeListeners == null || mModeListeners.size() == 0) {
+                    return;
+                }
+                modeListeners = (ArrayList<ModeListenerInfo>) mModeListeners.clone();
+            }
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                for (ModeListenerInfo info : modeListeners) {
+                    info.mExecutor.execute(() ->
+                            info.mListener.onModeChanged(mode));
+                }
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+    }
+
+    private static class ModeListenerInfo {
+        final @NonNull OnModeChangedListener mListener;
+        final @NonNull Executor mExecutor;
+
+        ModeListenerInfo(OnModeChangedListener listener, Executor exe) {
+            mListener = listener;
+            mExecutor = exe;
+        }
+    }
+
+    @GuardedBy("mModeListenerLock")
+    private boolean hasModeListener(OnModeChangedListener listener) {
+        return getModeListenerInfo(listener) != null;
+    }
+
+    @GuardedBy("mModeListenerLock")
+    private @Nullable ModeListenerInfo getModeListenerInfo(
+            OnModeChangedListener listener) {
+        if (mModeListeners == null) {
+            return null;
+        }
+        for (ModeListenerInfo info : mModeListeners) {
+            if (info.mListener == listener) {
+                return info;
+            }
+        }
+        return null;
+    }
+
+
+    @GuardedBy("mModeListenerLock")
+    /**
+     * @return true if the listener was removed from the list
+     */
+    private boolean removeModeListener(OnModeChangedListener listener) {
+        final ModeListenerInfo infoToRemove = getModeListenerInfo(listener);
+        if (infoToRemove != null) {
+            mModeListeners.remove(infoToRemove);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Adds a listener to be notified of changes to the audio mode.
+     * See {@link #getMode()}
+     * @param executor
+     * @param listener
+     */
+    public void addOnModeChangedListener(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull OnModeChangedListener listener) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(listener);
+        synchronized (mModeListenerLock) {
+            if (hasModeListener(listener)) {
+                throw new IllegalArgumentException("attempt to call addOnModeChangedListener() "
+                        + "on a previously registered listener");
+            }
+            // lazy initialization of the list of strategy-preferred device listener
+            if (mModeListeners == null) {
+                mModeListeners = new ArrayList<>();
+            }
+            final int oldCbCount = mModeListeners.size();
+            mModeListeners.add(new ModeListenerInfo(listener, executor));
+            if (oldCbCount == 0) {
+                // register binder for callbacks
+                if (mModeDispatcherStub == null) {
+                    mModeDispatcherStub = new ModeDispatcherStub();
+                }
+                try {
+                    getService().registerModeDispatcher(mModeDispatcherStub);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
+            }
+        }
+    }
+
+    /**
+     * Removes a previously added listener for changes to audio mode.
+     * See {@link #getMode()}
+     * @param listener
+     */
+    public void removeOnModeChangedListener(@NonNull OnModeChangedListener listener) {
+        Objects.requireNonNull(listener);
+        synchronized (mModeListenerLock) {
+            if (!removeModeListener(listener)) {
+                throw new IllegalArgumentException("attempt to call removeOnModeChangedListener() "
+                        + "on an unregistered listener");
+            }
+            if (mModeListeners.size() == 0) {
+                // unregister binder for callbacks
+                try {
+                    getService().unregisterModeDispatcher(mModeDispatcherStub);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                } finally {
+                    mModeDispatcherStub = null;
+                    mModeListeners = null;
+                }
+            }
+        }
+    }
+
+    /**
     * Indicates if the platform supports a special call screening and call monitoring mode.
     * <p>
     * When this mode is supported, it is possible to perform call screening and monitoring
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 3399377..0d44a85 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -21,6 +21,7 @@
 import android.annotation.CallbackExecutor;
 import android.annotation.FloatRange;
 import android.annotation.IntDef;
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
@@ -358,7 +359,8 @@
     @RequiresPermission(android.Manifest.permission.RECORD_AUDIO)
     public AudioRecord(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes,
             int sessionId) throws IllegalArgumentException {
-        this(attributes, format, bufferSizeInBytes, sessionId, ActivityThread.currentApplication());
+        this(attributes, format, bufferSizeInBytes, sessionId,
+                ActivityThread.currentApplication(), 0 /*maxSharedAudioHistoryMs*/);
     }
 
     /**
@@ -383,7 +385,8 @@
      * @throws IllegalArgumentException
      */
     private AudioRecord(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes,
-            int sessionId, @Nullable Context context) throws IllegalArgumentException {
+            int sessionId, @Nullable Context context,
+            int maxSharedAudioHistoryMs) throws IllegalArgumentException {
         mRecordingState = RECORDSTATE_STOPPED;
 
         if (attributes == null) {
@@ -455,12 +458,14 @@
         int[] sampleRate = new int[] {mSampleRate};
         int[] session = new int[1];
         session[0] = sessionId;
+
         //TODO: update native initialization when information about hardware init failure
         //      due to capture device already open is available.
         int initResult = native_setup(new WeakReference<AudioRecord>(this),
                 mAudioAttributes, sampleRate, mChannelMask, mChannelIndexMask,
                 mAudioFormat, mNativeBufferSizeInBytes,
-                session, identity, 0 /*nativeRecordInJavaObj*/);
+                session, identity, 0 /*nativeRecordInJavaObj*/,
+                maxSharedAudioHistoryMs);
         if (initResult != SUCCESS) {
             loge("Error code "+initResult+" when initializing native AudioRecord object.");
             return; // with mState == STATE_UNINITIALIZED
@@ -522,7 +527,8 @@
                     0 /*mNativeBufferSizeInBytes*/,
                     session,
                     myIdentity(null),
-                    nativeRecordInJavaObj);
+                    nativeRecordInJavaObj,
+                    0);
             if (initResult != SUCCESS) {
                 loge("Error code "+initResult+" when initializing native AudioRecord object.");
                 return; // with mState == STATE_UNINITIALIZED
@@ -581,7 +587,7 @@
         private int mBufferSizeInBytes;
         private int mSessionId = AudioManager.AUDIO_SESSION_ID_GENERATE;
         private int mPrivacySensitive = PRIVACY_SENSITIVE_DEFAULT;
-
+        private int mMaxSharedAudioHistoryMs = 0;
         private static final int PRIVACY_SENSITIVE_DEFAULT = -1;
         private static final int PRIVACY_SENSITIVE_DISABLED = 0;
         private static final int PRIVACY_SENSITIVE_ENABLED = 1;
@@ -747,7 +753,12 @@
             if (sessionId < 0) {
                 throw new IllegalArgumentException("Invalid session ID " + sessionId);
             }
-            mSessionId = sessionId;
+            // Do not override a session ID previously set with setSharedAudioEvent()
+            if (mSessionId == AudioManager.AUDIO_SESSION_ID_GENERATE) {
+                mSessionId = sessionId;
+            } else {
+                Log.e(TAG, "setSessionId() called twice or after setSharedAudioEvent()");
+            }
             return this;
         }
 
@@ -772,6 +783,57 @@
         }
 
         /**
+         * @hide
+         * Specifies the maximum duration in the past of the this AudioRecord's capture buffer
+         * that can be shared with another app by calling
+         * {@link AudioRecord#shareAudioHistory(String, long)}.
+         * @param maxSharedAudioHistoryMillis the maximum duration that will be available
+         *                                    in milliseconds.
+         * @return the same Builder instance.
+         * @throws IllegalArgumentException
+         *
+         */
+        @SystemApi
+        @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD)
+        public @NonNull Builder setMaxSharedAudioHistoryMillis(long maxSharedAudioHistoryMillis)
+                throws IllegalArgumentException {
+            if (maxSharedAudioHistoryMillis <= 0
+                    || maxSharedAudioHistoryMillis > MAX_SHARED_AUDIO_HISTORY_MS) {
+                throw new IllegalArgumentException("Illegal maxSharedAudioHistoryMillis argument");
+            }
+            mMaxSharedAudioHistoryMs = (int) maxSharedAudioHistoryMillis;
+            return this;
+        }
+
+        /**
+         * @hide
+         * Indicates that this AudioRecord will use the audio history shared by another app's
+         * AudioRecord. See {@link AudioRecord#shareAudioHistory(String, long)}.
+         * The audio session ID set with {@link AudioRecord.Builder#setSessionId(int)} will be
+         * ignored if this method is used.
+         * @param event The {@link MediaSyncEvent} provided by the app sharing its audio history
+         *              with this AudioRecord.
+         * @return the same Builder instance.
+         * @throws IllegalArgumentException
+         */
+        @SystemApi
+        public @NonNull Builder setSharedAudioEvent(@NonNull MediaSyncEvent event)
+                throws IllegalArgumentException {
+            Objects.requireNonNull(event);
+            if (event.getType() != MediaSyncEvent.SYNC_EVENT_SHARE_AUDIO_HISTORY) {
+                throw new IllegalArgumentException(
+                        "Invalid event type " + event.getType());
+            }
+            if (event.getAudioSessionId() == AudioSystem.AUDIO_SESSION_ALLOCATE) {
+                throw new IllegalArgumentException(
+                        "Invalid session ID " + event.getAudioSessionId());
+            }
+            // This prevails over a session ID set with setSessionId()
+            mSessionId = event.getAudioSessionId();
+            return this;
+        }
+
+        /**
          * @return a new {@link AudioRecord} instance successfully initialized with all
          *     the parameters set on this <code>Builder</code>.
          * @throws UnsupportedOperationException if the parameters set on the <code>Builder</code>
@@ -837,7 +899,8 @@
                             * mFormat.getBytesPerSample(mFormat.getEncoding());
                 }
                 final AudioRecord record = new AudioRecord(
-                        mAttributes, mFormat, mBufferSizeInBytes, mSessionId, mContext);
+                        mAttributes, mFormat, mBufferSizeInBytes, mSessionId, mContext,
+                                    mMaxSharedAudioHistoryMs);
                 if (record.getState() == STATE_UNINITIALIZED) {
                     // release is not necessary
                     throw new UnsupportedOperationException("Cannot create AudioRecord");
@@ -1423,7 +1486,6 @@
                 || (offsetInShorts + sizeInShorts > audioData.length)) {
             return ERROR_BAD_VALUE;
         }
-
         return native_read_in_short_array(audioData, offsetInShorts, sizeInShorts,
                 readMode == READ_BLOCKING);
     }
@@ -1642,6 +1704,70 @@
         return AudioManager.getDeviceForPortId(deviceId, AudioManager.GET_DEVICES_INPUTS);
     }
 
+    /**
+     * Must match the native definition in frameworks/av/service/audioflinger/Audioflinger.h.
+     */
+    private static final long MAX_SHARED_AUDIO_HISTORY_MS = 5000;
+
+    /**
+     * @hide
+     * returns the maximum duration in milliseconds of the audio history that can be requested
+     * to be made available to other clients using the same session with
+     * {@Link Builder#setMaxSharedAudioHistory(long)}.
+     */
+    @SystemApi
+    public static long getMaxSharedAudioHistoryMillis() {
+        return MAX_SHARED_AUDIO_HISTORY_MS;
+    }
+
+    /**
+     * @hide
+     *
+     * A privileged app with permission CAPTURE_AUDIO_HOTWORD can share part of its recent
+     * capture history on a given AudioRecord with the following steps:
+     * 1) Specify the maximum time in the past that will be available for other apps by calling
+     * {@link Builder#setMaxSharedAudioHistoryMillis(long)} when creating the AudioRecord.
+     * 2) Start recording and determine where the other app should start capturing in the past.
+     * 3) Call this method with the package name of the app the history will be shared with and
+     * the intended start time for this app's capture relative to this AudioRecord's start time.
+     * 4) Communicate the {@link MediaSyncEvent} returned by this method to the other app.
+     * 5) The other app will use the MediaSyncEvent when creating its AudioRecord with
+     * {@link Builder#setSharedAudioEvent(MediaSyncEvent).
+     * 6) Only after the other app has started capturing can this app stop capturing and
+     * release its AudioRecord.
+     * This method is intended to be called only once: if called multiple times, only the last
+     * request will be honored.
+     * The implementation is "best effort": if the specified start time if too far in the past
+     * compared to the max available history specified, the start time will be adjusted to the
+     * start of the available history.
+     * @param sharedPackage the package the history will be shared with
+     * @param startFromMillis the start time, relative to the initial start time of this
+     *        AudioRecord, at which the other AudioRecord will start.
+     * @return a {@link MediaSyncEvent} to be communicated to the app this AudioRecord's audio
+     *         history will be shared with.
+     * @throws IllegalArgumentException
+     * @throws SecurityException
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD)
+    @NonNull public MediaSyncEvent shareAudioHistory(@NonNull String sharedPackage,
+                                  @IntRange(from = 0) long startFromMillis) {
+        Objects.requireNonNull(sharedPackage);
+        if (startFromMillis < 0) {
+            throw new IllegalArgumentException("Illegal negative sharedAudioHistoryMs argument");
+        }
+        int status = native_shareAudioHistory(sharedPackage, startFromMillis);
+        if (status == AudioSystem.BAD_VALUE) {
+            throw new IllegalArgumentException("Illegal sharedAudioHistoryMs argument");
+        } else if (status == AudioSystem.PERMISSION_DENIED) {
+            throw new SecurityException("permission CAPTURE_AUDIO_HOTWORD required");
+        }
+        MediaSyncEvent event =
+                MediaSyncEvent.createEvent(MediaSyncEvent.SYNC_EVENT_SHARE_AUDIO_HISTORY);
+        event.setAudioSessionId(mSessionId);
+        return event;
+    }
+
     /*
      * Call BEFORE adding a routing callback handler.
      */
@@ -2105,13 +2231,14 @@
         identity.packageName = opPackageName;
 
         return native_setup(audiorecordThis, attributes, sampleRate, channelMask, channelIndexMask,
-                audioFormat, buffSizeInBytes, sessionId, identity, nativeRecordInJavaObj);
+                audioFormat, buffSizeInBytes, sessionId, identity, nativeRecordInJavaObj, 0);
     }
 
     private native int native_setup(Object audiorecordThis,
             Object /*AudioAttributes*/ attributes,
             int[] sampleRate, int channelMask, int channelIndexMask, int audioFormat,
-            int buffSizeInBytes, int[] sessionId, Identity identity, long nativeRecordInJavaObj);
+            int buffSizeInBytes, int[] sessionId, Identity identity, long nativeRecordInJavaObj,
+            int maxSharedAudioHistoryMs);
 
     // TODO remove: implementation calls directly into implementation of native_release()
     private native void native_finalize();
@@ -2170,6 +2297,8 @@
 
     private native void native_setLogSessionId(@Nullable String logSessionId);
 
+    private native int native_shareAudioHistory(@NonNull String sharedPackage, long startFromMs);
+
     //---------------------------------------------------------
     // Utility methods
     //------------------
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 363da24..ce9d7e3 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -430,6 +430,8 @@
                 return "AUDIO_FORMAT_MAT_2_1"; // (MAT | MAT_SUB_2_1)
             case /* AUDIO_FORMAT_DTS_UHD */           0x2E000000:
                 return "AUDIO_FORMAT_DTS_UHD";
+            case /* AUDIO_FORMAT_DRA */           0x2F000000:
+                return "AUDIO_FORMAT_DRA";
             default:
                 return "AUDIO_FORMAT_(" + audioFormat + ")";
         }
@@ -1464,6 +1466,10 @@
     // usage for AudioRecord.startRecordingSync(), must match AudioSystem::sync_event_t
     /** @hide */ public static final int SYNC_EVENT_NONE = 0;
     /** @hide */ public static final int SYNC_EVENT_PRESENTATION_COMPLETE = 1;
+    /** @hide
+     *  Not used by native implementation.
+     *  See {@link AudioRecord.Builder#setSharedAudioEvent(MediaSyncEvent) */
+    public static final int SYNC_EVENT_SHARE_AUDIO_HISTORY = 100;
 
     /**
      * @hide
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 2ea0984..b2b2f8e 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -45,6 +45,7 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.NioUtils;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Objects;
 import java.util.concurrent.Executor;
@@ -1595,9 +1596,24 @@
             AudioFormat.CHANNEL_OUT_LOW_FREQUENCY |
             AudioFormat.CHANNEL_OUT_BACK_LEFT |
             AudioFormat.CHANNEL_OUT_BACK_RIGHT |
+            AudioFormat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER |
+            AudioFormat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER |
             AudioFormat.CHANNEL_OUT_BACK_CENTER |
             AudioFormat.CHANNEL_OUT_SIDE_LEFT |
-            AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
+            AudioFormat.CHANNEL_OUT_SIDE_RIGHT |
+            AudioFormat.CHANNEL_OUT_TOP_CENTER |
+            AudioFormat.CHANNEL_OUT_TOP_FRONT_LEFT |
+            AudioFormat.CHANNEL_OUT_TOP_FRONT_CENTER |
+            AudioFormat.CHANNEL_OUT_TOP_FRONT_RIGHT |
+            AudioFormat.CHANNEL_OUT_TOP_BACK_LEFT |
+            AudioFormat.CHANNEL_OUT_TOP_BACK_CENTER |
+            AudioFormat.CHANNEL_OUT_TOP_BACK_RIGHT |
+            AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT |
+            AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT |
+            AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_LEFT |
+            AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_CENTER |
+            AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_RIGHT |
+            AudioFormat.CHANNEL_OUT_LOW_FREQUENCY_2;
 
     // Returns a boolean whether the attributes, format, bufferSizeInBytes, mode allow
     // power saving to be automatically enabled for an AudioTrack. Returns false if
@@ -1748,6 +1764,26 @@
         mDataLoadMode = mode;
     }
 
+    // General pair map
+    private static final HashMap<String, Integer> CHANNEL_PAIR_MAP = new HashMap<>() {{
+        put("front", AudioFormat.CHANNEL_OUT_FRONT_LEFT
+                | AudioFormat.CHANNEL_OUT_FRONT_RIGHT);
+        put("back", AudioFormat.CHANNEL_OUT_BACK_LEFT
+                | AudioFormat.CHANNEL_OUT_BACK_RIGHT);
+        put("front of center", AudioFormat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER
+                | AudioFormat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER);
+        put("side", AudioFormat.CHANNEL_OUT_SIDE_LEFT
+                | AudioFormat.CHANNEL_OUT_SIDE_RIGHT);
+        put("top front", AudioFormat.CHANNEL_OUT_TOP_FRONT_LEFT
+                | AudioFormat.CHANNEL_OUT_TOP_FRONT_RIGHT);
+        put("top back", AudioFormat.CHANNEL_OUT_TOP_BACK_LEFT
+                | AudioFormat.CHANNEL_OUT_TOP_BACK_RIGHT);
+        put("top side", AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT
+                | AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT);
+        put("bottom front", AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_LEFT
+                | AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_RIGHT);
+    }};
+
     /**
      * Convenience method to check that the channel configuration (a.k.a channel mask) is supported
      * @param channelConfig the mask to validate
@@ -1774,21 +1810,15 @@
                 loge("Front channels must be present in multichannel configurations");
                 return false;
         }
-        final int backPair =
-                AudioFormat.CHANNEL_OUT_BACK_LEFT | AudioFormat.CHANNEL_OUT_BACK_RIGHT;
-        if ((channelConfig & backPair) != 0) {
-            if ((channelConfig & backPair) != backPair) {
-                loge("Rear channels can't be used independently");
+        // Check all pairs to see that they are matched (front duplicated here).
+        for (HashMap.Entry<String, Integer> e : CHANNEL_PAIR_MAP.entrySet()) {
+            final int positionPair = e.getValue();
+            if ((channelConfig & positionPair) != 0
+                    && (channelConfig & positionPair) != positionPair) {
+                loge("Channel pair (" + e.getKey() + ") cannot be used independently");
                 return false;
             }
         }
-        final int sidePair =
-                AudioFormat.CHANNEL_OUT_SIDE_LEFT | AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
-        if ((channelConfig & sidePair) != 0
-                && (channelConfig & sidePair) != sidePair) {
-            loge("Side channels can't be used independently");
-            return false;
-        }
         return true;
     }
 
diff --git a/media/java/android/media/CamcorderProfile.java b/media/java/android/media/CamcorderProfile.java
index 2059f02..f6f0a59 100644
--- a/media/java/android/media/CamcorderProfile.java
+++ b/media/java/android/media/CamcorderProfile.java
@@ -442,6 +442,7 @@
      * camera on the device. If the device has no back-facing camera, this returns null.
      * @param quality the target quality level for the camcorder profile
      * @see #get(int, int)
+     * @deprecated Use {@link #getAll} instead
      */
     public static CamcorderProfile get(int quality) {
         int numberOfCameras = Camera.getNumberOfCameras();
@@ -508,6 +509,7 @@
      * @see #QUALITY_HIGH_SPEED_720P
      * @see #QUALITY_HIGH_SPEED_1080P
      * @see #QUALITY_HIGH_SPEED_2160P
+     * @deprecated Use {@link #getAll} instead
      * @throws IllegalArgumentException if quality is not one of the defined QUALITY_ values.
     */
     public static CamcorderProfile get(int cameraId, int quality) {
@@ -549,9 +551,9 @@
      * resolution and higher audio sampling rate, etc, than those with lower quality
      * level.
      *
-     * @param cameraId the id for the camera. Numeric camera ids parsed from the list received by
-     *                 invoking {@link CameraManager#getCameraIdList} can be used as long as they
-     *                 are {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE}
+     * @param cameraId the id for the camera. Numeric camera ids from the list received by invoking
+     *                 {@link CameraManager#getCameraIdList} can be used as long as they are
+     *                 {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE}
      *                 and not
      *                 {@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL EXTERNAL}.
      * @param quality the target quality level for the camcorder profile.
diff --git a/media/java/android/media/EncoderProfiles.java b/media/java/android/media/EncoderProfiles.java
index ca3daef..d9eabbd4 100644
--- a/media/java/android/media/EncoderProfiles.java
+++ b/media/java/android/media/EncoderProfiles.java
@@ -51,14 +51,14 @@
  * <li> Number of audio channels for recording.
  * </ul>
  */
-public class EncoderProfiles
+public final class EncoderProfiles
 {
     /**
      * Default recording duration in seconds before the session is terminated.
-     * This is useful for applications like MMS has limited file size requirement.
+     * This is useful for applications like MMS that have a limited file size requirement.
      * This could be 0 if there is no default recording duration.
      */
-    public int getDurationSeconds() {
+    public int getDefaultDurationSeconds() {
         return durationSecs;
     }
 
@@ -66,19 +66,19 @@
      * Recommended output file format
      * @see android.media.MediaRecorder.OutputFormat
      */
-    public int getFileFormat() {
+    public @MediaRecorder.OutputFormatValues int getRecommendedFileFormat() {
         return fileFormat;
     }
 
     /**
      * Configuration for a video encoder.
      */
-    public static class VideoProfile {
+    public final static class VideoProfile {
         /**
          * The video encoder being used for the video track
          * @see android.media.MediaRecorder.VideoEncoder
          */
-        public int getCodec() {
+        public @MediaRecorder.VideoEncoderValues int getCodec() {
             return codec;
         }
 
@@ -238,12 +238,12 @@
     /**
      * Configuration for an audio encoder.
      */
-    public static class AudioProfile {
+    public final static class AudioProfile {
         /**
          * The audio encoder being used for the audio track.
          * @see android.media.MediaRecorder.AudioEncoder
          */
-        public int getCodec() {
+        public @MediaRecorder.AudioEncoderValues int getCodec() {
             return codec;
         }
 
@@ -326,11 +326,6 @@
         private int bitrate;
     }
 
-    //static {
-    //    System.loadLibrary("media_jni");
-    //native_init();
-    //}
-
     private int durationSecs;
     private int fileFormat;
     // non-modifiable lists
diff --git a/media/java/android/media/HwAudioSource.java b/media/java/android/media/HwAudioSource.java
index e339ae8..167ab65 100644
--- a/media/java/android/media/HwAudioSource.java
+++ b/media/java/android/media/HwAudioSource.java
@@ -37,7 +37,13 @@
     private final AudioDeviceInfo mAudioDeviceInfo;
     private final AudioAttributes mAudioAttributes;
 
-    private int mNativeHandle;
+    /**
+     * The value of the native handle encodes the HwAudioSource state.
+     * The native handle returned by {@link AudioSystem#startAudioSource} is either valid
+     * (aka > 0, so successfully started) or hosting an error code (negative).
+     * 0 corresponds to an untialized or stopped HwAudioSource.
+     */
+    private int mNativeHandle = 0;
 
     /**
      * Class constructor for a hardware audio source based player.
@@ -129,14 +135,18 @@
 
     /**
      * Starts the playback from {@link AudioDeviceInfo}.
+     * Starts does not return any error code, caller must check {@link HwAudioSource#isPlaying} to
+     * ensure the state of the HwAudioSource encoded in {@link mNativeHandle}.
      */
     public void start() {
         Preconditions.checkState(!isPlaying(), "HwAudioSource is currently playing");
         mNativeHandle = AudioSystem.startAudioSource(
                 mAudioDeviceInfo.getPort().activeConfig(),
                 mAudioAttributes);
-        // FIXME: b/174876389 clean up device id reporting
-        baseStart(getDeviceId());
+        if (isPlaying()) {
+            // FIXME: b/174876389 clean up device id reporting
+            baseStart(getDeviceId());
+        }
     }
 
     private int getDeviceId() {
@@ -162,18 +172,23 @@
 
     /**
      * Checks whether the HwAudioSource player is playing.
+     * It checks the state of the HwAudioSource encoded in {@link HwAudioSource#isPlaying}.
+     * 0 corresponds to a stopped or uninitialized HwAudioSource.
+     * Negative value corresponds to a status reported by {@link AudioSystem#startAudioSource} to
+     * indicate a failure when trying to start the HwAudioSource.
+     *
      * @return true if currently playing, false otherwise
      */
     public boolean isPlaying() {
-        return mNativeHandle != 0;
+        return mNativeHandle > 0;
     }
 
     /**
      * Stops the playback from {@link AudioDeviceInfo}.
      */
     public void stop() {
-        baseStop();
         if (mNativeHandle > 0) {
+            baseStop();
             AudioSystem.stopAudioSource(mNativeHandle);
             mNativeHandle = 0;
         }
diff --git a/telephony/java/android/telephony/ims/RcsConfig.aidl b/media/java/android/media/IAudioModeDispatcher.aidl
similarity index 69%
copy from telephony/java/android/telephony/ims/RcsConfig.aidl
copy to media/java/android/media/IAudioModeDispatcher.aidl
index cfd93fb..6162541 100644
--- a/telephony/java/android/telephony/ims/RcsConfig.aidl
+++ b/media/java/android/media/IAudioModeDispatcher.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,6 +14,15 @@
  * limitations under the License.
  */
 
-package android.telephony.ims;
+package android.media;
 
-parcelable RcsConfig;
+/**
+ * AIDL for the AudioService to signal audio mode changes.
+ *
+ * {@hide}
+ */
+oneway interface IAudioModeDispatcher {
+
+    void dispatchAudioModeChanged(int mode);
+
+}
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 7a6369cd..c08c368 100755
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -25,6 +25,7 @@
 import android.media.AudioRecordingConfiguration;
 import android.media.AudioRoutesInfo;
 import android.media.IAudioFocusDispatcher;
+import android.media.IAudioModeDispatcher;
 import android.media.IAudioRoutesObserver;
 import android.media.IAudioServerStateDispatcher;
 import android.media.ICapturePresetDevicesRoleDispatcher;
@@ -383,4 +384,8 @@
             in AudioAttributes aa, in String callingPackageName);
 
     long getFadeOutDurationOnFocusLossMillis(in AudioAttributes aa);
+
+    void registerModeDispatcher(IAudioModeDispatcher dispatcher);
+
+    oneway void unregisterModeDispatcher(IAudioModeDispatcher dispatcher);
 }
diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl
index f817a3c..48289ec 100644
--- a/media/java/android/media/IMediaRouterService.aidl
+++ b/media/java/android/media/IMediaRouterService.aidl
@@ -48,7 +48,7 @@
     // MediaRouterService.java for readability.
 
     // Methods for MediaRouter2
-    void checkModifyAudioRoutingPermission();
+    void enforceMediaContentControlPermission();
     List<MediaRoute2Info> getSystemRoutes();
     RoutingSessionInfo getSystemSessionInfo();
 
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index 50a326e..9bf0db5 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -109,6 +109,15 @@
  * <tr><td>{@link #KEY_ENCODER_DELAY}</td><td>Integer</td><td>optional, the number of frames to trim from the start of the decoded audio stream.</td></tr>
  * <tr><td>{@link #KEY_ENCODER_PADDING}</td><td>Integer</td><td>optional, the number of frames to trim from the end of the decoded audio stream.</td></tr>
  * <tr><td>{@link #KEY_FLAC_COMPRESSION_LEVEL}</td><td>Integer</td><td><b>encoder-only</b>, optional, if content is FLAC audio, specifies the desired compression level.</td></tr>
+ * <tr><td>{@link #KEY_MPEGH_PROFILE_LEVEL_INDICATION}</td><td>Integer</td>
+ *     <td><b>decoder-only</b>, optional, if content is MPEG-H audio,
+ *         specifies the profile and level of the stream.</td></tr>
+ * <tr><td>{@link #KEY_MPEGH_COMPATIBLE_SETS}</td><td>ByteBuffer</td>
+ *     <td><b>decoder-only</b>, optional, if content is MPEG-H audio,
+ *         specifies the compatible sets (profile and level) of the stream.</td></tr>
+ * <tr><td>{@link #KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT}</td>
+ *     <td>Integer</td><td><b>decoder-only</b>, optional, if content is MPEG-H audio,
+ *         specifies the preferred reference channel layout of the stream.</td></tr>
  * </table>
  *
  * Subtitle formats have the following keys:
@@ -867,6 +876,30 @@
     public static final String KEY_FLAC_COMPRESSION_LEVEL = "flac-compression-level";
 
     /**
+     * A key describing the MPEG-H stream profile-level indication.
+     *
+     * See ISO_IEC_23008-3;2019 MHADecoderConfigurationRecord mpegh3daProfileLevelIndication.
+     */
+    public static final String KEY_MPEGH_PROFILE_LEVEL_INDICATION =
+            "mpegh-profile-level-indication";
+
+    /**
+     * A key describing the MPEG-H stream compatible sets.
+     *
+     * See FDAmd_2 of ISO_IEC_23008-3;2019 MHAProfileAndLevelCompatibilitySetBox.
+     */
+    public static final String KEY_MPEGH_COMPATIBLE_SETS = "mpegh-compatible-sets";
+
+    /**
+     * A key describing the MPEG-H stream reference channel layout.
+     *
+     * See ISO_IEC_23008-3;2019 MHADecoderConfigurationRecord referenceChannelLayout
+     * and ISO_IEC_23001‐8 ChannelConfiguration value.
+     */
+    public static final String KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT =
+            "mpegh-reference-channel-layout";
+
+    /**
      * A key describing the encoding complexity.
      * The associated value is an integer.  These values are device and codec specific,
      * but lower values generally result in faster and/or less power-hungry encoding.
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 5eb57da..499034e 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -609,6 +609,25 @@
     };
 
     /**
+     * @hide
+     */
+    @IntDef({
+        OutputFormat.DEFAULT,
+        OutputFormat.THREE_GPP,
+        OutputFormat.MPEG_4,
+        OutputFormat.AMR_NB,
+        OutputFormat.AMR_WB,
+        OutputFormat.AAC_ADIF,
+        OutputFormat.AAC_ADTS,
+        OutputFormat.MPEG_2_TS,
+        OutputFormat.WEBM,
+        OutputFormat.HEIF,
+        OutputFormat.OGG,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface OutputFormatValues {}
+
+    /**
      * Defines the audio encoding. These constants are used with
      * {@link MediaRecorder#setAudioEncoder(int)}.
      */
@@ -635,6 +654,22 @@
     }
 
     /**
+     * @hide
+     */
+    @IntDef({
+        AudioEncoder.DEFAULT,
+        AudioEncoder.AMR_NB,
+        AudioEncoder.AMR_WB,
+        AudioEncoder.AAC,
+        AudioEncoder.HE_AAC,
+        AudioEncoder.AAC_ELD,
+        AudioEncoder.VORBIS,
+        AudioEncoder.OPUS,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface AudioEncoderValues {}
+
+    /**
      * Defines the video encoding. These constants are used with
      * {@link MediaRecorder#setVideoEncoder(int)}.
      */
@@ -652,6 +687,20 @@
     }
 
     /**
+     * @hide
+     */
+    @IntDef({
+        VideoEncoder.DEFAULT,
+        VideoEncoder.H263,
+        VideoEncoder.H264,
+        VideoEncoder.MPEG_4_SP,
+        VideoEncoder.VP8,
+        VideoEncoder.HEVC,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface VideoEncoderValues {}
+
+    /**
      * Sets the audio source to be used for recording. If this method is not
      * called, the output file will not contain an audio track. The source needs
      * to be specified before setting recording-parameters or encoders. Call
@@ -887,7 +936,7 @@
      * setAudioSource()/setVideoSource().
      * @see android.media.MediaRecorder.OutputFormat
      */
-    public native void setOutputFormat(int output_format)
+    public native void setOutputFormat(@OutputFormatValues int output_format)
             throws IllegalStateException;
 
     /**
@@ -970,7 +1019,7 @@
      * setOutputFormat() or after prepare().
      * @see android.media.MediaRecorder.AudioEncoder
      */
-    public native void setAudioEncoder(int audio_encoder)
+    public native void setAudioEncoder(@AudioEncoderValues int audio_encoder)
             throws IllegalStateException;
 
     /**
@@ -983,7 +1032,7 @@
      * setOutputFormat() or after prepare()
      * @see android.media.MediaRecorder.VideoEncoder
      */
-    public native void setVideoEncoder(int video_encoder)
+    public native void setVideoEncoder(@VideoEncoderValues int video_encoder)
             throws IllegalStateException;
 
     /**
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index 90fa9a5..232de0b 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -18,6 +18,7 @@
 
 import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
 
+import android.Manifest;
 import android.annotation.CallbackExecutor;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -93,7 +94,7 @@
 
     // TODO: Specify the fields that are only used (or not used) by system media router.
     private final String mClientPackageName;
-    private final ManagerCallback mManagerCallback;
+    final ManagerCallback mManagerCallback;
 
     private final String mPackageName;
 
@@ -164,13 +165,24 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL)
     @Nullable
     public static MediaRouter2 getInstance(@NonNull Context context,
             @NonNull String clientPackageName) {
         Objects.requireNonNull(context, "context must not be null");
         Objects.requireNonNull(clientPackageName, "clientPackageName must not be null");
 
+        // Note: Even though this check could be somehow bypassed, the other permission checks
+        // in system server will not allow MediaRouter2Manager to be registered.
+        IMediaRouterService serviceBinder = IMediaRouterService.Stub.asInterface(
+                ServiceManager.getService(Context.MEDIA_ROUTER_SERVICE));
+        try {
+            // SecurityException will be thrown if there's no permission.
+            serviceBinder.enforceMediaContentControlPermission();
+        } catch (RemoteException e) {
+            Log.e(TAG, "Unable to check MEDIA_CONTENT_CONTROL permission.");
+        }
+
         PackageManager pm = context.getPackageManager();
         try {
             pm.getPackageInfo(clientPackageName, 0);
@@ -183,20 +195,13 @@
             MediaRouter2 instance = sSystemMediaRouter2Map.get(clientPackageName);
             if (instance == null) {
                 if (sManager == null) {
-                    IMediaRouterService serviceBinder = IMediaRouterService.Stub.asInterface(
-                            ServiceManager.getService(Context.MEDIA_ROUTER_SERVICE));
-                    try {
-                        // MediaRouterService will throw a SecurityException if the caller
-                        // doesn't have MODIFY_AUDIO_ROUTING permission.
-                        serviceBinder.checkModifyAudioRoutingPermission();
-                    } catch (RemoteException e) {
-                        e.rethrowAsRuntimeException();
-                    }
                     sManager = MediaRouter2Manager.getInstance(context.getApplicationContext());
                 }
                 instance = new MediaRouter2(context, clientPackageName);
                 sSystemMediaRouter2Map.put(clientPackageName, instance);
-                instance.registerManagerCallbackForSystemRouter();
+                // Using direct executor here, since MediaRouter2Manager also posts
+                // to the main handler.
+                sManager.registerCallback(Runnable::run, instance.mManagerCallback);
             }
             return instance;
         }
@@ -213,11 +218,15 @@
      * Use {@link RouteCallback} to get the route related events.
      * <p>
      * Note that calling start/stopScan is applied to all system routers in the same process.
+     * <p>
+     * This will be no-op for non-system media routers.
      *
      * @see #stopScan()
+     * @see #getInstance(Context, String)
      * @hide
      */
     @SystemApi
+    @RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL)
     public void startScan() {
         if (isSystemRouter()) {
             sManager.startScan();
@@ -236,11 +245,15 @@
      * Use {@link RouteCallback} to get the route related events.
      * <p>
      * Note that calling start/stopScan is applied to all system routers in the same process.
+     * <p>
+     * This will be no-op for non-system media routers.
      *
      * @see #startScan()
+     * @see #getInstance(Context, String)
      * @hide
      */
     @SystemApi
+    @RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL)
     public void stopScan() {
         if (isSystemRouter()) {
             sManager.stopScan();
@@ -314,7 +327,8 @@
 
     /**
      * Gets the client package name of the app which this media router controls.
-     * This is only non-null when the router instance is created with the client package name.
+     * <p>
+     * This will return null for non-system media routers.
      *
      * @see #getInstance(Context, String)
      * @hide
@@ -573,9 +587,25 @@
             return;
         }
 
-        Objects.requireNonNull(route, "route must not be null");
         Log.v(TAG, "Transferring to route: " + route);
-        transfer(getCurrentController(), route);
+
+        boolean routeFound;
+        synchronized (mLock) {
+            // TODO: Check thread-safety
+            routeFound = mRoutes.containsKey(route.getId());
+        }
+        if (!routeFound) {
+            notifyTransferFailure(route);
+            return;
+        }
+
+        RoutingController controller = getCurrentController();
+        if (controller.getRoutingSessionInfo().getTransferableRoutes().contains(route.getId())) {
+            controller.transferToRoute(route);
+            return;
+        }
+
+        requestCreateController(controller, route, MANAGER_REQUEST_ID_NONE);
     }
 
     /**
@@ -594,36 +624,20 @@
 
     /**
      * Transfers the media of a routing controller to the given route.
+     * <p>
+     * This will be no-op for non-system media routers.
+     *
      * @param controller a routing controller controlling media routing.
      * @param route the route you want to transfer the media to.
      * @hide
      */
     @SystemApi
+    @RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL)
     public void transfer(@NonNull RoutingController controller, @NonNull MediaRoute2Info route) {
         if (isSystemRouter()) {
             sManager.transfer(controller.getRoutingSessionInfo(), route);
             return;
         }
-
-        Objects.requireNonNull(controller, "controller must not be null");
-        Objects.requireNonNull(route, "route must not be null");
-
-        boolean routeFound;
-        synchronized (mLock) {
-            // TODO: Check thread-safety
-            routeFound = mRoutes.containsKey(route.getId());
-        }
-        if (!routeFound) {
-            notifyTransferFailure(route);
-            return;
-        }
-
-        if (controller.getRoutingSessionInfo().getTransferableRoutes().contains(route.getId())) {
-            controller.transferToRoute(route);
-            return;
-        }
-
-        requestCreateController(controller, route, MANAGER_REQUEST_ID_NONE);
     }
 
     void requestCreateController(@NonNull RoutingController controller,
@@ -687,9 +701,7 @@
     /**
      * Gets a {@link RoutingController} whose ID is equal to the given ID.
      * Returns {@code null} if there is no matching controller.
-     * @hide
      */
-    @SystemApi
     @Nullable
     public RoutingController getController(@NonNull String id) {
         Objects.requireNonNull(id, "id must not be null");
@@ -739,14 +751,16 @@
 
     /**
      * Requests a volume change for the route asynchronously.
-     * <p>
      * It may have no effect if the route is currently not selected.
-     * </p>
+     * <p>
+     * This will be no-op for non-system media routers.
      *
      * @param volume The new volume value between 0 and {@link MediaRoute2Info#getVolumeMax}.
+     * @see #getInstance(Context, String)
      * @hide
      */
     @SystemApi
+    @RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL)
     public void setRouteVolume(@NonNull MediaRoute2Info route, int volume) {
         Objects.requireNonNull(route, "route must not be null");
 
@@ -754,18 +768,7 @@
             sManager.setRouteVolume(route, volume);
             return;
         }
-
-        MediaRouter2Stub stub;
-        synchronized (mLock) {
-            stub = mStub;
-        }
-        if (stub != null) {
-            try {
-                mMediaRouterService.setRouteVolumeWithRouter2(stub, route, volume);
-            } catch (RemoteException ex) {
-                Log.e(TAG, "Unable to set route volume.", ex);
-            }
-        }
+        // If this API needs to be public, use IMediaRouterService#setRouteVolumeWithRouter2()
     }
 
     void syncRoutesOnHandler(List<MediaRoute2Info> currentRoutes,
@@ -1040,15 +1043,6 @@
     }
 
     /**
-     * Registers {@link MediaRouter2Manager.Callback} for getting events.
-     * Should only used for system media routers.
-     */
-    private void registerManagerCallbackForSystemRouter() {
-        // Using direct executor here, since MediaRouter2Manager also posts to the main handler.
-        sManager.registerCallback(Runnable::run, mManagerCallback);
-    }
-
-    /**
      * Returns a {@link RoutingSessionInfo} which has the client package name.
      * The client package name is set only when the given sessionInfo doesn't have it.
      * Should only used for system media routers.
@@ -1073,6 +1067,9 @@
     }
 
     private void updateAllRoutesFromManager() {
+        if (!isSystemRouter()) {
+            return;
+        }
         synchronized (mLock) {
             mRoutes.clear();
             for (MediaRoute2Info route : sManager.getAllRoutes()) {
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index 758a813..915cb12 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -49,6 +49,8 @@
 
 /**
  * A class that monitors and controls media routing of other apps.
+ * {@link android.Manifest.permission#MEDIA_CONTENT_CONTROL} is required to use this class,
+ * or {@link SecurityException} will be thrown.
  * @hide
  */
 public final class MediaRouter2Manager {
diff --git a/media/java/android/media/MediaServiceManager.java b/media/java/android/media/MediaServiceManager.java
index b899559..fd89c0c 100644
--- a/media/java/android/media/MediaServiceManager.java
+++ b/media/java/android/media/MediaServiceManager.java
@@ -45,12 +45,21 @@
      */
     public static final class ServiceRegisterer {
         private final String mServiceName;
+        private final boolean mLazyStart;
+
+        /**
+         * @hide
+         */
+        public ServiceRegisterer(String serviceName, boolean lazyStart) {
+            mServiceName = serviceName;
+            mLazyStart = lazyStart;
+        }
 
         /**
          * @hide
          */
         public ServiceRegisterer(String serviceName) {
-            mServiceName = serviceName;
+            this(serviceName, false /*lazyStart*/);
         }
 
         /**
@@ -61,6 +70,9 @@
          */
         @Nullable
         public IBinder get() {
+            if (mLazyStart) {
+                return ServiceManager.waitForService(mServiceName);
+            }
             return ServiceManager.getService(mServiceName);
         }
     }
@@ -78,7 +90,7 @@
      */
     @NonNull
     public ServiceRegisterer getMediaTranscodingServiceRegisterer() {
-        return new ServiceRegisterer(MEDIA_TRANSCODING_SERVICE);
+        return new ServiceRegisterer(MEDIA_TRANSCODING_SERVICE, true /*lazyStart*/);
     }
 
     /**
diff --git a/media/java/android/media/MediaSyncEvent.java b/media/java/android/media/MediaSyncEvent.java
index 04448f0..fa7d5b8 100644
--- a/media/java/android/media/MediaSyncEvent.java
+++ b/media/java/android/media/MediaSyncEvent.java
@@ -16,6 +16,13 @@
 
 package android.media;
 
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
 /**
  * The MediaSyncEvent class defines events that can be used to synchronize playback or capture
  * actions between different players and recorders.
@@ -24,7 +31,7 @@
  * The audio session ID is retrieved from a player (e.g {@link MediaPlayer}, {@link AudioTrack} or
  * {@link ToneGenerator}) by use of the getAudioSessionId() method.
  */
-public class MediaSyncEvent {
+public class MediaSyncEvent implements Parcelable {
 
     /**
      * No sync event specified. When used with a synchronized playback or capture method, the
@@ -39,8 +46,16 @@
      * {@link #setAudioSessionId(int)} method.
      */
     public static final int SYNC_EVENT_PRESENTATION_COMPLETE =
-                                                    AudioSystem.SYNC_EVENT_PRESENTATION_COMPLETE;
+            AudioSystem.SYNC_EVENT_PRESENTATION_COMPLETE;
 
+    /**
+     * @hide
+     * Used when sharing audio history between AudioRecord instances.
+     * See {@link AudioRecord.Builder#setSharedAudioEvent(MediaSyncEvent).
+     */
+    @SystemApi
+    public static final int SYNC_EVENT_SHARE_AUDIO_HISTORY =
+            AudioSystem.SYNC_EVENT_SHARE_AUDIO_HISTORY;
 
     /**
      * Creates a synchronization event of the sepcified type.
@@ -112,11 +127,86 @@
 
     private static boolean isValidType(int type) {
         switch (type) {
-        case SYNC_EVENT_NONE:
-        case SYNC_EVENT_PRESENTATION_COMPLETE:
-            return true;
-        default:
-            return false;
+            case SYNC_EVENT_NONE:
+            case SYNC_EVENT_PRESENTATION_COMPLETE:
+            case SYNC_EVENT_SHARE_AUDIO_HISTORY:
+                return true;
+            default:
+                return false;
         }
     }
+
+    // Parcelable implementation
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        Objects.requireNonNull(dest);
+        dest.writeInt(mType);
+        dest.writeInt(mAudioSession);
+    }
+
+    private MediaSyncEvent(Parcel in) {
+        mType = in.readInt();
+        mAudioSession = in.readInt();
+    }
+
+    public static final @NonNull Parcelable.Creator<MediaSyncEvent> CREATOR =
+            new Parcelable.Creator<MediaSyncEvent>() {
+        /**
+         * Rebuilds an MediaSyncEvent previously stored with writeToParcel().
+         * @param p Parcel object to read the MediaSyncEvent from
+         * @return a new MediaSyncEvent created from the data in the parcel
+         */
+        public MediaSyncEvent createFromParcel(Parcel p) {
+            return new MediaSyncEvent(p);
+        }
+        public MediaSyncEvent[] newArray(int size) {
+            return new MediaSyncEvent[size];
+        }
+    };
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        MediaSyncEvent that = (MediaSyncEvent) o;
+        return ((mType == that.mType)
+                && (mAudioSession == that.mAudioSession));
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mType, mAudioSession);
+    }
+
+    @Override
+    public String toString() {
+        return new String("MediaSyncEvent:"
+                + " type=" + typeToString(mType)
+                + " session=" + mAudioSession);
+    }
+
+    /**
+     * Returns the string representation for the type.
+     * @param type one of the {@link MediaSyncEvent} type constants
+     * @hide
+     */
+    public static @NonNull String typeToString(int type) {
+        switch (type) {
+            case SYNC_EVENT_NONE:
+                return "SYNC_EVENT_NONE";
+            case SYNC_EVENT_PRESENTATION_COMPLETE:
+                return "SYNC_EVENT_PRESENTATION_COMPLETE";
+            case SYNC_EVENT_SHARE_AUDIO_HISTORY:
+                return "SYNC_EVENT_SHARE_AUDIO_HISTORY";
+            default:
+                return "unknown event type " + type;
+        }
+    }
+
 }
diff --git a/media/java/android/media/session/PlaybackState.java b/media/java/android/media/session/PlaybackState.java
index e7d30eb..9eacc74 100644
--- a/media/java/android/media/session/PlaybackState.java
+++ b/media/java/android/media/session/PlaybackState.java
@@ -19,7 +19,6 @@
 import android.annotation.IntDef;
 import android.annotation.LongDef;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -493,15 +492,26 @@
 
     /**
      * Returns whether this is considered as an active playback state.
-     * @hide
+     * <p>
+     * The playback state is considered as an active if the state is one of the following:
+     * <ul>
+     * <li>{@link #STATE_BUFFERING}</li>
+     * <li>{@link #STATE_CONNECTING}</li>
+     * <li>{@link #STATE_FAST_FORWARDING}</li>
+     * <li>{@link #STATE_PLAYING}</li>
+     * <li>{@link #STATE_REWINDING}</li>
+     * <li>{@link #STATE_SKIPPING_TO_NEXT}</li>
+     * <li>{@link #STATE_SKIPPING_TO_PREVIOUS}</li>
+     * <li>{@link #STATE_SKIPPING_TO_QUEUE_ITEM}</li>
+     * </ul>
      */
-    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    public boolean isActiveState() {
+    public boolean isActive() {
         switch (mState) {
             case PlaybackState.STATE_FAST_FORWARDING:
             case PlaybackState.STATE_REWINDING:
             case PlaybackState.STATE_SKIPPING_TO_PREVIOUS:
             case PlaybackState.STATE_SKIPPING_TO_NEXT:
+            case PlaybackState.STATE_SKIPPING_TO_QUEUE_ITEM:
             case PlaybackState.STATE_BUFFERING:
             case PlaybackState.STATE_CONNECTING:
             case PlaybackState.STATE_PLAYING:
diff --git a/media/java/android/media/tv/TunedInfo.java b/media/java/android/media/tv/TunedInfo.java
index 6199c89..20acefa 100644
--- a/media/java/android/media/tv/TunedInfo.java
+++ b/media/java/android/media/tv/TunedInfo.java
@@ -25,6 +25,7 @@
 import android.os.Parcelable;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.Surface;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -92,18 +93,20 @@
     private final String mInputId;
     @Nullable private final Uri mChannelUri;
     private final boolean mIsRecordingSession;
-    private final boolean mIsForeground;
+    private final boolean mIsVisible;
+    private final boolean mIsMainSession;
     @AppType private final int mAppType;
     private final int mAppTag;
 
     /** @hide */
     public TunedInfo(
             String inputId, @Nullable Uri channelUri, boolean isRecordingSession,
-            boolean isForeground, @AppType int appType, int appTag) {
+            boolean isVisible, boolean isMainSession, @AppType int appType, int appTag) {
         mInputId = inputId;
         mChannelUri = channelUri;
         mIsRecordingSession = isRecordingSession;
-        mIsForeground = isForeground;
+        mIsVisible = isVisible;
+        mIsMainSession = isMainSession;
         mAppType = appType;
         mAppTag = appTag;
     }
@@ -114,7 +117,8 @@
         String uriString = source.readString();
         mChannelUri = uriString == null ? null : Uri.parse(uriString);
         mIsRecordingSession = (source.readInt() == 1);
-        mIsForeground = (source.readInt() == 1);
+        mIsVisible = (source.readInt() == 1);
+        mIsMainSession = (source.readInt() == 1);
         mAppType = source.readInt();
         mAppTag = source.readInt();
     }
@@ -145,11 +149,23 @@
     }
 
     /**
-     * Returns {@code true} if the application is a foreground application.
-     * @see android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
+     * Returns {@code true} if the corresponding session is visible.
+     * <p>The system checks whether the {@link Surface} of the session is {@code null} or not. When
+     * it becomes invisible, the surface is destroyed and set to null.
+     * @see TvInputService.Session#onSetSurface(Surface)
+     * @see android.view.SurfaceView#notifySurfaceDestroyed
      */
-    public boolean isForeground() {
-        return mIsForeground;
+    public boolean isVisible() {
+        return mIsVisible;
+    }
+
+    /**
+     * Returns {@code true} if the corresponding session is set as main session.
+     * @see TvView#setMain
+     * @see TvInputService.Session#onSetMain
+     */
+    public boolean isMainSession() {
+        return mIsMainSession;
     }
 
     /**
@@ -180,7 +196,8 @@
         String uriString = mChannelUri == null ? null : mChannelUri.toString();
         dest.writeString(uriString);
         dest.writeInt(mIsRecordingSession ? 1 : 0);
-        dest.writeInt(mIsForeground ? 1 : 0);
+        dest.writeInt(mIsVisible ? 1 : 0);
+        dest.writeInt(mIsMainSession ? 1 : 0);
         dest.writeInt(mAppType);
         dest.writeInt(mAppTag);
     }
@@ -190,7 +207,8 @@
         return "inputID=" + mInputId
                 + ";channelUri=" + mChannelUri
                 + ";isRecording=" + mIsRecordingSession
-                + ";isForeground=" + mIsForeground
+                + ";isVisible=" + mIsVisible
+                + ";isMainSession=" + mIsMainSession
                 + ";appType=" + mAppType
                 + ";appTag=" + mAppTag;
     }
@@ -206,7 +224,8 @@
         return TextUtils.equals(mInputId, other.getInputId())
                 && Objects.equals(mChannelUri, other.mChannelUri)
                 && mIsRecordingSession == other.mIsRecordingSession
-                && mIsForeground == other.mIsForeground
+                && mIsVisible == other.mIsVisible
+                && mIsMainSession == other.mIsMainSession
                 && mAppType == other.mAppType
                 && mAppTag == other.mAppTag;
     }
@@ -214,6 +233,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(
-                mInputId, mChannelUri, mIsRecordingSession, mIsForeground, mAppType, mAppTag);
+                mInputId, mChannelUri, mIsRecordingSession, mIsVisible, mIsMainSession, mAppType,
+                mAppTag);
     }
 }
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index c0185dc..34e4609 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -907,6 +907,7 @@
          * @hide
          */
         @SystemApi
+        @RequiresPermission(android.Manifest.permission.ACCESS_TUNED_INFO)
         public void onCurrentTunedInfosUpdated(@NonNull List<TunedInfo> tunedInfos) {
         }
     }
@@ -1989,7 +1990,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission("com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS")
+    @RequiresPermission(android.Manifest.permission.ACCESS_TUNED_INFO)
     @NonNull
     public List<TunedInfo> getCurrentTunedInfos() {
         try {
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index f54e266..5d9b12d 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -982,7 +982,7 @@
 TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
     TunerFrontendIsdbsSettings isdbsSettings{
         .frequency = (int)settings.isdbs().frequency,
-        .streamId = (int)settings.isdbs().streamId,
+        .streamId = (char16_t)settings.isdbs().streamId,
         .streamIdType = (int)settings.isdbs().streamIdType,
         .modulation = (int)settings.isdbs().modulation,
         .codeRate = (int)settings.isdbs().coderate,
@@ -996,7 +996,7 @@
         const FrontendSettings& settings) {
     TunerFrontendIsdbs3Settings isdbs3Settings{
         .frequency = (int)settings.isdbs3().frequency,
-        .streamId = (int)settings.isdbs3().streamId,
+        .streamId = (char16_t)settings.isdbs3().streamId,
         .streamIdType = (int)settings.isdbs3().streamIdType,
         .modulation = (int)settings.isdbs3().modulation,
         .codeRate = (int)settings.isdbs3().coderate,
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
index 4b0062b..eaa4f03 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
@@ -42,6 +42,8 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import android.Manifest;
+import android.app.UiAutomation;
 import android.content.Context;
 import android.media.MediaRoute2Info;
 import android.media.MediaRouter2;
@@ -87,6 +89,7 @@
     private static final String TEST_NAME_UNKNOWN = "unknown";
 
     private Context mContext;
+    private UiAutomation mUiAutomation;
     private MediaRouter2Manager mManager;
     private MediaRouter2 mRouter2;
     private Executor mExecutor;
@@ -110,6 +113,8 @@
     @Before
     public void setUp() throws Exception {
         mContext = InstrumentationRegistry.getTargetContext();
+        mUiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        mUiAutomation.adoptShellPermissionIdentity(Manifest.permission.MEDIA_CONTENT_CONTROL);
         mManager = MediaRouter2Manager.getInstance(mContext);
         mRouter2 = MediaRouter2.getInstance(mContext);
         // If we need to support thread pool executors, change this to thread pool executor.
@@ -129,6 +134,8 @@
             instance.setProxy(null);
             instance.setSpy(null);
         }
+
+        mUiAutomation.dropShellPermissionIdentity();
     }
 
     @Test
diff --git a/native/android/Android.bp b/native/android/Android.bp
index 5bb4fbc..3ee2c18 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -64,7 +64,7 @@
         "surface_texture.cpp",
         "system_fonts.cpp",
         "trace.cpp",
-        "thermal.cpp"
+        "thermal.cpp",
     ],
 
     shared_libs: [
@@ -77,7 +77,7 @@
         "libbinder",
         "libui",
         "libgui",
-        "libharfbuzz_ng",  // Only for including hb.h via minikin
+        "libharfbuzz_ng", // Only for including hb.h via minikin
         "libsensor",
         "libactivitymanager_aidl",
         "libandroid_runtime",
@@ -98,7 +98,10 @@
         "libarect",
     ],
 
-    header_libs: [ "libhwui_internal_headers", "libandroid_headers_private"],
+    header_libs: [
+        "libhwui_internal_headers",
+        "libandroid_headers_private",
+    ],
 
     whole_static_libs: ["libnativewindow"],
 
@@ -106,14 +109,17 @@
 
     include_dirs: ["bionic/libc/dns/include"],
 
-    local_include_dirs: [ "include_platform", ],
+    local_include_dirs: ["include_platform"],
 
-    export_include_dirs: [ "include_platform", ],
+    export_include_dirs: ["include_platform"],
 
     version_script: "libandroid.map.txt",
     stubs: {
         symbol_file: "libandroid.map.txt",
-        versions: ["29", "31"],
+        versions: [
+            "29",
+            "31",
+        ],
     },
 }
 
@@ -121,7 +127,11 @@
 cc_library_shared {
     name: "libandroid_net",
     defaults: ["libandroid_defaults"],
-    llndk_stubs: "libandroid_net.llndk",
+    llndk: {
+        symbol_file: "libandroid_net.map.txt",
+        unversioned: true,
+        override_export_include_dirs: ["include"],
+    },
     srcs: ["net.c"],
 
     shared_libs: ["libnetd_client"],
@@ -129,34 +139,26 @@
     include_dirs: ["bionic/libc/dns/include"],
 }
 
-llndk_library {
-    name: "libandroid_net.llndk",
-    export_include_dirs: ["include"],
-    symbol_file: "libandroid_net.map.txt",
-    unversioned: true,
-}
-
-
 // Aidl library for platform compat.
 cc_library_shared {
     name: "lib-platform-compat-native-api",
     cflags: [
-            "-Wall",
-            "-Werror",
-            "-Wno-missing-field-initializers",
-            "-Wno-unused-variable",
-            "-Wunused-parameter",
-        ],
+        "-Wall",
+        "-Werror",
+        "-Wno-missing-field-initializers",
+        "-Wno-unused-variable",
+        "-Wunused-parameter",
+    ],
     shared_libs: [
         "libbinder",
-         "libutils",
+        "libutils",
     ],
     aidl: {
         local_include_dirs: ["aidl"],
         export_aidl_headers: true,
     },
     srcs: [
-         ":platform-compat-native-aidl",
+        ":platform-compat-native-aidl",
     ],
     export_include_dirs: ["aidl"],
 }
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index 4d137e0..de6db1a 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -259,9 +259,11 @@
     ASurfaceTransaction_setHdrMetadata_cta861_3; # introduced=29
     ASurfaceTransaction_setHdrMetadata_smpte2086; # introduced=29
     ASurfaceTransaction_setOnComplete; # introduced=29
+    ASurfaceTransaction_setOnCommit; # introduced=31
     ASurfaceTransaction_setPosition; # introduced=31
-    ASurfaceTransaction_setSourceRect; # introduced=31
-    ASurfaceTransaction_setTransform; # introduced=31
+    ASurfaceTransaction_setCrop; # introduced=31
+    ASurfaceTransaction_setBufferTransform; # introduced=31
+    ASurfaceTransaction_setScale; # introduced=31
     ASurfaceTransaction_setVisibility; # introduced=29
     ASurfaceTransaction_setZOrder; # introduced=29
     ASystemFontIterator_open; # introduced=29
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index 7433cf9..7540a14 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -260,6 +260,7 @@
     std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
     int64_t latchTime;
     sp<Fence> presentFence;
+    bool transactionCompleted;
 };
 
 int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
@@ -269,6 +270,9 @@
 
 int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
     CHECK_NOT_NULL(aSurfaceTransactionStats);
+    LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
+                        "ASurfaceTransactionStats queried from an incomplete transaction callback");
+
     auto& presentFence = aSurfaceTransactionStats->presentFence;
     return (presentFence) ? presentFence->dup() : -1;
 }
@@ -313,6 +317,8 @@
             ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
     CHECK_NOT_NULL(aSurfaceTransactionStats);
     CHECK_NOT_NULL(aSurfaceControl);
+    LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
+                        "ASurfaceTransactionStats queried from an incomplete transaction callback");
 
     const auto& aSurfaceControlStats =
             aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
@@ -334,7 +340,6 @@
 void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
                                        ASurfaceTransaction_OnComplete func) {
     CHECK_NOT_NULL(aSurfaceTransaction);
-    CHECK_NOT_NULL(context);
     CHECK_NOT_NULL(func);
 
     TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
@@ -345,6 +350,7 @@
 
         aSurfaceTransactionStats.latchTime = latchTime;
         aSurfaceTransactionStats.presentFence = presentFence;
+        aSurfaceTransactionStats.transactionCompleted = true;
 
         auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
 
@@ -443,7 +449,7 @@
     sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
     Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
 
-    transaction->setCrop(surfaceControl, sourceRect);
+    transaction->setBufferCrop(surfaceControl, sourceRect);
 
     float dsdx = (destination.right - destination.left) /
             static_cast<float>(sourceRect.right - sourceRect.left);
@@ -459,34 +465,31 @@
     transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
 }
 
-void ASurfaceTransaction_setSourceRect(ASurfaceTransaction* aSurfaceTransaction,
-                                       ASurfaceControl* aSurfaceControl, const ARect& source) {
+void ASurfaceTransaction_setCrop(ASurfaceTransaction* aSurfaceTransaction,
+                                 ASurfaceControl* aSurfaceControl, const ARect& crop) {
     CHECK_NOT_NULL(aSurfaceTransaction);
     CHECK_NOT_NULL(aSurfaceControl);
-    CHECK_VALID_RECT(source);
+    CHECK_VALID_RECT(crop);
 
     sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
     Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
 
-    transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
+    transaction->setCrop(surfaceControl, static_cast<const Rect&>(crop));
 }
 
-void ASurfaceTransaction_setPosition(ASurfaceTransaction* /* aSurfaceTransaction */,
-                                     ASurfaceControl* /* aSurfaceControl */,
-                                     const ARect& /* destination */) {
-    // TODO: Fix this function
-    /* CHECK_NOT_NULL(aSurfaceTransaction);
+void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
+                                     ASurfaceControl* aSurfaceControl, int32_t x, int32_t y) {
+    CHECK_NOT_NULL(aSurfaceTransaction);
     CHECK_NOT_NULL(aSurfaceControl);
-    CHECK_VALID_RECT(destination);
 
     sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
     Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
 
-    transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));*/
+    transaction->setPosition(surfaceControl, x, y);
 }
 
-void ASurfaceTransaction_setTransform(ASurfaceTransaction* aSurfaceTransaction,
-                                      ASurfaceControl* aSurfaceControl, int32_t transform) {
+void ASurfaceTransaction_setBufferTransform(ASurfaceTransaction* aSurfaceTransaction,
+                                            ASurfaceControl* aSurfaceControl, int32_t transform) {
     CHECK_NOT_NULL(aSurfaceTransaction);
     CHECK_NOT_NULL(aSurfaceControl);
 
@@ -499,6 +502,19 @@
     transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
 }
 
+void ASurfaceTransaction_setScale(ASurfaceTransaction* aSurfaceTransaction,
+                                  ASurfaceControl* aSurfaceControl, float xScale, float yScale) {
+    CHECK_NOT_NULL(aSurfaceTransaction);
+    CHECK_NOT_NULL(aSurfaceControl);
+    LOG_ALWAYS_FATAL_IF(xScale < 0, "negative value passed in for xScale");
+    LOG_ALWAYS_FATAL_IF(yScale < 0, "negative value passed in for yScale");
+
+    sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
+    Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+    transaction->setMatrix(surfaceControl, xScale, 0, 0, yScale);
+}
+
 void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
                                                ASurfaceControl* aSurfaceControl,
                                                int8_t transparency) {
@@ -685,3 +701,33 @@
                       layer_state_t::eEnableBackpressure : 0;
     transaction->setFlags(surfaceControl, flags, layer_state_t::eEnableBackpressure);
 }
+
+void ASurfaceTransaction_setOnCommit(ASurfaceTransaction* aSurfaceTransaction, void* context,
+                                     ASurfaceTransaction_OnCommit func) {
+    CHECK_NOT_NULL(aSurfaceTransaction);
+    CHECK_NOT_NULL(func);
+
+    TransactionCompletedCallbackTakesContext callback =
+            [func](void* callback_context, nsecs_t latchTime, const sp<Fence>& /* presentFence */,
+                   const std::vector<SurfaceControlStats>& surfaceControlStats) {
+                ASurfaceTransactionStats aSurfaceTransactionStats;
+                aSurfaceTransactionStats.latchTime = latchTime;
+                aSurfaceTransactionStats.transactionCompleted = false;
+
+                auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
+                for (const auto&
+                             [surfaceControl, latchTime, acquireTime, presentFence,
+                              previousReleaseFence, transformHint,
+                              frameEvents] : surfaceControlStats) {
+                    ASurfaceControl* aSurfaceControl =
+                            reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
+                    aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
+                }
+
+                (*func)(callback_context, &aSurfaceTransactionStats);
+            };
+
+    Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
+
+    transaction->addTransactionCommittedCallback(callback, context);
+}
\ No newline at end of file
diff --git a/native/graphics/jni/imagedecoder.cpp b/native/graphics/jni/imagedecoder.cpp
index 385e455..b0c8c61 100644
--- a/native/graphics/jni/imagedecoder.cpp
+++ b/native/graphics/jni/imagedecoder.cpp
@@ -442,6 +442,15 @@
         return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
     }
 
+    const auto colorType = imageDecoder->getOutputInfo().colorType();
+    switch (colorType) {
+        case kN32_SkColorType:
+        case kRGBA_F16_SkColorType:
+            break;
+        default:
+            return ANDROID_IMAGE_DECODER_INVALID_STATE;
+    }
+
     if (imageDecoder->advanceFrame()) {
         return ANDROID_IMAGE_DECODER_SUCCESS;
     }
diff --git a/packages/Android.bp b/packages/Android.bp
index 8b0698b..0030015 100644
--- a/packages/Android.bp
+++ b/packages/Android.bp
@@ -13,6 +13,15 @@
 // limitations under the License.
 
 // Defaults for platform apps
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
 java_defaults {
     name: "platform_app_defaults",
     plugins: ["error_prone_android_framework"],
diff --git a/packages/Connectivity/framework/api/module-lib-current.txt b/packages/Connectivity/framework/api/module-lib-current.txt
index c8b04a3..90580fa 100644
--- a/packages/Connectivity/framework/api/module-lib-current.txt
+++ b/packages/Connectivity/framework/api/module-lib-current.txt
@@ -10,8 +10,7 @@
     method @NonNull @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public java.util.List<android.net.NetworkStateSnapshot> getAllNetworkStateSnapshots();
     method @Nullable public android.net.ProxyInfo getGlobalProxy();
     method @NonNull public static android.util.Range<java.lang.Integer> getIpSecNetIdRange();
-    method @NonNull public static String getPrivateDnsMode(@NonNull android.content.Context);
-    method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerDefaultNetworkCallbackAsUid(int, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
+    method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerDefaultNetworkCallbackForUid(int, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
     method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void registerSystemDefaultNetworkCallback(@NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
     method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void requestBackgroundNetwork(@NonNull android.net.NetworkRequest, @NonNull android.net.ConnectivityManager.NetworkCallback, @NonNull android.os.Handler);
     method @Deprecated public boolean requestRouteToHostAddress(int, java.net.InetAddress);
@@ -20,7 +19,6 @@
     method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void setAvoidUnvalidated(@NonNull android.net.Network);
     method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setGlobalProxy(@Nullable android.net.ProxyInfo);
     method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void setLegacyLockdownVpnEnabled(boolean);
-    method public static void setPrivateDnsMode(@NonNull android.content.Context, @NonNull String);
     method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setProfileNetworkPreference(@NonNull android.os.UserHandle, int, @Nullable java.util.concurrent.Executor, @Nullable Runnable);
     method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public void setRequireVpnForUids(boolean, @NonNull java.util.Collection<android.util.Range<java.lang.Integer>>);
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_TEST_NETWORKS, android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle);
@@ -40,9 +38,6 @@
     field public static final int BLOCKED_REASON_LOCKDOWN_VPN = 16; // 0x10
     field public static final int BLOCKED_REASON_NONE = 0; // 0x0
     field public static final int BLOCKED_REASON_RESTRICTED_MODE = 8; // 0x8
-    field public static final String PRIVATE_DNS_MODE_OFF = "off";
-    field public static final String PRIVATE_DNS_MODE_OPPORTUNISTIC = "opportunistic";
-    field public static final String PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = "hostname";
     field public static final int PROFILE_NETWORK_PREFERENCE_DEFAULT = 0; // 0x0
     field public static final int PROFILE_NETWORK_PREFERENCE_ENTERPRISE = 1; // 0x1
   }
@@ -69,6 +64,7 @@
     method @NonNull public static java.time.Duration getNetworkSwitchNotificationRateDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
     method @NonNull public static String getPrivateDnsDefaultMode(@NonNull android.content.Context);
     method @Nullable public static String getPrivateDnsHostname(@NonNull android.content.Context);
+    method public static int getPrivateDnsMode(@NonNull android.content.Context);
     method public static boolean getWifiAlwaysRequested(@NonNull android.content.Context, boolean);
     method @NonNull public static java.time.Duration getWifiDataActivityTimeout(@NonNull android.content.Context, @NonNull java.time.Duration);
     method public static void setCaptivePortalHttpUrl(@NonNull android.content.Context, @Nullable String);
@@ -85,8 +81,9 @@
     method public static void setNetworkMeteredMultipathPreference(@NonNull android.content.Context, @NonNull String);
     method public static void setNetworkSwitchNotificationMaximumDailyCount(@NonNull android.content.Context, @IntRange(from=0) int);
     method public static void setNetworkSwitchNotificationRateDuration(@NonNull android.content.Context, @NonNull java.time.Duration);
-    method public static void setPrivateDnsDefaultMode(@NonNull android.content.Context, @NonNull String);
+    method public static void setPrivateDnsDefaultMode(@NonNull android.content.Context, @NonNull int);
     method public static void setPrivateDnsHostname(@NonNull android.content.Context, @Nullable String);
+    method public static void setPrivateDnsMode(@NonNull android.content.Context, int);
     method public static void setWifiAlwaysRequested(@NonNull android.content.Context, boolean);
     method public static void setWifiDataActivityTimeout(@NonNull android.content.Context, @NonNull java.time.Duration);
     field public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; // 0x2
@@ -95,6 +92,9 @@
     field public static final int NETWORK_AVOID_BAD_WIFI_AVOID = 2; // 0x2
     field public static final int NETWORK_AVOID_BAD_WIFI_IGNORE = 0; // 0x0
     field public static final int NETWORK_AVOID_BAD_WIFI_PROMPT = 1; // 0x1
+    field public static final int PRIVATE_DNS_MODE_OFF = 1; // 0x1
+    field public static final int PRIVATE_DNS_MODE_OPPORTUNISTIC = 2; // 0x2
+    field public static final int PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = 3; // 0x3
   }
 
   public final class NetworkAgentConfig implements android.os.Parcelable {
@@ -166,11 +166,11 @@
   public final class VpnTransportInfo implements android.os.Parcelable android.net.TransportInfo {
     ctor public VpnTransportInfo(int, @Nullable String);
     method public int describeContents();
+    method @Nullable public String getSessionId();
+    method public int getType();
     method @NonNull public android.net.VpnTransportInfo makeCopy(long);
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.net.VpnTransportInfo> CREATOR;
-    field @Nullable public final String sessionId;
-    field public final int type;
   }
 
 }
diff --git a/packages/Connectivity/framework/api/system-current.txt b/packages/Connectivity/framework/api/system-current.txt
index 3ca7475..52673c9 100644
--- a/packages/Connectivity/framework/api/system-current.txt
+++ b/packages/Connectivity/framework/api/system-current.txt
@@ -240,7 +240,7 @@
     method public final void sendSocketKeepaliveEvent(int, int);
     method @Deprecated public void setLegacySubtype(int, @NonNull String);
     method public void setLingerDuration(@NonNull java.time.Duration);
-    method public void setTeardownDelayMs(@IntRange(from=0, to=0x1388) int);
+    method public void setTeardownDelayMillis(@IntRange(from=0, to=0x1388) int);
     method public final void setUnderlyingNetworks(@Nullable java.util.List<android.net.Network>);
     method public void unregister();
     field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2
diff --git a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java
index b3c1997..0c5eaa7 100644
--- a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java
+++ b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java
@@ -16,8 +16,6 @@
 package android.net;
 
 import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
-import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_DEFAULT_MODE;
-import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE;
 import static android.net.NetworkRequest.Type.BACKGROUND_REQUEST;
 import static android.net.NetworkRequest.Type.LISTEN;
 import static android.net.NetworkRequest.Type.LISTEN_FOR_BEST;
@@ -33,7 +31,6 @@
 import android.annotation.RequiresPermission;
 import android.annotation.SdkConstant;
 import android.annotation.SdkConstant.SdkConstantType;
-import android.annotation.StringDef;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
@@ -41,7 +38,6 @@
 import android.app.admin.DevicePolicyManager;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.net.ConnectivityDiagnosticsManager.DataStallReport.DetectionMethod;
@@ -70,7 +66,6 @@
 import android.provider.Settings;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
-import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Log;
 import android.util.Range;
@@ -424,6 +419,9 @@
      * Action used to display a dialog that asks the user whether to connect to a network that is
      * not validated. This intent is used to start the dialog in settings via startActivity.
      *
+     * This action includes a {@link Network} typed extra which is called
+     * {@link ConnectivityManager#EXTRA_NETWORK} that represents the network which is unvalidated.
+     *
      * @hide
      */
     @SystemApi(client = MODULE_LIBRARIES)
@@ -433,6 +431,10 @@
      * Action used to display a dialog that asks the user whether to avoid a network that is no
      * longer validated. This intent is used to start the dialog in settings via startActivity.
      *
+     * This action includes a {@link Network} typed extra which is called
+     * {@link ConnectivityManager#EXTRA_NETWORK} that represents the network which is no longer
+     * validated.
+     *
      * @hide
      */
     @SystemApi(client = MODULE_LIBRARIES)
@@ -444,6 +446,10 @@
      * that has not validated. This intent is used to start the dialog in settings via
      * startActivity.
      *
+     * This action includes a {@link Network} typed extra which is called
+     * {@link ConnectivityManager#EXTRA_NETWORK} that represents the network which has partial
+     * connectivity.
+     *
      * @hide
      */
     @SystemApi(client = MODULE_LIBRARIES)
@@ -810,38 +816,6 @@
     public static final int NETID_UNSET = 0;
 
     /**
-     * Private DNS Mode values.
-     *
-     * The "private_dns_mode" global setting stores a String value which is
-     * expected to be one of the following.
-     */
-
-    /**
-     * @hide
-     */
-    @SystemApi(client = MODULE_LIBRARIES)
-    public static final String PRIVATE_DNS_MODE_OFF = "off";
-    /**
-     * @hide
-     */
-    @SystemApi(client = MODULE_LIBRARIES)
-    public static final String PRIVATE_DNS_MODE_OPPORTUNISTIC = "opportunistic";
-    /**
-     * @hide
-     */
-    @SystemApi(client = MODULE_LIBRARIES)
-    public static final String PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = "hostname";
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @StringDef(value = {
-            PRIVATE_DNS_MODE_OFF,
-            PRIVATE_DNS_MODE_OPPORTUNISTIC,
-            PRIVATE_DNS_MODE_PROVIDER_HOSTNAME,
-    })
-    public @interface PrivateDnsMode {}
-
-    /**
      * Flag to indicate that an app is not subject to any restrictions that could result in its
      * network access blocked.
      *
@@ -4462,7 +4436,7 @@
     @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
     public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback,
             @NonNull Handler handler) {
-        registerDefaultNetworkCallbackAsUid(Process.INVALID_UID, networkCallback, handler);
+        registerDefaultNetworkCallbackForUid(Process.INVALID_UID, networkCallback, handler);
     }
 
     /**
@@ -4492,7 +4466,7 @@
     @RequiresPermission(anyOf = {
             NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
             android.Manifest.permission.NETWORK_SETTINGS})
-    public void registerDefaultNetworkCallbackAsUid(int uid,
+    public void registerDefaultNetworkCallbackForUid(int uid,
             @NonNull NetworkCallback networkCallback, @NonNull Handler handler) {
         CallbackHandler cbHandler = new CallbackHandler(handler);
         sendRequestForNetwork(uid, null /* need */, networkCallback, 0 /* timeoutMs */,
@@ -5492,44 +5466,4 @@
     public static Range<Integer> getIpSecNetIdRange() {
         return new Range(TUN_INTF_NETID_START, TUN_INTF_NETID_START + TUN_INTF_NETID_RANGE - 1);
     }
-
-    /**
-     * Get private DNS mode from settings.
-     *
-     * @param context The Context to query the private DNS mode from settings.
-     * @return A string of private DNS mode as one of the PRIVATE_DNS_MODE_* constants.
-     *
-     * @hide
-     */
-    @SystemApi(client = MODULE_LIBRARIES)
-    @NonNull
-    @PrivateDnsMode
-    public static String getPrivateDnsMode(@NonNull Context context) {
-        final ContentResolver cr = context.getContentResolver();
-        String mode = Settings.Global.getString(cr, PRIVATE_DNS_MODE);
-        if (TextUtils.isEmpty(mode)) mode = Settings.Global.getString(cr, PRIVATE_DNS_DEFAULT_MODE);
-        // If both PRIVATE_DNS_MODE and PRIVATE_DNS_DEFAULT_MODE are not set, choose
-        // PRIVATE_DNS_MODE_OPPORTUNISTIC as default mode.
-        if (TextUtils.isEmpty(mode)) mode = PRIVATE_DNS_MODE_OPPORTUNISTIC;
-        return mode;
-    }
-
-    /**
-     * Set private DNS mode to settings.
-     *
-     * @param context The {@link Context} to set the private DNS mode.
-     * @param mode The private dns mode. This should be one of the PRIVATE_DNS_MODE_* constants.
-     *
-     * @hide
-     */
-    @SystemApi(client = MODULE_LIBRARIES)
-    public static void setPrivateDnsMode(@NonNull Context context,
-            @NonNull @PrivateDnsMode String mode) {
-        if (!(mode == PRIVATE_DNS_MODE_OFF
-                || mode == PRIVATE_DNS_MODE_OPPORTUNISTIC
-                || mode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) {
-            throw new IllegalArgumentException("Invalid private dns mode");
-        }
-        Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_MODE, mode);
-    }
 }
diff --git a/packages/Connectivity/framework/src/android/net/ConnectivitySettingsManager.java b/packages/Connectivity/framework/src/android/net/ConnectivitySettingsManager.java
index 9a00055..31e1fb0 100644
--- a/packages/Connectivity/framework/src/android/net/ConnectivitySettingsManager.java
+++ b/packages/Connectivity/framework/src/android/net/ConnectivitySettingsManager.java
@@ -19,18 +19,15 @@
 import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_HANDOVER;
 import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_PERFORMANCE;
 import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.net.ConnectivityManager.MultipathPreference;
-import android.net.ConnectivityManager.PrivateDnsMode;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Range;
@@ -341,6 +338,37 @@
     public static final String MOBILE_DATA_PREFERRED_APPS = "mobile_data_preferred_apps";
 
     /**
+     * One of the private DNS modes that indicates the private DNS mode is off.
+     */
+    public static final int PRIVATE_DNS_MODE_OFF = 1;
+
+    /**
+     * One of the private DNS modes that indicates the private DNS mode is automatic, which
+     * will try to use the current DNS as private DNS.
+     */
+    public static final int PRIVATE_DNS_MODE_OPPORTUNISTIC = 2;
+
+    /**
+     * One of the private DNS modes that indicates the private DNS mode is strict and the
+     * {@link #PRIVATE_DNS_SPECIFIER} is required, which will try to use the value of
+     * {@link #PRIVATE_DNS_SPECIFIER} as private DNS.
+     */
+    public static final int PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = 3;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(value = {
+            PRIVATE_DNS_MODE_OFF,
+            PRIVATE_DNS_MODE_OPPORTUNISTIC,
+            PRIVATE_DNS_MODE_PROVIDER_HOSTNAME,
+    })
+    public @interface PrivateDnsMode {}
+
+    private static final String PRIVATE_DNS_MODE_OFF_STRING = "off";
+    private static final String PRIVATE_DNS_MODE_OPPORTUNISTIC_STRING = "opportunistic";
+    private static final String PRIVATE_DNS_MODE_PROVIDER_HOSTNAME_STRING = "hostname";
+
+    /**
      * Get mobile data activity timeout from {@link Settings}.
      *
      * @param context The {@link Context} to query the setting.
@@ -689,6 +717,65 @@
                 context.getContentResolver(), GLOBAL_HTTP_PROXY_PAC, "" /* value */);
     }
 
+    private static String getPrivateDnsModeAsString(@PrivateDnsMode int mode) {
+        switch (mode) {
+            case PRIVATE_DNS_MODE_OFF:
+                return PRIVATE_DNS_MODE_OFF_STRING;
+            case PRIVATE_DNS_MODE_OPPORTUNISTIC:
+                return PRIVATE_DNS_MODE_OPPORTUNISTIC_STRING;
+            case PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:
+                return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME_STRING;
+            default:
+                throw new IllegalArgumentException("Invalid private dns mode: " + mode);
+        }
+    }
+
+    private static int getPrivateDnsModeAsInt(String mode) {
+        switch (mode) {
+            case "off":
+                return PRIVATE_DNS_MODE_OFF;
+            case "hostname":
+                return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+            case "opportunistic":
+                return PRIVATE_DNS_MODE_OPPORTUNISTIC;
+            default:
+                throw new IllegalArgumentException("Invalid private dns mode: " + mode);
+        }
+    }
+
+    /**
+     * Get private DNS mode from settings.
+     *
+     * @param context The Context to query the private DNS mode from settings.
+     * @return A string of private DNS mode.
+     */
+    @PrivateDnsMode
+    public static int getPrivateDnsMode(@NonNull Context context) {
+        final ContentResolver cr = context.getContentResolver();
+        String mode = Settings.Global.getString(cr, PRIVATE_DNS_MODE);
+        if (TextUtils.isEmpty(mode)) mode = Settings.Global.getString(cr, PRIVATE_DNS_DEFAULT_MODE);
+        // If both PRIVATE_DNS_MODE and PRIVATE_DNS_DEFAULT_MODE are not set, choose
+        // PRIVATE_DNS_MODE_OPPORTUNISTIC as default mode.
+        if (TextUtils.isEmpty(mode)) return PRIVATE_DNS_MODE_OPPORTUNISTIC;
+        return getPrivateDnsModeAsInt(mode);
+    }
+
+    /**
+     * Set private DNS mode to settings.
+     *
+     * @param context The {@link Context} to set the private DNS mode.
+     * @param mode The private dns mode. This should be one of the PRIVATE_DNS_MODE_* constants.
+     */
+    public static void setPrivateDnsMode(@NonNull Context context, @PrivateDnsMode int mode) {
+        if (!(mode == PRIVATE_DNS_MODE_OFF
+                || mode == PRIVATE_DNS_MODE_OPPORTUNISTIC
+                || mode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) {
+            throw new IllegalArgumentException("Invalid private dns mode: " + mode);
+        }
+        Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_MODE,
+                getPrivateDnsModeAsString(mode));
+    }
+
     /**
      * Get specific private dns provider name from {@link Settings}.
      *
@@ -731,13 +818,14 @@
      *             constants.
      */
     public static void setPrivateDnsDefaultMode(@NonNull Context context,
-            @NonNull @PrivateDnsMode String mode) {
+            @NonNull @PrivateDnsMode int mode) {
         if (!(mode == PRIVATE_DNS_MODE_OFF
                 || mode == PRIVATE_DNS_MODE_OPPORTUNISTIC
                 || mode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) {
             throw new IllegalArgumentException("Invalid private dns mode");
         }
-        Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_DEFAULT_MODE, mode);
+        Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_DEFAULT_MODE,
+                getPrivateDnsModeAsString(mode));
     }
 
     /**
diff --git a/packages/Connectivity/framework/src/android/net/NetworkAgent.java b/packages/Connectivity/framework/src/android/net/NetworkAgent.java
index 518d3f3..adcf338 100644
--- a/packages/Connectivity/framework/src/android/net/NetworkAgent.java
+++ b/packages/Connectivity/framework/src/android/net/NetworkAgent.java
@@ -892,11 +892,11 @@
      * This method may be called at any time while the network is connected. It has no effect if
      * the network is already disconnected and the teardown delay timer is running.
      *
-     * @param teardownDelayMs the teardown delay to set, or 0 to disable teardown delay.
+     * @param teardownDelayMillis the teardown delay to set, or 0 to disable teardown delay.
      */
-    public void setTeardownDelayMs(
-            @IntRange(from = 0, to = MAX_TEARDOWN_DELAY_MS) int teardownDelayMs) {
-        queueOrSendMessage(reg -> reg.sendTeardownDelayMs(teardownDelayMs));
+    public void setTeardownDelayMillis(
+            @IntRange(from = 0, to = MAX_TEARDOWN_DELAY_MS) int teardownDelayMillis) {
+        queueOrSendMessage(reg -> reg.sendTeardownDelayMs(teardownDelayMillis));
     }
 
     /**
diff --git a/packages/Connectivity/framework/src/android/net/NetworkRequest.java b/packages/Connectivity/framework/src/android/net/NetworkRequest.java
index 90aac0e..194b8ff 100644
--- a/packages/Connectivity/framework/src/android/net/NetworkRequest.java
+++ b/packages/Connectivity/framework/src/android/net/NetworkRequest.java
@@ -220,6 +220,10 @@
         public Builder(@NonNull final NetworkRequest request) {
             Objects.requireNonNull(request);
             mNetworkCapabilities = request.networkCapabilities;
+            // If the caller constructed the builder from a request, it means the user
+            // might explicitly want the capabilities from the request. Thus, the NOT_VCN_MANAGED
+            // capabilities should not be touched later.
+            mModifiedNotVcnManaged = true;
         }
 
         /**
diff --git a/packages/Connectivity/framework/src/android/net/ProxyInfo.java b/packages/Connectivity/framework/src/android/net/ProxyInfo.java
index 745e20f..0deda37 100644
--- a/packages/Connectivity/framework/src/android/net/ProxyInfo.java
+++ b/packages/Connectivity/framework/src/android/net/ProxyInfo.java
@@ -37,8 +37,9 @@
  * Apache HTTP stack. So {@link URLConnection} and Apache's {@code HttpClient} will use
  * them automatically.
  *
- * Other HTTP stacks will need to obtain the proxy info from
- * {@link Proxy#PROXY_CHANGE_ACTION} broadcast as the extra {@link Proxy#EXTRA_PROXY_INFO}.
+ * Other HTTP stacks will need to obtain the proxy info by watching for the
+ * {@link Proxy#PROXY_CHANGE_ACTION} broadcast and calling methods such as
+ * {@link android.net.ConnectivityManager#getDefaultProxy}.
  */
 public class ProxyInfo implements Parcelable {
 
diff --git a/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java b/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java
index efd3363..4071c9a 100644
--- a/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java
+++ b/packages/Connectivity/framework/src/android/net/VpnTransportInfo.java
@@ -40,10 +40,10 @@
 @SystemApi(client = MODULE_LIBRARIES)
 public final class VpnTransportInfo implements TransportInfo, Parcelable {
     /** Type of this VPN. */
-    public final int type;
+    private final int mType;
 
     @Nullable
-    public final String sessionId;
+    private final String mSessionId;
 
     @Override
     public @RedactionType long getApplicableRedactions() {
@@ -55,13 +55,28 @@
      */
     @NonNull
     public VpnTransportInfo makeCopy(@RedactionType long redactions) {
-        return new VpnTransportInfo(type,
-            ((redactions & REDACT_FOR_NETWORK_SETTINGS) != 0) ? null : sessionId);
+        return new VpnTransportInfo(mType,
+            ((redactions & REDACT_FOR_NETWORK_SETTINGS) != 0) ? null : mSessionId);
     }
 
     public VpnTransportInfo(int type, @Nullable String sessionId) {
-        this.type = type;
-        this.sessionId = sessionId;
+        this.mType = type;
+        this.mSessionId = sessionId;
+    }
+
+    /**
+     * Returns the session Id of this VpnTransportInfo.
+     */
+    @Nullable
+    public String getSessionId() {
+        return mSessionId;
+    }
+
+    /**
+     * Returns the type of this VPN.
+     */
+    public int getType() {
+        return mType;
     }
 
     @Override
@@ -69,17 +84,17 @@
         if (!(o instanceof VpnTransportInfo)) return false;
 
         VpnTransportInfo that = (VpnTransportInfo) o;
-        return (this.type == that.type) && TextUtils.equals(this.sessionId, that.sessionId);
+        return (this.mType == that.mType) && TextUtils.equals(this.mSessionId, that.mSessionId);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(type, sessionId);
+        return Objects.hash(mType, mSessionId);
     }
 
     @Override
     public String toString() {
-        return String.format("VpnTransportInfo{type=%d, sessionId=%s}", type, sessionId);
+        return String.format("VpnTransportInfo{type=%d, sessionId=%s}", mType, mSessionId);
     }
 
     @Override
@@ -89,8 +104,8 @@
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeInt(type);
-        dest.writeString(sessionId);
+        dest.writeInt(mType);
+        dest.writeString(mSessionId);
     }
 
     public static final @NonNull Creator<VpnTransportInfo> CREATOR =
diff --git a/packages/Connectivity/service/ServiceConnectivityResources/Android.bp b/packages/Connectivity/service/ServiceConnectivityResources/Android.bp
index d783738..f491cc7 100644
--- a/packages/Connectivity/service/ServiceConnectivityResources/Android.bp
+++ b/packages/Connectivity/service/ServiceConnectivityResources/Android.bp
@@ -21,7 +21,7 @@
 
 android_app {
     name: "ServiceConnectivityResources",
-    sdk_version: "module_current",
+    sdk_version: "module_30",
     min_sdk_version: "30",
     resource_dirs: [
         "res",
@@ -31,6 +31,10 @@
     apex_available: [
         "com.android.tethering",
     ],
-    // TODO: use a dedicated cert once generated
-    certificate: "platform",
+    certificate: ":com.android.connectivity.resources.certificate",
+}
+
+android_app_certificate {
+    name: "com.android.connectivity.resources.certificate",
+    certificate: "resources-certs/com.android.connectivity.resources",
 }
diff --git a/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.pk8 b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.pk8
new file mode 100644
index 0000000..bfdc28b
--- /dev/null
+++ b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.pk8
Binary files differ
diff --git a/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.x509.pem b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.x509.pem
new file mode 100644
index 0000000..70eca1c
--- /dev/null
+++ b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources.x509.pem
@@ -0,0 +1,36 @@
+-----BEGIN CERTIFICATE-----
+MIIGQzCCBCugAwIBAgIUZY8nxBMINp/79sziXU77MLPpEXowDQYJKoZIhvcNAQEL
+BQAwga8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH
+DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy
+b2lkMSswKQYDVQQDDCJjb20uYW5kcm9pZC5jb25uZWN0aXZpdHkucmVzb3VyY2Vz
+MSIwIAYJKoZIhvcNAQkBFhNhbmRyb2lkQGFuZHJvaWQuY29tMCAXDTIxMDQyMjA3
+MjkxMFoYDzQ3NTkwMzE5MDcyOTEwWjCBrzELMAkGA1UEBhMCVVMxEzARBgNVBAgM
+CkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB0Fu
+ZHJvaWQxEDAOBgNVBAsMB0FuZHJvaWQxKzApBgNVBAMMImNvbS5hbmRyb2lkLmNv
+bm5lY3Rpdml0eS5yZXNvdXJjZXMxIjAgBgkqhkiG9w0BCQEWE2FuZHJvaWRAYW5k
+cm9pZC5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC361NT9qSz
+h3uLcLBD67HNE1QX3ykwGyw8u7ExzqpsqLCzZsOCFRJQJY+CnrgNaAz0NXeNtx7D
+Lpr9OCWWbG1KTQ/ANlR8g6xCqlAk4xdixsAnIlBUJB90+RlkcWrliEY7OwcqIu3x
+/qe+5UR3irIFZOApNHOm760PjRl7VWAnYZC/PhkW0iKwnBuE96ddPIJc+KuiqCcP
+KflgF4/jmbHTZ+5uvVV4qkfovc744HnQtQoCDoYR8WpsJv3YL5xrAv78o3WCRzx6
+xxB+eUlJpuyyfIee2lUCG4Ly4jgOsWaupnUglLDORnz/L8fhhnpv83wLal7E0Shx
+sqvzZZbb1QLuwMWy++gfzdDvGWewES3BdSFp5NwYWXQGZWSkEEFbIiorKSurU1On
+9OwB0jT/H2B/CAFKYJQ2V+hQ4I7PG+z9p7ZFNR6GZbZuhEr+Dpq1CwtI3W45izr3
+RJgcc2IP6Oj7/XC2MmKGMqZkybBWcvazdyAMHzk9EZIBT2Oru3dnOl3uVUUPeZRs
+xRzqaA0MAlyj+GJ9uziEr3W1j+U1CFEnNWtlD/jqcTAwmaOsn1GhWyMAo1KOrJ/o
+LcJvwk5P/0XEyeli7/DSUpGjYiAgWMHWCOn9s6aYw3YFb+A/SgX3/+FIDib/vHTX
+i76JZfO0CfoKsbFDCH9KOMupHM9EO3ftQwIDAQABo1MwUTAdBgNVHQ4EFgQU/KGg
+gmMqXD5YOe5+B0W+YezN9LcwHwYDVR0jBBgwFoAU/KGggmMqXD5YOe5+B0W+YezN
+9LcwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAhr+AaNaIlRyM
+WKyJ+2Aa35fH5e44Xr/xPpriM5HHxsj0evjMCODqCQ7kzfwSEmtXh5uZYYNKb/JP
+ZMDHIFcYi1QCvm6E6YOd+Qn9CVxrwaDhigJv7ylhVf8q201GTvHhJIU99yFIrzJQ
+RNhxw+pNo7FYMZr3J7JZPAy60DN1KZvRV4FjZx5qiPUMyu4zVygzDkr0v5Ilncdp
+l9VVjOi7ocHyBKI+7RkXl97xN4SUe3vszwZQHCVyVopBw+YrMbDBCrknrQzUEgie
+BuI+kj5oOeiQ0P1i1K+UCCAjrLwhNyc9H02rKUtBHxa2AVjw7YpAJlBesb49Qvq+
+5L6JjHFVSSOEbIjboNib26zNackjbiefF74meSUbGVGfcJ1OdkZsXZWphmER8V7X
+Wz3Z8JwOXW1RLPgcbjilHUR5g8pEmWBv4KrTCSg5IvOJr4w3pyyMBiiVI9NI5sB7
+g5Mi9v3ifPD1OHA4Y3wYCb26mMEpRb8ogOhMHcGNbdnL3QtIUg4cmXGqGSY/LbpU
+np0sIQDSjc46o79F0boPsLlaN3US5WZIu0nc9SHkjoNhd0CJQ5r9aEn4/wNrZgxs
+s8OEKsqcS7OsWiIE6nG51TMDsCuyRBrGedtSUyFFSVSpivpYIrPVNKKlHsJ/o+Nv
+Udb6dBjCraPvJB8binB1aojwya3MwRs=
+-----END CERTIFICATE-----
diff --git a/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/key.pem b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/key.pem
new file mode 100644
index 0000000..38771c2
--- /dev/null
+++ b/packages/Connectivity/service/ServiceConnectivityResources/resources-certs/key.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC361NT9qSzh3uL
+cLBD67HNE1QX3ykwGyw8u7ExzqpsqLCzZsOCFRJQJY+CnrgNaAz0NXeNtx7DLpr9
+OCWWbG1KTQ/ANlR8g6xCqlAk4xdixsAnIlBUJB90+RlkcWrliEY7OwcqIu3x/qe+
+5UR3irIFZOApNHOm760PjRl7VWAnYZC/PhkW0iKwnBuE96ddPIJc+KuiqCcPKflg
+F4/jmbHTZ+5uvVV4qkfovc744HnQtQoCDoYR8WpsJv3YL5xrAv78o3WCRzx6xxB+
+eUlJpuyyfIee2lUCG4Ly4jgOsWaupnUglLDORnz/L8fhhnpv83wLal7E0Shxsqvz
+ZZbb1QLuwMWy++gfzdDvGWewES3BdSFp5NwYWXQGZWSkEEFbIiorKSurU1On9OwB
+0jT/H2B/CAFKYJQ2V+hQ4I7PG+z9p7ZFNR6GZbZuhEr+Dpq1CwtI3W45izr3RJgc
+c2IP6Oj7/XC2MmKGMqZkybBWcvazdyAMHzk9EZIBT2Oru3dnOl3uVUUPeZRsxRzq
+aA0MAlyj+GJ9uziEr3W1j+U1CFEnNWtlD/jqcTAwmaOsn1GhWyMAo1KOrJ/oLcJv
+wk5P/0XEyeli7/DSUpGjYiAgWMHWCOn9s6aYw3YFb+A/SgX3/+FIDib/vHTXi76J
+ZfO0CfoKsbFDCH9KOMupHM9EO3ftQwIDAQABAoICAQCXM/GKqtAXBIBOT/Ops0C2
+n3hYM9BRy1UgDRKNJyG3OSwkIY0ECbzHhUmpkkEwTGWx8675JB43Sr6DBUDpnPRw
+zE/xrvjgcQQSvqAq40PbohhhU/WEZzoxWYVFrXS7hcBve4TVYGgMtlZEO4qBWNYo
+Vxlu5r9Z89tsWI0ldzgYyD5O64eG2nVIit6Y/11p6pAmTQ4WKHYMIm7xUA2siTPH
+4L8F7cQx8pQxxLI+q5WaPuweasBQShA7IAc7T1EiLRFitCOsWlJfgf6Oa7oTwhcA
+Wh7JOyf+Fo4ejlqVwcTwOss6YOPGge7LgQWr5HoORbeqTuXgmy/L4Z85+EABNOs1
+5muHZvsuPXSmW6g1bCi8zvQcjFIX31yBVg8zkdG8WRezFxiVlN8UFAx4rwo03aBs
+rDyU4GCxoUBvF/M9534l1gKOyr0hlQ40nQ4kBabbm2wWOKCVzmLEtFmWX9RV0tjX
+pEtTCqgsGlsIypLy21+uow8SBojhkZ+xORCF2XivGu6SKtvwGvjpYXpXrI6DN4Lw
+kH5J5FwSu1SNY8tnIEJEmj8IMTp+Vw20kwNVTcwdC2nJDDiezJum4PqZRdWIuupm
+BWzXD3fvMXqHmT02sJTQ+FRAgiQLLWDzNAYMJUofzuIwycs4iO9MOPHjkHScvk4N
+FXLrzFBSbdw+wi1DdzzMuQKCAQEA5wx07O5bHBHybs6tpwuZ0TuJ3OIVXh/ocNVR
+gSOCSMirv+K4u3jToXwjfTXUc9lcn+DenZPpGmUWF0sZ83ytZm1eFVgGZpP6941C
+waSeb8zGsgbEyZIQTVILfgtyPDwdtgu0d1Ip+ppj9czXmnxMY/ruHOX1Do1UfZoA
+UA1ytHJSjFKU6saAhHrdk91soTVzc/E3uo7U4Ff0L8/3tT3DAEFYxDXUCH8W2IZZ
+6zVvlqnPH4elxsPYM6rtIwq52reOTLNxC+SFSamK/82zu09Kjj5sQ6HKlvKJFiL5
+bULWu4lenoDfEN0lng+QopJTgZq4/tgOLum43C/Zd0PGC9R6PwKCAQEAy8fvPqwM
+gPbNasni9qGVG+FfiFd/wEMlgKlVVqi+WzF6tCAnXCQXXg3A7FpLQrX8hVKdMznq
+wPgM5AXP4FOguBFNk65chZmPizBIUDPJ4TNHI8FcGgcxbKGvDdVHsUpa/h5rJlvV
+GLJTKV4KjcsTjl5tlRsJ48bSfpBNQHpSKlCswT6jjteiDY6Rln0GFKQIKDHqp3I6
+Zn1E4yfdiIz9VnMPfg1fbjBeR7s1zNzlrR8Dv9oK9tkzI5G1wSbdzksg2O1q2tvg
+WrZrTAA3Uw6sPUMft0vk5Jw6a6CLkrcfayv3xDHwvM/4P3HgP8j9WQ8at8ttHpfD
+oWyt3fZ3pBuj/QKCAQANqxH7tjoTlgg2f+mL+Ua3NwN32rQS5mZUznnM3vHlJmHq
+rxnolURHyFU9IgMYe2JcXuwsfESM+C/vXtUBL33+kje/oX53cQemv2eUlw18ZavX
+ekkH96kZOeJOKZUvdQr46wZZDLZJCfsh3mVe0T2fqIePlBcELl4yM/sSwUjo3d5+
+SKBgpy+RJseW6MF1Y/kZgcqfMbXsM6fRcEciJK41hKggq2KIwiPy2TfWj0mzqwYC
+wn6PHKTcoZ73tLm786Hqba8hWfp8mhgL+/pG+XDaq1yyP48BkQWFFrqUuSCE5aKA
+U/VeRQblq9wNkgR4pVOOV++23MK/2+DMimjb6Ez3AoIBABIXK7wKlgmU32ONjKKM
+capJ9asq6WJuE5Q6dCL/U/bQi64V9KiPY6ur2OailW/UrBhB30a+64I6AxrzESM/
+CVON5a8omXoayc13edP05QUjAjvAXKbK4K5eJCY8OuMYUL+if6ymFmLc4dkYSiOQ
+Vaob4+qKvfQEoIcv1EvXEBhFlTCKmQaDShWeBHqxmqqWbUr0M3qt/1U95bGsxlPr
+AEp+aG+uTDyB+ryvd/U53wHhcPnFJ5gGbC3KL7J3+tTngoD/gq7vOhmTfC8BDehH
+sy61GMmy6R0KaX1IgVuC+j0PaC14qYB5jfZD675930/asWqDmqpOmsVn2n+L888T
+zRkCggEBAIMuNhhfGGY6E4PLUcPM0LZA4tI/wTpeYEahunU1hWIYo/iZB9od2biz
+EeYY4BtkzCoE5ZWYXqTgiMxN4hJ4ufB+5umZ4BO0Gyx4p2/Ik2uv1BXu++GbM+TI
+eeFmaBh00dTtjccpeZEDgNkjAO7Rh9GV2ifl3uhqg0MnFXywPUX2Vm2bmwQXnfV9
+wY2TXgOmBN2epFBOArJwiA5IfV+bSqXCFCx8fgyOWpMNq9+zDRd6KCeHyge54ahm
+jMhCncp1OPDPaV+gnUdgWDGcywYg0KQvu5dLuCFfvucnsWoH2txsVZrXFha5XSM4
+/4Pif3Aj5E9dm1zkUtZJYQbII5SKQ94=
+-----END PRIVATE KEY-----
diff --git a/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm b/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm
index 2a95cfe..44d5a0c 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm
@@ -85,14 +85,14 @@
 key 9 {
     label:                              '9'
     base:                               '\u0669'
-    shift:                              '('
+    shift:                              ')'
     capslock:                           '9'
 }
 
 key 0 {
     label:                              '0'
     base:                               '\u0660'
-    shift:                              ')'
+    shift:                              '('
     capslock:                           '0'
 }
 
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
index 62dfc51..579a6b2 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
@@ -16,29 +16,39 @@
   -->
 <androidx.coordinatorlayout.widget.CoordinatorLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/content_parent"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
 
     <com.google.android.material.appbar.AppBarLayout
         android:id="@+id/app_bar"
         android:layout_width="match_parent"
-        android:layout_height="180dp"
+        android:layout_height="wrap_content"
+        android:fitsSystemWindows="true"
+        android:outlineAmbientShadowColor="@android:color/transparent"
+        android:outlineSpotShadowColor="@android:color/transparent"
+        android:background="@android:color/transparent"
         android:theme="@style/Theme.CollapsingToolbar.Settings">
 
         <com.android.settingslib.collapsingtoolbar.AdjustableToolbarLayout
             android:id="@+id/collapsing_toolbar"
-            android:background="?android:attr/colorPrimary"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
+            android:layout_height="@dimen/toolbar_one_line_height"
+            android:clipToPadding="false"
+            app:contentScrim="?androidprv:attr/colorSurfaceHeader"
             app:maxLines="3"
-            app:contentScrim="?android:attr/colorPrimary"
+            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
+            app:scrimAnimationDuration="50"
+            app:scrimVisibleHeightTrigger="@dimen/scrim_visible_height_trigger"
+            app:statusBarScrim="@empty"
+            app:titleCollapseMode="fade"
             app:collapsedTitleTextAppearance="@style/CollapsingToolbarTitle.Collapsed"
-            app:statusBarScrim="?android:attr/colorPrimary"
-            app:layout_scrollFlags="scroll|exitUntilCollapsed"
-            app:expandedTitleMarginStart="18dp"
-            app:expandedTitleMarginEnd="18dp"
+            app:expandedTitleTextAppearance="@style/CollapsingToolbarTitle.Expanded"
+            app:expandedTitleMarginStart="@dimen/expanded_title_margin_start"
+            app:expandedTitleMarginEnd="@dimen/expanded_title_margin_end"
             app:toolbarId="@id/action_bar">
 
             <Toolbar
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night/themes.xml
index e20775e..878275a 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night/themes.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night/themes.xml
@@ -15,8 +15,9 @@
   limitations under the License.
 -->
 <resources>
-    <style name="Theme.CollapsingToolbar.Settings"
-           parent="@style/Theme.MaterialComponents.DayNight">
+    <style name="Theme.CollapsingToolbar.Settings" parent="@style/Theme.MaterialComponents.DayNight">
+        <item name="elevationOverlayEnabled">true</item>
+        <item name="elevationOverlayColor">?attr/colorPrimary</item>
         <item name="colorPrimary">@*android:color/primary_dark_device_default_settings</item>
         <item name="colorAccent">@*android:color/accent_device_default_dark</item>
     </style>
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/dimens.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/dimens.xml
new file mode 100644
index 0000000..f0cdaf6
--- /dev/null
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/dimens.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<resources>
+    <!-- Collapsing toolbar layout dimensions -->
+    <dimen name="toolbar_one_line_height">226dp</dimen>
+    <dimen name="toolbar_two_lines_height">270dp</dimen>
+    <dimen name="toolbar_three_lines_height">314dp</dimen>
+    <dimen name="scrim_visible_height_trigger">174dp</dimen>
+    <dimen name="expanded_title_margin_start">24dp</dimen>
+    <dimen name="expanded_title_margin_end">24dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/styles.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/styles.xml
index 1157a34..2a72a1a 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/styles.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/styles.xml
@@ -15,16 +15,11 @@
   limitations under the License.
 -->
 <resources>
-    <style name="CollapsingToolbarTitle.Collapsed"
-           parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+    <style name="CollapsingToolbarTitle.Collapsed" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
         <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
     </style>
 
-    <style name="CollapsingToolbarTitle" parent="CollapsingToolbarTitle.Collapsed">
-        <item name="android:textSize">36sp</item>
-    </style>
-
-    <style name="CollapsingToolbarTitle.MoreThanTwoLines">
-        <item name="android:textSize">24sp</item>
+    <style name="CollapsingToolbarTitle.Expanded" parent="CollapsingToolbarTitle.Collapsed">
+        <item name="android:textSize">36dp</item>
     </style>
 </resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/themes.xml
index de545b0..2e7a6a9 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/themes.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values/themes.xml
@@ -15,8 +15,9 @@
   limitations under the License.
 -->
 <resources>
-    <style name="Theme.CollapsingToolbar.Settings"
-           parent="@style/Theme.MaterialComponents.DayNight">
+    <style name="Theme.CollapsingToolbar.Settings" parent="@style/Theme.MaterialComponents.DayNight">
+        <item name="elevationOverlayEnabled">true</item>
+        <item name="elevationOverlayColor">?attr/colorPrimary</item>
         <item name="colorPrimary">@*android:color/primary_device_default_settings_light</item>
         <item name="colorAccent">@*android:color/accent_device_default_light</item>
     </style>
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/AdjustableToolbarLayout.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/AdjustableToolbarLayout.java
index e75a978..b3053ac 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/AdjustableToolbarLayout.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/AdjustableToolbarLayout.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.View;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -51,17 +52,24 @@
         initCollapsingToolbar();
     }
 
+    @SuppressWarnings("RestrictTo")
     private void initCollapsingToolbar() {
         this.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
             @Override
             public void onLayoutChange(View v, int left, int top, int right, int bottom,
                     int oldLeft, int oldTop, int oldRight, int oldBottom) {
                 v.removeOnLayoutChangeListener(this);
-                final int count = getLineCount();
+                final int count = getLineCountWithReflection();
                 if (count > TOOLBAR_MAX_LINE_NUMBER) {
-                    setExpandedTitleTextAppearance(R.style.CollapsingToolbarTitle_MoreThanTwoLines);
-                } else {
-                    setExpandedTitleTextAppearance(R.style.CollapsingToolbarTitle);
+                    final ViewGroup.LayoutParams lp = getLayoutParams();
+                    lp.height = getResources()
+                            .getDimensionPixelSize(R.dimen.toolbar_three_lines_height);
+                    setLayoutParams(lp);
+                } else if (count == TOOLBAR_MAX_LINE_NUMBER) {
+                    final ViewGroup.LayoutParams lp = getLayoutParams();
+                    lp.height = getResources()
+                            .getDimensionPixelSize(R.dimen.toolbar_two_lines_height);
+                    setLayoutParams(lp);
                 }
             }
         });
@@ -73,9 +81,10 @@
      * drawn in a canvas and the text process is wrapped in a CollapsingTextHelper, the way we used
      * here is to get the line count from the CollapsingTextHelper via Java Reflection.
      */
-    private int getLineCount() {
+    private int getLineCountWithReflection() {
         try {
-            final Field textHelperField = this.getClass().getDeclaredField("collapsingTextHelper");
+            final Field textHelperField =
+                    this.getClass().getSuperclass().getDeclaredField("collapsingTextHelper");
             textHelperField.setAccessible(true);
             final Object textHelperObj = textHelperField.get(this);
 
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
index b29205d..f5641bd 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
@@ -78,16 +78,18 @@
     public void setTitle(CharSequence title) {
         if (mCollapsingToolbarLayout != null) {
             mCollapsingToolbarLayout.setTitle(title);
+        } else {
+            super.setTitle(title);
         }
-        super.setTitle(title);
     }
 
     @Override
     public void setTitle(int titleId) {
         if (mCollapsingToolbarLayout != null) {
             mCollapsingToolbarLayout.setTitle(getText(titleId));
+        } else {
+            super.setTitle(titleId);
         }
-        super.setTitle(titleId);
     }
 
     @Override
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java
index 47551df..c47638a 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java
@@ -27,6 +27,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.core.os.BuildCompat;
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.settingslib.transition.SettingsTransitionHelper;
@@ -41,7 +42,7 @@
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+        if (BuildCompat.isAtLeastS()) {
             getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
             SettingsTransitionHelper.applyForwardTransition(this);
             SettingsTransitionHelper.applyBackwardTransition(this);
@@ -51,7 +52,7 @@
 
     @Override
     public void startActivity(Intent intent) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+        if (!BuildCompat.isAtLeastS()) {
             super.startActivity(intent);
             return;
         }
@@ -67,7 +68,7 @@
 
     @Override
     public void startActivity(Intent intent, @Nullable Bundle options) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+        if (!BuildCompat.isAtLeastS()) {
             super.startActivity(intent, options);
             return;
         }
@@ -82,7 +83,7 @@
 
     @Override
     public void startActivityForResult(Intent intent, int requestCode) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || requestCode == DEFAULT_REQUEST) {
+        if (!BuildCompat.isAtLeastS() || requestCode == DEFAULT_REQUEST) {
             super.startActivityForResult(intent, requestCode);
             return;
         }
@@ -98,7 +99,7 @@
 
     @Override
     public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || requestCode == DEFAULT_REQUEST) {
+        if (!BuildCompat.isAtLeastS() || requestCode == DEFAULT_REQUEST) {
             super.startActivityForResult(intent, requestCode, options);
             return;
         }
diff --git a/packages/SettingsLib/LayoutPreference/res/layout/settings_entity_header.xml b/packages/SettingsLib/LayoutPreference/res/layout/settings_entity_header.xml
index 3f0a06c..50f69d1 100644
--- a/packages/SettingsLib/LayoutPreference/res/layout/settings_entity_header.xml
+++ b/packages/SettingsLib/LayoutPreference/res/layout/settings_entity_header.xml
@@ -64,7 +64,9 @@
             style="@style/TextAppearance.EntityHeaderSummary"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginTop="2dp"/>
+            android:layout_marginTop="2dp"
+            android:singleLine="false"
+            android:textAlignment="center"/>
 
         <TextView
             android:id="@+id/entity_header_second_summary"
diff --git a/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml
index 5ff0dc7..403e417 100644
--- a/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml
+++ b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml
@@ -65,9 +65,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:singleLine="true"
-            android:textAppearance="?android:attr/textAppearanceListItem"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal"/>
+            android:textAppearance="?android:attr/textAppearanceListItem"/>
 
         <LinearLayout
             android:id="@+id/summary_container"
diff --git a/packages/SettingsLib/SearchWidget/res/values-es-rUS/strings.xml b/packages/SettingsLib/SearchWidget/res/values-es-rUS/strings.xml
index 9b735fe..d385101 100644
--- a/packages/SettingsLib/SearchWidget/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-es-rUS/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">"Buscar configuraciones"</string>
+    <string name="search_menu" msgid="1914043873178389845">"Buscar configuración"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-kn/strings.xml b/packages/SettingsLib/SearchWidget/res/values-kn/strings.xml
index a492ec0..eccf6c7 100644
--- a/packages/SettingsLib/SearchWidget/res/values-kn/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-kn/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/SettingsSpinner/res/drawable/settings_spinner_background.xml b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
index b38e3e3..80c95f5 100644
--- a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
+++ b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml
@@ -17,6 +17,7 @@
 
 <layer-list
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:priv-android="http://schemas.android.com/apk/prv/res/android"
     android:paddingMode="stack">
 
     <item
@@ -26,10 +27,7 @@
             <corners
                 android:radius="28dp"/>
             <solid
-                android:color="?android:attr/colorAccent"/>
-            <stroke
-                android:color="?android:attr/colorPrimary"
-                android:width="1dp"/>
+                android:color="?priv-android:attr/colorAccentPrimary"/>
             <size
                 android:height="@dimen/spinner_height"/>
         </shape>
diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_dropdown_background.xml b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_dropdown_background.xml
index 8cac988..7bdf643 100644
--- a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_dropdown_background.xml
+++ b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_dropdown_background.xml
@@ -15,19 +15,15 @@
   limitations under the License.
   -->
 
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+<layer-list
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:priv-android="http://schemas.android.com/apk/prv/res/android">
 
     <item>
         <shape>
             <solid
-                android:color="?android:attr/colorAccent"/>
+                android:color="?priv-android:attr/colorAccentSecondary"/>
         </shape>
     </item>
 
-    <item>
-        <shape>
-            <solid android:color="#BBFFFFFF"/>
-        </shape>
-    </item>
-
-</layer-list>
+</layer-list>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values/themes.xml b/packages/SettingsLib/SettingsTheme/res/values/themes.xml
index 9c096d2..771fbc2 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/themes.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/themes.xml
@@ -26,7 +26,11 @@
 
     <!-- Using in SubSettings page including injected settings page -->
     <style name="Theme.SubSettingsBase" parent="Theme.SettingsBase">
+        <!-- Suppress the built-in action bar -->
         <item name="android:windowActionBar">false</item>
         <item name="android:windowNoTitle">true</item>
+        <!-- Set up edge-to-edge configuration for top app bar -->
+        <item name="android:navigationBarColor">@android:color/transparent</item>
+        <item name="android:statusBarColor">@android:color/transparent</item>
     </style>
 </resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java b/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java
index 6560a18..ed447f8 100644
--- a/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java
+++ b/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java
@@ -25,6 +25,7 @@
 
 import androidx.core.os.BuildCompat;
 
+import com.google.android.material.transition.platform.FadeThroughProvider;
 import com.google.android.material.transition.platform.MaterialSharedAxis;
 import com.google.android.material.transition.platform.SlideDistanceProvider;
 
@@ -35,6 +36,7 @@
 
     private static final String TAG = "SettingsTransitionHelper";
     private static final long DURATION = 450L;
+    private static final float FADE_THROUGH_THRESHOLD = 0.22F;
 
     private static MaterialSharedAxis createSettingsSharedAxis(Context context, boolean forward) {
         final MaterialSharedAxis transition = new MaterialSharedAxis(MaterialSharedAxis.X, forward);
@@ -48,12 +50,14 @@
         forwardDistanceProvider.setSlideDistance(distance);
         transition.setDuration(DURATION);
 
+        final FadeThroughProvider fadeThroughProvider =
+                (FadeThroughProvider) transition.getSecondaryAnimatorProvider();
+        fadeThroughProvider.setProgressThreshold(FADE_THROUGH_THRESHOLD);
+
         final Interpolator interpolator =
                 AnimationUtils.loadInterpolator(context, R.interpolator.fast_out_extra_slow_in);
         transition.setInterpolator(interpolator);
 
-        // TODO(b/177480673): Update fade through threshold once (cl/362065364) is released
-
         return transition;
     }
 
diff --git a/packages/SettingsLib/TopIntroPreference/res/values/styles.xml b/packages/SettingsLib/TopIntroPreference/res/values/styles.xml
index e7eb9f4..65869b5 100644
--- a/packages/SettingsLib/TopIntroPreference/res/values/styles.xml
+++ b/packages/SettingsLib/TopIntroPreference/res/values/styles.xml
@@ -17,7 +17,7 @@
 <resources>
     <style name="TextAppearance.TopIntroText"
            parent="@*android:style/TextAppearance.DeviceDefault">
-        <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
+        <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
         <item name="android:textSize">14sp</item>
         <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
diff --git a/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml b/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml
index d2c6fa2..8c20e02 100644
--- a/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml
+++ b/packages/SettingsLib/UsageProgressBarPreference/res/layout/preference_usage_progress_bar.xml
@@ -24,7 +24,6 @@
     android:orientation="vertical"
     android:layout_marginStart="16dp"
     android:layout_marginEnd="16dp"
-    android:paddingTop="16dp"
     android:paddingBottom="16dp">
 
     <androidx.constraintlayout.widget.ConstraintLayout
@@ -64,8 +63,8 @@
         style="?android:attr/progressBarStyleHorizontal"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:scaleY="4"
-        android:max="100"/>
+        android:max="100"
+        android:scaleY="1"/>
 
     <TextView
         android:id="@+id/bottom_summary"
diff --git a/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java b/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java
index fbf325c..782b483 100644
--- a/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java
+++ b/packages/SettingsLib/UsageProgressBarPreference/src/com/android/settingslib/widget/UsageProgressBarPreference.java
@@ -40,7 +40,7 @@
  */
 public class UsageProgressBarPreference extends Preference {
 
-    private final Pattern mNumberPattern = Pattern.compile("[\\d]*\\.?[\\d]+");
+    private final Pattern mNumberPattern = Pattern.compile("[\\d]*[\\.,]?[\\d]+");
 
     private CharSequence mUsageSummary;
     private CharSequence mTotalSummary;
@@ -113,7 +113,14 @@
 
     /** Set percentage of the progress bar. */
     public void setPercent(long usage, long total) {
-        if (total == 0L || usage >  total) {
+        if (usage >  total) {
+            return;
+        }
+        if (total == 0L) {
+            if (mPercent != 0) {
+                mPercent = 0;
+                notifyChanged();
+            }
             return;
         }
         final int percent = (int) (usage / (double) total * 100);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 9c7aac1..4558a8a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -24,6 +24,10 @@
 import android.bluetooth.BluetoothUuid;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -32,12 +36,16 @@
 import android.text.TextUtils;
 import android.util.EventLog;
 import android.util.Log;
+import android.util.LruCache;
+import android.util.Pair;
 
 import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.util.ArrayUtils;
 import com.android.settingslib.R;
 import com.android.settingslib.Utils;
+import com.android.settingslib.utils.ThreadUtils;
+import com.android.settingslib.widget.AdaptiveOutlineDrawable;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -100,6 +108,8 @@
     private boolean mIsHearingAidProfileConnectedFail = false;
     // Group second device for Hearing Aid
     private CachedBluetoothDevice mSubDevice;
+    @VisibleForTesting
+    LruCache<String, BitmapDrawable> mDrawableCache;
 
     private final Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
@@ -131,6 +141,19 @@
         mDevice = device;
         fillData();
         mHiSyncId = BluetoothHearingAid.HI_SYNC_ID_INVALID;
+        initDrawableCache();
+    }
+
+    private void initDrawableCache() {
+        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
+        int cacheSize = maxMemory / 8;
+
+        mDrawableCache = new LruCache<String, BitmapDrawable>(cacheSize) {
+            @Override
+            protected int sizeOf(String key, BitmapDrawable bitmap) {
+                return bitmap.getBitmap().getByteCount() / 1024;
+            }
+        };
     }
 
     /**
@@ -381,6 +404,7 @@
             if (dev != null) {
                 final boolean successful = dev.removeBond();
                 if (successful) {
+                    releaseLruCache();
                     if (BluetoothUtils.D) {
                         Log.d(TAG, "Command sent successfully:REMOVE_BOND " + describe(null));
                     }
@@ -500,7 +524,21 @@
     }
 
     void refresh() {
-        dispatchAttributesChanged();
+        ThreadUtils.postOnBackgroundThread(() -> {
+            if (BluetoothUtils.isAdvancedDetailsHeader(mDevice)) {
+                Uri uri = BluetoothUtils.getUriMetaData(getDevice(),
+                        BluetoothDevice.METADATA_MAIN_ICON);
+                if (uri != null && mDrawableCache.get(uri.toString()) == null) {
+                    mDrawableCache.put(uri.toString(),
+                            (BitmapDrawable) BluetoothUtils.getBtDrawableWithDescription(
+                                    mContext, this).first);
+                }
+            }
+
+            ThreadUtils.postOnMainThread(() -> {
+                dispatchAttributesChanged();
+            });
+        });
     }
 
     public void setJustDiscovered(boolean justDiscovered) {
@@ -1178,4 +1216,28 @@
         mSubDevice.mJustDiscovered = tmpJustDiscovered;
         fetchActiveDevices();
     }
+
+    /**
+     * Get cached bluetooth icon with description
+     */
+    public Pair<Drawable, String> getDrawableWithDescription() {
+        Uri uri = BluetoothUtils.getUriMetaData(mDevice, BluetoothDevice.METADATA_MAIN_ICON);
+        if (BluetoothUtils.isAdvancedDetailsHeader(mDevice) && uri != null) {
+            BitmapDrawable drawable = mDrawableCache.get(uri.toString());
+            if (drawable != null) {
+                Resources resources = mContext.getResources();
+                return new Pair<>(new AdaptiveOutlineDrawable(
+                        resources, drawable.getBitmap()),
+                        BluetoothUtils.getBtClassDrawableWithDescription(mContext, this).second);
+            }
+
+            refresh();
+        }
+
+        return BluetoothUtils.getBtRainbowDrawableWithDescription(mContext, this);
+    }
+
+    void releaseLruCache() {
+        mDrawableCache.evictAll();
+    }
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index 8f7006e..2c2ca3b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -80,9 +80,6 @@
         @Override
         public void onCapabilitiesChanged(
                 Network network, NetworkCapabilities networkCapabilities) {
-            if (mDefaultNetwork != null && mDefaultNetwork.getNetId() != network.getNetId()) {
-                return;
-            }
             if (!mNetworks.contains(network.getNetId())) {
                 // New network
                 boolean isVcnOverWifi =
@@ -117,9 +114,6 @@
 
         @Override
         public void onLost(Network network) {
-            if (mDefaultNetwork != null && mDefaultNetwork.getNetId() != network.getNetId()) {
-                return;
-            }
             String log = new StringBuilder()
                     .append(SSDF.format(System.currentTimeMillis())).append(",")
                     .append("onLost: ")
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java
index cd78add..a9ad00d 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/UsageProgressBarPreferenceTest.java
@@ -22,7 +22,7 @@
 
 import android.content.Context;
 import android.text.SpannedString;
-import android.text.style.RelativeSizeSpan;
+import android.text.style.AbsoluteSizeSpan;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.FrameLayout;
@@ -56,39 +56,60 @@
     }
 
     @Test
-    public void setUsageSummary_noNumber_noRelativeSizeSpan() {
+    public void setUsageSummary_noNumber_noAbsoluteSizeSpan() {
         mUsageProgressBarPreference.setUsageSummary("test");
 
         mUsageProgressBarPreference.onBindViewHolder(mViewHolder);
 
         final TextView usageSummary = (TextView) mViewHolder.findViewById(R.id.usage_summary);
         final SpannedString summary = new SpannedString(usageSummary.getText());
-        assertThat(summary.getSpans(0, summary.length(), RelativeSizeSpan.class).length)
+        assertThat(summary.getSpans(0, summary.length(), AbsoluteSizeSpan.class).length)
                 .isEqualTo(0);
     }
 
     @Test
-    public void setUsageSummary_integerNumber_findRelativeSizeSpan() {
+    public void setUsageSummary_integerNumber_findAbsoluteSizeSpan() {
         mUsageProgressBarPreference.setUsageSummary("10Test");
 
         mUsageProgressBarPreference.onBindViewHolder(mViewHolder);
 
         final TextView usageSummary = (TextView) mViewHolder.findViewById(R.id.usage_summary);
         final SpannedString summary = new SpannedString(usageSummary.getText());
-        assertThat(summary.getSpans(0, summary.length(), RelativeSizeSpan.class).length)
-                .isEqualTo(1);
+        final AbsoluteSizeSpan[] spans = summary
+                .getSpans(0, summary.length(), AbsoluteSizeSpan.class);
+        assertThat(spans.length).isEqualTo(1);
+        assertThat(summary.getSpanStart(spans[0])).isEqualTo(0);
+        assertThat(summary.getSpanEnd(spans[0])).isEqualTo(2);
     }
 
     @Test
-    public void setUsageSummary_floatNumber_findRelativeSizeSpan() {
+    public void setUsageSummary_floatingPointNumber_findAbsoluteSizeSpan() {
         mUsageProgressBarPreference.setUsageSummary("3.14Test");
 
         mUsageProgressBarPreference.onBindViewHolder(mViewHolder);
 
         final TextView usageSummary = (TextView) mViewHolder.findViewById(R.id.usage_summary);
         final SpannedString summary = new SpannedString(usageSummary.getText());
-        assertThat(summary.getSpans(0, summary.length(), RelativeSizeSpan.class).length)
-                .isEqualTo(1);
+        final AbsoluteSizeSpan[] spans = summary
+                .getSpans(0, summary.length(), AbsoluteSizeSpan.class);
+        assertThat(spans.length).isEqualTo(1);
+        assertThat(summary.getSpanStart(spans[0])).isEqualTo(0);
+        assertThat(summary.getSpanEnd(spans[0])).isEqualTo(4);
+    }
+
+    @Test
+    public void setUsageSummary_commaFloatingPointNumber_findAbsoluteSizeSpan() {
+        mUsageProgressBarPreference.setUsageSummary("3,14Test");
+
+        mUsageProgressBarPreference.onBindViewHolder(mViewHolder);
+
+        final TextView usageSummary = (TextView) mViewHolder.findViewById(R.id.usage_summary);
+        final SpannedString summary = new SpannedString(usageSummary.getText());
+        final AbsoluteSizeSpan[] spans = summary
+                .getSpans(0, summary.length(), AbsoluteSizeSpan.class);
+        assertThat(spans.length).isEqualTo(1);
+        assertThat(summary.getSpanStart(spans[0])).isEqualTo(0);
+        assertThat(summary.getSpanEnd(spans[0])).isEqualTo(4);
     }
 
     @Test
@@ -125,6 +146,17 @@
     }
 
     @Test
+    public void setPercent_totalSizeZero_getProgressZero() {
+        mUsageProgressBarPreference.setPercent(0 /* usage */, 0 /* total */);
+
+        mUsageProgressBarPreference.onBindViewHolder(mViewHolder);
+
+        final ProgressBar progressBar = (ProgressBar) mViewHolder
+                .findViewById(android.R.id.progress);
+        assertThat(progressBar.getProgress()).isEqualTo(0);
+    }
+
+    @Test
     public void setCustomContent_setNullImageView_noChild() {
         mUsageProgressBarPreference.setCustomContent(null /* imageView */);
 
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
index 53a99ab..38172f7 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
@@ -35,6 +35,7 @@
 
 import com.android.settingslib.R;
 import com.android.settingslib.testutils.shadow.ShadowBluetoothAdapter;
+import com.android.settingslib.widget.AdaptiveOutlineDrawable;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -957,4 +958,41 @@
 
         // Should not crash
     }
+
+    @Test
+    public void getDrawableWithDescription_isAdvancedDevice_returnAdvancedIcon() {
+        when(mDevice.getMetadata(BluetoothDevice.METADATA_MAIN_ICON))
+                .thenReturn("fake_uri".getBytes());
+        when(mDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("true".getBytes());
+
+        mCachedDevice.refresh();
+
+        assertThat(mCachedDevice.getDrawableWithDescription().first).isInstanceOf(
+                AdaptiveOutlineDrawable.class);
+    }
+
+    @Test
+    public void getDrawableWithDescription_isNotAdvancedDevice_returnBluetoothIcon() {
+        when(mDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("false".getBytes());
+
+        mCachedDevice.refresh();
+
+        assertThat(mCachedDevice.getDrawableWithDescription().first).isNotInstanceOf(
+                AdaptiveOutlineDrawable.class);
+    }
+
+    @Test
+    public void releaseLruCache_lruCacheShouldBeRelease() {
+        when(mDevice.getMetadata(BluetoothDevice.METADATA_MAIN_ICON))
+                .thenReturn("fake_uri".getBytes());
+        when(mDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("true".getBytes());
+
+        mCachedDevice.refresh();
+        mCachedDevice.releaseLruCache();
+
+        assertThat(mCachedDevice.mDrawableCache.size()).isEqualTo(0);
+    }
 }
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index fbb84fd..ccbcb89 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -256,4 +256,7 @@
     <!-- Default for Settings.Secure.ACCESSIBILITY_BUTTON_MODE -->
     <integer name="def_accessibility_button_mode">1</integer>
 
+    <!-- Default for Settings.Secure.ONE_HANDED_MODE_ACTIVATED -->
+    <bool name="def_one_handed_mode_activated">false</bool>
+
 </resources>
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java
index 77032ba..b7560d2 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java
@@ -69,7 +69,6 @@
         Settings.Global.ZEN_DURATION,
         Settings.Global.CHARGING_VIBRATION_ENABLED,
         Settings.Global.AWARE_ALLOWED,
-        Settings.Global.NOTIFICATION_BUBBLES,
         Settings.Global.CUSTOM_BUGREPORT_HANDLER_APP,
         Settings.Global.CUSTOM_BUGREPORT_HANDLER_USER,
         Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index e92591d..1cfdff8 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -173,6 +173,7 @@
         Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE,
         Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
         Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY,
+        Settings.Secure.ONE_HANDED_MODE_ACTIVATED,
         Settings.Secure.ONE_HANDED_MODE_ENABLED,
         Settings.Secure.ONE_HANDED_MODE_TIMEOUT,
         Settings.Secure.TAPS_APP_TO_EXIT,
@@ -187,5 +188,7 @@
         Settings.Secure.ACCESSIBILITY_FLOATING_MENU_ICON_TYPE,
         Settings.Secure.ACCESSIBILITY_FLOATING_MENU_OPACITY,
         Settings.Secure.ACCESSIBILITY_FLOATING_MENU_FADE_ENABLED,
+        Settings.Secure.NOTIFICATION_BUBBLES,
+        Settings.Secure.LOCATION_TIME_ZONE_DETECTION_ENABLED,
     };
 }
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
index 30fd12b..0fe4efe 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
@@ -56,7 +56,6 @@
         Settings.System.AUTO_TIME,                  // moved to global
         Settings.System.AUTO_TIME_ZONE,             // moved to global
         Settings.System.TIME_12_24,
-        Settings.System.DATE_FORMAT,
         Settings.System.DTMF_TONE_WHEN_DIALING,
         Settings.System.DTMF_TONE_TYPE_WHEN_DIALING,
         Settings.System.HEARING_AID,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
index 97032dd..8f7f1fa 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
@@ -128,7 +128,6 @@
         VALIDATORS.put(
                 Global.POWER_BUTTON_VERY_LONG_PRESS, new InclusiveIntegerRangeValidator(0, 1));
         VALIDATORS.put(Global.KEY_CHORD_POWER_VOLUME_UP, new InclusiveIntegerRangeValidator(0, 2));
-        VALIDATORS.put(Global.NOTIFICATION_BUBBLES, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Global.CUSTOM_BUGREPORT_HANDLER_APP, ANY_STRING_VALIDATOR);
         VALIDATORS.put(Global.CUSTOM_BUGREPORT_HANDLER_USER, ANY_INTEGER_VALIDATOR);
         VALIDATORS.put(Global.DEVELOPMENT_SETTINGS_ENABLED, BOOLEAN_VALIDATOR);
@@ -139,6 +138,7 @@
                 new InclusiveIntegerRangeValidator(
                         /* first= */Global.ONE_HANDED_KEYGUARD_SIDE_LEFT,
                         /* last= */Global.ONE_HANDED_KEYGUARD_SIDE_RIGHT));
+        VALIDATORS.put(Global.DISABLE_WINDOW_BLURS, BOOLEAN_VALIDATOR);
     }
 }
 
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 53920f0..36f5dba 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -262,6 +262,7 @@
         VALIDATORS.put(
                 Secure.ACCESSIBILITY_BUTTON_TARGETS,
                 ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR);
+        VALIDATORS.put(Secure.ONE_HANDED_MODE_ACTIVATED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.ONE_HANDED_MODE_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.ONE_HANDED_MODE_TIMEOUT, ANY_INTEGER_VALIDATOR);
         VALIDATORS.put(Secure.TAPS_APP_TO_EXIT, BOOLEAN_VALIDATOR);
@@ -284,5 +285,7 @@
                 new InclusiveFloatRangeValidator(0.0f, 1.0f));
         VALIDATORS.put(Secure.ACCESSIBILITY_FLOATING_MENU_FADE_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.CLIPBOARD_SHOW_ACCESS_NOTIFICATIONS, BOOLEAN_VALIDATOR);
+        VALIDATORS.put(Secure.NOTIFICATION_BUBBLES, BOOLEAN_VALIDATOR);
+        VALIDATORS.put(Secure.LOCATION_TIME_ZONE_DETECTION_ENABLED, BOOLEAN_VALIDATOR);
     }
 }
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java
index 97e1d68..223cc51 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java
@@ -25,7 +25,6 @@
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import java.text.SimpleDateFormat;
 import java.util.Locale;
 
 /**
@@ -192,18 +191,6 @@
 
     public static final Validator TILE_LIST_VALIDATOR = new TileListValidator();
 
-    static final Validator DATE_FORMAT_VALIDATOR = value -> {
-        try {
-            if (value == null) {
-                return true;
-            }
-            new SimpleDateFormat(value);
-            return true;
-        } catch (IllegalArgumentException | NullPointerException e) {
-            return false;
-        }
-    };
-
     static final Validator COLON_SEPARATED_COMPONENT_LIST_VALIDATOR =
             new ComponentNameListValidator(":");
 
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
index ebf811f..462c3a5 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
@@ -19,7 +19,6 @@
 import static android.provider.settings.validators.SettingsValidators.ANY_STRING_VALIDATOR;
 import static android.provider.settings.validators.SettingsValidators.BOOLEAN_VALIDATOR;
 import static android.provider.settings.validators.SettingsValidators.COMPONENT_NAME_VALIDATOR;
-import static android.provider.settings.validators.SettingsValidators.DATE_FORMAT_VALIDATOR;
 import static android.provider.settings.validators.SettingsValidators.LENIENT_IP_ADDRESS_VALIDATOR;
 import static android.provider.settings.validators.SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR;
 import static android.provider.settings.validators.SettingsValidators.URI_VALIDATOR;
@@ -146,7 +145,6 @@
                 });
         VALIDATORS.put(
                 System.TIME_12_24, new DiscreteValueValidator(new String[] {"12", "24", null}));
-        VALIDATORS.put(System.DATE_FORMAT, DATE_FORMAT_VALIDATOR);
         VALIDATORS.put(System.SETUP_WIZARD_HAS_RUN, BOOLEAN_VALIDATOR);
         VALIDATORS.put(System.ACCELEROMETER_ROTATION, BOOLEAN_VALIDATOR);
         VALIDATORS.put(System.USER_ROTATION, new InclusiveIntegerRangeValidator(0, 3));
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 4119dc9f..2f54e21 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -242,15 +242,6 @@
                 Settings.Global.AUDIO_SAFE_VOLUME_STATE,
                 GlobalSettingsProto.AUDIO_SAFE_VOLUME_STATE);
 
-        final long autoToken = p.start(GlobalSettingsProto.AUTO);
-        dumpSetting(s, p,
-                Settings.Global.AUTO_TIME,
-                GlobalSettingsProto.Auto.TIME);
-        dumpSetting(s, p,
-                Settings.Global.AUTO_TIME_ZONE,
-                GlobalSettingsProto.Auto.TIME_ZONE);
-        p.end(autoToken);
-
         final long autofillToken = p.start(GlobalSettingsProto.AUTOFILL);
         dumpSetting(s, p,
                 Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES,
@@ -509,6 +500,15 @@
                 GlobalSettingsProto.Database.CREATION_BUILDID);
         p.end(databaseToken);
 
+        final long dateTimeToken = p.start(GlobalSettingsProto.DATE_TIME);
+        dumpSetting(s, p,
+                Settings.Global.AUTO_TIME,
+                GlobalSettingsProto.DateTime.AUTO_TIME);
+        dumpSetting(s, p,
+                Settings.Global.AUTO_TIME_ZONE,
+                GlobalSettingsProto.DateTime.AUTO_TIME_ZONE);
+        p.end(dateTimeToken);
+
         final long debugToken = p.start(GlobalSettingsProto.DEBUG);
         dumpSetting(s, p,
                 Settings.Global.DEBUG_APP,
@@ -553,6 +553,9 @@
         dumpSetting(s, p,
                 Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
                 GlobalSettingsProto.Development.ENABLE_NON_RESIZABLE_MULTI_WINDOW);
+        dumpSetting(s, p,
+                Settings.Global.DISABLE_WINDOW_BLURS,
+                GlobalSettingsProto.Development.DISABLE_WINDOW_BLURS);
         p.end(developmentToken);
 
         final long deviceToken = p.start(GlobalSettingsProto.DEVICE);
@@ -1107,9 +1110,6 @@
                 Settings.Global.NOTIFICATION_SNOOZE_OPTIONS,
                 GlobalSettingsProto.Notification.SNOOZE_OPTIONS);
         dumpSetting(s, p,
-                Settings.Global.NOTIFICATION_BUBBLES,
-                GlobalSettingsProto.Notification.BUBBLES);
-        dumpSetting(s, p,
                 Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS,
                 GlobalSettingsProto.Notification.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS);
         dumpSetting(s, p,
@@ -2022,6 +2022,12 @@
                 SecureSettingsProto.Controls.ENABLED);
         p.end(controlsToken);
 
+        final long dateTimeToken = p.start(SecureSettingsProto.DATE_TIME);
+        dumpSetting(s, p,
+                Settings.Secure.LOCATION_TIME_ZONE_DETECTION_ENABLED,
+                SecureSettingsProto.DateTime.LOCATION_TIME_ZONE_DETECTION_ENABLED);
+        p.end(dateTimeToken);
+
         dumpSetting(s, p,
                 Settings.Secure.DEVICE_PAIRED,
                 SecureSettingsProto.DEVICE_PAIRED);
@@ -2312,7 +2318,7 @@
                 Settings.Secure.NOTIFICATION_BADGING,
                 SecureSettingsProto.Notification.BADGING);
         dumpSetting(s, p,
-                Settings.Global.NOTIFICATION_BUBBLES,
+                Settings.Secure.NOTIFICATION_BUBBLES,
                 SecureSettingsProto.Notification.BUBBLES);
         dumpSetting(s, p,
                 Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING,
@@ -2708,9 +2714,6 @@
         p.end(bluetoothToken);
 
         dumpSetting(s, p,
-                Settings.System.DATE_FORMAT,
-                SystemSettingsProto.DATE_FORMAT);
-        dumpSetting(s, p,
                 Settings.System.DISPLAY_COLOR_MODE,
                 SystemSettingsProto.DISPLAY_COLOR_MODE);
 
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 6440d2a..941f47f 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -20,6 +20,7 @@
 import static android.os.Process.SHELL_UID;
 import static android.os.Process.SYSTEM_UID;
 import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_MAGNIFICATION_CONTROLLER;
+import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
@@ -3400,7 +3401,7 @@
         }
 
         private final class UpgradeController {
-            private static final int SETTINGS_VERSION = 199;
+            private static final int SETTINGS_VERSION = 202;
 
             private final int mUserId;
 
@@ -4645,11 +4646,8 @@
                     // Version 184: Reset the default for Global Settings: NOTIFICATION_BUBBLES
                     // This is originally set in version 182, however, the default value changed
                     // so this step is to ensure the value is updated to the correct default.
-                    getGlobalSettingsLocked().insertSettingOverrideableByRestoreLocked(
-                            Global.NOTIFICATION_BUBBLES, getContext().getResources().getBoolean(
-                                    R.bool.def_notification_bubbles) ? "1" : "0", null /* tag */,
-                            true /* makeDefault */, SettingsState.SYSTEM_PACKAGE_NAME);
 
+                    // Removed. Bubbles moved to secure settings. See version 197.
                     currentVersion = 185;
                 }
 
@@ -4894,7 +4892,6 @@
                                 defEnableNonResizableMultiWindow ? "1" : "0", null, true,
                                 SettingsState.SYSTEM_PACKAGE_NAME);
                     }
-
                     currentVersion = 198;
                 }
 
@@ -4928,6 +4925,56 @@
                     currentVersion = 199;
                 }
 
+                if (currentVersion == 199) {
+                    // Version 199: Bubbles moved to secure settings. Use the global value for
+                    // the newly inserted secure setting; we'll delete the global value in the
+                    // next version step.
+                    // If this is a new profile, check if a secure setting exists for the
+                    // owner of the profile and use that value for the work profile.
+                    int owningId = resolveOwningUserIdForSecureSettingLocked(userId,
+                            NOTIFICATION_BUBBLES);
+                    Setting previous = getGlobalSettingsLocked()
+                            .getSettingLocked("notification_bubbles");
+                    Setting secureBubbles = getSecureSettingsLocked(owningId)
+                            .getSettingLocked(NOTIFICATION_BUBBLES);
+                    String oldValue = "1";
+                    if (!previous.isNull()) {
+                        oldValue = previous.getValue();
+                    } else if (!secureBubbles.isNull()) {
+                        oldValue = secureBubbles.getValue();
+                    }
+                    if (secureBubbles.isNull()) {
+                        boolean isDefault = oldValue.equals("1");
+                        getSecureSettingsLocked(userId).insertSettingLocked(
+                                Secure.NOTIFICATION_BUBBLES, oldValue, null /* tag */,
+                                isDefault, SettingsState.SYSTEM_PACKAGE_NAME);
+                    }
+                    currentVersion = 200;
+                }
+
+                if (currentVersion == 200) {
+                    // Version 200: delete the global bubble setting which was moved to secure in
+                    // version 199.
+                    getGlobalSettingsLocked().deleteSettingLocked("notification_bubbles");
+                    currentVersion = 201;
+                }
+
+                if (currentVersion == 201) {
+                    // Version 201: Set the default value for Secure Settings:
+                    final SettingsState secureSettings = getSecureSettingsLocked(userId);
+                    final Setting oneHandedModeActivated = secureSettings.getSettingLocked(
+                            Secure.ONE_HANDED_MODE_ACTIVATED);
+                    if (oneHandedModeActivated.isNull()) {
+                        final boolean defOneHandedModeActivated = getContext().getResources()
+                                .getBoolean(R.bool.def_one_handed_mode_activated);
+                        secureSettings.insertSettingLocked(
+                                Secure.ONE_HANDED_MODE_ACTIVATED,
+                                defOneHandedModeActivated ? "1" : "0", null, true,
+                                SettingsState.SYSTEM_PACKAGE_NAME);
+                    }
+                    currentVersion = 202;
+                }
+
                 // 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 150d10d..22e38f4 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -231,6 +231,7 @@
                     Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_VR,
                     Settings.Global.DEVELOPMENT_WM_DISPLAY_SETTINGS_PATH,
                     Settings.Global.DEVICE_DEMO_MODE,
+                    Settings.Global.DISABLE_WINDOW_BLURS,
                     Settings.Global.BATTERY_SAVER_CONSTANTS,
                     Settings.Global.BATTERY_TIP_CONSTANTS,
                     Settings.Global.DEFAULT_SM_DP_PLUS,
diff --git a/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java b/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java
index e5d148c..865f431 100644
--- a/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java
@@ -220,11 +220,6 @@
     }
 
     @Test
-    public void dateFormatValidator_onNullValue_returnsTrue() {
-        assertTrue(SettingsValidators.DATE_FORMAT_VALIDATOR.validate(null));
-    }
-
-    @Test
     public void testJSONObjectValidator() throws JSONException {
         Validator v = SettingsValidators.JSON_OBJECT_VALIDATOR;
 
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 0c47cf8..1d321f2 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -163,6 +163,7 @@
     <uses-permission android:name="android.permission.SET_ORIENTATION" />
     <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
     <uses-permission android:name="com.android.permission.USE_INSTALLER_V2" />
+    <uses-permission android:name="android.permission.INSTALL_TEST_ONLY_PACKAGE" />
     <uses-permission android:name="com.android.permission.USE_SYSTEM_DATA_LOADERS" />
     <uses-permission android:name="android.permission.MOVE_PACKAGE" />
     <uses-permission android:name="android.permission.KEEP_UNINSTALLED_PACKAGES" />
@@ -299,6 +300,7 @@
     <uses-permission android:name="android.permission.COMPANION_APPROVE_WIFI_CONNECTIONS" />
 
     <uses-permission android:name="android.permission.MANAGE_APPOPS" />
+    <uses-permission android:name="android.permission.WATCH_APPOPS" />
 
     <!-- Permission required for IncrementalLogCollectionTest -->
     <uses-permission android:name="android.permission.LOADER_USAGE_STATS" />
@@ -414,6 +416,9 @@
     <!-- Permission required for testing system audio effect APIs. -->
     <uses-permission android:name="android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS"/>
 
+    <!-- Permission required for running networking unit tests -->
+    <uses-permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
+
     <!-- Permissions required for CTS test - TunerTest -->
     <uses-permission android:name="android.permission.ACCESS_TV_DESCRAMBLER" />
     <uses-permission android:name="android.permission.ACCESS_TV_TUNER" />
@@ -426,6 +431,7 @@
     <uses-permission android:name="android.permission.ACCESS_SHARED_LIBRARIES" />
 
     <!-- Permissions required for CTS test - TVInputManagerTest -->
+    <uses-permission android:name="android.permission.ACCESS_TUNED_INFO" />
     <uses-permission android:name="android.permission.TV_INPUT_HARDWARE" />
 
     <!-- Permission needed for CTS test - PrivilegedLocationPermissionTest -->
@@ -537,13 +543,14 @@
     <uses-permission android:name="android.permission.SCHEDULE_PRIORITIZED_ALARM" />
 
     <!-- Permission required for CTS test - SystemMediaRouter2Test -->
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" />
+    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
 
     <!-- Permission required for CTS test - CtsRotationResolverServiceDeviceTestCases -->
     <uses-permission android:name="android.permission.MANAGE_ROTATION_RESOLVER" />
 
     <!-- Permission required for CTS test - CtsUwbTestCases -->
     <uses-permission android:name="android.permission.UWB_PRIVILEGED" />
+    <uses-permission android:name="android.permission.UWB_RANGING" />
 
     <!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
     <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
index 03d844a..6d6bc07 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
@@ -39,7 +39,7 @@
                 ANIMATION_DURATION - ANIMATION_DURATION_NAV_FADE_IN
         private const val LAUNCH_TIMEOUT = 1000L
 
-        private val CONTENT_FADE_OUT_INTERPOLATOR = PathInterpolator(0f, 0f, 0.2f, 1f)
+        @JvmField val CONTENT_FADE_OUT_INTERPOLATOR = PathInterpolator(0f, 0f, 0.2f, 1f)
         private val WINDOW_FADE_IN_INTERPOLATOR = PathInterpolator(0f, 0f, 0.6f, 1f)
         private val NAV_FADE_IN_INTERPOLATOR = PathInterpolator(0f, 0f, 0f, 1f)
         private val NAV_FADE_OUT_INTERPOLATOR = PathInterpolator(0.2f, 0f, 1f, 1f)
@@ -191,23 +191,11 @@
         fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {}
 
         /**
-         * The animation was cancelled remotely. Note that [onLaunchAnimationEnd] will still be
-         * called after this if the animation was already started, i.e. if [onLaunchAnimationStart]
-         * was called before the cancellation.
+         * The animation was cancelled. Note that [onLaunchAnimationEnd] will still be called after
+         * this if the animation was already started, i.e. if [onLaunchAnimationStart] was called
+         * before the cancellation.
          */
         fun onLaunchAnimationCancelled() {}
-
-        /**
-         * The remote animation was not started within the expected time. It timed out and will
-         * never [start][onLaunchAnimationStart].
-         */
-        fun onLaunchAnimationTimedOut() {}
-
-        /**
-         * The animation was aborted because the opening window was not found. It will never
-         * [start][onLaunchAnimationStart].
-         */
-        fun onLaunchAnimationAborted() {}
     }
 
     /** The state of an expandable view during an [ActivityLaunchAnimator] animation. */
@@ -332,7 +320,7 @@
             if (window == null) {
                 removeTimeout()
                 invokeCallback(iCallback)
-                controller.onLaunchAnimationAborted()
+                controller.onLaunchAnimationCancelled()
                 return
             }
 
@@ -486,7 +474,7 @@
             }
 
             timedOut = true
-            controller.onLaunchAnimationTimedOut()
+            controller.onLaunchAnimationCancelled()
         }
 
         override fun onAnimationCancelled() {
diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp
index f415da8..9f02fdb 100644
--- a/packages/SystemUI/plugin/Android.bp
+++ b/packages/SystemUI/plugin/Android.bp
@@ -32,6 +32,7 @@
     ],
 
     static_libs: [
+        "androidx.annotation_annotation",
         "PluginCoreLib",
         "SystemUI-sensors",
         "SystemUIAnimationLib",
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
index 53ff9f0..8ead0e1 100644
--- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
+++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
@@ -16,8 +16,12 @@
 
 package com.android.systemui.plugins;
 
+import android.app.PendingIntent;
+import android.app.smartspace.SmartspaceAction;
 import android.app.smartspace.SmartspaceTarget;
+import android.content.Intent;
 import android.os.Parcelable;
+import android.view.View;
 import android.view.ViewGroup;
 
 import com.android.systemui.plugins.annotations.ProvidesInterface;
@@ -59,6 +63,42 @@
     interface SmartspaceView {
         void registerDataProvider(BcSmartspaceDataPlugin plugin);
 
+        /**
+         * Primary color for unprotected text
+         */
         void setPrimaryTextColor(int color);
+
+        /**
+         * Range [0.0 - 1.0] when transitioning from Lockscreen to/from AOD
+         */
+        void setDozeAmount(float amount);
+
+        /**
+         * Overrides how Intents/PendingIntents gets launched. Mostly to support auth from
+         * the lockscreen.
+         */
+        void setIntentStarter(IntentStarter intentStarter);
+
+        /**
+         * When on the lockscreen, use the FalsingManager to help detect errant touches
+         */
+        void setFalsingManager(FalsingManager falsingManager);
+    }
+
+    /** Interface for launching Intents, which can differ on the lockscreen */
+    interface IntentStarter {
+        default void startFromAction(SmartspaceAction action, View v) {
+            if (action.getIntent() != null) {
+                startIntent(v, action.getIntent());
+            } else if (action.getPendingIntent() != null) {
+                startPendingIntent(action.getPendingIntent());
+            }
+        }
+
+        /** Start the intent */
+        void startIntent(View v, Intent i);
+
+        /** Start the PendingIntent */
+        void startPendingIntent(PendingIntent pi);
     }
 }
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
index 4142e51..b75252b 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java
@@ -58,7 +58,6 @@
     /** Returns true if the gesture should be rejected. */
     boolean isFalseTouch(int interactionType);
 
-
     /**
      * Does basic checking to see if gesture looks like a tap.
      *
@@ -127,8 +126,19 @@
     /** Removes a {@link FalsingBeliefListener}. */
     void removeFalsingBeliefListener(FalsingBeliefListener listener);
 
+    /** Adds a {@link FalsingTapListener}. */
+    void addTapListener(FalsingTapListener falsingTapListener);
+
+    /** Removes a {@link FalsingTapListener}. */
+    void removeTapListener(FalsingTapListener falsingTapListener);
+
     /** Listener that is alerted when falsing belief level crosses a predfined threshold. */
     interface FalsingBeliefListener {
         void onFalse();
     }
+
+    /** Listener that is alerted when a double tap is required to confirm a single tap. */
+    interface FalsingTapListener {
+        void onDoubleTapRequired();
+    }
 }
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index fffcafb..4d4c909 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -14,7 +14,6 @@
 
 package com.android.systemui.plugins.qs;
 
-import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
@@ -57,7 +56,6 @@
     void setQsExpansion(float qsExpansionFraction, float headerTranslation);
     void setHeaderListening(boolean listening);
     void notifyCustomizeChanged();
-
     void setContainer(ViewGroup container);
     void setExpandClickListener(OnClickListener onClickListener);
 
@@ -75,6 +73,16 @@
         return isShowingDetail();
     }
 
+    /**
+     * If QS should translate as we pull it down, or if it should be static.
+     */
+    void setTranslateWhileExpanding(boolean shouldTranslate);
+
+    /**
+     * A rounded corner clipping that makes QS feel as if it were behind everything.
+     */
+    void setFancyClipping(int top, int bottom, int cornerRadius, boolean visible);
+
     @ProvidesInterface(version = HeightListener.VERSION)
     interface HeightListener {
         int VERSION = 1;
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
index 46237148..d1383eb 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
@@ -15,13 +15,14 @@
 package com.android.systemui.plugins.qs;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.metrics.LogMaker;
 import android.service.quicksettings.Tile;
 import android.view.View;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.InstanceId;
 import com.android.systemui.plugins.annotations.DependsOn;
 import com.android.systemui.plugins.annotations.ProvidesInterface;
@@ -56,8 +57,19 @@
 
     QSIconView createTileView(Context context);
 
-    void click();
-    void secondaryClick();
+    /**
+     * The tile was clicked.
+     *
+     * @param view The view that was clicked.
+     */
+    void click(@Nullable View view);
+
+    /**
+     * The tile secondary click was triggered.
+     *
+     * @param view The view that was clicked.
+     */
+    void secondaryClick(@Nullable View view);
 
     /**
      * The tile was long clicked.
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
index ca13204..2213d1c 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
@@ -46,6 +46,15 @@
      * background circle/peripherals. To retrieve only the inner icon, use {@link #getIcon()}.
      */
     public abstract View getIconWithBackground();
+
+    /**
+     * Returns the {@link View} containing the icon on the right
+     *
+     * @see com.android.systemui.qs.tileimpl.QSTileViewHorizontal#sideView
+     */
+    public View getSecondaryIcon() {
+        return null;
+    }
     public abstract void init(QSTile tile);
     public abstract void onStateChanged(State state);
 
@@ -54,4 +63,8 @@
     public View getLabelContainer() {
         return null;
     }
+
+    public View getSecondaryLabel() {
+        return null;
+    }
 }
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
index c5ba3d2..7f645ba 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
@@ -20,12 +20,14 @@
 <!-- This is a view that shows general status information in Keyguard. -->
 <com.android.keyguard.KeyguardStatusView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:androidprv="http://schemas.android.com/apk/res-auto"
+    xmlns:systemui="http://schemas.android.com/apk/res-auto"
     android:id="@+id/keyguard_status_view"
     android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center_horizontal|top">
+    systemui:layout_constraintStart_toStartOf="parent"
+    systemui:layout_constraintEnd_toEndOf="parent"
+    systemui:layout_constraintTop_toTopOf="parent"
+    android:layout_width="0dp"
+    android:layout_height="wrap_content">
     <LinearLayout
         android:id="@+id/status_view_container"
         android:layout_width="match_parent"
@@ -70,5 +72,11 @@
             android:letterSpacing="0.05"
             android:ellipsize="marquee"
             android:singleLine="true" />
+        <FrameLayout
+            android:id="@+id/status_view_media_container"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="@dimen/qs_media_padding"
+            />
     </LinearLayout>
 </com.android.keyguard.KeyguardStatusView>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 696f215..33aa228 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -100,7 +100,7 @@
     <string name="kg_password_puk_failed" msgid="6778867411556937118">"Operasi PUK SIM gagal!"</string>
     <string name="kg_pin_accepted" msgid="1625501841604389716">"Kode Diterima!"</string>
     <string name="keyguard_carrier_default" msgid="6359808469637388586">"Tidak ada layanan."</string>
-    <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Beralih metode masukan"</string>
+    <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Beralih metode input"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Mode pesawat"</string>
     <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Pola diperlukan setelah perangkat dimulai ulang"</string>
     <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"PIN diperlukan setelah perangkat dimulai ulang"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index e2ffc62..1985127 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -137,5 +137,5 @@
     </plurals>
     <string name="clock_title_default" msgid="6342735240617459864">"डीफॉल्ट"</string>
     <string name="clock_title_bubble" msgid="2204559396790593213">"बबल"</string>
-    <string name="clock_title_analog" msgid="8409262532900918273">"ॲनालॉग"</string>
+    <string name="clock_title_analog" msgid="8409262532900918273">"अ‍ॅनालॉग"</string>
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index bbeadd0..577dec7 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -137,5 +137,5 @@
     </plurals>
     <string name="clock_title_default" msgid="6342735240617459864">"မူလ"</string>
     <string name="clock_title_bubble" msgid="2204559396790593213">"ပူဖောင်းကွက်"</string>
-    <string name="clock_title_analog" msgid="8409262532900918273">"လက်တံနာရီ"</string>
+    <string name="clock_title_analog" msgid="8409262532900918273">"ရိုးရိုး"</string>
 </resources>
diff --git a/packages/SystemUI/res-keyguard/values/integers.xml b/packages/SystemUI/res-keyguard/values/integers.xml
index 6f14dc9b..c6e90c0 100644
--- a/packages/SystemUI/res-keyguard/values/integers.xml
+++ b/packages/SystemUI/res-keyguard/values/integers.xml
@@ -20,4 +20,11 @@
 
          0x50 = bottom, 0x01 = center_horizontal -->
     <integer name="keyguard_host_view_gravity">0x51</integer>
+
+    <!-- Gravity for the keyguard when it is in one-handed mode. This is ignored unless
+         can_use_one_handed_bouncer is true, _and_ the one handed bouncer is enabled in the device
+         config (com.android.internal.R.bool.config_enableOneHandedKeyguard)
+
+         0x50 = bottom, 0x01 = center_horizontal -->
+    <integer name="keyguard_host_view_one_handed_gravity">0x51</integer>
 </resources>
diff --git a/packages/SystemUI/res/color/qs_security_footer_background_stroke.xml b/packages/SystemUI/res/color/qs_security_footer_background_stroke.xml
new file mode 100644
index 0000000..aa4d4e8
--- /dev/null
+++ b/packages/SystemUI/res/color/qs_security_footer_background_stroke.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@android:color/system_neutral1_100" android:alpha="0.8" />
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/brightness_mirror_background.xml b/packages/SystemUI/res/drawable/brightness_mirror_background.xml
index ae3d312..2095103 100644
--- a/packages/SystemUI/res/drawable/brightness_mirror_background.xml
+++ b/packages/SystemUI/res/drawable/brightness_mirror_background.xml
@@ -16,5 +16,5 @@
   -->
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="?attr/underSurfaceColor" />
-    <corners android:radius="8dp" />
+    <corners android:radius="@dimen/rounded_slider_background_rounded_corner" />
 </shape>
diff --git a/packages/SystemUI/res-keyguard/color/notification_background_dimmed_color.xml b/packages/SystemUI/res/drawable/qs_media_art_background.xml
similarity index 72%
rename from packages/SystemUI/res-keyguard/color/notification_background_dimmed_color.xml
rename to packages/SystemUI/res/drawable/qs_media_art_background.xml
index 3345e6e..95a1870 100644
--- a/packages/SystemUI/res-keyguard/color/notification_background_dimmed_color.xml
+++ b/packages/SystemUI/res/drawable/qs_media_art_background.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2020 The Android Open Source Project
+  ~ Copyright (C) 2021 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -14,6 +14,7 @@
   ~ 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:alpha="0.7" android:color="?android:attr/colorBackground" />
-</selector>
\ No newline at end of file
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:radius="@dimen/qs_media_album_radius"/>
+</shape>
diff --git a/packages/SystemUI/res/drawable/qs_media_button_background.xml b/packages/SystemUI/res/drawable/qs_media_button_background.xml
new file mode 100644
index 0000000..2241abf
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_media_button_background.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+        android:shape="rectangle">
+        <stroke
+            android:color="?androidprv:attr/colorAccentPrimaryVariant"
+            android:width="1dp"/>
+        <corners android:radius="24dp"/>
+        <padding
+            android:left="16dp"
+            android:right="16dp"
+            android:top="8dp"
+            android:bottom="8dp" />
+</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/notification_material_bg_dim.xml b/packages/SystemUI/res/drawable/qs_media_icon_background.xml
similarity index 68%
rename from packages/SystemUI/res/drawable/notification_material_bg_dim.xml
rename to packages/SystemUI/res/drawable/qs_media_icon_background.xml
index 1127d3c..a3a2986 100644
--- a/packages/SystemUI/res/drawable/notification_material_bg_dim.xml
+++ b/packages/SystemUI/res/drawable/qs_media_icon_background.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2014 The Android Open Source Project
+  ~ Copyright (C) 2021 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -14,10 +14,10 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License
   -->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape>
-            <solid android:color="@color/notification_background_dimmed_color" />
-        </shape>
-    </item>
-</ripple>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid android:color="?android:attr/colorBackground" />
+    <size
+        android:width="20dp"
+        android:height="20dp" />
+</shape>
diff --git a/packages/SystemUI/res-keyguard/drawable/qs_media_seamless_background.xml b/packages/SystemUI/res/drawable/qs_media_seamless_background.xml
similarity index 85%
rename from packages/SystemUI/res-keyguard/drawable/qs_media_seamless_background.xml
rename to packages/SystemUI/res/drawable/qs_media_seamless_background.xml
index 8e37686..e71c3d3 100644
--- a/packages/SystemUI/res-keyguard/drawable/qs_media_seamless_background.xml
+++ b/packages/SystemUI/res/drawable/qs_media_seamless_background.xml
@@ -20,6 +20,11 @@
         <shape android:shape="rectangle">
             <solid android:color="@color/media_seamless_border" />
             <corners android:radius="24dp"/>
+            <padding
+                android:left="8dp"
+                android:right="8dp"
+                android:top="4dp"
+                android:bottom="4dp" />
         </shape>
     </item>
 </ripple>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_security_footer_background.xml b/packages/SystemUI/res/drawable/qs_security_footer_background.xml
new file mode 100644
index 0000000..7d370e9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_security_footer_background.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+    android:insetTop="@dimen/qs_security_footer_background_inset"
+    android:insetBottom="@dimen/qs_security_footer_background_inset"
+    >
+    <ripple
+        android:color="?android:attr/colorControlHighlight">
+        <item android:id="@android:id/mask">
+            <shape android:shape="rectangle">
+                <solid android:color="@android:color/white"/>
+                <corners android:radius="@dimen/qs_security_footer_corner_radius"/>
+            </shape>
+        </item>
+        <item>
+            <shape android:shape="rectangle">
+                <stroke android:width="1dp"
+                        android:color="@color/qs_security_footer_background_stroke"/>
+                <corners android:radius="@dimen/qs_security_footer_corner_radius"/>
+            </shape>
+        </item>
+    </ripple>
+</inset>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml b/packages/SystemUI/res/drawable/rounded_rect_background.xml
similarity index 63%
copy from packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
copy to packages/SystemUI/res/drawable/rounded_rect_background.xml
index 87affde..83b0f71 100644
--- a/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
+++ b/packages/SystemUI/res/drawable/rounded_rect_background.xml
@@ -13,13 +13,10 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-
-<com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-
-    <include layout="@layout/auth_biometric_contents"/>
-
-</com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView>
\ No newline at end of file
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size android:height="48dp"
+        android:width="48dp" />
+    <solid android:color="@android:color/transparent" />
+    <corners android:radius="4dp"></corners>
+</shape>
diff --git a/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml b/packages/SystemUI/res/drawable/thumbnail_delete_btn_bg.xml
similarity index 63%
copy from packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
copy to packages/SystemUI/res/drawable/thumbnail_delete_btn_bg.xml
index 87affde..ea7d45d 100644
--- a/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
+++ b/packages/SystemUI/res/drawable/thumbnail_delete_btn_bg.xml
@@ -14,12 +14,10 @@
   ~ limitations under the License.
   -->
 
-<com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-
-    <include layout="@layout/auth_biometric_contents"/>
-
-</com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView>
\ No newline at end of file
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="oval">
+    <size android:height="24dp"
+        android:width="24dp" />
+    <solid android:color="#FFFFFF" />
+</shape>
diff --git a/packages/SystemUI/res/drawable/notification_material_bg_dim.xml b/packages/SystemUI/res/drawable/volume_background.xml
similarity index 61%
copy from packages/SystemUI/res/drawable/notification_material_bg_dim.xml
copy to packages/SystemUI/res/drawable/volume_background.xml
index 1127d3c..66f1d0d 100644
--- a/packages/SystemUI/res/drawable/notification_material_bg_dim.xml
+++ b/packages/SystemUI/res/drawable/volume_background.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2014 The Android Open Source Project
+  ~ Copyright (C) 2021 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -14,10 +14,13 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License
   -->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android">
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
     <item>
         <shape>
-            <solid android:color="@color/notification_background_dimmed_color" />
+            <size android:width="@dimen/volume_dialog_panel_width" />
+            <solid android:color="?androidprv:attr/colorSurface" />
+            <corners android:radius="@dimen/volume_dialog_panel_width_half"/>
         </shape>
     </item>
-</ripple>
+</layer-list>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/volume_row_seekbar.xml b/packages/SystemUI/res/drawable/volume_row_seekbar.xml
index a845e73..7ce1ba3 100644
--- a/packages/SystemUI/res/drawable/volume_row_seekbar.xml
+++ b/packages/SystemUI/res/drawable/volume_row_seekbar.xml
@@ -9,7 +9,6 @@
   ~      http://www.apache.org/licenses/LICENSE-2.0
   ~
   ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
@@ -19,38 +18,24 @@
      and a bottom-aligned icon) and a progress layer (with an accent-colored round rect and icon)
      that moves up and down with the progress value. -->
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"
-            android:paddingMode="stack" >
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:paddingMode="stack" >
     <item android:id="@android:id/background"
         android:gravity="center_vertical|fill_horizontal">
-        <layer-list>
-            <item android:id="@+id/volume_seekbar_background_solid">
-                <shape>
-                    <size android:height="@dimen/volume_dialog_slider_width" />
-                    <solid android:color="?android:attr/colorBackgroundFloating" />
-                    <corners android:radius="@dimen/volume_dialog_slider_corner_radius" />
-                </shape>
-            </item>
-            <item
-                android:id="@+id/volume_seekbar_background_icon"
-                android:gravity="center_vertical|left"
-                android:height="@dimen/rounded_slider_icon_size"
-                android:width="@dimen/rounded_slider_icon_size"
-                android:left="@dimen/rounded_slider_icon_inset">
-                <rotate
-                    android:fromDegrees="-270"
-                    android:toDegrees="-270">
-                    <!-- A placeholder drawable is required here - it'll be replaced in code. -->
-                    <com.android.systemui.util.AlphaTintDrawableWrapper
-                        android:drawable="@drawable/ic_volume_media"
-                        android:tint="?android:attr/colorAccent" />
-                </rotate>
-            </item>
-        </layer-list>
+        <inset
+            android:insetLeft="@dimen/rounded_slider_track_inset"
+            android:insetRight="@dimen/rounded_slider_track_inset" >
+            <shape>
+                <size android:height="@dimen/volume_dialog_track_width" />
+                <corners android:radius="@dimen/volume_dialog_track_corner_radius" />
+                <solid android:color="?androidprv:attr/colorAccentSecondaryVariant" />
+            </shape>
+        </inset>
     </item>
     <item android:id="@android:id/progress"
-          android:gravity="center_vertical|fill_horizontal">
-            <com.android.systemui.util.RoundedCornerProgressDrawable
-                android:drawable="@drawable/volume_row_seekbar_progress"
+        android:gravity="center_vertical|fill_horizontal">
+        <com.android.systemui.util.RoundedCornerProgressDrawable
+            android:drawable="@drawable/volume_row_seekbar_progress"
             />
     </item>
 </layer-list>
diff --git a/packages/SystemUI/res/drawable/volume_row_seekbar_progress.xml b/packages/SystemUI/res/drawable/volume_row_seekbar_progress.xml
index ef20236..4f97ca4 100644
--- a/packages/SystemUI/res/drawable/volume_row_seekbar_progress.xml
+++ b/packages/SystemUI/res/drawable/volume_row_seekbar_progress.xml
@@ -18,12 +18,13 @@
 <!-- Progress drawable for volume row SeekBars. This is the accent-colored round rect that moves up
      and down as the progress value changes. -->
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     android:autoMirrored="true">
     <item android:id="@+id/volume_seekbar_progress_solid">
         <shape>
-            <size android:height="@dimen/volume_dialog_panel_width" />
+            <size android:height="@dimen/volume_dialog_slider_width" />
             <solid android:color="?android:attr/colorAccent" />
-            <corners android:radius="@dimen/volume_dialog_panel_width_half"/>
+            <corners android:radius="@dimen/volume_dialog_slider_corner_radius"/>
         </shape>
     </item>
     <item
@@ -38,7 +39,7 @@
             <!-- A placeholder drawable is required here - it'll be replaced in code. -->
             <com.android.systemui.util.AlphaTintDrawableWrapper
                 android:drawable="@drawable/ic_volume_media"
-                android:tint="?android:attr/colorBackgroundFloating" />
+                android:tint="?androidprv:attr/colorAccentPrimaryVariant" />
         </rotate>
     </item>
 </layer-list>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml b/packages/SystemUI/res/layout/auth_biometric_face_to_fingerprint_view.xml
similarity index 86%
rename from packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
rename to packages/SystemUI/res/layout/auth_biometric_face_to_fingerprint_view.xml
index 87affde..7cf1789 100644
--- a/packages/SystemUI/res/layout/auth_biometric_face_to_udfps_view.xml
+++ b/packages/SystemUI/res/layout/auth_biometric_face_to_fingerprint_view.xml
@@ -14,7 +14,7 @@
   ~ limitations under the License.
   -->
 
-<com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView
+<com.android.systemui.biometrics.AuthBiometricFaceToFingerprintView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
@@ -22,4 +22,4 @@
 
     <include layout="@layout/auth_biometric_contents"/>
 
-</com.android.systemui.biometrics.AuthBiometricFaceToUdfpsView>
\ No newline at end of file
+</com.android.systemui.biometrics.AuthBiometricFaceToFingerprintView>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/brightness_mirror.xml b/packages/SystemUI/res/layout/brightness_mirror_container.xml
similarity index 70%
rename from packages/SystemUI/res/layout/brightness_mirror.xml
rename to packages/SystemUI/res/layout/brightness_mirror_container.xml
index b714767..ac90db3 100644
--- a/packages/SystemUI/res/layout/brightness_mirror.xml
+++ b/packages/SystemUI/res/layout/brightness_mirror_container.xml
@@ -17,10 +17,14 @@
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:theme="@style/Theme.SystemUI.QuickSettings"
-    android:id="@+id/brightness_mirror"
-    android:layout_width="@dimen/qs_panel_width"
-    android:layout_height="@dimen/brightness_mirror_height"
-    android:layout_gravity="@integer/notification_panel_layout_gravity"
+    android:id="@+id/brightness_mirror_container"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/brightness_mirror_background"
+    android:layout_gravity="center_vertical"
+    android:layout_margin="8dp"
+    android:padding="@dimen/rounded_slider_background_padding"
+    android:gravity="center"
     android:visibility="invisible">
 
 </FrameLayout>
diff --git a/packages/SystemUI/res/layout/controls_fullscreen.xml b/packages/SystemUI/res/layout/controls_fullscreen.xml
index 1b2d2e2..7fd029c 100644
--- a/packages/SystemUI/res/layout/controls_fullscreen.xml
+++ b/packages/SystemUI/res/layout/controls_fullscreen.xml
@@ -20,8 +20,7 @@
     android:id="@+id/control_detail_root"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:background="@android:color/black">
+    android:orientation="vertical">
 
   <com.android.systemui.globalactions.MinHeightScrollView
       android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/disabled_udfps_view.xml b/packages/SystemUI/res/layout/disabled_udfps_view.xml
deleted file mode 100644
index 13d3065..0000000
--- a/packages/SystemUI/res/layout/disabled_udfps_view.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.
-  -->
-<com.android.keyguard.DisabledUdfpsView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/disabled_udfps_view"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-/>
diff --git a/packages/SystemUI/res/layout/hybrid_conversation_notification.xml b/packages/SystemUI/res/layout/hybrid_conversation_notification.xml
index 214c44a..335e0a4 100644
--- a/packages/SystemUI/res/layout/hybrid_conversation_notification.xml
+++ b/packages/SystemUI/res/layout/hybrid_conversation_notification.xml
@@ -26,21 +26,22 @@
 
     <FrameLayout
         android:layout_width="@*android:dimen/conversation_content_start"
-        android:layout_height="25dp"
+        android:layout_height="@dimen/conversation_single_line_face_pile_size"
+        android:paddingHorizontal="16dp"
     >
         <ImageView
             android:id="@*android:id/conversation_icon"
-            android:layout_width="20dp"
-            android:layout_height="20dp"
-            android:layout_gravity="center"
+            android:layout_width="@dimen/conversation_single_line_avatar_size"
+            android:layout_height="@dimen/conversation_single_line_avatar_size"
+            android:layout_gravity="center_vertical|end"
         />
 
         <ViewStub
             android:id="@*android:id/conversation_face_pile"
             android:layout="@*android:layout/conversation_face_pile_layout"
-            android:layout_width="25dp"
-            android:layout_height="25dp"
-            android:layout_gravity="center"
+            android:layout_width="@dimen/conversation_single_line_face_pile_size"
+            android:layout_height="@dimen/conversation_single_line_face_pile_size"
+            android:layout_gravity="center_vertical|end"
         />
     </FrameLayout>
 
diff --git a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
index 7e944162..9210d05 100644
--- a/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
+++ b/packages/SystemUI/res/layout/media_smartspace_recommendations.xml
@@ -18,6 +18,7 @@
 <!-- Layout for media recommendations inside QSPanel carousel -->
 <com.android.systemui.util.animation.TransitionLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/media_recommendations"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
@@ -84,4 +85,90 @@
         android:layout_width="@dimen/qs_aa_media_rec_icon_size"
         android:layout_height="@dimen/qs_aa_media_rec_icon_size" />
 
+    <!-- Constraints are set here as they are the same regardless of host -->
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/qs_media_padding"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:layout_marginEnd="@dimen/qs_media_padding"
+        android:id="@+id/remove_text"
+        android:fontFamily="@*android:string/config_headlineFontFamily"
+        android:singleLine="true"
+        android:textColor="?android:attr/textColorPrimary"
+        android:text="@string/controls_media_close_session"
+        android:gravity="center_horizontal|top"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/settings"/>
+
+    <FrameLayout
+        android:id="@+id/settings"
+        android:background="@drawable/qs_media_light_source"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:paddingBottom="@dimen/qs_media_padding"
+        android:minWidth="48dp"
+        android:minHeight="48dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/remove_text">
+
+        <TextView
+            android:layout_gravity="bottom"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/qs_media_button_background"
+            android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
+            android:textColor="?android:attr/textColorPrimary"
+            android:text="@string/controls_media_settings_button" />
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/cancel"
+        android:background="@drawable/qs_media_light_source"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="8dp"
+        android:paddingBottom="@dimen/qs_media_padding"
+        android:minWidth="48dp"
+        android:minHeight="48dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/dismiss" >
+
+        <TextView
+            android:layout_gravity="bottom"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/qs_media_button_background"
+            android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
+            android:textColor="?android:attr/textColorPrimary"
+            android:text="@string/cancel" />
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/dismiss"
+        android:background="@drawable/qs_media_light_source"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/qs_media_padding"
+        android:paddingBottom="@dimen/qs_media_padding"
+        android:minWidth="48dp"
+        android:minHeight="48dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent">
+
+        <TextView
+            android:layout_gravity="bottom"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/qs_media_button_background"
+            android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
+            android:textColor="?android:attr/textColorPrimary"
+            android:text="@string/controls_media_dismiss_button"
+            />
+    </FrameLayout>
+
 </com.android.systemui.util.animation.TransitionLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/media_view.xml b/packages/SystemUI/res/layout/media_view.xml
index a4cf5ed..cdced5a 100644
--- a/packages/SystemUI/res/layout/media_view.xml
+++ b/packages/SystemUI/res/layout/media_view.xml
@@ -18,6 +18,7 @@
 <!-- Layout for media controls inside QSPanel carousel -->
 <com.android.systemui.util.animation.TransitionLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     android:id="@+id/qs_media_controls"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
@@ -32,8 +33,14 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:orientation="vertical"
-        app:layout_constraintGuide_percent="0.5"
-        />
+        app:layout_constraintGuide_percent="0.6" />
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/center_horizontal_guideline"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintGuide_percent="0.5" />
 
     <!-- As per Material Design on Biderectionality, this is forced to LTR in code -->
     <FrameLayout
@@ -50,7 +57,7 @@
             android:fontFamily="@*android:string/config_bodyFontFamily"
             android:textColor="?android:attr/textColorPrimary"
             android:gravity="start"
-            android:textSize="14sp" />
+            android:textSize="12sp" />
 
         <TextView
             android:id="@+id/media_total_time"
@@ -60,11 +67,11 @@
             android:fontFamily="@*android:string/config_bodyFontFamily"
             android:textColor="?android:attr/textColorPrimary"
             android:gravity="end"
-            android:textSize="14sp" />
+            android:textSize="12sp" />
     </FrameLayout>
 
     <!--  Actions must be ordered left-to-right even in RTL layout.  However, they appear in a chain
-    with the album art, and must as a group appear at the end of that chain.  This is
+    with the artist name, and must as a group appear at the end of that chain.  This is
     accomplished by having all actions appear in a LTR chain within the parent, and then biasing it
     to the right side, then this barrier is used to bound the text views.  -->
     <androidx.constraintlayout.widget.Barrier
@@ -72,10 +79,10 @@
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:orientation="vertical"
-        app:layout_constraintTop_toBottomOf="@id/header_artist"
+        app:layout_constraintTop_toBottomOf="@id/header_title"
         app:barrierDirection="start"
         app:constraint_referenced_ids="action0,action1,action2,action3,action4"
-        app:layout_constraintHorizontal_bias="0" />
+         />
 
     <ImageButton
         android:id="@+id/action0"
@@ -92,8 +99,8 @@
     <ImageButton
         android:id="@+id/action2"
         style="@style/MediaPlayer.Button"
-        android:layout_width="52dp"
-        android:layout_height="52dp" />
+        android:layout_width="48dp"
+        android:layout_height="48dp" />
 
     <ImageButton
         android:id="@+id/action3"
@@ -112,23 +119,27 @@
         android:id="@+id/album_art"
         android:layout_width="@dimen/qs_media_album_size"
         android:layout_height="@dimen/qs_media_album_size"
-        android:layout_gravity="center_vertical" />
+        android:layout_gravity="center_vertical"
+        android:background="@drawable/qs_media_art_background"
+        android:backgroundTint="?androidprv:attr/colorAccentSecondary"
+        android:clipToOutline="true" />
 
     <!-- Seamless Output Switcher -->
     <LinearLayout
         android:id="@+id/media_seamless"
         android:layout_width="0dp"
-        android:layout_height="wrap_content"
+        android:layout_height="48dp"
         android:orientation="horizontal"
-        android:gravity="center"
+        android:gravity="top|end"
+        android:paddingTop="@dimen/qs_media_padding"
+        android:paddingEnd="@dimen/qs_media_padding"
         android:background="@drawable/qs_media_light_source"
         android:forceHasOverlappingRendering="false">
         <LinearLayout
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_height="@dimen/qs_seamless_height"
             android:background="@drawable/qs_media_seamless_background"
             android:orientation="horizontal"
-            android:padding="6dp"
             android:contentDescription="@string/quick_settings_media_device_label">
             <ImageView
                 android:id="@+id/media_seamless_image"
@@ -138,25 +149,28 @@
                 android:tint="?android:attr/colorPrimary"
                 android:src="@*android:drawable/ic_media_seamless" />
             <TextView
-                android:visibility="gone"
                 android:id="@+id/media_seamless_text"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_vertical"
-                android:layout_marginStart="8dp"
+                android:layout_marginStart="4dp"
                 android:fontFamily="@*android:string/config_headlineFontFamily"
                 android:singleLine="true"
                 android:text="@*android:string/ext_media_seamless_action"
                 android:textColor="?android:attr/colorPrimary"
                 android:textDirection="locale"
-                android:textSize="14sp" />
+                android:textSize="12sp" />
         </LinearLayout>
     </LinearLayout>
 
     <ImageView
         android:id="@+id/media_seamless_fallback"
-        android:layout_width="@dimen/qs_seamless_icon_size"
-        android:layout_height="@dimen/qs_seamless_icon_size"
+        android:layout_width="@dimen/qs_seamless_fallback_icon_size"
+        android:layout_height="@dimen/qs_seamless_fallback_icon_size"
+        android:layout_marginTop="@dimen/qs_media_padding"
+        android:layout_marginBottom="@dimen/qs_media_padding"
+        android:layout_marginStart="@dimen/qs_center_guideline_padding"
+        android:layout_marginEnd="@dimen/qs_seamless_fallback_margin"
         android:tint="?android:attr/textColorPrimary"
         android:src="@drawable/ic_cast_connected"
         android:forceHasOverlappingRendering="false" />
@@ -170,27 +184,18 @@
         android:layout_height="wrap_content"
         android:clickable="true"
         android:maxHeight="@dimen/qs_media_enabled_seekbar_height"
-        android:paddingVertical="@dimen/qs_media_enabled_seekbar_vertical_padding"
+        android:paddingTop="@dimen/qs_media_enabled_seekbar_vertical_padding"
+        android:layout_marginTop="-22dp"
+        android:paddingBottom="0dp"
         android:thumbTint="?android:attr/textColorPrimary"
         android:progressTint="?android:attr/textColorPrimary"
-        android:progressBackgroundTint="?android:attr/colorBackground"
+        android:progressBackgroundTint="?android:attr/textColorTertiary"
         android:splitTrack="false" />
 
-    <!-- App name -->
-    <TextView
-        android:id="@+id/app_name"
-        android:textColor="?android:attr/textColorPrimary"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:singleLine="true"
-        android:fontFamily="@*android:string/config_headlineFontFamily"
-        android:textDirection="locale"
-        android:textSize="14sp" />
-
     <!-- Song name -->
     <TextView
         android:id="@+id/header_title"
-        android:layout_width="wrap_content"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
         android:singleLine="true"
@@ -200,7 +205,7 @@
     <!-- Artist name -->
     <TextView
         android:id="@+id/header_artist"
-        android:layout_width="wrap_content"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:fontFamily="@*android:string/config_headlineFontFamily"
         android:singleLine="true"
@@ -209,39 +214,28 @@
 
     <com.android.internal.widget.CachingIconView
         android:id="@+id/icon"
-        android:tint="?android:attr/textColorPrimary"
-        android:layout_width="48dp"
-        android:layout_height="48dp"
-        android:layout_margin="6dp" />
+        android:tint="?android:attr/colorAccent"
+        android:layout_width="@dimen/qs_media_icon_size"
+        android:layout_height="@dimen/qs_media_icon_size"
+        android:background="@drawable/qs_media_icon_background"
+    />
 
-    <!-- Constraints are set here as they are the same regardless of host -->
+    <!-- Long press menu -->
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:id="@+id/media_text"
-        android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
-        android:textColor="?android:attr/textColorSecondary"
-        android:text="@string/controls_media_title"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintBottom_toTopOf="@id/remove_text"
-        app:layout_constraintVertical_chainStyle="spread_inside"/>
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="@dimen/qs_media_padding"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:layout_marginEnd="@dimen/qs_media_padding"
         android:id="@+id/remove_text"
         android:fontFamily="@*android:string/config_headlineFontFamily"
         android:singleLine="true"
         android:textColor="?android:attr/textColorPrimary"
         android:text="@string/controls_media_close_session"
-        app:layout_constraintTop_toBottomOf="@id/media_text"
+        android:gravity="center_horizontal|top"
+        app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintBottom_toTopOf="@id/settings"/>
 
     <FrameLayout
@@ -249,8 +243,8 @@
         android:background="@drawable/qs_media_light_source"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
-        android:paddingBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:paddingBottom="@dimen/qs_media_padding"
         android:minWidth="48dp"
         android:minHeight="48dp"
         app:layout_constraintBottom_toBottomOf="parent"
@@ -261,6 +255,7 @@
             android:layout_gravity="bottom"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:background="@drawable/qs_media_button_background"
             android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
             android:textColor="?android:attr/textColorPrimary"
             android:text="@string/controls_media_settings_button" />
@@ -271,17 +266,19 @@
         android:background="@drawable/qs_media_light_source"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:paddingBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginEnd="8dp"
+        android:paddingBottom="@dimen/qs_media_padding"
         android:minWidth="48dp"
         android:minHeight="48dp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/dismiss" >
+        app:layout_constraintEnd_toStartOf="@id/dismiss"
+        app:layout_constraintTop_toBottomOf="@id/remove_text">
 
         <TextView
             android:layout_gravity="bottom"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:background="@drawable/qs_media_button_background"
             android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
             android:textColor="?android:attr/textColorPrimary"
             android:text="@string/cancel" />
@@ -292,17 +289,19 @@
         android:background="@drawable/qs_media_light_source"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:paddingBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginEnd="@dimen/qs_media_padding"
+        android:paddingBottom="@dimen/qs_media_padding"
         android:minWidth="48dp"
         android:minHeight="48dp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent">
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/remove_text">
 
         <TextView
             android:layout_gravity="bottom"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:background="@drawable/qs_media_button_background"
             android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
             android:textColor="?android:attr/textColorPrimary"
             android:text="@string/controls_media_dismiss_button"
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index 1125092..ea644cf 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -24,7 +24,6 @@
     android:clipChildren="true"
     android:clipToPadding="true"
     android:orientation="vertical"
-    android:background="?android:attr/colorBackground"
     android:paddingStart="12dp">
 
     <!-- Package Info -->
diff --git a/packages/SystemUI/res/layout/ongoing_call_chip.xml b/packages/SystemUI/res/layout/ongoing_call_chip.xml
index c90fc31..a5e7f5d 100644
--- a/packages/SystemUI/res/layout/ongoing_call_chip.xml
+++ b/packages/SystemUI/res/layout/ongoing_call_chip.xml
@@ -23,7 +23,6 @@
     android:background="@drawable/ongoing_call_chip_bg"
     android:paddingStart="@dimen/ongoing_call_chip_side_padding"
     android:paddingEnd="@dimen/ongoing_call_chip_side_padding"
-    android:visibility="gone"
 >
 
     <ImageView
diff --git a/packages/SystemUI/res/layout/people_space_placeholder_layout.xml b/packages/SystemUI/res/layout/people_space_placeholder_layout.xml
index 2402bd7..abb771b 100644
--- a/packages/SystemUI/res/layout/people_space_placeholder_layout.xml
+++ b/packages/SystemUI/res/layout/people_space_placeholder_layout.xml
@@ -26,7 +26,7 @@
         android:orientation="horizontal"
         android:gravity="center"
         android:layout_gravity="top"
-        android:paddingVertical="16dp"
+        android:paddingVertical="8dp"
         android:paddingHorizontal="16dp"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
diff --git a/packages/SystemUI/res/layout/privacy_dialog_item.xml b/packages/SystemUI/res/layout/privacy_dialog_item.xml
index 0c8ed9f..b91fb29c 100644
--- a/packages/SystemUI/res/layout/privacy_dialog_item.xml
+++ b/packages/SystemUI/res/layout/privacy_dialog_item.xml
@@ -31,7 +31,6 @@
         android:layout_width="@dimen/ongoing_appops_dialog_circle_size"
         android:layout_height="@dimen/ongoing_appops_dialog_circle_size"
         android:layout_gravity="center_vertical"
-        android:importantForAccessibility="no"
     />
 
     <TextView
diff --git a/packages/SystemUI/res/layout/qs_customize_tile_divider.xml b/packages/SystemUI/res/layout/qs_customize_tile_divider.xml
index 0d932ac..19c2fc8 100644
--- a/packages/SystemUI/res/layout/qs_customize_tile_divider.xml
+++ b/packages/SystemUI/res/layout/qs_customize_tile_divider.xml
@@ -18,8 +18,5 @@
 <View
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginStart="16dp"
-    android:layout_marginEnd="16dp"
-    android:background="?android:attr/listDivider"
+    android:layout_height="32dp"
     android:importantForAccessibility="no" />
diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml
index 59e1a75..f056402 100644
--- a/packages/SystemUI/res/layout/qs_detail.xml
+++ b/packages/SystemUI/res/layout/qs_detail.xml
@@ -23,6 +23,7 @@
     android:clickable="true"
     android:orientation="vertical"
     android:layout_marginTop="@*android:dimen/quick_qs_offset_height"
+    android:layout_marginBottom="@dimen/qs_container_bottom_padding"
     android:paddingBottom="8dp"
     android:visibility="invisible"
     android:elevation="4dp"
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index 343b398..93a4715 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -50,7 +50,8 @@
                 android:focusable="true"
                 android:gravity="center_vertical"
                 android:singleLine="true"
-                android:textAppearance="@style/TextAppearance.QS.Status"
+                android:textColor="?android:attr/textColorSecondary"
+                android:textAppearance="@style/TextAppearance.QS.Build"
                 android:visibility="gone" />
 
             <com.android.systemui.qs.PageIndicator
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 3d2a621..30e52e9 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -32,6 +32,7 @@
         android:id="@+id/expanded_qs_scroll_view"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:paddingBottom="@dimen/qs_container_bottom_padding"
         android:elevation="4dp"
         android:importantForAccessibility="no"
         android:scrollbars="none"
diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
index 1f90476..d8bb7e6 100644
--- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml
+++ b/packages/SystemUI/res/layout/quick_qs_status_icons.xml
@@ -44,14 +44,6 @@
         android:layout_weight="1"
         />
 
-    <!-- Will hold security footer in landscape with media -->
-    <FrameLayout
-        android:id="@+id/header_text_container"
-        android:layout_height="match_parent"
-        android:layout_width="wrap_content"
-        android:gravity="center"
-        />
-
     <include layout="@layout/qs_carrier_group"
         android:id="@+id/carrier_group"
         android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index f4d5304..e95c6a7 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -13,16 +13,12 @@
      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_height="wrap_content"
-    android:layout_width="match_parent"
-    android:layout_gravity="center">
-
     <com.android.systemui.settings.brightness.BrightnessSliderView
+        xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/brightness_slider"
         android:layout_width="match_parent"
         android:layout_height="@dimen/brightness_mirror_height"
-        android:layout_gravity="center_vertical"
+        android:layout_gravity="center"
         android:contentDescription="@string/accessibility_brightness"
         android:importantForAccessibility="no" >
 
@@ -40,4 +36,3 @@
             android:splitTrack="false"
         />
     </com.android.systemui.settings.brightness.BrightnessSliderView>
-</FrameLayout>
diff --git a/packages/SystemUI/res/layout/quick_settings_footer.xml b/packages/SystemUI/res/layout/quick_settings_footer.xml
deleted file mode 100644
index db712e4..0000000
--- a/packages/SystemUI/res/layout/quick_settings_footer.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<com.android.systemui.util.NeverExactlyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:minHeight="48dp"
-    android:clickable="true"
-    android:paddingBottom="@dimen/qs_tile_padding_top"
-    android:paddingTop="@dimen/qs_tile_padding_top"
-    android:paddingStart="@dimen/qs_footer_padding_start"
-    android:paddingEnd="@dimen/qs_footer_padding_end"
-    android:gravity="center_vertical"
-    android:layout_gravity="center_vertical|center_horizontal"
-    android:background="@android:color/transparent">
-
-    <ImageView
-        android:id="@+id/primary_footer_icon"
-        android:layout_width="@dimen/qs_footer_icon_size"
-        android:layout_height="@dimen/qs_footer_icon_size"
-        android:gravity="start"
-        android:layout_marginEnd="8dp"
-        android:contentDescription="@null"
-        android:tint="?android:attr/textColorPrimary" />
-
-    <com.android.systemui.util.AutoMarqueeTextView
-        android:id="@+id/footer_text"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:singleLine="true"
-        android:ellipsize="marquee"
-        android:marqueeRepeatLimit="marquee_forever"
-        android:textAppearance="@style/TextAppearance.QS.TileLabel"
-        android:textColor="?android:attr/textColorPrimary"/>
-
-    <ImageView
-        android:id="@+id/footer_icon"
-        android:layout_width="@dimen/qs_footer_icon_size"
-        android:layout_height="@dimen/qs_footer_icon_size"
-        android:layout_marginStart="8dp"
-        android:contentDescription="@null"
-        android:src="@drawable/ic_info_outline"
-        android:tint="?android:attr/textColorPrimary" />
-
-</com.android.systemui.util.NeverExactlyLinearLayout>
diff --git a/packages/SystemUI/res/layout/quick_settings_security_footer.xml b/packages/SystemUI/res/layout/quick_settings_security_footer.xml
new file mode 100644
index 0000000..de65fa0
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_security_footer.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.systemui.util.DualHeightHorizontalLinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:systemui="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/qs_security_footer_height"
+    android:clickable="true"
+    android:padding="@dimen/qs_footer_padding"
+    android:gravity="center_vertical"
+    android:layout_gravity="center_vertical|center_horizontal"
+    android:layout_marginVertical="@dimen/qs_security_footer_vertical_margin"
+    android:background="@drawable/qs_security_footer_background"
+    systemui:singleLineHeight="@dimen/qs_security_footer_single_line_height"
+    systemui:textViewId="@id/footer_text"
+    >
+
+    <ImageView
+        android:id="@+id/primary_footer_icon"
+        android:layout_width="@dimen/qs_footer_icon_size"
+        android:layout_height="@dimen/qs_footer_icon_size"
+        android:gravity="start"
+        android:layout_marginEnd="12dp"
+        android:contentDescription="@null"
+        android:tint="?android:attr/textColorSecondary" />
+
+    <TextView
+        android:id="@+id/footer_text"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:maxLines="@integer/qs_security_footer_maxLines"
+        android:ellipsize="end"
+        android:textAppearance="@style/TextAppearance.QS.SecurityFooter"
+        android:textColor="?android:attr/textColorSecondary"/>
+
+    <ImageView
+        android:id="@+id/footer_icon"
+        android:layout_width="@dimen/qs_footer_icon_size"
+        android:layout_height="@dimen/qs_footer_icon_size"
+        android:layout_marginStart="8dp"
+        android:contentDescription="@null"
+        android:src="@*android:drawable/ic_chevron_end"
+        android:tint="?android:attr/textColorSecondary" />
+
+</com.android.systemui.util.DualHeightHorizontalLinearLayout>
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml b/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml
index 22cf2cb..d0e3d3c 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml
@@ -55,6 +55,16 @@
         android:layout_gravity="center_vertical|center_horizontal"
         android:visibility="gone" />
 
+    <!-- Will hold security footer in landscape with media -->
+    <FrameLayout
+        android:id="@+id/header_text_container"
+        android:layout_height="match_parent"
+        android:layout_width="wrap_content"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:gravity="center"
+    />
+
     <LinearLayout
         android:layout_width="0dp"
         android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/layout/remote_input.xml b/packages/SystemUI/res/layout/remote_input.xml
index 4fcce24..a909d0d 100644
--- a/packages/SystemUI/res/layout/remote_input.xml
+++ b/packages/SystemUI/res/layout/remote_input.xml
@@ -22,28 +22,75 @@
         android:id="@+id/remote_input"
         android:layout_height="match_parent"
         android:layout_width="match_parent">
+    <LinearLayout
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:id="@+id/remote_input_content"
+        android:orientation="vertical"
+        android:clipToPadding="false"
+        android:layout_marginEnd="20dp"
+        android:layout_marginStart="20dp"
+        android:layout_marginTop="5dp"
+        android:layout_marginBottom="16dp"
+        android:layout_weight="1">
+        <FrameLayout
+            android:id="@+id/remote_input_content_container"
+            android:layout_marginTop="-6dp"
+            android:layout_height="60dp"
+            android:layout_width="60dp"
+            android:layout_marginStart="4dp"
+            android:layout_marginBottom="12dp"
+            android:visibility="gone"
+            android:layout_gravity="center_vertical">
+            <ImageView
+                android:id="@+id/remote_input_attachment_image"
+                android:layout_width="48dp"
+                android:layout_height="48dp"
+                android:layout_gravity="start|bottom"
+                android:clipToOutline="true"
+                android:background="@drawable/rounded_rect_background"
+                android:scaleType="centerCrop" />
+            <ImageView
+                android:id="@+id/remote_input_delete_bg"
+                android:paddingStart="24dp"
+                android:paddingBottom="24dp"
+                android:layout_width="48dp"
+                android:layout_height="48dp"
+                android:layout_gravity="end|top"
+                android:src="@drawable/thumbnail_delete_btn_bg"/>
+            <ImageView
+                android:id="@+id/remote_input_delete"
+                android:paddingTop="3dp"
+                android:paddingEnd="3dp"
+                android:paddingStart="27dp"
+                android:paddingBottom="27dp"
+                android:layout_width="48dp"
+                android:layout_height="48dp"
+                android:layout_gravity="end|top"
+                android:src="@drawable/ic_close"
+                android:contentDescription="@string/notif_inline_reply_remove_attachment_description"/>
+        </FrameLayout>
 
-    <view class="com.android.systemui.statusbar.policy.RemoteInputView$RemoteEditText"
-            android:id="@+id/remote_input_text"
-            android:layout_height="wrap_content"
-            android:layout_width="0dp"
-            android:layout_weight="1"
-            android:paddingTop="2dp"
-            android:paddingStart="16dp"
-            android:paddingEnd="12dp"
-            android:layout_marginLeft="16dp"
-            android:layout_marginTop="5dp"
-            android:layout_marginBottom="16dp"
-            android:layout_gravity="start|center_vertical"
-            android:textAppearance="?android:attr/textAppearance"
-            android:textColor="@color/remote_input_text"
-            android:textColorHint="@color/remote_input_hint"
-            android:textSize="16sp"
-            android:background="@null"
-            android:maxLines="4"
-            android:ellipsize="start"
-            android:inputType="textShortMessage|textMultiLine|textAutoCorrect|textCapSentences"
-            android:imeOptions="actionSend|flagNoExtractUi|flagNoFullscreen" />
+        <view class="com.android.systemui.statusbar.policy.RemoteInputView$RemoteEditText"
+                android:id="@+id/remote_input_text"
+                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:paddingTop="2dp"
+                android:paddingStart="4dp"
+                android:paddingBottom="4dp"
+                android:paddingEnd="12dp"
+                android:layout_gravity="start|center_vertical"
+                android:textAppearance="?android:attr/textAppearance"
+                android:textColor="@color/remote_input_text"
+                android:textColorHint="@color/remote_input_hint"
+                android:textSize="16sp"
+                android:background="@null"
+                android:maxLines="4"
+                android:ellipsize="start"
+                android:inputType="textShortMessage|textMultiLine|textAutoCorrect|textCapSentences"
+                android:imeOptions="actionSend|flagNoExtractUi|flagNoFullscreen" />
+    </LinearLayout>
 
     <FrameLayout
             android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 46a698a..52995ea 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -37,10 +37,6 @@
         android:layout_height="match_parent"
         android:layout_width="match_parent" />
 
-    <include
-        layout="@layout/keyguard_status_view"
-        android:visibility="gone" />
-
     <com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -49,6 +45,10 @@
         android:clipToPadding="false"
         android:clipChildren="false">
 
+        <include
+            layout="@layout/keyguard_status_view"
+            android:visibility="gone"/>
+
         <include layout="@layout/dock_info_overlay" />
 
         <FrameLayout
diff --git a/packages/SystemUI/res/layout/status_bar_notification_footer.xml b/packages/SystemUI/res/layout/status_bar_notification_footer.xml
index 91220e5..c3c291b 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_footer.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_footer.xml
@@ -31,6 +31,7 @@
             android:id="@+id/manage_text"
             android:layout_width="wrap_content"
             android:layout_height="40dp"
+            android:layout_marginTop="16dp"
             android:layout_gravity="start"
             android:background="@drawable/notif_footer_btn_background"
             android:focusable="true"
@@ -43,6 +44,7 @@
             android:id="@+id/dismiss_text"
             android:layout_width="wrap_content"
             android:layout_height="40dp"
+            android:layout_marginTop="16dp"
             android:layout_gravity="end"
             android:background="@drawable/notif_footer_btn_background"
             android:focusable="true"
diff --git a/packages/SystemUI/res/layout/status_bar_notification_shelf.xml b/packages/SystemUI/res/layout/status_bar_notification_shelf.xml
index 781c015..87a1bbb 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_shelf.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_shelf.xml
@@ -27,10 +27,6 @@
         android:id="@+id/backgroundNormal"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
-    <com.android.systemui.statusbar.notification.row.NotificationBackgroundView
-        android:id="@+id/backgroundDimmed"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
     <com.android.systemui.statusbar.phone.NotificationIconContainer
         android:id="@+id/content"
         android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml
index 941081e..bea50e8 100644
--- a/packages/SystemUI/res/layout/super_notification_shade.xml
+++ b/packages/SystemUI/res/layout/super_notification_shade.xml
@@ -43,7 +43,7 @@
                    android:visibility="invisible" />
     </com.android.systemui.statusbar.BackDropView>
 
-    <com.android.systemui.statusbar.ScrimView
+    <com.android.systemui.scrim.ScrimView
         android:id="@+id/scrim_behind"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -51,7 +51,7 @@
         sysui:ignoreRightInset="true"
         />
 
-    <com.android.systemui.statusbar.ScrimView
+    <com.android.systemui.scrim.ScrimView
         android:id="@+id/scrim_notifications"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -70,9 +70,9 @@
         android:layout_height="match_parent"
         android:visibility="invisible" />
 
-    <include layout="@layout/brightness_mirror" />
+    <include layout="@layout/brightness_mirror_container" />
 
-    <com.android.systemui.statusbar.ScrimView
+    <com.android.systemui.scrim.ScrimView
         android:id="@+id/scrim_in_front"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/layout/udfps_view.xml b/packages/SystemUI/res/layout/udfps_view.xml
index 50b2f20..e5e8fe6 100644
--- a/packages/SystemUI/res/layout/udfps_view.xml
+++ b/packages/SystemUI/res/layout/udfps_view.xml
@@ -20,7 +20,8 @@
     android:id="@+id/udfps_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    systemui:sensorTouchAreaCoefficient="0.5">
+    systemui:sensorTouchAreaCoefficient="0.5"
+    android:contentDescription="@string/accessibility_fingerprint_label">
 
     <ViewStub
         android:id="@+id/animation_view"
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index 6aac5a3..a39006c 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -16,114 +16,119 @@
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:sysui="http://schemas.android.com/apk/res-auto"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     android:id="@+id/volume_dialog_container"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:gravity="right"
     android:layout_gravity="right"
-    android:paddingRight="@dimen/volume_dialog_stream_padding"
     android:clipToPadding="false"
-    android:background="@android:color/transparent"
     android:theme="@style/volume_dialog_theme">
 
     <!-- right-aligned to be physically near volume button -->
     <LinearLayout
         android:id="@+id/volume_dialog"
-        android:minWidth="@dimen/volume_dialog_panel_width"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:gravity="right"
         android:layout_gravity="right"
-        android:background="@android:color/transparent"
-        android:paddingRight="@dimen/volume_dialog_panel_transparent_padding_right"
-        android:paddingLeft="@dimen/volume_dialog_panel_transparent_padding"
+        android:layout_marginRight="@dimen/volume_dialog_panel_transparent_padding_right"
         android:orientation="vertical"
         android:clipToPadding="false"
         android:clipChildren="false">
 
-        <include layout="@layout/volume_ringer_drawer" />
-
-        <FrameLayout
-            android:visibility="gone"
-            android:id="@+id/ringer"
-            android:layout_width="@dimen/volume_dialog_ringer_size"
-            android:layout_height="@dimen/volume_dialog_ringer_size"
-            android:layout_marginBottom="@dimen/volume_dialog_spacer"
-            android:gravity="right"
-            android:layout_gravity="right"
-            android:translationZ="@dimen/volume_dialog_elevation"
-            android:clipToPadding="false"
-            android:background="@drawable/rounded_bg_full">
-            <com.android.keyguard.AlphaOptimizedImageButton
-                android:id="@+id/ringer_icon"
-                style="@style/VolumeButtons"
-                android:background="@drawable/rounded_ripple"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:scaleType="fitCenter"
-                android:padding="@dimen/volume_dialog_ringer_icon_padding"
-                android:tint="?android:attr/textColorPrimary"
-                android:layout_gravity="center"
-                android:soundEffectsEnabled="false" />
-
-            <include layout="@layout/volume_dnd_icon"
-                     android:layout_width="match_parent"
-                     android:layout_height="wrap_content"
-                     android:layout_marginRight="@dimen/volume_dialog_stream_padding"
-                     android:layout_marginTop="6dp"/>
-        </FrameLayout>
 
         <LinearLayout
-            android:id="@+id/main"
-            android:minWidth="@dimen/volume_dialog_panel_width"
+            android:id="@+id/volume_dialog_ringer_and_rows_container"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:gravity="right"
-            android:layout_gravity="right"
             android:orientation="vertical"
+            android:padding="7dp"
             android:clipChildren="false"
-            android:clipToPadding="false" >
+            android:background="@drawable/volume_background">
+
+            <include layout="@layout/volume_ringer_drawer" />
+
+            <FrameLayout
+                android:visibility="gone"
+                android:id="@+id/ringer"
+                android:layout_width="@dimen/volume_dialog_ringer_size"
+                android:layout_height="@dimen/volume_dialog_ringer_size"
+                android:layout_marginBottom="@dimen/volume_dialog_spacer"
+                android:gravity="right"
+                android:layout_gravity="right"
+                android:translationZ="@dimen/volume_dialog_elevation"
+                android:clipToPadding="false"
+                android:background="@drawable/rounded_bg_full">
+                <com.android.keyguard.AlphaOptimizedImageButton
+                    android:id="@+id/ringer_icon"
+                    style="@style/VolumeButtons"
+                    android:background="@drawable/rounded_ripple"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:scaleType="fitCenter"
+                    android:padding="@dimen/volume_dialog_ringer_icon_padding"
+                    android:tint="?android:attr/textColorPrimary"
+                    android:layout_gravity="center"
+                    android:soundEffectsEnabled="false" />
+
+                <include layout="@layout/volume_dnd_icon"
+                         android:layout_width="match_parent"
+                         android:layout_height="wrap_content"
+                         android:layout_marginRight="@dimen/volume_dialog_stream_padding"
+                         android:layout_marginTop="6dp"/>
+            </FrameLayout>
+
             <LinearLayout
-                android:id="@+id/volume_dialog_rows"
+                android:id="@+id/main"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:minWidth="@dimen/volume_dialog_panel_width"
-                android:gravity="center"
-                android:orientation="horizontal"
-                android:layout_marginTop="@dimen/volume_row_slider_padding_start">
-                    <!-- volume rows added and removed here! :-) -->
+                android:gravity="right"
+                android:layout_gravity="right"
+                android:orientation="vertical"
+                android:clipChildren="false"
+                android:clipToPadding="false" >
+                <LinearLayout
+                    android:id="@+id/volume_dialog_rows"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:orientation="horizontal"
+                    android:layout_marginTop="@dimen/volume_row_slider_padding_start">
+                        <!-- volume rows added and removed here! :-) -->
+                </LinearLayout>
+                <FrameLayout
+                    android:id="@+id/settings_container"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <com.android.keyguard.AlphaOptimizedImageButton
+                        android:id="@+id/settings"
+                        android:src="@drawable/horizontal_ellipsis"
+                        android:layout_width="@dimen/volume_dialog_tap_target_size"
+                        android:layout_height="@dimen/volume_dialog_tap_target_size"
+                        android:layout_gravity="center"
+                        android:contentDescription="@string/accessibility_volume_settings"
+                        android:background="@drawable/ripple_drawable_20dp"
+                        android:tint="?androidprv:attr/colorAccent"
+                        android:soundEffectsEnabled="false" />
+                </FrameLayout>
             </LinearLayout>
-            <FrameLayout
-                android:id="@+id/settings_container"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
-                <com.android.keyguard.AlphaOptimizedImageButton
-                    android:id="@+id/settings"
-                    android:src="@drawable/horizontal_ellipsis"
-                    android:layout_width="@dimen/volume_dialog_tap_target_size"
-                    android:layout_height="@dimen/volume_dialog_tap_target_size"
-                    android:layout_gravity="center"
-                    android:contentDescription="@string/accessibility_volume_settings"
-                    android:background="@drawable/ripple_drawable_20dp"
-                    android:tint="?android:attr/colorBackgroundFloating"
-                    android:soundEffectsEnabled="false" />
-            </FrameLayout>
+
         </LinearLayout>
 
         <FrameLayout
             android:id="@+id/odi_captions"
             android:layout_width="@dimen/volume_dialog_caption_size"
             android:layout_height="@dimen/volume_dialog_caption_size"
-            android:layout_marginTop="@dimen/volume_dialog_spacer"
+            android:layout_marginTop="@dimen/volume_dialog_row_margin_bottom"
             android:gravity="right"
-            android:layout_gravity="right"
+            android:layout_gravity="center"
             android:clipToPadding="false"
-            android:background="@drawable/rounded_bg_full">
+            android:background="@drawable/volume_background">
             <com.android.systemui.volume.CaptionsToggleImageButton
                 android:id="@+id/odi_captions_icon"
                 android:src="@drawable/ic_volume_odi_captions_disabled"
                 style="@style/VolumeButtons"
-                android:background="@drawable/rounded_ripple"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:tint="?android:attr/colorAccent"
@@ -131,7 +136,6 @@
                 android:soundEffectsEnabled="false"
                 sysui:optedOut="false"/>
         </FrameLayout>
-
     </LinearLayout>
 
     <ViewStub
diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml
index 1d5bca9..446c7eb 100644
--- a/packages/SystemUI/res/layout/volume_dialog_row.xml
+++ b/packages/SystemUI/res/layout/volume_dialog_row.xml
@@ -17,7 +17,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:tag="row"
     android:layout_height="wrap_content"
-    android:layout_width="@dimen/volume_dialog_panel_width"
+    android:layout_width="@dimen/volume_dialog_slider_width"
     android:clipChildren="false"
     android:clipToPadding="false"
     android:translationZ="@dimen/volume_dialog_elevation"
@@ -25,7 +25,7 @@
 
     <LinearLayout
         android:layout_height="wrap_content"
-        android:layout_width="@dimen/volume_dialog_panel_width"
+        android:layout_width="@dimen/volume_dialog_slider_width"
         android:gravity="center"
         android:layout_gravity="center"
         android:orientation="vertical" >
@@ -54,7 +54,9 @@
                 android:layout_width="@dimen/volume_row_slider_height"
                 android:layout_height="match_parent"
                 android:layout_gravity="center"
-                android:thumb="@android:color/transparent"
+                android:thumb="@null"
+                android:splitTrack="false"
+                android:progressDrawable="@drawable/volume_row_seekbar"
                 android:rotation="270" />
         </FrameLayout>
 
diff --git a/packages/SystemUI/res/layout/volume_ringer_drawer.xml b/packages/SystemUI/res/layout/volume_ringer_drawer.xml
index d6e1782..9d14ac4 100644
--- a/packages/SystemUI/res/layout/volume_ringer_drawer.xml
+++ b/packages/SystemUI/res/layout/volume_ringer_drawer.xml
@@ -60,7 +60,7 @@
                     android:layout_width="@dimen/volume_ringer_drawer_icon_size"
                     android:layout_height="@dimen/volume_ringer_drawer_icon_size"
                     android:layout_gravity="center"
-                    android:tint="?android:attr/colorAccent"
+                    android:tint="?android:attr/textColorPrimary"
                     android:src="@drawable/ic_volume_ringer_vibrate" />
 
             </FrameLayout>
@@ -77,7 +77,7 @@
                     android:layout_width="@dimen/volume_ringer_drawer_icon_size"
                     android:layout_height="@dimen/volume_ringer_drawer_icon_size"
                     android:layout_gravity="center"
-                    android:tint="?android:attr/colorAccent"
+                    android:tint="?android:attr/textColorPrimary"
                     android:src="@drawable/ic_volume_ringer_mute" />
 
             </FrameLayout>
@@ -94,7 +94,7 @@
                     android:layout_width="@dimen/volume_ringer_drawer_icon_size"
                     android:layout_height="@dimen/volume_ringer_drawer_icon_size"
                     android:layout_gravity="center"
-                    android:tint="?android:attr/colorAccent"
+                    android:tint="?android:attr/textColorPrimary"
                     android:src="@drawable/ic_volume_ringer" />
 
             </FrameLayout>
@@ -118,7 +118,7 @@
             android:layout_width="@dimen/volume_ringer_drawer_icon_size"
             android:layout_height="@dimen/volume_ringer_drawer_icon_size"
             android:layout_gravity="center"
-            android:tint="?android:attr/colorBackgroundFloating"
+            android:tint="?android:attr/textColorPrimaryInverse"
             android:src="@drawable/ic_volume_media" />
 
     </FrameLayout>
diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
index 7aca9f8..e4b6e07 100644
--- a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
+++ b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
@@ -1,54 +1,11 @@
 precision mediump float;
-#define GAMMA 2.2
-#define INV_GAMMA 1.0 / GAMMA
 
 // The actual wallpaper texture.
 uniform sampler2D uTexture;
-uniform float uExposure;
 
 varying vec2 vTextureCoordinates;
 
-// Following the Rec. ITU-R BT.709.
-float relativeLuminance(vec3 color) {
-    return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
-}
-
-// Adjusts the exposure of some luminance value.
-float relativeExposureCompensation(in float lum, in float ev) {
-    return lum * pow(2.0, ev);
-}
-
-vec4 srgbToLinear(in vec4 color) {
-    vec4 linearColor = vec4(color);
-    linearColor.rgb = pow(linearColor.rgb, vec3(GAMMA));
-    return linearColor;
-}
-
-vec4 linearToSrgb(in vec4 color) {
-    vec4 srgbColor = vec4(color);
-        srgbColor.rgb = pow(srgbColor.rgb, vec3(INV_GAMMA));
-        return srgbColor;
-}
-
-/*
- * Normalizes a value inside a range to a normalized range [0,1].
- */
-float normalizedRange(in float value, in float inMin, in float inMax) {
-    float valueClamped = clamp(value, inMin, inMax);
-    return (value - inMin) / (inMax - inMin);
-}
-
 void main() {
-    // Gets the pixel value of the wallpaper for this uv coordinates on screen.
-    vec4 color = srgbToLinear(texture2D(uTexture, vTextureCoordinates));
-    float lum = relativeLuminance(color.rgb);
-
-    // Transform it using the S curve created by the smoothstep. This will increase the contrast.
-    lum = smoothstep(0., 1., lum) + 0.001;
-
-    lum = relativeExposureCompensation(lum, mix(-5., 10., uExposure));
-    lum = mix(clamp(lum, 0.0, 1.0), 1.0, normalizedRange(uExposure, 0.55, 1.0));
-    color.rgb *= lum;
-
-    gl_FragColor = linearToSrgb(color);
+    // gets the pixel value of the wallpaper for this uv coordinates on screen.
+    gl_FragColor = texture2D(uTexture, vTextureCoordinates);
 }
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index 007f81b..46e7d71 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -30,10 +30,16 @@
     -->
     <dimen name="qs_customize_header_min_height">44dp</dimen>
 
+    <dimen name="qs_security_footer_single_line_height">@*android:dimen/quick_qs_offset_height</dimen>
+    <dimen name="qs_footer_padding">14dp</dimen>
+    <dimen name="qs_security_footer_vertical_margin">0dp</dimen>
+    <dimen name="qs_security_footer_background_inset">12dp</dimen>
+    <dimen name="qs_security_footer_corner_radius">28dp</dimen>
+
     <dimen name="battery_detail_graph_space_top">9dp</dimen>
     <dimen name="battery_detail_graph_space_bottom">9dp</dimen>
 
-    <dimen name="qs_detail_margin_top">0dp</dimen>
+    <dimen name="qs_detail_margin_top">14dp</dimen>
 
     <dimen name="volume_tool_tip_right_margin">136dp</dimen>
     <dimen name="volume_tool_tip_top_margin">12dp</dimen>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index f489fe8..eb72442 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -189,5 +189,11 @@
         <attr name="borderThickness" format="dimension" />
         <attr name="borderColor" format="color" />
     </declare-styleable>
+
+    <declare-styleable name="DualHeightHorizontalLinearLayout">
+        <attr name="singleLineHeight" format="dimension" />
+        <attr name="singleLineVerticalPadding" format="dimension" />
+        <attr name="textViewId" format="reference" />
+    </declare-styleable>
 </resources>
 
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 5feb957..120b3f8 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -375,7 +375,7 @@
     <bool name="config_showNotificationGear">true</bool>
 
     <!-- Whether or not a background should be drawn behind a notification. -->
-    <bool name="config_drawNotificationBackground">true</bool>
+    <bool name="config_drawNotificationBackground">false</bool>
 
     <!-- Whether or the notifications can be shown and dismissed with a drag. -->
     <bool name="config_enableNotificationShadeDrag">true</bool>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 210efd8..b76a4ce 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -139,7 +139,7 @@
     <dimen name="notification_min_height_before_s">106dp</dimen>
 
     <!-- Height of a large notification in the status bar -->
-    <dimen name="notification_max_height">294dp</dimen>
+    <dimen name="notification_max_height">358dp</dimen>
 
     <!-- Height of a heads up notification in the status bar for legacy custom views -->
     <dimen name="notification_max_heads_up_height_legacy">128dp</dimen>
@@ -157,7 +157,7 @@
     <dimen name="notification_max_heads_up_height_increased">188dp</dimen>
 
     <!-- Side padding on the lockscreen on the side of notifications -->
-    <dimen name="notification_side_paddings">4dp</dimen>
+    <dimen name="notification_side_paddings">16dp</dimen>
 
     <!-- padding between the heads up and the statusbar -->
     <dimen name="heads_up_status_bar_padding">8dp</dimen>
@@ -179,10 +179,10 @@
     <dimen name="notification_min_interaction_height">40dp</dimen>
 
     <!-- Radius for notifications corners without adjacent notifications -->
-    <dimen name="notification_corner_radius">8dp</dimen>
+    <dimen name="notification_corner_radius">28dp</dimen>
 
     <!-- Radius for notifications corners with adjacent notifications -->
-    <dimen name="notification_corner_radius_small">0dp</dimen>
+    <dimen name="notification_corner_radius_small">4dp</dimen>
 
     <!-- the padding of the shelf icon container -->
     <dimen name="shelf_icon_container_padding">13dp</dimen>
@@ -461,29 +461,33 @@
     <!-- The width of the panel that holds the quick settings. -->
     <dimen name="qs_panel_width">@dimen/notification_panel_width</dimen>
 
-    <dimen name="volume_dialog_panel_transparent_padding_right">4dp</dimen>
+    <dimen name="volume_dialog_panel_transparent_padding_right">8dp</dimen>
 
     <dimen name="volume_dialog_panel_transparent_padding">20dp</dimen>
 
     <dimen name="volume_dialog_stream_padding">12dp</dimen>
 
-    <dimen name="volume_dialog_panel_width">64dp</dimen>
+    <dimen name="volume_dialog_panel_width">56dp</dimen>
 
-    <dimen name="volume_dialog_panel_width_half">32dp</dimen>
+    <dimen name="volume_dialog_panel_width_half">28dp</dimen>
+
+    <dimen name="volume_dialog_slider_width">42dp</dimen>
+
+    <dimen name="volume_dialog_slider_corner_radius">21dp</dimen>
 
     <dimen name="volume_dialog_slider_height">116dp</dimen>
 
-    <dimen name="volume_dialog_slider_width">@dimen/volume_dialog_panel_width</dimen>
+    <dimen name="volume_dialog_track_width">4dp</dimen>
 
-    <dimen name="volume_dialog_slider_corner_radius">@dimen/volume_dialog_panel_width_half</dimen>
+    <dimen name="volume_dialog_track_corner_radius">2dp</dimen>
 
-    <dimen name="volume_dialog_ringer_size">64dp</dimen>
+    <dimen name="volume_dialog_ringer_size">42dp</dimen>
 
     <dimen name="volume_dialog_ringer_icon_padding">20dp</dimen>
 
-    <dimen name="volume_dialog_caption_size">64dp</dimen>
+    <dimen name="volume_dialog_caption_size">56dp</dimen>
 
-    <dimen name="volume_dialog_tap_target_size">48dp</dimen>
+    <dimen name="volume_dialog_tap_target_size">42dp</dimen>
 
     <dimen name="volume_dialog_spacer">4dp</dimen>
 
@@ -504,8 +508,8 @@
     <dimen name="volume_tool_tip_arrow_corner_radius">2dp</dimen>
 
     <!-- Size of each item in the ringer selector drawer. -->
-    <dimen name="volume_ringer_drawer_item_size">64dp</dimen>
-    <dimen name="volume_ringer_drawer_item_size_half">32dp</dimen>
+    <dimen name="volume_ringer_drawer_item_size">42dp</dimen>
+    <dimen name="volume_ringer_drawer_item_size_half">21dp</dimen>
 
     <!-- Size of the icon inside each item in the ringer selector drawer. -->
     <dimen name="volume_ringer_drawer_icon_size">24dp</dimen>
@@ -528,7 +532,7 @@
     <!-- The size of the gesture span needed to activate the "pull" notification expansion -->
     <dimen name="pull_span_min">25dp</dimen>
 
-    <dimen name="qs_corner_radius">14dp</dimen>
+    <dimen name="qs_corner_radius">28dp</dimen>
     <dimen name="qs_tile_height">88dp</dimen>
     <!--notification_side_paddings + notification_content_margin_start - (qs_quick_tile_size - qs_tile_background_size) / 2 -->
     <dimen name="qs_tile_layout_margin_side">18dp</dimen>
@@ -601,15 +605,22 @@
     <dimen name="qs_header_carrier_separator_width">6dp</dimen>
     <dimen name="qs_status_separator">32dp</dimen>
     <dimen name="qs_carrier_margin_width">4dp</dimen>
-    <dimen name="qs_footer_padding_start">16dp</dimen>
-    <dimen name="qs_footer_padding_end">16dp</dimen>
-    <dimen name="qs_footer_icon_size">16dp</dimen>
+    <dimen name="qs_footer_icon_size">20dp</dimen>
     <dimen name="qs_paged_tile_layout_padding_bottom">0dp</dimen>
     <dimen name="qs_header_top_padding">15dp</dimen>
     <dimen name="qs_header_bottom_padding">14dp</dimen>
 
+    <dimen name="qs_footer_padding">20dp</dimen>
+    <dimen name="qs_security_footer_height">88dp</dimen>
+    <dimen name="qs_security_footer_single_line_height">48dp</dimen>
+    <dimen name="qs_security_footer_vertical_margin">8dp</dimen>
+    <dimen name="qs_security_footer_background_inset">0dp</dimen>
+    <dimen name="qs_security_footer_corner_radius">28dp</dimen>
+
     <dimen name="qs_notif_collapsed_space">64dp</dimen>
 
+    <dimen name="qs_container_bottom_padding">24dp</dimen>
+
     <!-- Desired qs icon overlay size. -->
     <dimen name="qs_detail_icon_overlay_size">24dp</dimen>
 
@@ -656,7 +667,7 @@
     <dimen name="z_distance_between_notifications">0.5dp</dimen>
 
     <!-- The height of the divider between the individual notifications. -->
-    <dimen name="notification_divider_height">1dp</dimen>
+    <dimen name="notification_divider_height">2dp</dimen>
 
     <!-- The corner radius of the shadow behind the notification. -->
     <dimen name="notification_shadow_radius">0dp</dimen>
@@ -669,7 +680,7 @@
     <dimen name="notification_children_container_divider_height">0.5dp</dimen>
 
     <!-- The horizontal margin of the content in the notification shade -->
-    <dimen name="notification_shade_content_margin_horizontal">4dp</dimen>
+    <dimen name="notification_shade_content_margin_horizontal">16dp</dimen>
 
     <!-- The top margin for the notification children container in its non-expanded form. -->
     <dimen name="notification_children_container_margin_top">
@@ -685,8 +696,11 @@
     <!-- Size of the face pile shown on one-line (children of a group) conversation notifications -->
     <dimen name="conversation_single_line_face_pile_size">25dp</dimen>
 
+    <!-- Size of the avatars within a face pile shown on one-line (children of a group) conversation notifications -->
+    <dimen name="conversation_single_line_face_pile_avatar_size">17dp</dimen>
+
     <!-- Size of an avatar shown on one-line (children of a group) conversation notifications -->
-    <dimen name="conversation_single_line_avatar_size">20dp</dimen>
+    <dimen name="conversation_single_line_avatar_size">24dp</dimen>
 
     <!-- Border width for avatars in the face pile shown on one-line (children of a group) conversation notifications -->
     <dimen name="conversation_single_line_face_pile_protection_width">1dp</dimen>
@@ -1240,26 +1254,31 @@
 
     <!-- Size of media cards in the QSPanel carousel -->
     <dimen name="qs_media_padding">16dp</dimen>
-    <dimen name="qs_media_panel_outer_padding">16dp</dimen>
-    <dimen name="qs_media_album_size">120dp</dimen>
+    <dimen name="qs_media_album_size_small">72dp</dimen>
+    <dimen name="qs_media_album_size">92dp</dimen>
     <dimen name="qs_media_album_radius">14dp</dimen>
-    <dimen name="qs_media_icon_size">16dp</dimen>
+    <dimen name="qs_media_album_device_padding">26dp</dimen>
+    <dimen name="qs_media_info_margin">12dp</dimen>
+    <dimen name="qs_media_info_spacing">4dp</dimen>
+    <dimen name="qs_media_icon_size">20dp</dimen>
+    <dimen name="qs_media_icon_offset">4dp</dimen>
     <dimen name="qs_center_guideline_padding">10dp</dimen>
-    <dimen name="qs_seamless_icon_size">@dimen/qs_media_icon_size</dimen>
+    <dimen name="qs_media_action_spacing">4dp</dimen>
+    <dimen name="qs_media_action_top">8dp</dimen>
+    <dimen name="qs_seamless_height">24dp</dimen>
+    <dimen name="qs_seamless_icon_size">16dp</dimen>
     <dimen name="qs_seamless_fallback_icon_size">@dimen/qs_seamless_icon_size</dimen>
-    <dimen name="qs_seamless_fallback_end_margin">16dp</dimen>
-    <dimen name="qqs_media_spacing">16dp</dimen>
+    <dimen name="qs_seamless_fallback_margin">20dp</dimen>
     <dimen name="qs_footer_horizontal_margin">22dp</dimen>
     <dimen name="qs_media_disabled_seekbar_height">1dp</dimen>
-    <dimen name="qs_media_enabled_seekbar_height">3dp</dimen>
-    <dimen name="qs_media_enabled_seekbar_vertical_padding">15dp</dimen>
-    <dimen name="qs_media_disabled_seekbar_vertical_padding">16dp</dimen>
+    <dimen name="qs_media_enabled_seekbar_height">2dp</dimen>
+    <dimen name="qs_media_enabled_seekbar_vertical_padding">35dp</dimen>
+    <dimen name="qs_media_disabled_seekbar_vertical_padding">36dp</dimen>
 
     <!-- Size of Smartspace media recommendations cards in the QSPanel carousel -->
     <dimen name="qs_aa_media_rec_album_size">80dp</dimen>
     <dimen name="qs_aa_media_rec_icon_size">20dp</dimen>
 
-
     <!-- Window magnification -->
     <dimen name="magnification_border_drag_size">35dp</dimen>
     <dimen name="magnification_outer_border_margin">15dp</dimen>
@@ -1428,6 +1447,9 @@
     <dimen name="rounded_slider_track_width">4dp</dimen>
     <!-- rounded_slider_track_width / 2 -->
     <dimen name="rounded_slider_track_corner_radius">2dp</dimen>
+    <dimen name="rounded_slider_background_padding">8dp</dimen>
+    <!-- rounded_slider_corner_radius + rounded_slider_background_padding -->
+    <dimen name="rounded_slider_background_rounded_corner">32dp</dimen>
 
     <!-- inset for ic_lock_open within a DisabledUdfpsView -->
     <dimen name="udfps_unlock_icon_inset">16dp</dimen>
@@ -1447,6 +1469,12 @@
      screen directly in front of the sensor. -->
     <dimen name="physical_fingerprint_sensor_center_screen_location_y">610px</dimen>
 
+    <!-- Normalized location on the screen of the center of the physical usb charger port in
+         portrait mode. This is a reasonable default that should be overridden by device-specific
+         overlays. -->
+    <item name="physical_charger_port_location_normalized_x" type="dimen" format="float">0.5</item>
+    <item name="physical_charger_port_location_normalized_y" type="dimen" format="float">1</item>
+
     <!-- Wallet activity screen specs -->
     <dimen name="wallet_icon_size">36sp</dimen>
     <dimen name="card_margin">16dp</dimen>
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index 5827f4e..f4d4ab8 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -20,9 +20,9 @@
 
     <bool name="flag_notification_pipeline2">true</bool>
     <bool name="flag_notification_pipeline2_rendering">false</bool>
-    <bool name="flag_notif_updates">false</bool>
+    <bool name="flag_notif_updates">true</bool>
 
-    <bool name="flag_shade_is_opaque">false</bool>
+    <bool name="flag_shade_is_opaque">true</bool>
     <bool name="flag_monet">false</bool>
 
     <!-- b/171917882 -->
diff --git a/packages/SystemUI/res/values/integers.xml b/packages/SystemUI/res/values/integers.xml
index b50b5c1..116403c 100644
--- a/packages/SystemUI/res/values/integers.xml
+++ b/packages/SystemUI/res/values/integers.xml
@@ -22,6 +22,8 @@
     <integer name="qs_footer_actions_width">0</integer>
     <integer name="qs_footer_actions_weight">1</integer>
 
+    <integer name="qs_security_footer_maxLines">2</integer>
+
     <integer name="magnification_default_scale">2</integer>
 
     <!-- The position of the volume dialog on the screen.
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e55142b..bbb5519 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -338,6 +338,8 @@
     <string name="accessibility_voice_assist_button">Voice Assist</string>
     <!-- Content description of the unlock button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
     <string name="accessibility_unlock_button">Unlock</string>
+    <!-- Content description of the lock icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
+    <string name="accessibility_lock_icon">Device locked</string>
     <!-- Content description hint of the unlock button when fingerprint is on (not shown on the screen). [CHAR LIMIT=NONE] -->
     <string name="accessibility_waiting_for_fingerprint">Waiting for fingerprint</string>
     <!-- Accessibility action of the unlock button when fingerpint is on (not shown on the screen). [CHAR LIMIT=NONE] -->
@@ -2096,7 +2098,8 @@
     <string name="keyboard_key_num_lock">Num Lock</string>
     <!-- Name used to refer to keys on the numeric pad of the keyboard, e.g. "Numpad 9". -->
     <string name="keyboard_key_numpad_template">Numpad <xliff:g id="name">%1$s</xliff:g></string>
-
+    <!-- Content description for the delete button on an image attachment when using inline reply via notification [CHAR LIMIT=NONE] -->
+    <string name="notif_inline_reply_remove_attachment_description">Remove attachment</string>
     <!-- User visible title for the system-wide keyboard shortcuts list. -->
     <string name="keyboard_shortcut_group_system">System</string>
     <!-- User visible title for the keyboard shortcut that takes the user to the home screen. -->
@@ -2620,19 +2623,19 @@
     <string name="ongoing_privacy_dialog_last_separator">\u0020and\u0020</string>
 
     <!-- Text for privacy dialog, using sensitive app op (one of camera, location, microphone) right now [CHAR LIMIT=NONE] -->
-    <string name="ongoing_privacy_dialog_using_op"><xliff:g id="application_name" example="Photos">%1$s</xliff:g> is using the <xliff:g id="app_opp_name" example="camera">%2$s</xliff:g></string>
+    <string name="ongoing_privacy_dialog_using_op">Being used by <xliff:g id="application_name" example="Photos">%1$s</xliff:g></string>
 
     <!-- Text for privacy dialog, recently used sensitive app op (one of camera, location, microphone) [CHAR LIMIT=NONE] -->
-    <string name="ongoing_privacy_dialog_recent_op"><xliff:g id="application_name" example="Photos">%1$s</xliff:g> used the <xliff:g id="app_opp_name" example="camera">%2$s</xliff:g> recently</string>
+    <string name="ongoing_privacy_dialog_recent_op">Recently used by <xliff:g id="application_name" example="Photos">%1$s</xliff:g></string>
 
     <!-- Text for privacy dialog, indicating that the application is the enterprise version [CHAR LIMIT=NONE] -->
-    <string name="ongoing_privacy_dialog_enterprise">(enterprise)</string>
+    <string name="ongoing_privacy_dialog_enterprise">(work)</string>
 
     <!-- Text for privacy dialog, identifying the phone call app [CHAR LIMIT=NONE]-->
     <string name="ongoing_privacy_dialog_phonecall">Phone call</string>
 
-    <!-- Text for privacy dialog, indicating that an app is using an op on behalf of another [CHAR LIMIT=NONE] -->
-    <string name="ongoing_privacy_dialog_attribution_text">(through <xliff:g id="attribution" example="Special app">%s</xliff:g>)</string>
+    <!-- Text for privacy dialog, indicating that an app (or multiple) is using an op on behalf of another [CHAR LIMIT=NONE] -->
+    <string name="ongoing_privacy_dialog_attribution_text">(through <xliff:g id="application name(s)" example="Maps, and Assistant">%s</xliff:g>)</string>
 
     <!-- Text for camera app op [CHAR LIMIT=20]-->
     <string name="privacy_type_camera">camera</string>
@@ -2724,7 +2727,7 @@
     <string name="accessibility_floating_button_action_move_bottom_right">Move bottom right</string>
     <!-- Action in accessibility menu to move the accessibility floating button to the edge and hide it to half. [CHAR LIMIT=30]-->
     <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half">Move to edge and hide</string>
-    <!-- Action in accessibility menu to move the accessibility floating button out the edge and show. [CHAR LIMIT=30]-->
+    <!-- Action in accessibility menu to move the accessibility floating button out the edge and show. [CHAR LIMIT=36]-->
     <string name="accessibility_floating_button_action_move_out_edge_and_show">Move out edge and show</string>
 
     <!-- Device Controls strings -->
@@ -2823,10 +2826,10 @@
 
     <!-- Title for media controls [CHAR_LIMIT=50] -->
     <string name="controls_media_title">Media</string>
-    <!-- Explanation for closing controls associated with a specific media session [CHAR_LIMIT=NONE] -->
-    <string name="controls_media_close_session">Hide the current session.</string>
-    <!-- Explanation that controls associated with a specific media session are active [CHAR_LIMIT=NONE] -->
-    <string name="controls_media_active_session">Current session cannot be hidden.</string>
+    <!-- Explanation for closing controls associated with a specific media session [CHAR_LIMIT=50] -->
+    <string name="controls_media_close_session">Hide this media session?</string>
+    <!-- Explanation that controls associated with a specific media session are active [CHAR_LIMIT=50] -->
+    <string name="controls_media_active_session">The current media session cannot be hidden.</string>
     <!-- Label for a button that will hide media controls [CHAR_LIMIT=30] -->
     <string name="controls_media_dismiss_button">Dismiss</string>
     <!-- Label for button to resume media playback [CHAR_LIMIT=NONE] -->
@@ -2904,15 +2907,15 @@
     <!-- Status text on the Conversation widget for a birthday today [CHAR LIMIT=20] -->
     <string name="birthday_status">Birthday</string>
     <!-- Content description text on the Conversation widget for a birthday today [CHAR LIMIT=150] -->
-    <string name="birthday_status_content_description">It\’s <xliff:g id="name" example="Anna">%1$s</xliff:g>\’s birthday</string>
+    <string name="birthday_status_content_description">It\'s <xliff:g id="name" example="Anna">%1$s</xliff:g>\’s birthday</string>
     <!-- Status text on the Conversation widget for an upcoming birthday [CHAR LIMIT=20] -->
     <string name="upcoming_birthday_status">Birthday soon</string>
     <!-- Content description text on the Conversation widget for an upcoming birthday [CHAR LIMIT=150] -->
-    <string name="upcoming_birthday_status_content_description">It\’s <xliff:g id="name" example="Anna">%1$s</xliff:g>\’s birthday soon</string>
+    <string name="upcoming_birthday_status_content_description">It\'s <xliff:g id="name" example="Anna">%1$s</xliff:g>\’s birthday soon</string>
     <!-- Status text on the Conversation widget for an anniversary [CHAR LIMIT=20] -->
     <string name="anniversary_status">Anniversary</string>
     <!-- Content description text on the Conversation widget for an anniversary [CHAR LIMIT=150] -->
-    <string name="anniversary_status_content_description">It\’s <xliff:g id="name" example="Anna">%1$s</xliff:g>\’s anniversary</string>
+    <string name="anniversary_status_content_description">It\'s <xliff:g id="name" example="Anna">%1$s</xliff:g>\’s anniversary</string>
     <!-- Status text on the Conversation widget for sharing location [CHAR LIMIT=20] -->
     <string name="location_status">Sharing location</string>
     <!-- Content description text on the Conversation widget for sharing location [CHAR LIMIT=150] -->
@@ -2957,4 +2960,18 @@
 
     <!-- Secondary label for alarm tile when there is no next alarm information [CHAR LIMIT=20] -->
     <string name="qs_alarm_tile_no_alarm">No alarm set</string>
+
+    <!-- Accessibility label for fingerprint sensor [CHAR LIMIT=NONE] -->
+    <string name="accessibility_fingerprint_label">Fingerprint sensor</string>
+    <!-- Accessibility label for disabled udfps sensor [CHAR LIMIT=NONE] -->
+    <string name="accessibility_udfps_disabled_button">Fingerprint sensor disabled</string>
+    <!-- Accessibility action for tapping on an affordance that will bring up the user's
+    pin/pattern/password bouncer (ie: "Double tap to authenticate") [CHAR LIMIT=NONE] -->
+    <string name="accessibility_authenticate_hint">authenticate</string>
+    <!-- Accessibility action for tapping on an affordance on an unlocked lock screen (ie: "Double
+     tap to enter device") [CHAR LIMIT=NONE] -->
+    <string name="accessibility_enter_hint">enter device</string>
+    <!-- Message shown to suggest authentication using [CHAR LIMIT=60]-->
+    <string name="keyguard_try_fingerprint">Use fingerprint to open</string>
+
 </resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index ce8c0c2..2e45acc 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -220,11 +220,21 @@
         <item name="android:textSize">@dimen/celltile_rat_type_size</item>
     </style>
 
+    <style name="TextAppearance.QS.SecurityFooter">
+        <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
+        <item name="android:textSize">@dimen/qs_tile_text_size</item>
+    </style>
+
     <style name="TextAppearance.QS.Status" parent="TextAppearance.QS.TileLabel.Secondary">
         <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
         <item name="android:textColor">@color/dark_mode_qs_icon_color_single_tone</item>
     </style>
 
+    <style name="TextAppearance.QS.Build">
+        <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
+        <item name="android:textSize">14sp</item>
+    </style>
+
     <style name="TextAppearance.DeviceManagementDialog">
         <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
@@ -388,7 +398,7 @@
     </style>
 
     <style name="Theme.SystemUI.QuickSettings.BrightnessDialog" parent="@android:style/Theme.DeviceDefault.Dialog">
-        <item name="android:dialogCornerRadius">8dp</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
     </style>
 
     <style name="Theme.SystemUI.QuickSettings.Dialog" parent="@android:style/Theme.DeviceDefault.Dialog">
@@ -678,9 +688,9 @@
         <item name="android:windowActivityTransitions">true</item>
         <item name="android:windowContentTransitions">false</item>
         <item name="android:windowIsTranslucent">false</item>
-        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowBackground">@android:color/black</item>
         <item name="android:windowAnimationStyle">@null</item>
-        <item name="android:statusBarColor">@*android:color/transparent</item>
+        <item name="android:statusBarColor">@android:color/black</item>
         <item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item>
     </style>
 
diff --git a/packages/SystemUI/res/xml/media_collapsed.xml b/packages/SystemUI/res/xml/media_collapsed.xml
index f83e3a1..9bd462e 100644
--- a/packages/SystemUI/res/xml/media_collapsed.xml
+++ b/packages/SystemUI/res/xml/media_collapsed.xml
@@ -21,96 +21,82 @@
         android:id="@+id/icon"
         android:layout_width="@dimen/qs_media_icon_size"
         android:layout_height="@dimen/qs_media_icon_size"
-        android:layout_marginStart="18dp"
-        android:layout_marginTop="@dimen/qs_media_panel_outer_padding"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintStart_toEndOf="@id/album_art"
-        />
-
-    <Constraint
-        android:id="@+id/app_name"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/qs_center_guideline_padding"
-        android:layout_marginStart="8dp"
-        app:layout_constraintTop_toTopOf="@id/icon"
-        app:layout_constraintBottom_toBottomOf="@id/icon"
-        app:layout_constraintStart_toEndOf="@id/icon"
-        app:layout_constraintEnd_toStartOf="@id/center_vertical_guideline"
-        app:layout_constrainedWidth="true"
-        app:layout_constraintHorizontal_bias="0"
+        android:translationY="@dimen/qs_media_icon_offset"
+        android:translationX="@dimen/qs_media_icon_offset"
+        app:layout_constraintEnd_toEndOf="@id/album_art"
+        app:layout_constraintBottom_toBottomOf="@id/album_art"
         />
 
     <Constraint
         android:id="@+id/media_seamless"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="48dp"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toEndOf="@id/center_vertical_guideline"
+        app:layout_constraintBottom_toTopOf="@id/center_horizontal_guideline"
         app:layout_constraintHorizontal_chainStyle="spread_inside"
         app:layout_constraintHorizontal_bias="1"
         app:layout_constrainedWidth="true"
         app:layout_constraintWidth_min="48dp"
         app:layout_constraintHeight_min="48dp"
+        android:paddingTop="@dimen/qs_media_padding"
+        android:paddingEnd="@dimen/qs_media_padding"
         android:layout_marginStart="@dimen/qs_center_guideline_padding"
+        android:layout_marginBottom="4dp"
         />
 
     <Constraint
         android:id="@+id/media_seamless_fallback"
         android:layout_width="@dimen/qs_seamless_fallback_icon_size"
         android:layout_height="@dimen/qs_seamless_fallback_icon_size"
-        android:layout_marginEnd="@dimen/qs_seamless_fallback_end_margin"
+        android:layout_marginTop="@dimen/qs_media_padding"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         android:layout_marginStart="@dimen/qs_center_guideline_padding"
+        android:layout_marginEnd="@dimen/qs_seamless_fallback_margin"
         android:alpha="0.5"
         android:visibility="gone"
         app:layout_constraintHorizontal_bias="1"
-        app:layout_constraintTop_toTopOf="@id/icon"
-        app:layout_constraintBottom_toBottomOf="@id/icon"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/center_horizontal_guideline"
         app:layout_constraintStart_toEndOf="@id/center_vertical_guideline"
         app:layout_constraintEnd_toEndOf="parent"
         />
 
     <Constraint
         android:id="@+id/album_art"
-        android:layout_width="@dimen/qs_media_album_size"
-        android:layout_height="@dimen/qs_media_album_size"
-        android:layout_marginTop="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_width="@dimen/qs_media_album_size_small"
+        android:layout_height="@dimen/qs_media_album_size_small"
+        android:layout_marginTop="@dimen/qs_media_padding"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/media_action_barrier"
-        app:layout_constraintHorizontal_bias="0"
         />
 
     <!-- Song name -->
     <Constraint
         android:id="@+id/header_title"
-        android:layout_width="wrap_content"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/qqs_media_spacing"
-        android:layout_marginStart="@dimen/qqs_media_spacing"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginStart="@dimen/qs_media_info_margin"
+        android:layout_marginEnd="@dimen/qs_center_guideline_padding"
         app:layout_constrainedWidth="true"
-        app:layout_constraintTop_toBottomOf="@id/icon"
-        app:layout_constraintBottom_toTopOf="@id/header_artist"
+        app:layout_constraintBottom_toTopOf="@id/center_horizontal_guideline"
         app:layout_constraintStart_toEndOf="@id/album_art"
-        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/center_vertical_guideline"
         app:layout_constraintHorizontal_bias="0"/>
 
     <!-- Artist name -->
     <Constraint
         android:id="@+id/header_artist"
-        android:layout_width="wrap_content"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="3dp"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginBottom="@dimen/qqs_media_spacing"
         app:layout_constrainedWidth="true"
-        app:layout_constraintTop_toBottomOf="@id/header_title"
+        android:layout_marginTop="@dimen/qs_media_info_spacing"
+        app:layout_constraintTop_toTopOf="@id/center_horizontal_guideline"
         app:layout_constraintStart_toStartOf="@id/header_title"
-        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/media_action_barrier"
         app:layout_constraintHorizontal_bias="0"/>
 
     <!-- Seek Bar -->
@@ -130,9 +116,6 @@
         android:alpha="0.0"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="35dp"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
         app:layout_constraintTop_toBottomOf="@id/album_art"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
@@ -143,15 +126,16 @@
         android:id="@+id/action0"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="@dimen/qqs_media_spacing"
-        android:layout_marginEnd="4dp"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginTop="@dimen/qs_media_action_spacing"
         android:visibility="gone"
         app:layout_constraintHorizontal_chainStyle="packed"
-        app:layout_constraintTop_toBottomOf="@id/header_artist"
+        app:layout_constraintTop_toBottomOf="@id/center_horizontal_guideline"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toLeftOf="@id/action1"
-        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_bias="1"
         >
     </Constraint>
 
@@ -159,10 +143,10 @@
         android:id="@+id/action1"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
-        app:layout_constraintTop_toBottomOf="@id/header_artist"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginTop="@dimen/qs_media_action_spacing"
+        app:layout_constraintTop_toBottomOf="@id/center_horizontal_guideline"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toRightOf="@id/action0"
         app:layout_constraintRight_toLeftOf="@id/action2"
@@ -173,10 +157,10 @@
         android:id="@+id/action2"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
-        app:layout_constraintTop_toBottomOf="@id/header_artist"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginTop="@dimen/qs_media_action_spacing"
+        app:layout_constraintTop_toBottomOf="@id/center_horizontal_guideline"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toRightOf="@id/action1"
         app:layout_constraintRight_toLeftOf="@id/action3"
@@ -187,10 +171,10 @@
         android:id="@+id/action3"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
-        app:layout_constraintTop_toBottomOf="@id/header_artist"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginTop="@dimen/qs_media_action_spacing"
+        app:layout_constraintTop_toBottomOf="@id/center_horizontal_guideline"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toRightOf="@id/action2"
         app:layout_constraintRight_toLeftOf="@id/action4"
@@ -201,12 +185,12 @@
         android:id="@+id/action4"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_padding"
         android:visibility="gone"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="@dimen/qs_media_action_spacing"
         app:layout_constraintHorizontal_chainStyle="packed"
-        app:layout_constraintTop_toBottomOf="@id/header_artist"
+        app:layout_constraintTop_toBottomOf="@id/center_horizontal_guideline"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toRightOf="@id/action3"
         app:layout_constraintRight_toRightOf="parent"
diff --git a/packages/SystemUI/res/xml/media_expanded.xml b/packages/SystemUI/res/xml/media_expanded.xml
index 7c67720..fd04fa0 100644
--- a/packages/SystemUI/res/xml/media_expanded.xml
+++ b/packages/SystemUI/res/xml/media_expanded.xml
@@ -21,30 +21,16 @@
         android:id="@+id/icon"
         android:layout_width="@dimen/qs_media_icon_size"
         android:layout_height="@dimen/qs_media_icon_size"
-        android:layout_marginStart="18dp"
-        android:layout_marginTop="@dimen/qs_media_panel_outer_padding"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintStart_toEndOf="@id/album_art"
-        />
-
-    <Constraint
-        android:id="@+id/app_name"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/qs_center_guideline_padding"
-        android:layout_marginStart="8dp"
-        app:layout_constraintTop_toTopOf="@id/icon"
-        app:layout_constraintBottom_toBottomOf="@id/icon"
-        app:layout_constraintStart_toEndOf="@id/icon"
-        app:layout_constraintEnd_toStartOf="@id/center_vertical_guideline"
-        app:layout_constrainedWidth="true"
-        app:layout_constraintHorizontal_bias="0"
-        />
+        android:translationY="@dimen/qs_media_icon_offset"
+        android:translationX="@dimen/qs_media_icon_offset"
+        app:layout_constraintEnd_toEndOf="@id/album_art"
+        app:layout_constraintBottom_toBottomOf="@id/album_art"
+    />
 
     <Constraint
         android:id="@+id/media_seamless"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="48dp"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toEndOf="@id/center_vertical_guideline"
@@ -53,20 +39,23 @@
         app:layout_constrainedWidth="true"
         app:layout_constraintWidth_min="48dp"
         app:layout_constraintHeight_min="48dp"
+        android:paddingTop="@dimen/qs_media_padding"
+        android:paddingEnd="@dimen/qs_media_padding"
         android:layout_marginStart="@dimen/qs_center_guideline_padding"
-        />
+        android:layout_marginBottom="4dp" />
 
     <Constraint
         android:id="@+id/media_seamless_fallback"
         android:layout_width="@dimen/qs_seamless_fallback_icon_size"
         android:layout_height="@dimen/qs_seamless_fallback_icon_size"
-        android:layout_marginEnd="@dimen/qs_seamless_fallback_end_margin"
+        android:layout_marginTop="@dimen/qs_media_padding"
+        android:layout_marginBottom="16dp"
         android:layout_marginStart="@dimen/qs_center_guideline_padding"
+        android:layout_marginEnd="@dimen/qs_seamless_fallback_margin"
         android:alpha="0.5"
         android:visibility="gone"
         app:layout_constraintHorizontal_bias="1"
-        app:layout_constraintTop_toTopOf="@id/icon"
-        app:layout_constraintBottom_toBottomOf="@id/icon"
+        app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toEndOf="@id/center_vertical_guideline"
         app:layout_constraintEnd_toEndOf="parent"
         />
@@ -75,9 +64,9 @@
         android:id="@+id/album_art"
         android:layout_width="@dimen/qs_media_album_size"
         android:layout_height="@dimen/qs_media_album_size"
-        android:layout_marginTop="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginBottom="@dimen/qqs_media_spacing"
+        android:layout_marginTop="@dimen/qs_media_padding"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:layout_marginBottom="0dp"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         />
@@ -87,11 +76,11 @@
         android:id="@+id/header_title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/qqs_media_spacing"
-        android:layout_marginStart="@dimen/qqs_media_spacing"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="26dp"
+        android:layout_marginStart="@dimen/qs_media_info_margin"
+        android:layout_marginEnd="@dimen/qs_media_padding"
         app:layout_constrainedWidth="true"
-        app:layout_constraintTop_toBottomOf="@+id/icon"
+        app:layout_constraintTop_toTopOf="@+id/album_art"
         app:layout_constraintStart_toEndOf="@id/album_art"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_bias="0"/>
@@ -101,10 +90,10 @@
         android:id="@+id/header_artist"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginBottom="@dimen/qqs_media_spacing"
-        android:layout_marginTop="3dp"
+        android:layout_marginEnd="@dimen/qs_media_padding"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constrainedWidth="true"
+        android:layout_marginTop="@dimen/qs_media_info_spacing"
         app:layout_constraintTop_toBottomOf="@id/header_title"
         app:layout_constraintStart_toStartOf="@id/header_title"
         app:layout_constraintEnd_toEndOf="parent"
@@ -115,7 +104,6 @@
         android:id="@+id/media_progress_bar"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="35dp"
         app:layout_constraintTop_toBottomOf="@id/header_artist"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
@@ -125,10 +113,9 @@
         android:id="@+id/notification_media_progress_time"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="70dp"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
-        app:layout_constraintTop_toBottomOf="@id/header_artist"
+        android:layout_marginEnd="@dimen/qs_media_padding"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        app:layout_constraintTop_toBottomOf="@id/media_progress_bar"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         />
@@ -137,9 +124,10 @@
         android:id="@+id/action0"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginTop="5dp"
-        android:layout_marginStart="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="@dimen/qs_media_action_top"
+        android:layout_marginStart="@dimen/qs_media_padding"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constraintHorizontal_chainStyle="packed"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toLeftOf="@id/action1"
@@ -151,12 +139,12 @@
         android:id="@+id/action1"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="@dimen/qs_media_action_top"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constraintLeft_toRightOf="@id/action0"
         app:layout_constraintRight_toLeftOf="@id/action2"
-        app:layout_constraintTop_toTopOf="@id/action0"
         app:layout_constraintTop_toBottomOf="@id/media_progress_bar"
         app:layout_constraintBottom_toBottomOf="parent">
     </Constraint>
@@ -165,9 +153,10 @@
         android:id="@+id/action2"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="@dimen/qs_media_action_top"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constraintLeft_toRightOf="@id/action1"
         app:layout_constraintRight_toLeftOf="@id/action3"
         app:layout_constraintTop_toBottomOf="@id/media_progress_bar"
@@ -178,9 +167,10 @@
         android:id="@+id/action3"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="4dp"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="@dimen/qs_media_action_top"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_action_spacing"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constraintLeft_toRightOf="@id/action2"
         app:layout_constraintRight_toLeftOf="@id/action4"
         app:layout_constraintTop_toBottomOf="@id/media_progress_bar"
@@ -191,9 +181,10 @@
         android:id="@+id/action4"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="@dimen/qs_media_panel_outer_padding"
-        android:layout_marginBottom="@dimen/qs_media_panel_outer_padding"
+        android:layout_marginTop="@dimen/qs_media_action_top"
+        android:layout_marginStart="@dimen/qs_media_action_spacing"
+        android:layout_marginEnd="@dimen/qs_media_padding"
+        android:layout_marginBottom="@dimen/qs_media_padding"
         app:layout_constraintHorizontal_chainStyle="packed"
         app:layout_constraintLeft_toRightOf="@id/action3"
         app:layout_constraintRight_toRightOf="parent"
diff --git a/packages/SystemUI/res/xml/people_space_widget_info.xml b/packages/SystemUI/res/xml/people_space_widget_info.xml
index 68e6ca8..cce27e7 100644
--- a/packages/SystemUI/res/xml/people_space_widget_info.xml
+++ b/packages/SystemUI/res/xml/people_space_widget_info.xml
@@ -16,7 +16,7 @@
 
 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
     android:minWidth="136dp"
-    android:minHeight="55dp"
+    android:targetCellHeight="1"
     android:minResizeWidth="60dp"
     android:minResizeHeight="50dp"
     android:maxResizeHeight="207dp"
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
index 1a4e2d1..2b35bcd 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java
@@ -385,10 +385,8 @@
                     }
                     Intent i = new Intent(PluginManagerImpl.DISABLE_PLUGIN).setData(
                             Uri.parse("package://" + component.flattenToString()));
-                    // TODO(b/174161910) Please replace FLAG_MUTABLE_UNAUDITED below
-                    // with either FLAG_IMMUTABLE (recommended) or FLAG_MUTABLE.
                     PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, i,
-                            PendingIntent.FLAG_MUTABLE_UNAUDITED);
+                            PendingIntent.FLAG_IMMUTABLE);
                     nb.addAction(new Action.Builder(null, "Disable plugin", pi).build());
                     mContext.getSystemService(NotificationManager.class)
                             .notify(SystemMessage.NOTE_PLUGIN, nb.build());
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
index dde20c1..1cc488f 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.shared.system;
 
-import android.graphics.Rect;
 import android.os.RemoteException;
 import android.util.Log;
 import android.view.IRecentsAnimationController;
@@ -72,17 +71,16 @@
     }
 
     /**
-     * Sets the final bounds on a Task. This is used by Launcher to notify the system that
-     * animating Activity to PiP has completed and the associated task surface should be updated
-     * accordingly. This should be called before `finish`
+     * Sets the final surface transaction on a Task. This is used by Launcher to notify the system
+     * that animating Activity to PiP has completed and the associated task surface should be
+     * updated accordingly. This should be called before `finish`
      * @param taskId Task id of the Activity in PiP mode.
-     * @param destinationBounds Bounds of the PiP window on home.
      * @param finishTransaction leash operations for the final transform.
      */
-    public void setFinishTaskBounds(int taskId, Rect destinationBounds,
+    public void setFinishTaskTransaction(int taskId,
             PictureInPictureSurfaceTransaction finishTransaction) {
         try {
-            mAnimationController.setFinishTaskBounds(taskId, destinationBounds, finishTransaction);
+            mAnimationController.setFinishTaskTransaction(taskId, finishTransaction);
         } catch (RemoteException e) {
             Log.d(TAG, "Failed to set finish task bounds", e);
         }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java
index 2f38f0a..22d934e 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java
@@ -25,6 +25,8 @@
 import static android.view.WindowManager.TransitionOldType;
 import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
 
+import android.annotation.SuppressLint;
+import android.os.IBinder;
 import android.os.RemoteException;
 import android.util.Log;
 import android.view.IRemoteAnimationFinishedCallback;
@@ -153,7 +155,8 @@
             final RemoteAnimationRunnerCompat remoteAnimationAdapter) {
         return new IRemoteTransition.Stub() {
             @Override
-            public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+            public void startAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t,
                     IRemoteTransitionFinishedCallback finishCallback) {
                 final RemoteAnimationTargetCompat[] appsCompat =
                         RemoteAnimationTargetCompat.wrap(info, false /* wallpapers */);
@@ -239,10 +242,16 @@
 
                 final Runnable animationFinishedCallback = new Runnable() {
                     @Override
+                    @SuppressLint("NewApi")
                     public void run() {
                         try {
                             counterLauncher.cleanUp(info.getRootLeash());
                             counterWallpaper.cleanUp(info.getRootLeash());
+                            // Release surface references now. This is apparently to free GPU
+                            // memory while doing quick operations (eg. during CTS).
+                            for (int i = 0; i < info.getChanges().size(); ++i) {
+                                info.getChanges().get(i).getLeash().release();
+                            }
                             finishCallback.onTransitionFinished(null /* wct */);
                         } catch (RemoteException e) {
                             Log.e("ActivityOptionsCompat", "Failed to call app controlled animation"
@@ -256,6 +265,14 @@
                         appsCompat, wallpapersCompat, nonAppsCompat,
                         animationFinishedCallback);
             }
+
+            @Override
+            public void mergeAnimation(IBinder token, TransitionInfo info,
+                    SurfaceControl.Transaction t, IBinder mergeTarget,
+                    IRemoteTransitionFinishedCallback finishCallback) {
+                // TODO: hook up merge to recents onTaskAppeared if applicable. Until then, ignore
+                //       any incoming merges.
+            }
         };
     }
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
index 26ef145..351dfd5 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
@@ -24,7 +24,9 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.graphics.Rect;
+import android.os.IBinder;
 import android.os.Parcelable;
 import android.os.RemoteException;
 import android.util.Log;
@@ -65,7 +67,8 @@
             @NonNull Executor executor) {
         mTransition = new IRemoteTransition.Stub() {
             @Override
-            public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+            public void startAnimation(IBinder transition, TransitionInfo info,
+                    SurfaceControl.Transaction t,
                     IRemoteTransitionFinishedCallback finishedCallback) {
                 final Runnable finishAdapter = () ->  {
                     try {
@@ -74,7 +77,22 @@
                         Log.e(TAG, "Failed to call transition finished callback", e);
                     }
                 };
-                executor.execute(() -> runner.startAnimation(info, t, finishAdapter));
+                executor.execute(() -> runner.startAnimation(transition, info, t, finishAdapter));
+            }
+
+            @Override
+            public void mergeAnimation(IBinder transition, TransitionInfo info,
+                    SurfaceControl.Transaction t, IBinder mergeTarget,
+                    IRemoteTransitionFinishedCallback finishedCallback) {
+                final Runnable finishAdapter = () ->  {
+                    try {
+                        finishedCallback.onTransitionFinished(null /* wct */);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Failed to call transition finished callback", e);
+                    }
+                };
+                executor.execute(() -> runner.mergeAnimation(transition, info, t, mergeTarget,
+                        finishAdapter));
             }
         };
     }
@@ -84,7 +102,8 @@
             RecentsAnimationControllerCompat controller) {
         mTransition = new IRemoteTransition.Stub() {
             @Override
-            public void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+            public void startAnimation(IBinder transition, TransitionInfo info,
+                    SurfaceControl.Transaction t,
                     IRemoteTransitionFinishedCallback finishedCallback) {
                 final RemoteAnimationTargetCompat[] apps =
                         RemoteAnimationTargetCompat.wrap(info, false /* wallpapers */);
@@ -109,10 +128,17 @@
                 }
                 t.apply();
                 final RecentsAnimationControllerCompat wrapControl =
-                        new RecentsControllerWrap(controller, finishedCallback, pausingTask);
+                        new RecentsControllerWrap(controller, info, finishedCallback, pausingTask);
                 recents.onAnimationStart(wrapControl, apps, wallpapers, new Rect(0, 0, 0, 0),
                         new Rect());
             }
+
+            @Override
+            public void mergeAnimation(IBinder transition, TransitionInfo info,
+                    SurfaceControl.Transaction t, IBinder mergeTarget,
+                    IRemoteTransitionFinishedCallback finishedCallback) {
+                // TODO: hook up merge to onTaskAppeared. Until then, just ignore incoming merges.
+            }
         };
     }
 
@@ -136,10 +162,12 @@
         private final RecentsAnimationControllerCompat mWrapped;
         private final IRemoteTransitionFinishedCallback mFinishCB;
         private final WindowContainerToken mPausingTask;
+        private final TransitionInfo mInfo;
 
-        RecentsControllerWrap(RecentsAnimationControllerCompat wrapped,
+        RecentsControllerWrap(RecentsAnimationControllerCompat wrapped, TransitionInfo info,
                 IRemoteTransitionFinishedCallback finishCB, WindowContainerToken pausingTask) {
             mWrapped = wrapped;
+            mInfo = info;
             mFinishCB = finishCB;
             mPausingTask = pausingTask;
         }
@@ -160,14 +188,16 @@
             mWrapped.hideCurrentInputMethod();
         }
 
-        @Override public void setFinishTaskBounds(int taskId, Rect destinationBounds,
+        @Override public void setFinishTaskTransaction(int taskId,
                 PictureInPictureSurfaceTransaction finishTransaction) {
             if (mWrapped != null) {
-                mWrapped.setFinishTaskBounds(taskId, destinationBounds, finishTransaction);
+                mWrapped.setFinishTaskTransaction(taskId, finishTransaction);
             }
         }
 
-        @Override public void finish(boolean toHome, boolean sendUserLeaveHint) {
+        @Override
+        @SuppressLint("NewApi")
+        public void finish(boolean toHome, boolean sendUserLeaveHint) {
             try {
                 if (!toHome && mPausingTask != null) {
                     // The gesture went back to opening the app rather than continuing with
@@ -182,6 +212,11 @@
                 Log.e("RemoteTransitionCompat", "Failed to call animation finish callback", e);
             }
             if (mWrapped != null) mWrapped.finish(toHome, sendUserLeaveHint);
+            // Release surface references now. This is apparently to free GPU
+            // memory while doing quick operations (eg. during CTS).
+            for (int i = 0; i < mInfo.getChanges().size(); ++i) {
+                mInfo.getChanges().get(i).getLeash().release();
+            }
         }
 
         @Override public void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot) {
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionRunner.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionRunner.java
index 6002bca..accc456 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionRunner.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionRunner.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.shared.system;
 
+import android.os.IBinder;
 import android.view.SurfaceControl;
 import android.window.TransitionInfo;
 
@@ -25,6 +26,17 @@
      * Starts a transition animation. Once complete, the implementation should call
      * `finishCallback`.
      */
-    void startAnimation(TransitionInfo info, SurfaceControl.Transaction t,
+    void startAnimation(IBinder transition, TransitionInfo info, SurfaceControl.Transaction t,
             Runnable finishCallback);
+
+    /**
+     * Attempts to merge a transition into the currently-running animation. If merge is not
+     * possible/supported, this should do nothing. Otherwise, the implementation should call
+     * `finishCallback` immediately to indicate that it merged the transition.
+     *
+     * @param transition The transition that wants to be merged into the running animation.
+     * @param mergeTarget The transition to merge into (that this runner is currently animating).
+     */
+    default void mergeAnimation(IBinder transition, TransitionInfo info,
+            SurfaceControl.Transaction t, IBinder mergeTarget, Runnable finishCallback) { }
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java
index fbabaa4..e281914 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java
@@ -231,7 +231,7 @@
              * @return this Builder
              */
             public Builder withMatrix(Matrix matrix) {
-                this.matrix = matrix;
+                this.matrix = new Matrix(matrix);
                 flags |= FLAG_MATRIX;
                 return this;
             }
@@ -241,7 +241,7 @@
              * @return this Builder
              */
             public Builder withWindowCrop(Rect windowCrop) {
-                this.windowCrop = windowCrop;
+                this.windowCrop = new Rect(windowCrop);
                 flags |= FLAG_WINDOW_CROP;
                 return this;
             }
@@ -324,8 +324,8 @@
             this.flags = flags;
             this.surface = surface;
             this.alpha = alpha;
-            this.matrix = new Matrix(matrix);
-            this.windowCrop = windowCrop != null ? new Rect(windowCrop) : null;
+            this.matrix = matrix;
+            this.windowCrop = windowCrop;
             this.layer = layer;
             this.relativeTo = relativeTo;
             this.relativeLayer = relativeLayer;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index e7418e6..5559a18 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -19,12 +19,13 @@
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 
+import android.app.PendingIntent;
 import android.app.WallpaperManager;
 import android.app.smartspace.SmartspaceConfig;
 import android.app.smartspace.SmartspaceManager;
 import android.app.smartspace.SmartspaceSession;
+import android.content.Intent;
 import android.content.res.Resources;
-import android.graphics.Color;
 import android.text.TextUtils;
 import android.text.format.DateFormat;
 import android.view.View;
@@ -33,7 +34,6 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.colorextraction.ColorExtractor;
-import com.android.internal.graphics.ColorUtils;
 import com.android.keyguard.clock.ClockManager;
 import com.android.settingslib.Utils;
 import com.android.systemui.R;
@@ -41,8 +41,11 @@
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.BcSmartspaceDataPlugin;
+import com.android.systemui.plugins.BcSmartspaceDataPlugin.IntentStarter;
 import com.android.systemui.plugins.ClockPlugin;
+import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.FeatureFlags;
 import com.android.systemui.statusbar.notification.AnimatableProperty;
@@ -86,11 +89,11 @@
     private FrameLayout mLargeClockFrame;
 
     private SmartspaceSession mSmartspaceSession;
-    private SmartspaceSession.Callback mSmartspaceCallback;
-    private float mDozeAmount;
+    private SmartspaceSession.OnTargetsAvailableListener mSmartspaceCallback;
     private int mWallpaperTextColor;
-    private int mDozeColor = Color.WHITE;
     private ConfigurationController mConfigurationController;
+    private ActivityStarter mActivityStarter;
+    private FalsingManager mFalsingManager;
 
     /**
      * Listener for changes to the color palette.
@@ -121,8 +124,9 @@
             new StatusBarStateController.StateListener() {
                 @Override
                 public void onDozeAmountChanged(float linear, float eased) {
-                    mDozeAmount = eased;
-                    updateSmartspaceColor();
+                    if (mSmartspaceView != null) {
+                        mSmartspaceView.setDozeAmount(eased);
+                    }
                 }
             };
 
@@ -141,7 +145,9 @@
             @Main Executor uiExecutor,
             BatteryController batteryController,
             ConfigurationController configurationController,
-            SystemUIFactory systemUIFactory) {
+            SystemUIFactory systemUIFactory,
+            ActivityStarter activityStarter,
+            FalsingManager falsingManager) {
         super(keyguardClockSwitch);
         mStatusBarStateController = statusBarStateController;
         mColorExtractor = colorExtractor;
@@ -154,6 +160,8 @@
         mBatteryController = batteryController;
         mConfigurationController = configurationController;
         mSystemUIFactory = systemUIFactory;
+        mActivityStarter = activityStarter;
+        mFalsingManager = falsingManager;
     }
 
     /**
@@ -192,9 +200,6 @@
                 mBatteryController);
         mLargeClockViewController.init();
 
-        mDozeAmount = mStatusBarStateController.getDozeAmount();
-        updateWallpaperColor();
-
         mStatusBarStateController.addCallback(mStatusBarStateListener);
         mConfigurationController.addCallback(mConfigurationListener);
 
@@ -206,7 +211,17 @@
 
             mSmartspaceView = smartspaceDataPlugin.getView(mView);
             mSmartspaceView.registerDataProvider(smartspaceDataPlugin);
-            updateSmartspaceColor();
+            mSmartspaceView.setIntentStarter(new IntentStarter() {
+                public void startIntent(View v, Intent i) {
+                    mActivityStarter.startActivity(i, true /* dismissShade */);
+                }
+
+                public void startPendingIntent(PendingIntent pi) {
+                    mActivityStarter.startPendingIntentDismissingKeyguard(pi);
+                }
+            });
+            mSmartspaceView.setFalsingManager(mFalsingManager);
+            updateWallpaperColor();
             View asView = (View) mSmartspaceView;
 
             // Place smartspace view below normal clock...
@@ -234,20 +249,17 @@
                     .createSmartspaceSession(
                             new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
             mSmartspaceCallback = targets -> smartspaceDataPlugin.onTargetsAvailable(targets);
-            mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback);
+            mSmartspaceSession.addOnTargetsAvailableListener(mUiExecutor, mSmartspaceCallback);
             mSmartspaceSession.requestSmartspaceUpdate();
         }
+
+        float dozeAmount = mStatusBarStateController.getDozeAmount();
+        mStatusBarStateListener.onDozeAmountChanged(dozeAmount, dozeAmount);
     }
 
     private void updateWallpaperColor() {
-        mWallpaperTextColor = Utils.getColorAttrDefaultColor(getContext(),
-                R.attr.wallpaperTextColor);
-        updateSmartspaceColor();
-    }
-
-    private void updateSmartspaceColor() {
         if (mSmartspaceView != null) {
-            int color = ColorUtils.blendARGB(mWallpaperTextColor, mDozeColor, mDozeAmount);
+            int color = Utils.getColorAttrDefaultColor(getContext(), R.attr.wallpaperTextColor);
             mSmartspaceView.setPrimaryTextColor(color);
         }
     }
@@ -261,8 +273,8 @@
         mView.setClockPlugin(null, mStatusBarStateController.getState());
 
         if (mSmartspaceSession != null) {
-            mSmartspaceSession.unregisterSmartspaceUpdates(mSmartspaceCallback);
-            mSmartspaceSession.destroy();
+            mSmartspaceSession.removeOnTargetsAvailableListener(mSmartspaceCallback);
+            mSmartspaceSession.close();
             mSmartspaceSession = null;
         }
         mStatusBarStateController.removeCallback(mStatusBarStateListener);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java
index 31f1332..d06c8bc 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostViewController.java
@@ -475,7 +475,18 @@
      * configuration.
      */
     public void updateResources() {
-        int gravity = mView.getResources().getInteger(R.integer.keyguard_host_view_gravity);
+        int gravity;
+
+        Resources resources = mView.getResources();
+
+        if (resources.getBoolean(R.bool.can_use_one_handed_bouncer)
+                && resources.getBoolean(
+                com.android.internal.R.bool.config_enableOneHandedKeyguard)) {
+            gravity = resources.getInteger(
+                    R.integer.keyguard_host_view_one_handed_gravity);
+        } else {
+            gravity = resources.getInteger(R.integer.keyguard_host_view_gravity);
+        }
 
         // Android SysUI uses a FrameLayout as the top-level, but Auto uses RelativeLayout.
         // We're just changing the gravity here though (which can't be applied to RelativeLayout),
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 9df7734..3ab2cca 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -35,6 +35,7 @@
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.systemui.R;
+import com.android.systemui.statusbar.CrossFadeHelper;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -44,6 +45,7 @@
  * - keyguard clock
  * - logout button (on certain managed devices)
  * - owner information (if set)
+ * - media player (split shade mode only)
  */
 public class KeyguardStatusView extends GridLayout {
     private static final boolean DEBUG = KeyguardConstants.DEBUG;
@@ -60,6 +62,7 @@
     private KeyguardSliceView mKeyguardSlice;
     private Runnable mPendingMarqueeStart;
     private Handler mHandler;
+    private View mMediaHostContainer;
 
     private float mDarkAmount = 0;
     private int mTextColor;
@@ -148,6 +151,8 @@
         mKeyguardSlice.setContentChangeListener(this::onSliceContentChanged);
         onSliceContentChanged();
 
+        mMediaHostContainer = findViewById(R.id.status_view_media_container);
+
         updateOwnerInfo();
         updateDark();
     }
@@ -223,6 +228,9 @@
         }
         mDarkAmount = darkAmount;
         mClockView.setDarkAmount(darkAmount);
+        if (mMediaHostContainer.getVisibility() != View.GONE) {
+            CrossFadeHelper.fadeOut(mMediaHostContainer, darkAmount);
+        }
         updateDark();
     }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
index fc80dbe..588f4bb 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
@@ -16,6 +16,7 @@
 
 package com.android.keyguard;
 
+import android.graphics.Rect;
 import android.os.UserHandle;
 import android.util.Slog;
 
@@ -48,6 +49,7 @@
     private final ConfigurationController mConfigurationController;
     private final DozeParameters mDozeParameters;
     private final KeyguardVisibilityHelper mKeyguardVisibilityHelper;
+    private final Rect mClipBounds = new Rect();
 
     private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
 
@@ -299,4 +301,17 @@
             mView.updateLogoutView(shouldShowLogout());
         }
     };
+
+    /**
+     * Rect that specifies how KSV should be clipped, on its parent's coordinates.
+     */
+    public void setClipBounds(Rect clipBounds) {
+        if (clipBounds != null) {
+            mClipBounds.set(clipBounds.left, (int) (clipBounds.top - mView.getY()),
+                    clipBounds.right, (int) (clipBounds.bottom - mView.getY()));
+            mView.setClipBounds(mClipBounds);
+        } else {
+            mView.setClipBounds(null);
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 138dd15..321c6b7 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -2009,9 +2009,8 @@
 
         // TODO: Add support for multiple fingerprint sensors, b/173730729
         updateUdfpsEnrolled(getCurrentUser());
-        boolean shouldListenForFingerprint =
-                isUdfpsEnrolled() ? shouldListenForUdfps() : shouldListenForFingerprint();
-        boolean runningOrRestarting = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING
+        final boolean shouldListenForFingerprint = shouldListenForFingerprint(isUdfpsEnrolled());
+        final boolean runningOrRestarting = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING
                 || mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING;
         if (runningOrRestarting && !shouldListenForFingerprint) {
             stopListeningForFingerprint();
@@ -2092,28 +2091,36 @@
                 && !mUserHasTrust.get(getCurrentUser(), false);
     }
 
-    private boolean shouldListenForFingerprint() {
-        final boolean allowedOnBouncer =
-                !(mFingerprintLockedOut && mBouncer && mCredentialAttempted);
+    @VisibleForTesting
+    protected boolean shouldListenForFingerprint(boolean isUdfps) {
+        final boolean shouldListenKeyguardState =
+                 mKeyguardIsVisible
+                     || !mDeviceInteractive
+                     || (mBouncer && !mKeyguardGoingAway)
+                     || mGoingToSleep
+                     || shouldListenForFingerprintAssistant()
+                     || (mKeyguardOccluded && mIsDreaming)
+                     || (isUdfps && mKeyguardOccluded);
 
         // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
         // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
-        final boolean shouldListen = (mKeyguardIsVisible || !mDeviceInteractive ||
-                (mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
-                shouldListenForFingerprintAssistant() || (mKeyguardOccluded && mIsDreaming))
-                && !mSwitchingUser && !isFingerprintDisabled(getCurrentUser())
-                && (!mKeyguardGoingAway || !mDeviceInteractive) && mIsPrimaryUser
-                && allowedOnBouncer && mBiometricEnabledForUser.get(getCurrentUser());
-        return shouldListen;
-    }
+        final boolean shouldListenUserState =
+                !mSwitchingUser
+                        && !isFingerprintDisabled(getCurrentUser())
+                        && (!mKeyguardGoingAway || !mDeviceInteractive)
+                        && mIsPrimaryUser
+                        && mBiometricEnabledForUser.get(getCurrentUser());
 
-    @VisibleForTesting
-    boolean shouldListenForUdfps() {
-        return shouldListenForFingerprint()
-                && !mBouncer
-                && !getUserCanSkipBouncer(getCurrentUser())
+        final boolean shouldListenBouncerState =
+                !(mFingerprintLockedOut && mBouncer && mCredentialAttempted);
+
+        final boolean shouldListenUdfpsState = !isUdfps
+                || (!getUserCanSkipBouncer(getCurrentUser())
                 && !isEncryptedOrLockdown(getCurrentUser())
-                && mStrongAuthTracker.hasUserAuthenticatedSinceBoot();
+                && mStrongAuthTracker.hasUserAuthenticatedSinceBoot());
+
+        return shouldListenKeyguardState && shouldListenUserState && shouldListenBouncerState
+                && shouldListenUdfpsState;
     }
 
     /**
@@ -3235,13 +3242,13 @@
             pw.println("    disabled(DPM)=" + isFingerprintDisabled(userId));
             pw.println("    possible=" + isUnlockWithFingerprintPossible(userId));
             pw.println("    listening: actual=" + mFingerprintRunningState
-                    + " expected=" + (shouldListenForFingerprint() ? 1 : 0));
+                    + " expected=" + (shouldListenForFingerprint(false) ? 1 : 0));
             pw.println("    strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
             pw.println("    trustManaged=" + getUserTrustIsManaged(userId));
             pw.println("    udfpsEnrolled=" + isUdfpsEnrolled());
             pw.println("    enabledByUser=" + mBiometricEnabledForUser.get(userId));
             if (isUdfpsEnrolled()) {
-                pw.println("        shouldListenForUdfps=" + shouldListenForUdfps());
+                pw.println("        shouldListenForUdfps=" + shouldListenForFingerprint(true));
                 pw.println("        bouncerVisible=" + mBouncer);
                 pw.println("        mStatusBarState="
                         + StatusBarState.toShortString(mStatusBarState));
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
index 015c4e4..ecc8c00 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
@@ -146,6 +146,13 @@
     void startPreHideAnimation(Runnable finishRunnable);
 
     /**
+     * Blocks the current touch gesture from affecting the expansion amount of the notification
+     * panel. This is used after a completed unlock gesture to ignore further dragging before an
+     * ACTION_UP.
+     */
+    void blockPanelExpansionFromCurrentTouch();
+
+    /**
      * @return the ViewRootImpl of the View where the Keyguard is mounted.
      */
     ViewRootImpl getViewRootImpl();
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
index 66ea2ad..b5f2ab2 100644
--- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
@@ -29,9 +29,12 @@
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 
 import com.android.settingslib.Utils;
 import com.android.systemui.Dumpable;
@@ -63,6 +66,7 @@
     @NonNull private final KeyguardStateController mKeyguardStateController;
     @NonNull private final FalsingManager mFalsingManager;
     @NonNull private final AuthController mAuthController;
+    @NonNull private final AccessibilityManager mAccessibilityManager;
 
     private boolean mHasUdfpsOrFaceAuthFeatures;
     private boolean mUdfpsEnrolled;
@@ -79,6 +83,7 @@
     private boolean mQsExpanded;
     private int mStatusBarState;
     private boolean mIsKeyguardShowing;
+    private boolean mUserUnlockedWithBiometric;
 
     private boolean mShowButton;
     private boolean mShowUnlockIcon;
@@ -93,19 +98,17 @@
             @NonNull KeyguardStateController keyguardStateController,
             @NonNull FalsingManager falsingManager,
             @NonNull AuthController authController,
-            @NonNull DumpManager dumpManager
+            @NonNull DumpManager dumpManager,
+            @NonNull AccessibilityManager accessibilityManager
     ) {
         super(view);
-        if (mView != null) {
-            mView.setOnClickListener(v -> onAffordanceClick());
-            mView.setOnLongClickListener(v -> onAffordanceClick());
-        }
         mStatusBarStateController = statusBarStateController;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mAuthController = authController;
         mKeyguardViewController = keyguardViewController;
         mKeyguardStateController = keyguardStateController;
         mFalsingManager = falsingManager;
+        mAccessibilityManager = accessibilityManager;
 
         final Context context = view.getContext();
         mButton = context.getResources().getDrawable(
@@ -122,6 +125,11 @@
     }
 
     @Override
+    protected void onInit() {
+        mView.setAccessibilityDelegate(mAccessibilityDelegate);
+    }
+
+    @Override
     protected void onViewAttached() {
         // we check this here instead of onInit since the FingeprintManager + FaceManager may not
         // have started up yet onInit
@@ -148,7 +156,8 @@
             mView.setLocation(new PointF(props[0], props[1]), props[2]);
         }
 
-        mIsKeyguardShowing = mKeyguardViewController.isShowing();
+        updateKeyguardShowing();
+        mUserUnlockedWithBiometric = false;
         mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
         mIsDozing = mStatusBarStateController.isDozing();
         mRunningFPS = mKeyguardUpdateMonitor.isFingerprintDetectionRunning();
@@ -163,6 +172,8 @@
         mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
         mStatusBarStateController.addCallback(mStatusBarStateListener);
         mKeyguardStateController.addCallback(mKeyguardStateCallback);
+        mAccessibilityManager.addTouchExplorationStateChangeListener(
+                mTouchExplorationStateChangeListener);
 
         updateVisibility();
     }
@@ -172,6 +183,8 @@
         mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
         mStatusBarStateController.removeCallback(mStatusBarStateListener);
         mKeyguardStateController.removeCallback(mKeyguardStateCallback);
+        mAccessibilityManager.removeTouchExplorationStateChangeListener(
+                mTouchExplorationStateChangeListener);
     }
 
     public float getTop() {
@@ -205,25 +218,62 @@
         }
 
         // these three states are mutually exclusive:
-        mShowButton = mUdfpsEnrolled && !mCanDismissLockScreen && !mRunningFPS && isLockScreen();
+        mShowButton = mUdfpsEnrolled && !mCanDismissLockScreen && !mRunningFPS
+                && !mUserUnlockedWithBiometric && isLockScreen();
         mShowUnlockIcon = mFaceAuthEnrolled & mCanDismissLockScreen && isLockScreen();
         mShowLockIcon = !mUdfpsEnrolled && !mCanDismissLockScreen && isLockScreen()
             && mFaceAuthEnrolled;
 
+        updateClickListener();
         if (mShowButton) {
             mView.setImageDrawable(mButton);
             mView.setVisibility(View.VISIBLE);
+            mView.setContentDescription(getResources().getString(
+                    R.string.accessibility_udfps_disabled_button));
         } else if (mShowUnlockIcon) {
             mView.setImageDrawable(mUnlockIcon);
             mView.setVisibility(View.VISIBLE);
+            mView.setContentDescription(getResources().getString(
+                    R.string.accessibility_unlock_button));
         } else if (mShowLockIcon) {
             mView.setImageDrawable(mLockIcon);
             mView.setVisibility(View.VISIBLE);
+            mView.setContentDescription(getResources().getString(
+                    R.string.accessibility_lock_icon));
         } else {
             mView.setVisibility(View.INVISIBLE);
+            mView.setContentDescription(null);
         }
     }
 
+    private final View.AccessibilityDelegate mAccessibilityDelegate =
+            new View.AccessibilityDelegate() {
+        private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityAuthenticateHint =
+                new AccessibilityNodeInfo.AccessibilityAction(
+                        AccessibilityNodeInfoCompat.ACTION_CLICK,
+                        getResources().getString(R.string.accessibility_authenticate_hint));
+        private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityEnterHint =
+                new AccessibilityNodeInfo.AccessibilityAction(
+                        AccessibilityNodeInfoCompat.ACTION_CLICK,
+                        getResources().getString(R.string.accessibility_enter_hint));
+        public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) {
+            super.onInitializeAccessibilityNodeInfo(v, info);
+            removeAllActions(info);
+            if (mShowButton || mShowLockIcon) {
+                info.addAction(mAccessibilityAuthenticateHint);
+            } else if (mShowUnlockIcon) {
+                info.addAction(mAccessibilityEnterHint);
+            }
+        }
+
+        private void removeAllActions(AccessibilityNodeInfo info) {
+            info.removeAction(mAccessibilityAuthenticateHint);
+            info.removeAction(mAccessibilityEnterHint);
+            info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK);
+            mView.setLongClickable(false);
+        }
+    };
+
     private boolean isLockScreen() {
         return !mIsDozing
                 && !mIsBouncerShowing
@@ -231,6 +281,22 @@
                 && mStatusBarState == StatusBarState.KEYGUARD;
     }
 
+    private void updateClickListener() {
+        if (mView != null) {
+            mView.setOnClickListener(v -> onAffordanceClick());
+            if (mAccessibilityManager.isTouchExplorationEnabled()) {
+                mView.setOnLongClickListener(null);
+            } else {
+                mView.setOnLongClickListener(v -> onAffordanceClick());
+            }
+        }
+    }
+
+    private void updateKeyguardShowing() {
+        mIsKeyguardShowing = mKeyguardStateController.isShowing()
+                && !mKeyguardStateController.isKeyguardGoingAway();
+    }
+
     @Override
     public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
         pw.println("  mShowBouncerButton: " + mShowButton);
@@ -242,6 +308,7 @@
         pw.println("  mIsKeyguardShowing: " + mIsKeyguardShowing);
         pw.println("  mIsDozing: " + mIsDozing);
         pw.println("  mIsBouncerShowing: " + mIsBouncerShowing);
+        pw.println("  mUserUnlockedWithBiometric: " + mUserUnlockedWithBiometric);
         pw.println("  mRunningFPS: " + mRunningFPS);
         pw.println("  mCanDismissLockScreen: " + mCanDismissLockScreen);
         pw.println("  mStatusBarState: " + StatusBarState.toShortString(mStatusBarState));
@@ -268,18 +335,20 @@
                 @Override
                 public void onKeyguardBouncerChanged(boolean bouncer) {
                     mIsBouncerShowing = bouncer;
-                    mIsKeyguardShowing = mKeyguardStateController.isShowing();
                     updateVisibility();
                 }
 
                 @Override
                 public void onBiometricRunningStateChanged(boolean running,
                         BiometricSourceType biometricSourceType) {
+                    mUserUnlockedWithBiometric =
+                            mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(
+                                    KeyguardUpdateMonitor.getCurrentUser());
+
                     if (biometricSourceType == FINGERPRINT) {
                         mRunningFPS = running;
+                        updateVisibility();
                     }
-
-                    updateVisibility();
                 }
             };
 
@@ -288,14 +357,25 @@
         @Override
         public void onUnlockedChanged() {
             mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
+            updateKeyguardShowing();
             updateVisibility();
         }
+
         @Override
         public void onKeyguardShowingChanged() {
-            mIsKeyguardShowing = mKeyguardStateController.isShowing();
+            updateKeyguardShowing();
             mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled();
             mFaceAuthEnrolled = mKeyguardUpdateMonitor.isFaceEnrolled();
             updateVisibility();
         }
+
+        @Override
+        public void onKeyguardFadingAwayChanged() {
+            updateKeyguardShowing();
+            updateVisibility();
+        }
     };
+
+    private final AccessibilityManager.TouchExplorationStateChangeListener
+            mTouchExplorationStateChangeListener = enabled -> updateClickListener();
 }
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index cbfdce5..351ae82 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -54,6 +54,7 @@
 import com.android.systemui.navigationbar.NavigationBarController;
 import com.android.systemui.navigationbar.NavigationBarOverlayController;
 import com.android.systemui.navigationbar.NavigationModeController;
+import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.DarkIconDispatcher;
 import com.android.systemui.plugins.PluginDependencyProvider;
@@ -356,6 +357,7 @@
     @Inject Lazy<TelephonyListenerManager> mTelephonyListenerManager;
     @Inject Lazy<SystemStatusAnimationScheduler> mSystemStatusAnimationSchedulerLazy;
     @Inject Lazy<PrivacyDotViewController> mPrivacyDotViewControllerLazy;
+    @Inject Lazy<EdgeBackGestureHandler> mEdgeBackGestureHandler;
 
     @Inject
     public Dependency() {
@@ -568,6 +570,7 @@
         mProviders.put(SystemStatusAnimationScheduler.class,
                 mSystemStatusAnimationSchedulerLazy::get);
         mProviders.put(PrivacyDotViewController.class, mPrivacyDotViewControllerLazy::get);
+        mProviders.put(EdgeBackGestureHandler.class, mEdgeBackGestureHandler::get);
 
         Dependency.setInstance(this);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index c8e6741..76cec0b 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -29,7 +29,7 @@
 import android.util.Log;
 import android.util.MathUtils;
 import android.util.Size;
-import android.view.Choreographer;
+import android.view.DisplayInfo;
 import android.view.SurfaceHolder;
 import android.view.WindowManager;
 
@@ -38,7 +38,6 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.systemui.glwallpaper.EglHelper;
 import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -59,19 +58,16 @@
     private static final @android.annotation.NonNull RectF LOCAL_COLOR_BOUNDS =
             new RectF(0, 0, 1, 1);
     private static final boolean DEBUG = false;
-    private final StatusBarStateController mStatusBarStateController;
     private final ArrayList<RectF> mLocalColorsToAdd = new ArrayList<>();
     private final ArraySet<RectF> mColorAreas = new ArraySet<>();
-    private float mShift;
-    private volatile int mPages;
+    private volatile int mPages = 1;
     private HandlerThread mWorker;
     // scaled down version
     private Bitmap mMiniBitmap;
 
     @Inject
-    public ImageWallpaper(StatusBarStateController statusBarStateController) {
+    public ImageWallpaper() {
         super();
-        mStatusBarStateController = statusBarStateController;
     }
 
     @Override
@@ -94,27 +90,24 @@
         mMiniBitmap = null;
     }
 
-
-    class GLEngine extends Engine implements StatusBarStateController.StateListener,
-            Choreographer.FrameCallback {
+    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
-        static final int MIN_SURFACE_WIDTH = 64;
+        static final int MIN_SURFACE_WIDTH = 128;
         @VisibleForTesting
-        static final int MIN_SURFACE_HEIGHT = 64;
+        static final int MIN_SURFACE_HEIGHT = 128;
 
         private ImageWallpaperRenderer mRenderer;
         private EglHelper mEglHelper;
         private final Runnable mFinishRenderingTask = this::finishRendering;
-        private final Runnable mInitChoreographerTask = this::initChoreographerInternal;
+        private boolean mNeedRedraw;
         private int mWidth = 1;
         private int mHeight = 1;
         private int mImgWidth = 1;
         private int mImgHeight = 1;
-        private volatile float mDozeAmount;
-        private volatile boolean mNewDozeValue = false;
-        private volatile boolean mShouldScheduleFrame = false;
+        private float mPageWidth = 1.f;
+        private float mPageOffset = 1.f;
 
         GLEngine() {
         }
@@ -141,9 +134,6 @@
             if (mWorker != null && mWorker.getThreadHandler() != null) {
                 mWorker.getThreadHandler().post(this::updateMiniBitmap);
             }
-
-            mDozeAmount = mStatusBarStateController.getDozeAmount();
-            mStatusBarStateController.addCallback(this);
         }
 
         EglHelper getEglHelperInstance() {
@@ -158,15 +148,15 @@
         public void onOffsetsChanged(float xOffset, float yOffset,
                 float xOffsetStep, float yOffsetStep,
                 int xPixelOffset, int yPixelOffset) {
-            if (mMiniBitmap == null || mMiniBitmap.isRecycled()) return;
             final int pages;
             if (xOffsetStep > 0 && xOffsetStep <= 1) {
-                pages = (int) (1 / xOffsetStep + 1);
+                pages = (int) Math.round(1 / xOffsetStep) + 1;
             } else {
                 pages = 1;
             }
             if (pages == mPages) return;
             mPages = pages;
+            if (mMiniBitmap == null || mMiniBitmap.isRecycled()) return;
             updateShift();
             mWorker.getThreadHandler().post(() ->
                     computeAndNotifyLocalColors(new ArrayList<>(mColorAreas), mMiniBitmap));
@@ -174,19 +164,17 @@
 
         private void updateShift() {
             if (mImgHeight == 0) {
-                mShift = 0;
+                mPageOffset = 0;
+                mPageWidth = 1;
                 return;
             }
             // calculate shift
-            float imgWidth = (float) mImgWidth / (float) mImgHeight;
-            float displayWidth =
-                    (float) mWidth / (float) mHeight;
-            // if need to shift
-            if (imgWidth > displayWidth) {
-                mShift = imgWidth / imgWidth - displayWidth / imgWidth;
-            } else {
-                mShift = 0;
-            }
+            DisplayInfo displayInfo = new DisplayInfo();
+            getDisplayContext().getDisplay().getDisplayInfo(displayInfo);
+            int screenWidth = displayInfo.getNaturalWidth();
+            float imgWidth = Math.min(mImgWidth > 0 ? screenWidth / (float) mImgWidth : 1.f, 1.f);
+            mPageWidth = imgWidth;
+            mPageOffset = (1 - imgWidth) / (float) (mPages - 1);
         }
 
         private void updateMiniBitmap() {
@@ -198,8 +186,8 @@
                 }
                 mImgHeight = b.getHeight();
                 mImgWidth = b.getWidth();
-                mMiniBitmap = Bitmap.createScaledBitmap(b, (int) Math.ceil(scale * b.getWidth()),
-                        (int) Math.ceil(scale * b.getHeight()), false);
+                mMiniBitmap = Bitmap.createScaledBitmap(b,  (int) Math.max(scale * b.getWidth(), 1),
+                        (int) Math.max(scale * b.getHeight(), 1), false);
                 computeAndNotifyLocalColors(mLocalColorsToAdd, mMiniBitmap);
                 mLocalColorsToAdd.clear();
             });
@@ -221,11 +209,7 @@
         @Override
         public void onDestroy() {
             mMiniBitmap = null;
-
-            mStatusBarStateController.removeCallback(this);
-
             mWorker.getThreadHandler().post(() -> {
-                finishChoreographerInternal();
                 mRenderer.finish();
                 mRenderer = null;
                 mEglHelper.finish();
@@ -274,27 +258,39 @@
             });
         }
 
+        /**
+         * Transform the logical coordinates into wallpaper coordinates.
+         *
+         * Logical coordinates are organised such that the various pages are non-overlapping. So,
+         * if there are n pages, the first page will have its X coordinate on the range [0-1/n].
+         *
+         * The real pages are overlapping. If the Wallpaper are a width Ww and the screen a width
+         * Ws, the relative width of a page Wr is Ws/Ww. This does not change if the number of
+         * pages increase.
+         * If there are n pages, the page k starts at the offset k * (1 - Wr) / (n - 1), as the
+         * last page is at position (1-Wr) and the others are regularly spread on the range [0-
+         * (1-Wr)].
+         */
         private RectF pageToImgRect(RectF area) {
-            float pageWidth = 1f / (float) mPages;
-            if (pageWidth < 1 && pageWidth >= 0) pageWidth = 1;
-            float imgWidth = (float) mImgWidth / (float) mImgHeight;
-            float displayWidth =
-                    (float) mWidth / (float) mHeight;
-            float expansion = imgWidth > displayWidth ? displayWidth / imgWidth : 1;
-            int page = (int) Math.floor(area.centerX() / pageWidth);
-            float shiftWidth = mShift * page * pageWidth;
+            // Width of a page for the caller of this API.
+            float virtualPageWidth = 1f / (float) mPages;
+            float leftPosOnPage = (area.left % virtualPageWidth) / virtualPageWidth;
+            float rightPosOnPage = (area.right % virtualPageWidth) / virtualPageWidth;
+            int currentPage = (int) Math.floor(area.centerX() / virtualPageWidth);
+
             RectF imgArea = new RectF();
             imgArea.bottom = area.bottom;
             imgArea.top = area.top;
-            imgArea.left = MathUtils.constrain(area.left % pageWidth, 0, 1)
-                    * expansion + shiftWidth;
-            imgArea.right = MathUtils.constrain(area.right % pageWidth, 0, 1)
-                    * expansion + shiftWidth;
+            imgArea.left = MathUtils.constrain(
+                    leftPosOnPage * mPageWidth + currentPage * mPageOffset, 0, 1);
+            imgArea.right = MathUtils.constrain(
+                    rightPosOnPage * mPageWidth + currentPage * mPageOffset, 0, 1);
             if (imgArea.left > imgArea.right) {
                 // take full page
-                imgArea.left = shiftWidth;
-                imgArea.right = 1 - (mShift - shiftWidth);
+                imgArea.left = 0;
+                imgArea.right = 1;
             }
+
             return imgArea;
         }
 
@@ -339,28 +335,17 @@
         @Override
         public void onSurfaceRedrawNeeded(SurfaceHolder holder) {
             if (mWorker == null) return;
-            mDozeAmount = mStatusBarStateController.getDozeAmount();
             mWorker.getThreadHandler().post(this::drawFrame);
         }
 
-        @Override
-        public void onDozeAmountChanged(float linear, float eased) {
-            initChoreographer();
-
-            mDozeAmount = linear;
-            mNewDozeValue = true;
-        }
-
         private void drawFrame() {
             preRender();
             requestRender();
             postRender();
         }
 
-        /**
-         * Important: this method should only be invoked from the ImageWallpaper (worker) Thread.
-         */
         public void preRender() {
+            // This method should only be invoked from worker thread.
             Trace.beginSection("ImageWallpaper#preRender");
             preRenderInternal();
             Trace.endSection();
@@ -395,10 +380,8 @@
             }
         }
 
-        /**
-         * Important: this method should only be invoked from the ImageWallpaper (worker) Thread.
-         */
         public void requestRender() {
+            // This method should only be invoked from worker thread.
             Trace.beginSection("ImageWallpaper#requestRender");
             requestRenderInternal();
             Trace.endSection();
@@ -410,7 +393,6 @@
                     && frame.width() > 0 && frame.height() > 0;
 
             if (readyToRender) {
-                mRenderer.setExposureValue(1 - mDozeAmount);
                 mRenderer.onDrawFrame();
                 if (!mEglHelper.swapBuffer()) {
                     Log.e(TAG, "drawFrame failed!");
@@ -422,10 +404,8 @@
             }
         }
 
-        /**
-         * Important: this method should only be invoked from the ImageWallpaper (worker) Thread.
-         */
         public void postRender() {
+            // This method should only be invoked from worker thread.
             Trace.beginSection("ImageWallpaper#postRender");
             scheduleFinishRendering();
             Trace.endSection();
@@ -444,7 +424,6 @@
 
         private void finishRendering() {
             Trace.beginSection("ImageWallpaper#finishRendering");
-            finishChoreographerInternal();
             if (mEglHelper != null) {
                 mEglHelper.destroyEglSurface();
                 mEglHelper.destroyEglContext();
@@ -452,35 +431,6 @@
             Trace.endSection();
         }
 
-        private void initChoreographer() {
-            if (!mWorker.getThreadHandler().hasCallbacks(mInitChoreographerTask)
-                    && !mShouldScheduleFrame) {
-                mWorker.getThreadHandler().post(mInitChoreographerTask);
-            }
-        }
-
-        /**
-         * Subscribes the engine to listen to Choreographer frame events.
-         * Important: this method should only be invoked from the ImageWallpaper (worker) Thread.
-         */
-        private void initChoreographerInternal() {
-            if (!mShouldScheduleFrame) {
-                // Prepare EGL Context and Surface
-                preRender();
-                mShouldScheduleFrame = true;
-                Choreographer.getInstance().postFrameCallback(GLEngine.this);
-            }
-        }
-
-        /**
-         * Unsubscribe the engine from listening to Choreographer frame events.
-         * Important: this method should only be invoked from the ImageWallpaper (worker) Thread.
-         */
-        private void finishChoreographerInternal() {
-            mShouldScheduleFrame = false;
-            Choreographer.getInstance().removeFrameCallback(GLEngine.this);
-        }
-
         private boolean needSupportWideColorGamut() {
             return mRenderer.isWcgContent();
         }
@@ -500,17 +450,5 @@
             mEglHelper.dump(prefix, fd, out, args);
             mRenderer.dump(prefix, fd, out, args);
         }
-
-        @Override
-        public void doFrame(long frameTimeNanos) {
-            if (mNewDozeValue) {
-                drawFrame();
-                mNewDozeValue = false;
-            }
-
-            if (mShouldScheduleFrame) {
-                Choreographer.getInstance().postFrameCallback(this);
-            }
-        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
index 48beea3..ae16703 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
@@ -30,7 +30,6 @@
 import android.content.res.Resources;
 import android.graphics.Matrix;
 import android.graphics.PixelFormat;
-import android.graphics.Point;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.Region;
@@ -80,7 +79,7 @@
     private final Context mContext;
     private final Resources mResources;
     private final Handler mHandler;
-    private final Point mDisplaySize = new Point();
+    private Rect mWindowBounds;
     private final int mDisplayId;
     @Surface.Rotation
     @VisibleForTesting
@@ -143,12 +142,13 @@
         mHandler = handler;
         mSfVsyncFrameProvider = sfVsyncFrameProvider;
         mWindowMagnifierCallback = callback;
-        Display display = mContext.getDisplay();
-        display.getRealSize(mDisplaySize);
+
+        final Display display = mContext.getDisplay();
         mDisplayId = mContext.getDisplayId();
         mRotation = display.getRotation();
 
         mWm = context.getSystemService(WindowManager.class);
+        mWindowBounds = mWm.getCurrentWindowMetrics().getBounds();
 
         mResources = mContext.getResources();
         mScale = mResources.getInteger(R.integer.magnification_default_scale);
@@ -225,7 +225,7 @@
             mNavGestureHeight = 0;
             return;
         }
-        mNavGestureHeight = (mDisplaySize.x > mDisplaySize.y)
+        mNavGestureHeight = (mWindowBounds.width() > mWindowBounds.height())
                 ? mResources.getDimensionPixelSize(
                 com.android.internal.R.dimen.navigation_bar_height_landscape)
                 : mResources.getDimensionPixelSize(
@@ -295,7 +295,8 @@
     private void onRotate() {
         final Display display = mContext.getDisplay();
         final int oldRotation = mRotation;
-        display.getRealSize(mDisplaySize);
+        mWindowBounds = mWm.getCurrentWindowMetrics().getBounds();
+
         setMagnificationFrameBoundary();
         mRotation = display.getRotation();
         updateNavigationBarDimensions();
@@ -309,9 +310,9 @@
         final Matrix matrix = new Matrix();
         matrix.setRotate(rotationDegree);
         if (rotationDegree == 90) {
-            matrix.postTranslate(mDisplaySize.x, 0);
+            matrix.postTranslate(mWindowBounds.width(), 0);
         } else if (rotationDegree == 270) {
-            matrix.postTranslate(0, mDisplaySize.y);
+            matrix.postTranslate(0, mWindowBounds.height());
         } else {
             Log.w(TAG, "Invalid rotation change. " + rotationDegree);
             return;
@@ -409,10 +410,10 @@
 
     private void setInitialStartBounds() {
         // Sets the initial frame area for the mirror and places it in the center of the display.
-        final int initSize = Math.min(mDisplaySize.x, mDisplaySize.y) / 2
+        final int initSize = Math.min(mWindowBounds.width(), mWindowBounds.height()) / 2
                 + 2 * mMirrorSurfaceMargin;
-        final int initX = mDisplaySize.x / 2 - initSize / 2;
-        final int initY = mDisplaySize.y / 2 - initSize / 2;
+        final int initX = mWindowBounds.width() / 2 - initSize / 2;
+        final int initY = mWindowBounds.height() / 2 - initSize / 2;
         mMagnificationFrame.set(initX, initY, initX + initSize, initY + initSize);
     }
 
@@ -462,8 +463,9 @@
         if (!isWindowVisible()) {
             return;
         }
-        final int maxMirrorViewX = mDisplaySize.x - mMirrorView.getWidth();
-        final int maxMirrorViewY = mDisplaySize.y - mMirrorView.getHeight() - mNavGestureHeight;
+        final int maxMirrorViewX = mWindowBounds.width() - mMirrorView.getWidth();
+        final int maxMirrorViewY =
+                mWindowBounds.height() - mMirrorView.getHeight() - mNavGestureHeight;
         LayoutParams params =
                 (LayoutParams) mMirrorView.getLayoutParams();
         params.x = mMagnificationFrame.left - mMirrorSurfaceMargin;
@@ -535,7 +537,7 @@
         final int exceededHeight = halfHeight - scaledHeight;
 
         mMagnificationFrameBoundary.set(-exceededWidth, -exceededHeight,
-                mDisplaySize.x + exceededWidth, mDisplaySize.y + exceededHeight);
+                mWindowBounds.width() + exceededWidth, mWindowBounds.height() + exceededHeight);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
index d89dff5..5502a20 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuView.java
@@ -371,6 +371,7 @@
         mAdapter.notifyDataSetChanged();
 
         updateRadiusWith(mSizeType, mRadiusType, mTargets.size());
+        updateScrollModeWith(hasExceededMaxLayoutHeight());
         setSystemGestureExclusion();
 
         fadeOut();
@@ -614,6 +615,7 @@
         updateColor();
         updateStrokeWith(newConfig.uiMode, mAlignment);
         updateLocationWith(mAlignment, mPercentageY);
+        updateScrollModeWith(hasExceededMaxLayoutHeight());
     }
 
     @VisibleForTesting
@@ -679,6 +681,12 @@
         mListView.setLayoutParams(layoutParams);
     }
 
+    private void updateScrollModeWith(boolean hasExceededMaxLayoutHeight) {
+        mListView.setOverScrollMode(hasExceededMaxLayoutHeight
+                ? OVER_SCROLL_ALWAYS
+                : OVER_SCROLL_NEVER);
+    }
+
     private void updateColor() {
         final int menuColorResId = R.color.accessibility_floating_menu_background;
         getMenuGradientDrawable().setColor(getResources().getColor(menuColorResId));
@@ -726,6 +734,11 @@
         layerDrawable.setLayerInset(INDEX_MENU_ITEM, left, 0, right, 0);
     }
 
+    @VisibleForTesting
+    boolean hasExceededMaxLayoutHeight() {
+        return calculateActualLayoutHeight() > getMaxLayoutHeight();
+    }
+
     @Alignment
     private int calculateCurrentAlignment() {
         return mCurrentLayoutParams.x >= ((MIN_WINDOW_X + getMaxWindowX()) / 2)
@@ -737,6 +750,10 @@
         return mCurrentLayoutParams.y / (float) getMaxWindowY();
     }
 
+    private int calculateActualLayoutHeight() {
+        return (mPadding + mIconHeight) * mTargets.size() + mPadding;
+    }
+
     private @DimenRes int getRadiusResId(@SizeType int sizeType, int itemCount) {
         return sizeType == SizeType.SMALL
                 ? getSmallSizeResIdWith(itemCount)
@@ -760,13 +777,16 @@
         return new Rect(0, 0, mScreenWidth - getWindowWidth(), mScreenHeight - getWindowHeight());
     }
 
+    private int getMaxLayoutHeight() {
+        return mScreenHeight - mMargin * 2;
+    }
+
     private int getLayoutWidth() {
         return mPadding * 2 + mIconWidth;
     }
 
     private int getLayoutHeight() {
-        return Math.min(mScreenHeight - mMargin * 2,
-                (mPadding + mIconHeight) * mTargets.size() + mPadding);
+        return Math.min(getMaxLayoutHeight(), calculateActualLayoutHeight());
     }
 
     private int getWindowWidth() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToUdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java
similarity index 83%
rename from packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToUdfpsView.java
rename to packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java
index 197f35b..71260de 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToUdfpsView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java
@@ -32,12 +32,12 @@
 import com.android.systemui.R;
 
 /**
- * Manages the layout of an auth dialog for devices with a face sensor and an under-display
- * fingerprint sensor (UDFPS). Face authentication is attempted first, followed by fingerprint if
- * the initial attempt is unsuccessful.
+ * Manages the layout of an auth dialog for devices with both a face sensor and a fingerprint
+ * sensor. Face authentication is attempted first, followed by fingerprint if the initial attempt is
+ * unsuccessful.
  */
-public class AuthBiometricFaceToUdfpsView extends AuthBiometricFaceView {
-    private static final String TAG = "BiometricPrompt/AuthBiometricFaceToUdfpsView";
+public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView {
+    private static final String TAG = "BiometricPrompt/AuthBiometricFaceToFingerprintView";
 
     protected static class UdfpsIconController extends IconController {
         protected UdfpsIconController(
@@ -87,20 +87,23 @@
 
     @BiometricAuthenticator.Modality private int mActiveSensorType = TYPE_FACE;
 
-    @Nullable UdfpsDialogMeasureAdapter mMeasureAdapter;
-    @Nullable private UdfpsIconController mUdfpsIconController;
+    @Nullable UdfpsDialogMeasureAdapter mUdfpsMeasureAdapter;
 
-    public AuthBiometricFaceToUdfpsView(Context context) {
+    public AuthBiometricFaceToFingerprintView(Context context) {
         super(context);
     }
 
-    public AuthBiometricFaceToUdfpsView(Context context, AttributeSet attrs) {
+    public AuthBiometricFaceToFingerprintView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     void setFingerprintSensorProps(@NonNull FingerprintSensorPropertiesInternal sensorProps) {
-        if (mMeasureAdapter == null || mMeasureAdapter.getSensorProps() != sensorProps) {
-            mMeasureAdapter = new UdfpsDialogMeasureAdapter(this, sensorProps);
+        if (!sensorProps.isAnyUdfpsType()) {
+            return;
+        }
+
+        if (mUdfpsMeasureAdapter == null || mUdfpsMeasureAdapter.getSensorProps() != sensorProps) {
+            mUdfpsMeasureAdapter = new UdfpsDialogMeasureAdapter(this, sensorProps);
         }
     }
 
@@ -140,8 +143,8 @@
     @NonNull
     AuthDialog.LayoutParams onMeasureInternal(int width, int height) {
         final AuthDialog.LayoutParams layoutParams = super.onMeasureInternal(width, height);
-        return mMeasureAdapter != null
-                ? mMeasureAdapter.onMeasureInternal(width, height, layoutParams)
+        return mUdfpsMeasureAdapter != null
+                ? mUdfpsMeasureAdapter.onMeasureInternal(width, height, layoutParams)
                 : layoutParams;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index 72db6cd..9e72310 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -348,14 +348,14 @@
                     }
                 }
 
-                if (fingerprintSensorProps != null && fingerprintSensorProps.isAnyUdfpsType()) {
-                    final AuthBiometricFaceToUdfpsView faceToUdfpsView =
-                            (AuthBiometricFaceToUdfpsView) factory.inflate(
-                                    R.layout.auth_biometric_face_to_udfps_view, null, false);
-                    faceToUdfpsView.setFingerprintSensorProps(fingerprintSensorProps);
-                    mBiometricView = faceToUdfpsView;
+                if (fingerprintSensorProps != null) {
+                    final AuthBiometricFaceToFingerprintView faceToFingerprintView =
+                            (AuthBiometricFaceToFingerprintView) factory.inflate(
+                                    R.layout.auth_biometric_face_to_fingerprint_view, null, false);
+                    faceToFingerprintView.setFingerprintSensorProps(fingerprintSensorProps);
+                    mBiometricView = faceToFingerprintView;
                 } else {
-                    Log.e(TAG, "Fingerprint must be UDFPS for dual-sensor config");
+                    Log.e(TAG, "Fingerprint props not found for sensor ID: " + fingerprintSensorId);
                     mBiometricView = null;
                     mBackgroundView = null;
                     mBiometricScrollView = null;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index 0c7b55d..179b077 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -20,6 +20,7 @@
 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
 import static android.hardware.biometrics.BiometricManager.Authenticators;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.ActivityTaskManager;
@@ -39,6 +40,7 @@
 import android.hardware.face.FaceSensorPropertiesInternal;
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -57,6 +59,7 @@
 import com.android.systemui.statusbar.CommandQueue;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import javax.inject.Inject;
@@ -73,16 +76,13 @@
     private static final String TAG = "AuthController";
     private static final boolean DEBUG = true;
 
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
     private final CommandQueue mCommandQueue;
     private final StatusBarStateController mStatusBarStateController;
     private final ActivityTaskManager mActivityTaskManager;
     @Nullable private final FingerprintManager mFingerprintManager;
     @Nullable private final FaceManager mFaceManager;
     private final Provider<UdfpsController> mUdfpsControllerFactory;
-
-    @Nullable private final List<FingerprintSensorPropertiesInternal> mFpProps;
-    @Nullable private final List<FaceSensorPropertiesInternal> mFaceProps;
-    @Nullable private final List<FingerprintSensorPropertiesInternal> mUdfpsProps;
     @Nullable private final PointF mFaceAuthSensorLocation;
 
     // TODO: These should just be saved from onSaveState
@@ -90,7 +90,6 @@
     @VisibleForTesting
     AuthDialog mCurrentDialog;
 
-    private Handler mHandler = new Handler(Looper.getMainLooper());
     private WindowManager mWindowManager;
     @Nullable
     private UdfpsController mUdfpsController;
@@ -98,6 +97,9 @@
     TaskStackListener mTaskStackListener;
     @VisibleForTesting
     IBiometricSysuiReceiver mReceiver;
+    @Nullable private final List<FaceSensorPropertiesInternal> mFaceProps;
+    @Nullable private List<FingerprintSensorPropertiesInternal> mFpProps;
+    @Nullable private List<FingerprintSensorPropertiesInternal> mUdfpsProps;
 
     private class BiometricTaskStackListener extends TaskStackListener {
         @Override
@@ -106,8 +108,31 @@
         }
     }
 
-    @VisibleForTesting
-    final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+    @NonNull
+    private final IFingerprintAuthenticatorsRegisteredCallback
+            mFingerprintAuthenticatorsRegisteredCallback =
+            new IFingerprintAuthenticatorsRegisteredCallback.Stub() {
+                @Override public void onAllAuthenticatorsRegistered(
+                        List<FingerprintSensorPropertiesInternal> sensors) {
+                    if (DEBUG) {
+                        Log.d(TAG, "onFingerprintProvidersAvailable | sensors: " + Arrays.toString(
+                                sensors.toArray()));
+                    }
+                    mFpProps = sensors;
+                    List<FingerprintSensorPropertiesInternal> udfpsProps = new ArrayList<>();
+                    for (FingerprintSensorPropertiesInternal props : mFpProps) {
+                        if (props.isAnyUdfpsType()) {
+                            udfpsProps.add(props);
+                        }
+                    }
+                    mUdfpsProps = !udfpsProps.isEmpty() ? udfpsProps : null;
+                    if (mUdfpsProps != null) {
+                        mUdfpsController = mUdfpsControllerFactory.get();
+                    }
+                }
+            };
+
+    @VisibleForTesting final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             if (mCurrentDialog != null
@@ -265,7 +290,7 @@
     /**
      * @return where the UDFPS exists on the screen in pixels in portrait mode.
      */
-    public RectF getUdfpsRegion() {
+    @Nullable public RectF getUdfpsRegion() {
         return mUdfpsController == null
                 ? null
                 : mUdfpsController.getSensorLocation();
@@ -274,7 +299,7 @@
     /**
      * @return where the UDFPS exists on the screen in pixels in portrait mode.
      */
-    public PointF getUdfpsSensorLocation() {
+    @Nullable public PointF getUdfpsSensorLocation() {
         if (mUdfpsController == null) {
             return null;
         }
@@ -286,7 +311,7 @@
      * @return where the face authentication sensor exists relative to the screen in pixels in
      * portrait mode.
      */
-    public PointF getFaceAuthSensorLocation() {
+    @Nullable public PointF getFaceAuthSensorLocation() {
         if (mFaceProps == null || mFaceAuthSensorLocation == null) {
             return null;
         }
@@ -348,19 +373,8 @@
         mFaceManager = faceManager;
         mUdfpsControllerFactory = udfpsControllerFactory;
 
-        mFpProps = mFingerprintManager != null ? mFingerprintManager.getSensorPropertiesInternal()
-                : null;
         mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null;
 
-        List<FingerprintSensorPropertiesInternal> udfpsProps = new ArrayList<>();
-        if (mFpProps != null) {
-            for (FingerprintSensorPropertiesInternal props : mFpProps) {
-                if (props.isAnyUdfpsType()) {
-                    udfpsProps.add(props);
-                }
-            }
-        }
-        mUdfpsProps = !udfpsProps.isEmpty() ? udfpsProps : null;
         int[] faceAuthLocation = context.getResources().getIntArray(
                 com.android.systemui.R.array.config_face_auth_props);
         if (faceAuthLocation == null || faceAuthLocation.length < 2) {
@@ -383,9 +397,9 @@
         mCommandQueue.addCallback(this);
         mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
 
-        if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()
-                && mUdfpsProps != null) {
-            mUdfpsController = mUdfpsControllerFactory.get();
+        if (mFingerprintManager != null) {
+            mFingerprintManager.addAuthenticatorsRegisteredCallback(
+                    mFingerprintAuthenticatorsRegisteredCallback);
         }
 
         mTaskStackListener = new BiometricTaskStackListener();
@@ -527,7 +541,7 @@
         return mFaceManager.hasEnrolledTemplates(userId);
     }
 
-   /**
+    /**
      * Whether the passed userId has enrolled UDFPS.
      */
     public boolean isUdfpsEnrolled(int userId) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS b/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS
index 8765c9a..947466f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS
@@ -1,7 +1,3 @@
 set noparent
 
-kchyn@google.com
-jaggies@google.com
-curtislb@google.com
-ilyamaty@google.com
-joshmccloskey@google.com
+include /services/core/java/com/android/server/biometrics/OWNERS
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java
index d9e1b50..195d006 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java
@@ -165,6 +165,18 @@
         mView.postInvalidate();
     }
 
+    /**
+     * Whether to listen for touches outside of the view.
+     */
+    boolean listenForTouchesOutsideView() {
+        return false;
+    }
+
+    /**
+     * Called on touches outside of the view if listenForTouchesOutsideView returns true
+     */
+    void onTouchOutsideView() { }
+
     private final StatusBar.ExpansionChangedListener mStatusBarExpansionChangedListener =
             new StatusBar.ExpansionChangedListener() {
                 @Override
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 9239a8a..ee5fb31 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -28,7 +28,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.res.Resources;
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.RectF;
@@ -39,6 +38,7 @@
 import android.media.AudioAttributes;
 import android.os.Handler;
 import android.os.Looper;
+import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.Trace;
@@ -54,6 +54,7 @@
 import android.view.VelocityTracker;
 import android.view.View;
 import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.keyguard.KeyguardUpdateMonitor;
@@ -106,6 +107,8 @@
     @NonNull private final Vibrator mVibrator;
     @NonNull private final Handler mMainHandler;
     @NonNull private final FalsingManager mFalsingManager;
+    @NonNull private final PowerManager mPowerManager;
+    @NonNull private final AccessibilityManager mAccessibilityManager;
     // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
     // sensors, this, in addition to a lot of the code here, will be updated.
     @VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
@@ -141,6 +144,8 @@
     private final VibrationEffect mEffectClick = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
     private final VibrationEffect mEffectHeavy =
             VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK);
+    private final VibrationEffect mDoubleClick =
+            VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
     private final Runnable mAcquiredVibration = new Runnable() {
         @Override
         public void run() {
@@ -258,15 +263,52 @@
         }
     };
 
-    @SuppressLint("ClickableViewAccessibility")
-    private final UdfpsView.OnTouchListener mOnTouchListener = this::onTouch;
+    /**
+     * Forwards touches to the udfps controller / view
+     */
+    public boolean onTouch(MotionEvent event) {
+        if (mView == null) {
+            return false;
+        }
+        return onTouch(mView, event, false);
+    }
 
-    private boolean onTouch(View view, MotionEvent event) {
+    @SuppressLint("ClickableViewAccessibility")
+    private final UdfpsView.OnTouchListener mOnTouchListener = (view, event) ->
+            onTouch(view, event, true);
+
+    @SuppressLint("ClickableViewAccessibility")
+    private final UdfpsView.OnHoverListener mOnHoverListener = (view, event) ->
+            onTouch(view, event, true);
+
+    private final AccessibilityManager.TouchExplorationStateChangeListener
+            mTouchExplorationStateChangeListener = enabled -> updateTouchListener();
+
+    /**
+     * @param x coordinate
+     * @param y coordinate
+     * @param relativeToUdfpsView true if the coordinates are relative to the udfps view; else,
+     *                            calculate from the display dimensions in portrait orientation
+     */
+    private boolean isWithinSensorArea(UdfpsView udfpsView, float x, float y,
+            boolean relativeToUdfpsView) {
+        if (relativeToUdfpsView) {
+            // TODO: move isWithinSensorArea to UdfpsController.
+            return udfpsView.isWithinSensorArea(x, y);
+        }
+        return getSensorLocation().contains(x, y);
+    }
+
+    private boolean onTouch(View view, MotionEvent event, boolean fromUdfpsView) {
         UdfpsView udfpsView = (UdfpsView) view;
         final boolean isFingerDown = udfpsView.isIlluminationRequested();
         boolean handled = false;
         switch (event.getActionMasked()) {
+            case MotionEvent.ACTION_OUTSIDE:
+                udfpsView.onTouchOutsideView();
+                break;
             case MotionEvent.ACTION_DOWN:
+            case MotionEvent.ACTION_HOVER_ENTER:
                 // To simplify the lifecycle of the velocity tracker, make sure it's never null
                 // after ACTION_DOWN, and always null after ACTION_CANCEL or ACTION_UP.
                 if (mVelocityTracker == null) {
@@ -276,8 +318,7 @@
                     // ACTION_DOWN, in that case we should just reuse the old instance.
                     mVelocityTracker.clear();
                 }
-                // TODO: move isWithinSensorArea to UdfpsController.
-                if (udfpsView.isWithinSensorArea(event.getX(), event.getY())) {
+                if (isWithinSensorArea(udfpsView, event.getX(), event.getY(), fromUdfpsView)) {
                     Trace.beginAsyncSection(
                             "UdfpsController.mOnTouchListener#isWithinSensorArea", 1);
                     // The pointer that causes ACTION_DOWN is always at index 0.
@@ -285,37 +326,24 @@
                     // data for many other pointers because of multi-touch support.
                     mActivePointerId = event.getPointerId(0);
                     mVelocityTracker.addMovement(event);
-
-                    // TODO: (b/185124905) these settings are for ux testing purposes and should
-                    // be removed (or cached) before going into production
-                    final ContentResolver contentResolver = mContext.getContentResolver();
-                    int startEnabled = Settings.Global.getInt(contentResolver,
-                            "udfps_start", 0);
-                    if (startEnabled > 0) {
-                        String startEffectSetting = Settings.Global.getString(contentResolver,
-                                "udfps_start_type");
-                        mVibrator.vibrate(getVibration(startEffectSetting, mEffectClick),
-                                VIBRATION_SONIFICATION_ATTRIBUTES);
-                    }
-
-                    int acquiredEnabled = Settings.Global.getInt(contentResolver,
-                            "udfps_acquired", 0);
-                    if (acquiredEnabled > 0) {
-                        int delay = Settings.Global.getInt(contentResolver,
-                                "udfps_acquired_delay", 500);
-                        mMainHandler.removeCallbacks(mAcquiredVibration);
-                        mMainHandler.postDelayed(mAcquiredVibration, delay);
-                    }
                     handled = true;
                 }
                 break;
 
             case MotionEvent.ACTION_MOVE:
-                final int idx = event.findPointerIndex(mActivePointerId);
+            case MotionEvent.ACTION_HOVER_MOVE:
+                final int idx = mActivePointerId == -1
+                        ? event.getPointerId(0)
+                        : event.findPointerIndex(mActivePointerId);
                 if (idx == event.getActionIndex()) {
                     final float x = event.getX(idx);
                     final float y = event.getY(idx);
-                    if (udfpsView.isWithinSensorArea(x, y)) {
+                    if (isWithinSensorArea(udfpsView, x, y, fromUdfpsView)) {
+                        if (mVelocityTracker == null) {
+                            // touches could be injected, so the velocity tracker may not have
+                            // been initialized (via ACTION_DOWN).
+                            mVelocityTracker = VelocityTracker.obtain();
+                        }
                         mVelocityTracker.addMovement(event);
                         // Compute pointer velocity in pixels per second.
                         mVelocityTracker.computeCurrentVelocity(1000);
@@ -323,15 +351,39 @@
                         final float v = computePointerSpeed(mVelocityTracker, mActivePointerId);
                         final float minor = event.getTouchMinor(idx);
                         final float major = event.getTouchMajor(idx);
-                        final String touchInfo = String.format("minor: %.1f, major: %.1f, v: %.1f",
-                                minor, major, v);
+                        final boolean exceedsVelocityThreshold = v > 750f;
+                        final String touchInfo = String.format(
+                                "minor: %.1f, major: %.1f, v: %.1f, exceedsVelocityThreshold: %b",
+                                minor, major, v, exceedsVelocityThreshold);
                         final long sinceLastLog = SystemClock.elapsedRealtime() - mTouchLogTime;
-                        if (!isFingerDown) {
+                        if (!isFingerDown && !exceedsVelocityThreshold) {
                             Trace.endAsyncSection(
                                     "UdfpsController.mOnTouchListener#isWithinSensorArea", 1);
                             onFingerDown((int) x, (int) y, minor, major);
                             Log.v(TAG, "onTouch | finger down: " + touchInfo);
                             mTouchLogTime = SystemClock.elapsedRealtime();
+                            mPowerManager.userActivity(SystemClock.uptimeMillis(),
+                                    PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+
+                            // TODO: this should eventually be removed after ux testing
+                            final ContentResolver contentResolver = mContext.getContentResolver();
+                            int startEnabled = Settings.Global.getInt(contentResolver,
+                                    "udfps_start", 0);
+                            if (startEnabled > 0) {
+                                String startEffectSetting = Settings.Global.getString(
+                                        contentResolver, "udfps_start_type");
+                                mVibrator.vibrate(getVibration(startEffectSetting, mEffectClick),
+                                        VIBRATION_SONIFICATION_ATTRIBUTES);
+                            }
+
+                            int acquiredEnabled = Settings.Global.getInt(contentResolver,
+                                    "udfps_acquired", 0);
+                            if (acquiredEnabled > 0) {
+                                int delay = Settings.Global.getInt(contentResolver,
+                                        "udfps_acquired_delay", 500);
+                                mMainHandler.removeCallbacks(mAcquiredVibration);
+                                mMainHandler.postDelayed(mAcquiredVibration, delay);
+                            }
                             handled = true;
                         } else if (sinceLastLog >= MIN_TOUCH_LOG_INTERVAL) {
                             Log.v(TAG, "onTouch | finger move: " + touchInfo);
@@ -346,6 +398,8 @@
 
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_HOVER_EXIT:
+                mActivePointerId = -1;
                 if (mVelocityTracker != null) {
                     mVelocityTracker.recycle();
                     mVelocityTracker = null;
@@ -366,10 +420,9 @@
 
     @Inject
     public UdfpsController(@NonNull Context context,
-            @Main Resources resources,
             @NonNull LayoutInflater inflater,
             @Nullable FingerprintManager fingerprintManager,
-            WindowManager windowManager,
+            @NonNull WindowManager windowManager,
             @NonNull StatusBarStateController statusBarStateController,
             @Main DelayableExecutor fgExecutor,
             @NonNull StatusBar statusBar,
@@ -377,7 +430,9 @@
             @NonNull DumpManager dumpManager,
             @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
             @NonNull KeyguardViewMediator keyguardViewMediator,
-            @NonNull FalsingManager falsingManager) {
+            @NonNull FalsingManager falsingManager,
+            @NonNull PowerManager powerManager,
+            @NonNull AccessibilityManager accessibilityManager) {
         mContext = context;
         // TODO (b/185124905): inject main handler and vibrator once done prototyping
         mMainHandler = new Handler(Looper.getMainLooper());
@@ -395,6 +450,8 @@
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mKeyguardViewMediator = keyguardViewMediator;
         mFalsingManager = falsingManager;
+        mPowerManager = powerManager;
+        mAccessibilityManager = accessibilityManager;
 
         mSensorProps = findFirstUdfps();
         // At least one UDFPS sensor exists
@@ -403,10 +460,7 @@
 
         mCoreLayoutParams = new WindowManager.LayoutParams(
                 WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
-                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                        | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+                getCoreLayoutParamFlags(),
                 PixelFormat.TRANSLUCENT);
         mCoreLayoutParams.setTitle(TAG);
         mCoreLayoutParams.setFitInsetsTypes(0);
@@ -422,6 +476,13 @@
         context.registerReceiver(mBroadcastReceiver, filter);
     }
 
+    private int getCoreLayoutParamFlags() {
+        return WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
+    }
+
     @Nullable
     private FingerprintSensorPropertiesInternal findFirstUdfps() {
         for (FingerprintSensorPropertiesInternal props :
@@ -467,6 +528,11 @@
         final int paddingX = animation != null ? animation.getPaddingX() : 0;
         final int paddingY = animation != null ? animation.getPaddingY() : 0;
 
+        mCoreLayoutParams.flags = getCoreLayoutParamFlags();
+        if (animation.listenForTouchesOutsideView()) {
+            mCoreLayoutParams.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
+        }
+
         // Default dimensions assume portrait mode.
         mCoreLayoutParams.x = mSensorProps.sensorLocationX - mSensorProps.sensorRadius - paddingX;
         mCoreLayoutParams.y = mSensorProps.sensorLocationY - mSensorProps.sensorRadius - paddingY;
@@ -523,7 +589,9 @@
                     mView.setAnimationViewController(animation);
 
                     mWindowManager.addView(mView, computeLayoutParams(animation));
-                    mView.setOnTouchListener(mOnTouchListener);
+                    mAccessibilityManager.addTouchExplorationStateChangeListener(
+                            mTouchExplorationStateChangeListener);
+                    updateTouchListener();
                 } catch (RuntimeException e) {
                     Log.e(TAG, "showUdfpsOverlay | failed to add window", e);
                 }
@@ -559,7 +627,8 @@
                         mKeyguardUpdateMonitor,
                         mFgExecutor,
                         mDumpManager,
-                        mKeyguardViewMediator
+                        mKeyguardViewMediator,
+                        this
                 );
             case IUdfpsOverlayController.REASON_AUTH_BP:
                 // note: empty controller, currently shows no visual affordance
@@ -595,7 +664,10 @@
                 onFingerUp();
                 mWindowManager.removeView(mView);
                 mView.setOnTouchListener(null);
+                mView.setOnHoverListener(null);
                 mView.setAnimationViewController(null);
+                mAccessibilityManager.removeTouchExplorationStateChangeListener(
+                        mTouchExplorationStateChangeListener);
                 mView = null;
             } else {
                 Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden");
@@ -661,6 +733,7 @@
 
     // This method can be called from the UI thread.
     private void onFingerUp() {
+        mActivePointerId = -1;
         mMainHandler.removeCallbacks(mAcquiredVibration);
         if (mView == null) {
             Log.w(TAG, "Null view in onFingerUp");
@@ -696,8 +769,24 @@
                 return mEffectTextureTick;
             case "tick":
                 return mEffectTick;
+            case "double_tap":
+                return mDoubleClick;
             default:
                 return defaultEffect;
         }
     }
+
+    private void updateTouchListener() {
+        if (mView == null) {
+            return;
+        }
+
+        if (mAccessibilityManager.isTouchExplorationEnabled()) {
+            mView.setOnHoverListener(mOnHoverListener);
+            mView.setOnTouchListener(null);
+        } else {
+            mView.setOnHoverListener(null);
+            mView.setOnTouchListener(mOnTouchListener);
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
index 565e65f..37ea251 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
@@ -48,6 +48,7 @@
     private ImageView mBgProtection;
 
     private AnimatorSet mAnimatorSet;
+    private int mAlpha; // 0-255
 
     public UdfpsKeyguardView(Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
@@ -97,9 +98,20 @@
         }
     }
 
+    /**
+     * @param alpha between 0 and 255
+     */
+    void setUnpausedAlpha(int alpha) {
+        mAlpha = alpha;
+        updateAlpha();
+    }
+
     @Override
     int calculateAlpha() {
-        return mPauseAuth ? 0 : 255;
+        if (mPauseAuth) {
+            return 0;
+        }
+        return mAlpha;
     }
 
     void onDozeAmountChanged(float linear, float eased) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
index 35678e6..4d2f809 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
@@ -20,6 +20,8 @@
 
 import android.annotation.NonNull;
 import android.hardware.biometrics.BiometricSourceType;
+import android.util.MathUtils;
+import android.view.MotionEvent;
 
 import androidx.annotation.Nullable;
 
@@ -29,6 +31,7 @@
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.phone.KeyguardBouncer;
 import com.android.systemui.statusbar.phone.StatusBar;
 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
 import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -50,14 +53,23 @@
     @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     @NonNull private final DelayableExecutor mExecutor;
     @NonNull private final KeyguardViewMediator mKeyguardViewMediator;
+    @NonNull private final UdfpsController mUdfpsController;
 
     @Nullable private Runnable mCancelRunnable;
-    private boolean mShowBouncer;
+    private boolean mShowingUdfpsBouncer;
     private boolean mQsExpanded;
     private boolean mFaceDetectRunning;
     private boolean mHintShown;
     private boolean mTransitioningFromHome;
     private int mStatusBarState;
+    private boolean mKeyguardIsVisible;
+
+    /**
+     * hidden amount of pin/pattern/password bouncer
+     * {@link KeyguardBouncer#EXPANSION_VISIBLE} (0f) to
+     * {@link KeyguardBouncer#EXPANSION_HIDDEN} (1f)
+     */
+    private float mInputBouncerHiddenAmount;
 
     protected UdfpsKeyguardViewController(
             @NonNull UdfpsKeyguardView view,
@@ -67,12 +79,14 @@
             @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
             @NonNull DelayableExecutor mainDelayableExecutor,
             @NonNull DumpManager dumpManager,
-            @NonNull KeyguardViewMediator keyguardViewMediator) {
+            @NonNull KeyguardViewMediator keyguardViewMediator,
+            @NonNull UdfpsController udfpsController) {
         super(view, statusBarStateController, statusBar, dumpManager);
         mKeyguardViewManager = statusBarKeyguardViewManager;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mExecutor = mainDelayableExecutor;
         mKeyguardViewMediator = keyguardViewMediator;
+        mUdfpsController = udfpsController;
     }
 
     @Override
@@ -88,10 +102,16 @@
         updateFaceDetectRunning(mKeyguardUpdateMonitor.isFaceDetectionRunning());
 
         final float dozeAmount = mStatusBarStateController.getDozeAmount();
-        mStatusBarStateController.addCallback(mStateListener);
         mStateListener.onDozeAmountChanged(dozeAmount, dozeAmount);
-        mStateListener.onStateChanged(mStatusBarStateController.getState());
-        mAlternateAuthInterceptor.setQsExpanded(mKeyguardViewManager.isQsExpanded());
+        mStatusBarStateController.addCallback(mStateListener);
+
+        mStatusBarState = mStatusBarStateController.getState();
+        mQsExpanded = mKeyguardViewManager.isQsExpanded();
+        mKeyguardIsVisible = mKeyguardUpdateMonitor.isKeyguardVisible();
+        mInputBouncerHiddenAmount = KeyguardBouncer.EXPANSION_HIDDEN;
+        updateAlpha();
+        updatePauseAuth();
+
         mKeyguardViewManager.setAlternateAuthInterceptor(mAlternateAuthInterceptor);
     }
 
@@ -102,7 +122,6 @@
         mFaceDetectRunning = false;
 
         mStatusBarStateController.removeCallback(mStateListener);
-        mAlternateAuthInterceptor.hideAlternateAuthBouncer();
         mKeyguardViewManager.setAlternateAuthInterceptor(null);
         mTransitioningFromHome = false;
 
@@ -115,28 +134,33 @@
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         super.dump(fd, pw, args);
-        pw.println("mShowBouncer=" + mShowBouncer);
+        pw.println("mShowingUdfpsBouncer=" + mShowingUdfpsBouncer);
         pw.println("mFaceDetectRunning=" + mFaceDetectRunning);
         pw.println("mTransitioningFromHomeToKeyguard=" + mTransitioningFromHome);
         pw.println("mStatusBarState" + StatusBarState.toShortString(mStatusBarState));
         pw.println("mQsExpanded=" + mQsExpanded);
+        pw.println("mKeyguardVisible=" + mKeyguardIsVisible);
+        pw.println("mInputBouncerHiddenAmount=" + mInputBouncerHiddenAmount);
+        pw.println("mAlpha=" + mView.getAlpha());
     }
 
     /**
-     * Overrides non-bouncer show logic in shouldPauseAuth to still auth.
+     * Overrides non-bouncer show logic in shouldPauseAuth to still show icon.
+     * @return whether the udfpsBouncer has been newly shown or hidden
      */
-    private void showBouncer(boolean show) {
-        if (mShowBouncer == show) {
-            return;
+    private boolean showUdfpsBouncer(boolean show) {
+        if (mShowingUdfpsBouncer == show) {
+            return false;
         }
 
-        mShowBouncer = show;
+        mShowingUdfpsBouncer = show;
         updatePauseAuth();
-        if (mShowBouncer) {
+        if (mShowingUdfpsBouncer) {
             mView.animateUdfpsBouncer();
         } else {
             mView.animateAwayUdfpsBouncer(() -> mKeyguardViewManager.cancelPostAuthActions());
         }
+        return true;
     }
 
     /**
@@ -145,7 +169,7 @@
      * is expanded, so this can be overridden with the showBouncer method.
      */
     public boolean shouldPauseAuth() {
-        if (mShowBouncer) {
+        if (mShowingUdfpsBouncer) {
             return false;
         }
 
@@ -161,9 +185,40 @@
             return true;
         }
 
+        if (!mKeyguardIsVisible) {
+            return true;
+        }
+
+        if (mInputBouncerHiddenAmount < .4f) {
+            return true;
+        }
+
         return false;
     }
 
+    @Override
+    public boolean listenForTouchesOutsideView() {
+        return true;
+    }
+
+    @Override
+    public void onTouchOutsideView() {
+        maybeShowInputBouncer();
+    }
+
+    /**
+     * If we were previously showing the udfps bouncer, hide it and instead show the regular
+     * (pin/pattern/password) bouncer.
+     *
+     * Does nothing if we weren't previously showing the udfps bouncer.
+     */
+    private void maybeShowInputBouncer() {
+        if (mShowingUdfpsBouncer) {
+            mKeyguardViewManager.resetAlternateAuth(false);
+            mKeyguardViewManager.showBouncer(true);
+        }
+    }
+
     private void cancelDelayedHint() {
         if (mCancelRunnable != null) {
             mCancelRunnable.run();
@@ -194,11 +249,19 @@
         }
     }
 
+    private void updateAlpha() {
+        // fade icon on transition to showing bouncer
+        int alpha = mShowingUdfpsBouncer ? 255
+                : Math.abs((int) MathUtils.map(.4f, 0f, .7f, 255f,
+                        mInputBouncerHiddenAmount));
+        mView.setUnpausedAlpha(alpha);
+    }
+
     private final StatusBarStateController.StateListener mStateListener =
             new StatusBarStateController.StateListener() {
         @Override
         public void onDozeAmountChanged(float linear, float eased) {
-            if (linear != 0) showBouncer(false);
+            if (linear != 0) showUdfpsBouncer(false);
             mView.onDozeAmountChanged(linear, eased);
             if (linear == 1f) {
                 // transition has finished
@@ -245,33 +308,28 @@
                         cancelDelayedHint();
                     }
                 }
+
+                public void onKeyguardVisibilityChangedRaw(boolean showing) {
+                    mKeyguardIsVisible = showing;
+                    updatePauseAuth();
+                }
             };
 
     private final StatusBarKeyguardViewManager.AlternateAuthInterceptor mAlternateAuthInterceptor =
             new StatusBarKeyguardViewManager.AlternateAuthInterceptor() {
                 @Override
                 public boolean showAlternateAuthBouncer() {
-                    if (mShowBouncer) {
-                        return false;
-                    }
-
-                    showBouncer(true);
-                    return true;
+                    return showUdfpsBouncer(true);
                 }
 
                 @Override
                 public boolean hideAlternateAuthBouncer() {
-                    if (!mShowBouncer) {
-                        return false;
-                    }
-
-                    showBouncer(false);
-                    return true;
+                    return showUdfpsBouncer(false);
                 }
 
                 @Override
                 public boolean isShowingAlternateAuthBouncer() {
-                    return mShowBouncer;
+                    return mShowingUdfpsBouncer;
                 }
 
                 @Override
@@ -286,6 +344,18 @@
                 }
 
                 @Override
+                public boolean onTouch(MotionEvent event) {
+                    return mUdfpsController.onTouch(event);
+                }
+
+                @Override
+                public void setBouncerExpansionChanged(float expansion) {
+                    mInputBouncerHiddenAmount = expansion;
+                    updateAlpha();
+                    updatePauseAuth();
+                }
+
+                @Override
                 public void dump(PrintWriter pw) {
                     pw.println(getTag());
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java
index 42d0d84..d92d8df 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java
@@ -130,6 +130,10 @@
         }
     }
 
+    void onTouchOutsideView() {
+        mAnimationViewController.onTouchOutsideView();
+    }
+
     void setAnimationViewController(UdfpsAnimationViewController animationViewController) {
         mAnimationViewController = animationViewController;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
index e2c62ed..58881d9 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.classifier;
 
+import static com.android.systemui.classifier.Classifier.BACK_GESTURE;
+import static com.android.systemui.classifier.Classifier.GENERIC;
 import static com.android.systemui.classifier.FalsingManagerProxy.FALSING_SUCCESS;
 import static com.android.systemui.classifier.FalsingModule.BRIGHT_LINE_GESTURE_CLASSIFERS;
 
@@ -79,6 +81,7 @@
 
     private final Collection<FalsingClassifier> mClassifiers;
     private final List<FalsingBeliefListener> mFalsingBeliefListeners = new ArrayList<>();
+    private List<FalsingTapListener> mFalsingTapListeners = new ArrayList<>();
 
     private final SessionListener mSessionListener = new SessionListener() {
         @Override
@@ -147,10 +150,16 @@
                         mPriorInteractionType = Classifier.GENERIC;
                     } else {
                         // Gestures that were not classified get treated as a false.
+                        // Gestures that look like simple taps are less likely to be false
+                        // than swipes. They may simply be mis-clicks.
+                        double penalty = mSingleTapClassifier.isTap(
+                                mDataProvider.getRecentMotionEvents(), 0).isFalse()
+                                ? 0.7 : 0.8;
                         mHistoryTracker.addResults(
                                 Collections.singleton(
                                         FalsingClassifier.Result.falsed(
-                                                .8, getClass().getSimpleName(), "unclassified")),
+                                                penalty, getClass().getSimpleName(),
+                                                "unclassified")),
                                 completionTimeMs);
                     }
                 }
@@ -189,32 +198,26 @@
     @Override
     public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
         mPriorInteractionType = interactionType;
-        if (skipFalsing()) {
+        if (skipFalsing(interactionType)) {
+            mPriorResults = getPassedResult(1);
+            logDebug("Skipped falsing");
             return false;
         }
 
-        final boolean booleanResult;
+        final boolean[] localResult = {false};
+        mPriorResults = mClassifiers.stream().map(falsingClassifier -> {
+            FalsingClassifier.Result r = falsingClassifier.classifyGesture(
+                    interactionType,
+                    mHistoryTracker.falseBelief(),
+                    mHistoryTracker.falseConfidence());
+            localResult[0] |= r.isFalse();
 
-        if (!mTestHarness && !mDataProvider.isJustUnlockedWithFace() && !mDockManager.isDocked()) {
-            final boolean[] localResult = {false};
-            mPriorResults = mClassifiers.stream().map(falsingClassifier -> {
-                FalsingClassifier.Result r = falsingClassifier.classifyGesture(
-                        interactionType,
-                        mHistoryTracker.falseBelief(),
-                        mHistoryTracker.falseConfidence());
-                localResult[0] |= r.isFalse();
+            return r;
+        }).collect(Collectors.toList());
 
-                return r;
-            }).collect(Collectors.toList());
-            booleanResult = localResult[0];
-        } else {
-            booleanResult = false;
-            mPriorResults = Collections.singleton(FalsingClassifier.Result.passed(1));
-        }
+        logDebug("False Gesture: " + localResult[0]);
 
-        logDebug("False Gesture: " + booleanResult);
-
-        return booleanResult;
+        return localResult[0];
     }
 
     @Override
@@ -228,7 +231,9 @@
 
     @Override
     public boolean isFalseTap(@Penalty int penalty) {
-        if (skipFalsing()) {
+        if (skipFalsing(GENERIC)) {
+            mPriorResults = getPassedResult(1);
+            logDebug("Skipped falsing");
             return false;
         }
 
@@ -257,7 +262,7 @@
         if (!singleTapResult.isFalse()) {
             if (mDataProvider.isJustUnlockedWithFace()) {
                 // Immediately pass if a face is detected.
-                mPriorResults = Collections.singleton(FalsingClassifier.Result.passed(1));
+                mPriorResults = getPassedResult(1);
                 logDebug("False Single Tap: false (face detected)");
                 return false;
             } else if (!isFalseDoubleTap()) {
@@ -271,9 +276,10 @@
                         FalsingClassifier.Result.falsed(
                                 0, getClass().getSimpleName(), "bad history"));
                 logDebug("False Single Tap: true (bad history)");
+                mFalsingTapListeners.forEach(FalsingTapListener::onDoubleTapRequired);
                 return true;
             } else {
-                mPriorResults = Collections.singleton(FalsingClassifier.Result.passed(0.1));
+                mPriorResults = getPassedResult(0.1);
                 logDebug("False Single Tap: false (default)");
                 return false;
             }
@@ -287,7 +293,9 @@
 
     @Override
     public boolean isFalseDoubleTap() {
-        if (skipFalsing()) {
+        if (skipFalsing(GENERIC)) {
+            mPriorResults = getPassedResult(1);
+            logDebug("Skipped falsing");
             return false;
         }
 
@@ -300,8 +308,12 @@
         return result.isFalse();
     }
 
-    private boolean skipFalsing() {
-        return !mKeyguardStateController.isShowing();
+    private boolean skipFalsing(@Classifier.InteractionType  int interactionType) {
+        return interactionType == BACK_GESTURE
+                || !mKeyguardStateController.isShowing()
+                || mTestHarness
+                || mDataProvider.isJustUnlockedWithFace()
+                || mDockManager.isDocked();
     }
 
     @Override
@@ -350,6 +362,16 @@
     }
 
     @Override
+    public void addTapListener(FalsingTapListener listener) {
+        mFalsingTapListeners.add(listener);
+    }
+
+    @Override
+    public void removeTapListener(FalsingTapListener listener) {
+        mFalsingTapListeners.remove(listener);
+    }
+
+    @Override
     public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
         IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
         ipw.println("BRIGHTLINE FALSING MANAGER");
@@ -393,6 +415,10 @@
         mHistoryTracker.removeBeliefListener(mBeliefListener);
     }
 
+    private static Collection<FalsingClassifier.Result> getPassedResult(double confidence) {
+        return Collections.singleton(FalsingClassifier.Result.passed(confidence));
+    }
+
     static void logDebug(String msg) {
         logDebug(msg, null);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
index 6f70672..ffdcff2 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
@@ -43,6 +43,7 @@
     public static final int UDFPS_AUTHENTICATION = 13;
     public static final int DISABLED_UDFPS_AFFORDANCE = 14;
     public static final int QS_SWIPE = 15;
+    public static final int BACK_GESTURE = 16;
 
     @IntDef({
             QUICK_SETTINGS,
@@ -61,7 +62,8 @@
             BRIGHTNESS_SLIDER,
             UDFPS_AUTHENTICATION,
             DISABLED_UDFPS_AFFORDANCE,
-            QS_SWIPE
+            QS_SWIPE,
+            BACK_GESTURE
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface InteractionType {}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index 88748f9..94e5c8a 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -44,6 +44,7 @@
     private static final boolean DEBUG = false;
     private static final String TAG = "FalsingManager";
     private static final String PROXIMITY_SENSOR_TAG = "FalsingManager";
+    private static final long GESTURE_PROCESSING_DELAY_MS = 100;
 
     private final FalsingDataProvider mFalsingDataProvider;
     private final FalsingManager mFalsingManager;
@@ -256,7 +257,7 @@
 
     @Override
     public void onTouchEvent(MotionEvent ev) {
-        if (!mKeyguardStateController.isShowing()) {
+        if (!mKeyguardStateController.isShowing() || mStatusBarStateController.isDozing()) {
             avoidGesture();
             return;
         }
@@ -281,7 +282,18 @@
 
     @Override
     public void onMotionEventComplete() {
-        mMainExecutor.executeDelayed(mFalsingDataProvider::onMotionEventComplete , 50);
+        // We must delay processing the completion because of the way Android handles click events.
+        // It generally delays executing them immediately, instead choosing to give the UI a chance
+        // to respond to touch events before acknowledging the click. As such, we must also delay,
+        // giving click handlers a chance to analyze it.
+        // You might think we could do something clever to remove this delay - adding non-committed
+        // results that can later be changed - but this won't help. Calling the code
+        // below can eventually end up in a "Falsing Event" being fired. If we remove the delay
+        // here, we would still have to add the delay to the event, but we'd also have to make all
+        // the intervening code more complicated in the process. This is the simplest insertion
+        // point for the delay.
+        mMainExecutor.executeDelayed(
+                mFalsingDataProvider::onMotionEventComplete, GESTURE_PROCESSING_DELAY_MS);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
index e557773..e8445d4 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java
@@ -146,4 +146,14 @@
     public void removeFalsingBeliefListener(FalsingBeliefListener listener) {
         mFalsingBeliefListeners.remove(listener);
     }
+
+    @Override
+    public void addTapListener(FalsingTapListener falsingTapListener) {
+
+    }
+
+    @Override
+    public void removeTapListener(FalsingTapListener falsingTapListener) {
+
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
index 1723291..6b819fb 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
@@ -176,6 +176,16 @@
     }
 
     @Override
+    public void addTapListener(FalsingTapListener listener) {
+        mInternalFalsingManager.addTapListener(listener);
+    }
+
+    @Override
+    public void removeTapListener(FalsingTapListener listener) {
+        mInternalFalsingManager.removeTapListener(listener);
+    }
+
+    @Override
     public void onProximityEvent(ThresholdSensor.ThresholdSensorEvent proximityEvent) {
         mInternalFalsingManager.onProximityEvent(proximityEvent);
     }
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 496741b..ea1ade41 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
@@ -40,11 +40,6 @@
  */
 interface ControlsController : UserAwareController {
 
-    /**
-     * Whether the controls system is available for the current user.
-     */
-    val available: Boolean
-
     // SERVICE COMMUNICATION
 
     /**
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 8c3ef68..5d0127a 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
@@ -28,7 +28,6 @@
 import android.net.Uri
 import android.os.Environment
 import android.os.UserHandle
-import android.provider.Settings
 import android.service.controls.Control
 import android.service.controls.actions.ControlAction
 import android.util.ArrayMap
@@ -70,15 +69,10 @@
 
     companion object {
         private const val TAG = "ControlsControllerImpl"
-        internal const val CONTROLS_AVAILABLE = Settings.Secure.CONTROLS_ENABLED
-        internal val URI = Settings.Secure.getUriFor(CONTROLS_AVAILABLE)
         private const val USER_CHANGE_RETRY_DELAY = 500L // ms
         private const val DEFAULT_ENABLED = 1
         private const val PERMISSION_SELF = "com.android.systemui.permission.SELF"
         const val SUGGESTED_CONTROLS_PER_STRUCTURE = 6
-
-        private fun isAvailable(userId: Int, cr: ContentResolver) = Settings.Secure.getIntForUser(
-            cr, CONTROLS_AVAILABLE, DEFAULT_ENABLED, userId) != 0
     }
 
     private var userChanging: Boolean = true
@@ -93,8 +87,6 @@
 
     private val contentResolver: ContentResolver
         get() = context.contentResolver
-    override var available = isAvailable(currentUserId, contentResolver)
-        private set
 
     private val persistenceWrapper: ControlsFavoritePersistenceWrapper
     @VisibleForTesting
@@ -126,8 +118,7 @@
                 BackupManager(userStructure.userContext)
         )
         auxiliaryPersistenceWrapper.changeFile(userStructure.auxiliaryFile)
-        available = isAvailable(newUser.identifier, contentResolver)
-        resetFavorites(available)
+        resetFavorites()
         bindingController.changeUser(newUser)
         listingController.changeUser(newUser)
         userChanging = false
@@ -157,7 +148,7 @@
                     Log.d(TAG, "Restore finished, storing auxiliary favorites")
                     auxiliaryPersistenceWrapper.initialize()
                     persistenceWrapper.storeFavorites(auxiliaryPersistenceWrapper.favorites)
-                    resetFavorites(available)
+                    resetFavorites()
                 }
             }
         }
@@ -176,8 +167,7 @@
             if (userChanging || userId != currentUserId) {
                 return
             }
-            available = isAvailable(currentUserId, contentResolver)
-            resetFavorites(available)
+            resetFavorites()
         }
     }
 
@@ -242,7 +232,7 @@
 
     init {
         dumpManager.registerDumpable(javaClass.name, this)
-        resetFavorites(available)
+        resetFavorites()
         userChanging = false
         broadcastDispatcher.registerReceiver(
                 userSwitchReceiver,
@@ -256,23 +246,18 @@
             PERMISSION_SELF,
             null
         )
-        contentResolver.registerContentObserver(URI, false, settingObserver, UserHandle.USER_ALL)
         listingController.addCallback(listingCallback)
     }
 
     fun destroy() {
         broadcastDispatcher.unregisterReceiver(userSwitchReceiver)
         context.unregisterReceiver(restoreFinishedReceiver)
-        contentResolver.unregisterContentObserver(settingObserver)
         listingController.removeCallback(listingCallback)
     }
 
-    private fun resetFavorites(shouldLoad: Boolean) {
+    private fun resetFavorites() {
         Favorites.clear()
-
-        if (shouldLoad) {
-            Favorites.load(persistenceWrapper.readFavorites())
-        }
+        Favorites.load(persistenceWrapper.readFavorites())
     }
 
     private fun confirmAvailability(): Boolean {
@@ -280,10 +265,6 @@
             Log.w(TAG, "Controls not available while user is changing")
             return false
         }
-        if (!available) {
-            Log.d(TAG, "Controls not available")
-            return false
-        }
         return true
     }
 
@@ -577,7 +558,6 @@
 
     override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
         pw.println("ControlsController state:")
-        pw.println("  Available: $available")
         pw.println("  Changing users: $userChanging")
         pw.println("  Current user: ${currentUser.identifier}")
         pw.println("  Favorites:")
diff --git a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
index 6b7a1ac..5557c86 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
@@ -93,7 +93,7 @@
     /**
      * @return true if controls are feature-enabled and the user has the setting enabled
      */
-    fun isEnabled() = featureEnabled && lazyControlsController.get().available
+    fun isEnabled() = featureEnabled
 
     /**
      * Returns one of 3 states:
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt
index 4ed6106..f9e7f0e 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt
@@ -71,10 +71,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        if (!controller.available) {
-            Log.w(TAG, "Quick Controls not available for this user ")
-            finish()
-        }
+
         currentUserTracker.startTracking()
         controlsListingController.addCallback(callback)
 
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 ac13aad..2bbd3cb 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
@@ -23,8 +23,6 @@
 import android.view.ViewGroup
 
 interface ControlsUiController {
-    val available: Boolean
-
     companion object {
         public const val TAG = "ControlsUiController"
         public const val EXTRA_ANIMATE = "extra_animate"
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 954bfb3..26be987 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -128,9 +128,6 @@
             reload(parent)
     }
 
-    override val available: Boolean
-        get() = controlsController.get().available
-
     private lateinit var activityContext: Context
     private lateinit var listingCallback: ControlsListingController.ControlsListingCallback
 
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index d8ade2b..4196465 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -376,8 +376,8 @@
             case REASON_SENSOR_DOUBLE_TAP: return "doubletap";
             case PULSE_REASON_SENSOR_LONG_PRESS: return "longpress";
             case PULSE_REASON_DOCKING: return "docking";
-            case PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN: return "wakelockscreen";
-            case REASON_SENSOR_WAKE_UP: return "wakeup";
+            case PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN: return "reach-wakelockscreen";
+            case REASON_SENSOR_WAKE_UP: return "presence-wakeup";
             case REASON_SENSOR_TAP: return "tap";
             case REASON_SENSOR_UDFPS_LONG_PRESS: return "udfps";
             case REASON_SENSOR_QUICK_PICKUP: return "quickPickup";
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 5cea31b..39adabb 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -40,11 +40,9 @@
 
 import androidx.annotation.VisibleForTesting;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.UiEvent;
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.logging.UiEventLoggerImpl;
-import com.android.internal.logging.nano.MetricsProto;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.plugins.SensorManagerPlugin;
@@ -491,10 +489,6 @@
             mHandler.post(mWakeLock.wrap(() -> {
                 if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event));
                 if (mSensor != null && mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) {
-                    int subType = (int) event.values[0];
-                    MetricsLogger.action(
-                            mContext, MetricsProto.MetricsEvent.ACTION_AMBIENT_GESTURE,
-                            subType);
                     UI_EVENT_LOGGER.log(DozeSensorsUiEvent.ACTION_AMBIENT_GESTURE_PICKUP);
                 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index ee55965..c45eb35 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -24,7 +24,6 @@
 import android.content.IntentFilter;
 import android.content.res.Configuration;
 import android.hardware.display.AmbientDisplayConfiguration;
-import android.metrics.LogMaker;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.text.format.Formatter;
@@ -33,12 +32,8 @@
 import android.view.Display;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.UiEvent;
 import com.android.internal.logging.UiEventLogger;
-import com.android.internal.logging.UiEventLoggerImpl;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.systemui.Dependency;
 import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dagger.qualifiers.Main;
@@ -70,8 +65,6 @@
     /** adb shell am broadcast -a com.android.systemui.doze.pulse com.android.systemui */
     private static final String PULSE_ACTION = "com.android.systemui.doze.pulse";
 
-    private static final UiEventLogger UI_EVENT_LOGGER = new UiEventLoggerImpl();
-
     /**
      * Last value sent by the wake-display sensor.
      * Assuming that the screen should start on.
@@ -99,12 +92,11 @@
     private final BroadcastDispatcher mBroadcastDispatcher;
     private final AuthController mAuthController;
     private final DelayableExecutor mMainExecutor;
+    private final UiEventLogger mUiEventLogger;
 
     private long mNotificationPulseTime;
     private boolean mPulsePending;
 
-    private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
-
     /** see {@link #onProximityFar} prox for callback */
     private boolean mWantProxSensor;
     private boolean mWantTouchScreenSensors;
@@ -143,7 +135,10 @@
         DOZING_UPDATE_AUTH_TRIGGERED(657),
 
         @UiEvent(doc = "Dozing updated because quick pickup sensor woke up.")
-        DOZING_UPDATE_QUICK_PICKUP(708);
+        DOZING_UPDATE_QUICK_PICKUP(708),
+
+        @UiEvent(doc = "Dozing updated - sensor wakeup timed out (from quick pickup or presence)")
+        DOZING_UPDATE_WAKE_TIMEOUT(794);
 
         private final int mId;
 
@@ -182,7 +177,8 @@
             ProximitySensor proximitySensor, ProximitySensor.ProximityCheck proxCheck,
             DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher,
             SecureSettings secureSettings, AuthController authController,
-            @Main DelayableExecutor mainExecutor) {
+            @Main DelayableExecutor mainExecutor,
+            UiEventLogger uiEventLogger) {
         mContext = context;
         mDozeHost = dozeHost;
         mConfig = config;
@@ -200,6 +196,7 @@
         mBroadcastDispatcher = broadcastDispatcher;
         mAuthController = authController;
         mMainExecutor = mainExecutor;
+        mUiEventLogger = uiEventLogger;
     }
 
     @Override
@@ -328,11 +325,8 @@
 
     private void gentleWakeUp(int reason) {
         // Log screen wake up reason (lift/pickup, tap, double-tap)
-        mMetricsLogger.write(new LogMaker(MetricsEvent.DOZING)
-                .setType(MetricsEvent.TYPE_UPDATE)
-                .setSubtype(reason));
         Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason))
-                .ifPresent(UI_EVENT_LOGGER::log);
+                .ifPresent(mUiEventLogger::log);
         if (mDozeParameters.getDisplayNeedsBlanking()) {
             // Let's prepare the display to wake-up by drawing black.
             // This will cover the hardware wake-up sequence, where the display
@@ -401,10 +395,9 @@
                 }
                 if (state == DozeMachine.State.DOZE) {
                     mMachine.requestState(DozeMachine.State.DOZE_AOD);
-                    // Logs AOD open due to sensor wake up.
-                    mMetricsLogger.write(new LogMaker(MetricsEvent.DOZING)
-                            .setType(MetricsEvent.TYPE_OPEN)
-                            .setSubtype(reason));
+                    // Log sensor triggered
+                    Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason))
+                            .ifPresent(mUiEventLogger::log);
 
                     if (isQuickPickup) {
                         // schedule runnable to go back to DOZE
@@ -427,10 +420,8 @@
                     return;
                 }
                 mMachine.requestState(DozeMachine.State.DOZE);
-                // Logs AOD close due to sensor wake up.
-                mMetricsLogger.write(new LogMaker(MetricsEvent.DOZING)
-                        .setType(MetricsEvent.TYPE_CLOSE)
-                        .setSubtype(reason));
+                // log wake timeout
+                mUiEventLogger.log(DozingUpdateUiEvent.DOZING_UPDATE_WAKE_TIMEOUT);
             }
         }
     }
@@ -563,10 +554,8 @@
         }, !mDozeParameters.getProxCheckBeforePulse() || performedProxCheck, reason);
 
         // Logs request pulse reason on AOD screen.
-        mMetricsLogger.write(new LogMaker(MetricsEvent.DOZING)
-                .setType(MetricsEvent.TYPE_UPDATE).setSubtype(reason));
         Optional.ofNullable(DozingUpdateUiEvent.fromReason(reason))
-                .ifPresent(UI_EVENT_LOGGER::log);
+                .ifPresent(mUiEventLogger::log);
     }
 
     private boolean canPulse() {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index e44e305..19edeb8 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -98,7 +98,6 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.colorextraction.ColorExtractor;
 import com.android.internal.colorextraction.ColorExtractor.GradientColors;
-import com.android.internal.colorextraction.drawable.ScrimDrawable;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.UiEvent;
 import com.android.internal.logging.UiEventLogger;
@@ -117,6 +116,7 @@
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
 import com.android.systemui.plugins.GlobalActionsPanelPlugin;
+import com.android.systemui.scrim.ScrimDrawable;
 import com.android.systemui.statusbar.NotificationShadeDepthController;
 import com.android.systemui.statusbar.NotificationShadeWindowController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index 767d7ab..411e0f0 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -30,11 +30,11 @@
 import android.widget.TextView;
 
 import com.android.internal.R;
-import com.android.internal.colorextraction.drawable.ScrimDrawable;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.settingslib.Utils;
 import com.android.systemui.Dependency;
 import com.android.systemui.plugins.GlobalActions;
+import com.android.systemui.scrim.ScrimDrawable;
 import com.android.systemui.statusbar.BlurUtils;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.phone.ScrimController;
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
index 58c41d5..1a53c28 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
@@ -29,7 +29,6 @@
 import static android.opengl.GLES20.glEnableVertexAttribArray;
 import static android.opengl.GLES20.glGenTextures;
 import static android.opengl.GLES20.glTexParameteri;
-import static android.opengl.GLES20.glUniform1f;
 import static android.opengl.GLES20.glUniform1i;
 import static android.opengl.GLES20.glVertexAttribPointer;
 
@@ -53,7 +52,6 @@
     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 String U_EXPOSURE = "uExposure";
     private static final int POSITION_COMPONENT_COUNT = 2;
     private static final int TEXTURE_COMPONENT_COUNT = 2;
     private static final int BYTES_PER_FLOAT = 4;
@@ -85,7 +83,6 @@
     private int mAttrPosition;
     private int mAttrTextureCoordinates;
     private int mUniTexture;
-    private int mUniExposure;
     private int mTextureId;
 
     ImageGLWallpaper(ImageGLProgram program) {
@@ -128,7 +125,6 @@
 
     private void setupUniforms() {
         mUniTexture = mProgram.getUniformHandle(U_TEXTURE);
-        mUniExposure = mProgram.getUniformHandle(U_EXPOSURE);
     }
 
     void draw() {
@@ -175,10 +171,6 @@
         glUniform1i(mUniTexture, 0);
     }
 
-    void setExposureValue(float exposureValue) {
-        glUniform1f(mUniExposure, exposureValue);
-    }
-
     /**
      * Called to dump current state.
      * @param prefix prefix.
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
index cdf88f3..01a353c 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
@@ -46,7 +46,6 @@
     private final ImageGLWallpaper mWallpaper;
     private final Rect mSurfaceSize = new Rect();
     private final WallpaperTexture mTexture;
-    private float mExposureValue;
 
     public ImageWallpaperRenderer(Context context) {
         final WallpaperManager wpm = context.getSystemService(WallpaperManager.class);
@@ -67,13 +66,6 @@
         mTexture.use(c);
     }
 
-    /**
-     * @hide
-     */
-    public void setExposureValue(float exposureValue) {
-        mExposureValue = exposureValue;
-    }
-
     @Override
     public boolean isWcgContent() {
         return mTexture.isWcgContent();
@@ -102,7 +94,6 @@
     public void onDrawFrame() {
         glClear(GL_COLOR_BUFFER_BIT);
         glViewport(0, 0, mSurfaceSize.width(), mSurfaceSize.height());
-        mWallpaper.setExposureValue(mExposureValue);
         mWallpaper.useTexture();
         mWallpaper.draw();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index 97803c1..666afed 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -70,7 +70,7 @@
     /**
      * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
      */
-    private static boolean sEnableRemoteKeyguardAnimation =
+    static boolean sEnableRemoteKeyguardAnimation =
             SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false);
 
     private final KeyguardViewMediator mKeyguardViewMediator;
@@ -138,6 +138,7 @@
 
         @Override // Binder interface
         public void onAnimationCancelled() {
+            mKeyguardViewMediator.cancelKeyguardExitAnimation();
         }
     };
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
new file mode 100644
index 0000000..411c328
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.keyguard
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.ValueAnimator
+import android.content.Context
+import android.graphics.Matrix
+import android.view.RemoteAnimationTarget
+import android.view.SyncRtSurfaceTransactionApplier
+import androidx.core.math.MathUtils
+import com.android.internal.R
+import com.android.keyguard.KeyguardViewController
+import com.android.systemui.animation.Interpolators
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import dagger.Lazy
+import javax.inject.Inject
+
+/**
+ * Starting scale factor for the app/launcher surface behind the keyguard, when it's animating
+ * in during keyguard exit.
+ */
+const val SURFACE_BEHIND_START_SCALE_FACTOR = 0.95f
+
+/**
+ * How much to translate the surface behind the keyguard at the beginning of the exit animation,
+ * in terms of percentage of the surface's height.
+ */
+const val SURFACE_BEHIND_START_TRANSLATION_Y = 0.05f
+
+/**
+ * Y coordinate of the pivot point for the scale effect on the surface behind the keyguard. This
+ * is expressed as percentage of the surface's height, so 0.66f means the surface will scale up
+ * from the point at (width / 2, height * 0.66).
+ */
+const val SURFACE_BEHIND_SCALE_PIVOT_Y = 0.66f
+
+/**
+ * Dismiss amount at which to fade in the surface behind the keyguard. The surface will then animate
+ * along with the dismiss amount until [DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD] is reached.
+ *
+ * The dismiss amount is the inverse of the notification panel expansion, which decreases as the
+ * lock screen is swiped away.
+ */
+const val DISMISS_AMOUNT_SHOW_SURFACE_THRESHOLD = 0.1f
+
+/**
+ * Dismiss amount at which to complete the keyguard exit animation and hide the keyguard.
+ *
+ * The dismiss amount is the inverse of the notification panel expansion, which decreases as the
+ * lock screen is swiped away.
+ */
+const val DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD = 0.3f
+
+/**
+ * Initiates, controls, and ends the keyguard unlock animation.
+ *
+ * The unlock animation transitions between the keyguard (lock screen) and the app/launcher surface
+ * behind the keyguard. If the user is swiping away the keyguard, this controller will decide when
+ * to animate in the surface, and synchronize its appearance with the swipe gesture. If the keyguard
+ * is animating away via a canned animation (due to biometric unlock, tapping a notification, etc.)
+ * this controller will play a canned animation on the surface as well.
+ *
+ * The surface behind the keyguard is manipulated via a RemoteAnimation passed to
+ * [notifyStartKeyguardExitAnimation] by [KeyguardViewMediator].
+ */
+@SysUISingleton
+class KeyguardUnlockAnimationController @Inject constructor(
+    context: Context,
+    private val keyguardStateController: KeyguardStateController,
+    private val keyguardViewMediator: Lazy<KeyguardViewMediator>,
+    private val keyguardViewController: KeyguardViewController
+) : KeyguardStateController.Callback {
+
+    /**
+     * Information used to start, run, and finish a RemoteAnimation on the app or launcher surface
+     * behind the keyguard.
+     *
+     * If we're swiping to unlock, the "animation" is controlled via the gesture, tied to the
+     * dismiss amounts received in [onKeyguardDismissAmountChanged]. It does not have a fixed
+     * duration, and it ends when the gesture reaches a certain threshold or is cancelled.
+     *
+     * If we're unlocking via biometrics, PIN entry, or from clicking a notification, a canned
+     * animation is started in [notifyStartKeyguardExitAnimation].
+     */
+    private var surfaceTransactionApplier: SyncRtSurfaceTransactionApplier? = null
+    private var surfaceBehindRemoteAnimationTarget: RemoteAnimationTarget? = null
+    private var surfaceBehindRemoteAnimationStartTime: Long = 0
+
+    /**
+     * Alpha value applied to [surfaceBehindRemoteAnimationTarget], which is the surface of the
+     * app/launcher behind the keyguard.
+     *
+     * If we're doing a swipe gesture, we fade in the surface when the swipe passes a certain
+     * threshold. If we're doing a canned animation, it'll be faded in while a translate/scale
+     * animation plays.
+     */
+    private var surfaceBehindAlpha = 1f
+    private var surfaceBehindAlphaAnimator = ValueAnimator.ofFloat(0f, 1f)
+
+    /**
+     * Matrix applied to [surfaceBehindRemoteAnimationTarget], which is the surface of the
+     * app/launcher behind the keyguard.
+     *
+     * This is used during the unlock animation/swipe gesture to scale and translate the surface.
+     */
+    private val surfaceBehindMatrix = Matrix()
+
+    /**
+     * Animator that animates in the surface behind the keyguard. This is used to play a canned
+     * animation on the surface, if we're not doing a swipe gesture.
+     */
+    private val surfaceBehindEntryAnimator = ValueAnimator.ofFloat(0f, 1f)
+
+    /** Rounded corner radius to apply to the surface behind the keyguard. */
+    private var roundedCornerRadius = 0f
+
+    init {
+        surfaceBehindAlphaAnimator.duration = 150
+        surfaceBehindAlphaAnimator.interpolator = Interpolators.ALPHA_IN
+        surfaceBehindAlphaAnimator.addUpdateListener { valueAnimator: ValueAnimator ->
+            surfaceBehindAlpha = valueAnimator.animatedValue as Float
+            updateSurfaceBehindAppearAmount()
+        }
+        surfaceBehindAlphaAnimator.addListener(object : AnimatorListenerAdapter() {
+            override fun onAnimationEnd(animation: Animator) {
+                // If the surface alpha is 0f, it's no longer visible so we can safely be done with
+                // the animation.
+                if (surfaceBehindAlpha == 0f) {
+                    keyguardViewMediator.get().finishSurfaceBehindRemoteAnimation()
+                }
+            }
+        })
+
+        surfaceBehindEntryAnimator.duration = 450
+        surfaceBehindEntryAnimator.interpolator = Interpolators.DECELERATE_QUINT
+        surfaceBehindEntryAnimator.addUpdateListener { valueAnimator: ValueAnimator ->
+            surfaceBehindAlpha = valueAnimator.animatedValue as Float
+            setSurfaceBehindAppearAmount(valueAnimator.animatedValue as Float)
+        }
+        surfaceBehindEntryAnimator.addListener(object : AnimatorListenerAdapter() {
+            override fun onAnimationEnd(animation: Animator) {
+                keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished()
+            }
+        })
+
+        // Listen for changes in the dismiss amount.
+        keyguardStateController.addCallback(this)
+
+        roundedCornerRadius =
+                context.resources.getDimensionPixelSize(R.dimen.rounded_corner_radius).toFloat()
+    }
+
+    /**
+     * Called from [KeyguardViewMediator] to tell us that the RemoteAnimation on the surface behind
+     * the keyguard has started successfully. We can use these parameters to directly manipulate the
+     * surface for the unlock gesture/animation.
+     *
+     * When we're done with it, we'll call [KeyguardViewMediator.finishSurfaceBehindRemoteAnimation]
+     * to end the RemoteAnimation.
+     *
+     * [requestedShowSurfaceBehindKeyguard] denotes whether the exit animation started because of a
+     * call to [KeyguardViewMediator.showSurfaceBehindKeyguard], as happens during a swipe gesture,
+     * as opposed to the keyguard hiding.
+     */
+    fun notifyStartKeyguardExitAnimation(
+        target: RemoteAnimationTarget,
+        startTime: Long,
+        requestedShowSurfaceBehindKeyguard: Boolean
+    ) {
+
+        if (surfaceTransactionApplier == null) {
+            surfaceTransactionApplier = SyncRtSurfaceTransactionApplier(
+                    keyguardViewController.viewRootImpl.view)
+        }
+
+        surfaceBehindRemoteAnimationTarget = target
+        surfaceBehindRemoteAnimationStartTime = startTime
+
+        // If the surface behind wasn't made visible during a swipe, we'll do a canned animation
+        // to animate it in. Otherwise, the swipe touch events will continue animating it.
+        if (!requestedShowSurfaceBehindKeyguard) {
+            keyguardViewController.hide(startTime, 350)
+            surfaceBehindEntryAnimator.start()
+        }
+    }
+
+    fun notifyCancelKeyguardExitAnimation() {
+        surfaceBehindRemoteAnimationTarget = null
+    }
+
+    fun notifyFinishedKeyguardExitAnimation() {
+        surfaceBehindRemoteAnimationTarget = null
+    }
+
+    fun hideKeyguardViewAfterRemoteAnimation() {
+        keyguardViewController.hide(surfaceBehindRemoteAnimationStartTime, 350)
+    }
+
+    /**
+     * Scales in and translates up the surface behind the keyguard. This is used during unlock
+     * animations and swipe gestures to animate the surface's entry (and exit, if the swipe is
+     * cancelled).
+     */
+    private fun setSurfaceBehindAppearAmount(amount: Float) {
+        if (surfaceBehindRemoteAnimationTarget == null) {
+            return
+        }
+
+        val surfaceHeight: Int = surfaceBehindRemoteAnimationTarget!!.screenSpaceBounds.height()
+        val scaleFactor = (SURFACE_BEHIND_START_SCALE_FACTOR +
+                (1f - SURFACE_BEHIND_START_SCALE_FACTOR) *
+                MathUtils.clamp(amount, 0f, 1f))
+
+        // Scale up from a point at the center-bottom of the surface.
+        surfaceBehindMatrix.setScale(
+                scaleFactor,
+                scaleFactor,
+                surfaceBehindRemoteAnimationTarget!!.screenSpaceBounds.width() / 2f,
+                surfaceHeight * SURFACE_BEHIND_SCALE_PIVOT_Y)
+
+        // Translate up from the bottom.
+        surfaceBehindMatrix.postTranslate(0f,
+                surfaceHeight * SURFACE_BEHIND_START_TRANSLATION_Y * (1f - amount))
+
+        // If we're snapping the keyguard back, immediately begin fading it out.
+        val animationAlpha =
+                if (keyguardStateController.isSnappingKeyguardBackAfterSwipe) amount
+                else surfaceBehindAlpha
+
+        val params = SyncRtSurfaceTransactionApplier.SurfaceParams.Builder(
+                surfaceBehindRemoteAnimationTarget!!.leash)
+                .withMatrix(surfaceBehindMatrix)
+                .withCornerRadius(roundedCornerRadius)
+                .withAlpha(animationAlpha)
+                .build()
+        surfaceTransactionApplier!!.scheduleApply(params)
+    }
+
+    /**
+     * Sets the appearance amount of the surface behind the keyguard, according to the current
+     * keyguard dismiss amount and the method of dismissal.
+     */
+    private fun updateSurfaceBehindAppearAmount() {
+        if (surfaceBehindRemoteAnimationTarget == null) {
+            return
+        }
+
+        // For fling animations, we want to animate the surface in over the full distance. If we're
+        // dismissing the keyguard via a swipe gesture (or cancelling the swipe gesture), we want to
+        // bring in the surface behind over a relatively short swipe distance (~15%), to keep the
+        // interaction tight.
+        if (keyguardStateController.isFlingingToDismissKeyguard) {
+            setSurfaceBehindAppearAmount(keyguardStateController.dismissAmount)
+        } else if (keyguardStateController.isDismissingFromSwipe ||
+                keyguardStateController.isSnappingKeyguardBackAfterSwipe) {
+            val totalSwipeDistanceToDismiss =
+                    (DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD - DISMISS_AMOUNT_SHOW_SURFACE_THRESHOLD)
+            val swipedDistanceSoFar: Float =
+                    keyguardStateController.dismissAmount - DISMISS_AMOUNT_SHOW_SURFACE_THRESHOLD
+            val progress = swipedDistanceSoFar / totalSwipeDistanceToDismiss
+            setSurfaceBehindAppearAmount(progress)
+        }
+    }
+
+    override fun onKeyguardDismissAmountChanged() {
+        if (!KeyguardService.sEnableRemoteKeyguardAnimation) {
+            return
+        }
+
+        val dismissAmount = keyguardStateController.dismissAmount
+
+        // Hide the keyguard if we're fully dismissed, or if we're swiping to dismiss and have
+        // crossed the threshold to finish the dismissal.
+        val reachedHideKeyguardThreshold = (dismissAmount >= 1f ||
+                (keyguardStateController.isDismissingFromSwipe &&
+                // Don't hide if we're flinging during a swipe, since we need to finish
+                // animating it out. This will be called again after the fling ends.
+                !keyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture &&
+                dismissAmount >= DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD))
+
+        if (dismissAmount >= DISMISS_AMOUNT_SHOW_SURFACE_THRESHOLD &&
+                !keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard()) {
+            // We passed the threshold, and we're not yet showing the surface behind the keyguard.
+            // Animate it in.
+            keyguardViewMediator.get().showSurfaceBehindKeyguard()
+            fadeInSurfaceBehind()
+        } else if (dismissAmount < DISMISS_AMOUNT_SHOW_SURFACE_THRESHOLD &&
+                keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard()) {
+            // We're no longer past the threshold but we are showing the surface. Animate it out.
+            keyguardViewMediator.get().hideSurfaceBehindKeyguard()
+            fadeOutSurfaceBehind()
+        } else if (keyguardViewMediator.get().isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe &&
+                reachedHideKeyguardThreshold) {
+            keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished()
+        }
+
+        if (keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard() ||
+                keyguardViewMediator.get().isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe) {
+            updateSurfaceBehindAppearAmount()
+        }
+    }
+
+    private fun fadeInSurfaceBehind() {
+        surfaceBehindAlphaAnimator.cancel()
+        surfaceBehindAlphaAnimator.start()
+    }
+
+    private fun fadeOutSurfaceBehind() {
+        surfaceBehindAlphaAnimator.cancel()
+        surfaceBehindAlphaAnimator.reverse()
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 70459df..48f9a58 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -17,6 +17,7 @@
 package com.android.systemui.keyguard;
 
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
+import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
 
 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_SHOW_OVER_LOCKSCREEN;
 import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
@@ -72,7 +73,6 @@
 import android.view.IRemoteAnimationFinishedCallback;
 import android.view.RemoteAnimationTarget;
 import android.view.SyncRtSurfaceTransactionApplier;
-import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
@@ -109,6 +109,7 @@
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
 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.util.DeviceConfigProxy;
 
 import java.io.FileDescriptor;
@@ -195,6 +196,7 @@
     private static final int NOTIFY_SCREEN_TURNED_OFF = 16;
     private static final int NOTIFY_STARTED_GOING_TO_SLEEP = 17;
     private static final int SYSTEM_READY = 18;
+    private static final int CANCEL_KEYGUARD_EXIT_ANIM = 19;
 
     /**
      * The default amount of time we stay awake (used for all key input)
@@ -350,7 +352,6 @@
     private int mUnlockSoundId;
     private int mTrustedSoundId;
     private int mLockSoundStreamId;
-
     /**
      * The animation used for hiding keyguard. This is used to fetch the animation timings if
      * WindowManager is not providing us with them.
@@ -400,6 +401,29 @@
     private IKeyguardDrawnCallback mDrawnCallback;
     private CharSequence mCustomMessage;
 
+    /**
+     * Whether the RemoteAnimation on the app/launcher surface behind the keyguard is 'running'.
+     * Note that this does not necessarily mean the surface is currently in motion - we may be
+     * 'animating' it along with the user's finger during a swipe to unlock gesture, a gesture that
+     * can be paused or reversed.
+     */
+    private boolean mSurfaceBehindRemoteAnimationRunning;
+
+    /**
+     * Whether we've asked to make the app/launcher surface behind the keyguard visible, via a call
+     * to {@link android.app.IActivityTaskManager#keyguardGoingAway(int)}.
+     *
+     * Since that's an IPC, this doesn't necessarily mean the remote animation has started yet.
+     * {@link #mSurfaceBehindRemoteAnimationRunning} will be true if the call completed and the
+     * animation is now running.
+     */
+    private boolean mSurfaceBehindRemoteAnimationRequested = false;
+
+    /**
+     * Callback to run to end the RemoteAnimation on the app/launcher surface behind the keyguard.
+     */
+    private IRemoteAnimationFinishedCallback mSurfaceBehindRemoteAnimationFinishedCallback;
+
     private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener =
             new DeviceConfig.OnPropertiesChangedListener() {
             @Override
@@ -735,6 +759,9 @@
     private DeviceConfigProxy mDeviceConfig;
     private DozeParameters mDozeParameters;
 
+    private final KeyguardStateController mKeyguardStateController;
+    private final Lazy<KeyguardUnlockAnimationController> mKeyguardUnlockAnimationControllerLazy;
+
     /**
      * Injected constructor. See {@link KeyguardModule}.
      */
@@ -752,7 +779,9 @@
             NavigationModeController navigationModeController,
             KeyguardDisplayManager keyguardDisplayManager,
             DozeParameters dozeParameters,
-            StatusBarStateController statusBarStateController) {
+            StatusBarStateController statusBarStateController,
+            KeyguardStateController keyguardStateController,
+            Lazy<KeyguardUnlockAnimationController> keyguardUnlockAnimationControllerLazy) {
         super(context);
         mFalsingCollector = falsingCollector;
         mLockPatternUtils = lockPatternUtils;
@@ -780,6 +809,9 @@
                 }));
         mDozeParameters = dozeParameters;
         statusBarStateController.addCallback(this);
+
+        mKeyguardStateController = keyguardStateController;
+        mKeyguardUnlockAnimationControllerLazy = keyguardUnlockAnimationControllerLazy;
     }
 
     public void userActivity() {
@@ -1732,6 +1764,12 @@
                     mFalsingCollector.onSuccessfulUnlock();
                     Trace.endSection();
                     break;
+                case CANCEL_KEYGUARD_EXIT_ANIM:
+                    Trace.beginSection(
+                            "KeyguardViewMediator#handleMessage CANCEL_KEYGUARD_EXIT_ANIM");
+                    handleCancelKeyguardExitAnimation();
+                    Trace.endSection();
+                    break;
                 case KEYGUARD_DONE_PENDING_TIMEOUT:
                     Trace.beginSection("KeyguardViewMediator#handleMessage"
                             + " KEYGUARD_DONE_PENDING_TIMEOUT");
@@ -1943,7 +1981,8 @@
 
             int flags = 0;
             if (mKeyguardViewControllerLazy.get().shouldDisableWindowAnimationsForUnlock()
-                    || (mWakeAndUnlocking && !mPulsing)) {
+                    || (mWakeAndUnlocking && !mPulsing)
+                    || isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe()) {
                 flags |= WindowManagerPolicyConstants
                         .KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
             }
@@ -1952,7 +1991,7 @@
                 flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE;
             }
             if (mKeyguardViewControllerLazy.get().isUnlockWithWallpaper()) {
-                flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
+                flags |= KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
             }
             if (mKeyguardViewControllerLazy.get().shouldSubtleWindowAnimationsForUnlock()) {
                 flags |= WindowManagerPolicyConstants
@@ -2033,8 +2072,13 @@
                 + " fadeoutDuration=" + fadeoutDuration);
         synchronized (KeyguardViewMediator.this) {
 
-            if (!mHiding) {
-                // Tell ActivityManager that we canceled the keyguardExitAnimation.
+            // Tell ActivityManager that we canceled the keyguard animation if
+            // handleStartKeyguardExitAnimation was called but we're not hiding the keyguard, unless
+            // we're animating the surface behind the keyguard and will be hiding the keyguard
+            // shortly.
+            if (!mHiding
+                    && !mSurfaceBehindRemoteAnimationRequested
+                    && !mKeyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture()) {
                 setShowingLocked(mShowing, true /* force */);
                 return;
             }
@@ -2056,61 +2100,184 @@
                 playSounds(false);
             }
 
-            setShowingLocked(false);
-            mWakeAndUnlocking = false;
-            mDismissCallbackRegistry.notifyDismissSucceeded();
-            mKeyguardViewControllerLazy.get().hide(startTime, fadeoutDuration);
+            if (KeyguardService.sEnableRemoteKeyguardAnimation) {
+                mSurfaceBehindRemoteAnimationFinishedCallback = finishedCallback;
+                mSurfaceBehindRemoteAnimationRunning = true;
 
-            // TODO(bc-animation): When remote animation is enabled for keyguard exit animation,
-            // apps, wallpapers and finishedCallback are set to non-null. nonApps is not yet
-            // supported, so it's always null.
-            mContext.getMainExecutor().execute(() -> {
-                if (finishedCallback == null) {
+                if (apps != null && apps.length > 0) {
+                    // Pass the surface and metadata to the unlock animation controller.
+                    mKeyguardUnlockAnimationControllerLazy.get().notifyStartKeyguardExitAnimation(
+                            apps[0], startTime, mSurfaceBehindRemoteAnimationRequested);
+                } else {
+                    // We weren't given any surfaces to animate, so just finish.
+                    onKeyguardExitRemoteAnimationFinished();
                     return;
                 }
+            } else {
+                setShowingLocked(false);
+                mWakeAndUnlocking = false;
+                mDismissCallbackRegistry.notifyDismissSucceeded();
+                mKeyguardViewControllerLazy.get().hide(startTime, fadeoutDuration);
 
-                // TODO(bc-unlock): Sample animation, just to apply alpha animation on the app.
-                final SyncRtSurfaceTransactionApplier applier = new SyncRtSurfaceTransactionApplier(
-                        mKeyguardViewControllerLazy.get().getViewRootImpl().getView());
-                final RemoteAnimationTarget primary = apps[0];
-                ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
-                anim.setDuration(400 /* duration */);
-                anim.setInterpolator(Interpolators.LINEAR);
-                anim.addUpdateListener((ValueAnimator animation) -> {
-                    SurfaceParams params = new SurfaceParams.Builder(primary.leash)
-                            .withAlpha(animation.getAnimatedFraction())
-                            .build();
-                    applier.scheduleApply(params);
-                });
-                anim.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        try {
-                            finishedCallback.onAnimationFinished();
-                        } catch (RemoteException e) {
-                            Slog.e(TAG, "RemoteException");
-                        }
+                // TODO(bc-animation): When remote animation is enabled for keyguard exit animation,
+                // apps, wallpapers and finishedCallback are set to non-null. nonApps is not yet
+                // supported, so it's always null.
+                mContext.getMainExecutor().execute(() -> {
+                    if (finishedCallback == null) {
+                        return;
                     }
 
-                    @Override
-                    public void onAnimationCancel(Animator animation) {
-                        try {
-                            finishedCallback.onAnimationFinished();
-                        } catch (RemoteException e) {
-                            Slog.e(TAG, "RemoteException");
+                    // TODO(bc-unlock): Sample animation, just to apply alpha animation on the app.
+                    final SyncRtSurfaceTransactionApplier applier =
+                            new SyncRtSurfaceTransactionApplier(
+                                    mKeyguardViewControllerLazy.get().getViewRootImpl().getView());
+                    final RemoteAnimationTarget primary = apps[0];
+                    ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
+                    anim.setDuration(400 /* duration */);
+                    anim.setInterpolator(Interpolators.LINEAR);
+                    anim.addUpdateListener((ValueAnimator animation) -> {
+                        SyncRtSurfaceTransactionApplier.SurfaceParams params =
+                                new SyncRtSurfaceTransactionApplier.SurfaceParams.Builder(
+                                        primary.leash)
+                                .withAlpha(animation.getAnimatedFraction())
+                                .build();
+                        applier.scheduleApply(params);
+                    });
+                    anim.addListener(new AnimatorListenerAdapter() {
+                        @Override
+                        public void onAnimationEnd(Animator animation) {
+                            try {
+                                finishedCallback.onAnimationFinished();
+                            } catch (RemoteException e) {
+                                Slog.e(TAG, "RemoteException");
+                            }
                         }
-                    }
+
+                        @Override
+                        public void onAnimationCancel(Animator animation) {
+                            try {
+                                finishedCallback.onAnimationFinished();
+                            } catch (RemoteException e) {
+                                Slog.e(TAG, "RemoteException");
+                            }
+                        }
+                    });
+                    anim.start();
                 });
-                anim.start();
-            });
-            resetKeyguardDonePendingLocked();
-            mHideAnimationRun = false;
-            adjustStatusBarLocked();
-            sendUserPresentBroadcast();
+                resetKeyguardDonePendingLocked();
+                mHideAnimationRun = false;
+                adjustStatusBarLocked();
+                sendUserPresentBroadcast();
+            }
         }
+
         Trace.endSection();
     }
 
+    /**
+     * Whether we're currently animating between the keyguard and the app/launcher surface behind
+     * it, or will be shortly (which happens if we started a fling to dismiss the keyguard).
+     */
+    public boolean isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe() {
+        return mSurfaceBehindRemoteAnimationRunning
+                || mKeyguardStateController.isFlingingToDismissKeyguard();
+    }
+
+    /**
+     * Called if the keyguard exit animation has been cancelled and we should return to the
+     * keyguard.
+     *
+     * This can happen due to the system cancelling the RemoteAnimation (due to a timeout), or the
+     * user cancelling the unlock swipe gesture.
+     */
+    private void handleCancelKeyguardExitAnimation() {
+        hideSurfaceBehindKeyguard();
+        mKeyguardUnlockAnimationControllerLazy.get().notifyCancelKeyguardExitAnimation();
+    }
+
+    /**
+     * Called when we're done running the keyguard exit animation.
+     *
+     * This will call {@link #mSurfaceBehindRemoteAnimationFinishedCallback} to let WM know that
+     * we're done with the RemoteAnimation, actually hide the keyguard, and clean up state related
+     * to the keyguard exit animation.
+     */
+    public void onKeyguardExitRemoteAnimationFinished() {
+        if (!mSurfaceBehindRemoteAnimationRunning && !mSurfaceBehindRemoteAnimationRequested) {
+            return;
+        }
+
+        // Block the panel from expanding, in case we were doing a swipe to dismiss gesture.
+        mKeyguardViewControllerLazy.get().blockPanelExpansionFromCurrentTouch();
+        final boolean wasShowing = mShowing;
+        setShowingLocked(false);
+
+        mWakeAndUnlocking = false;
+        mDismissCallbackRegistry.notifyDismissSucceeded();
+
+        if (mKeyguardStateController.isDismissingFromSwipe() || !wasShowing) {
+            mKeyguardUnlockAnimationControllerLazy.get().hideKeyguardViewAfterRemoteAnimation();
+        }
+
+        finishSurfaceBehindRemoteAnimation();
+
+        resetKeyguardDonePendingLocked();
+        mHideAnimationRun = false;
+        adjustStatusBarLocked();
+        sendUserPresentBroadcast();
+        mSurfaceBehindRemoteAnimationRequested = false;
+        mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation();
+    }
+
+    /**
+     * Tells the ActivityTaskManager that the keyguard is planning to go away, so that it makes the
+     * surface behind the keyguard visible and calls {@link #handleStartKeyguardExitAnimation} with
+     * the parameters needed to animate the surface.
+     */
+    public void showSurfaceBehindKeyguard() {
+        mSurfaceBehindRemoteAnimationRequested = true;
+
+        try {
+            ActivityTaskManager.getService().keyguardGoingAway(
+                    WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS
+                            | WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER);
+        } catch (RemoteException e) {
+            mSurfaceBehindRemoteAnimationRequested = false;
+            e.printStackTrace();
+        }
+    }
+
+    /** Hides the surface behind the keyguard by re-showing the keyguard/activity lock screen. */
+    public void hideSurfaceBehindKeyguard() {
+        mSurfaceBehindRemoteAnimationRequested = false;
+
+        if (mShowing) {
+            setShowingLocked(true, true);
+        }
+    }
+
+    /**
+     * Whether we have requested to show the surface behind the keyguard, even if it's not yet
+     * visible due to IPC delay.
+     */
+    public boolean requestedShowSurfaceBehindKeyguard() {
+        return mSurfaceBehindRemoteAnimationRequested;
+    }
+
+    /** If it's running, finishes the RemoteAnimation on the surface behind the keyguard. */
+    public void finishSurfaceBehindRemoteAnimation() {
+        mSurfaceBehindRemoteAnimationRunning = false;
+
+        if (mSurfaceBehindRemoteAnimationFinishedCallback != null) {
+            try {
+                mSurfaceBehindRemoteAnimationFinishedCallback.onAnimationFinished();
+                mSurfaceBehindRemoteAnimationFinishedCallback = null;
+            } catch (RemoteException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
     private void adjustStatusBarLocked() {
         adjustStatusBarLocked(false /* forceHideHomeRecentsButtons */,
                 false /* forceClearFlags */);
@@ -2346,6 +2513,19 @@
         Trace.endSection();
     }
 
+    /**
+     * Cancel the keyguard exit animation, usually because we were swiping to unlock and the swipe
+     * gesture was cancelled.
+     *
+     * This will re-show the keyguard and animate out the app/launcher surface behind the keyguard.
+     */
+    public void cancelKeyguardExitAnimation() {
+        Trace.beginSection("KeyguardViewMediator#cancelKeyguardExitAnimation");
+        Message msg = mHandler.obtainMessage(CANCEL_KEYGUARD_EXIT_ANIM);
+        mHandler.sendMessage(msg);
+        Trace.endSection();
+    }
+
     public void onShortPowerPressedGoHome() {
         // do nothing
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
index a747edd..ecee1b5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
@@ -42,6 +42,7 @@
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
 import com.android.systemui.keyguard.FaceAuthScreenBrightnessController;
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.navigationbar.NavigationModeController;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -49,6 +50,7 @@
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.statusbar.phone.KeyguardLiftController;
 import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.DeviceConfigProxy;
 import com.android.systemui.util.sensors.AsyncSensorManager;
 import com.android.systemui.util.settings.GlobalSettings;
@@ -92,7 +94,9 @@
             NavigationModeController navigationModeController,
             KeyguardDisplayManager keyguardDisplayManager,
             DozeParameters dozeParameters,
-            StatusBarStateController statusBarStateController) {
+            StatusBarStateController statusBarStateController,
+            KeyguardStateController keyguardStateController,
+            Lazy<KeyguardUnlockAnimationController> keyguardUnlockAnimationController) {
         return new KeyguardViewMediator(
                 context,
                 falsingCollector,
@@ -109,7 +113,9 @@
                 navigationModeController,
                 keyguardDisplayManager,
                 dozeParameters,
-                statusBarStateController
+                statusBarStateController,
+                keyguardStateController,
+                keyguardUnlockAnimationController
         );
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt b/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt
index 6fb8650..b668e88 100644
--- a/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.media
 
 import android.view.View
+import android.view.ViewGroup
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.media.dagger.MediaModule.KEYGUARD
 import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -29,8 +30,8 @@
 import javax.inject.Named
 
 /**
- * A class that controls the media notifications on the lock screen, handles its visibility and
- * is responsible for the embedding of he media experience.
+ * Controls the media notifications on the lock screen, handles its visibility and placement -
+ * switches media player positioning between split pane container vs single pane container
  */
 @SysUISingleton
 class KeyguardMediaController @Inject constructor(
@@ -43,46 +44,120 @@
     init {
         statusBarStateController.addCallback(object : StatusBarStateController.StateListener {
             override fun onStateChanged(newState: Int) {
-                updateVisibility()
+                refreshMediaPosition()
+            }
+
+            override fun onDozingChanged(isDozing: Boolean) {
+                if (!isDozing) {
+                    mediaHost.visible = true
+                    refreshMediaPosition()
+                }
             }
         })
-    }
 
-    var visibilityChangedListener: ((Boolean) -> Unit)? = null
-    var view: MediaHeaderView? = null
-        private set
-
-    /**
-     * Attach this controller to a media view, initializing its state
-     */
-    fun attach(mediaView: MediaHeaderView) {
-        view = mediaView
         // First let's set the desired state that we want for this host
-        mediaHost.addVisibilityChangeListener { updateVisibility() }
-        mediaHost.expansion = 0.0f
+        mediaHost.expansion = MediaHostState.COLLAPSED
         mediaHost.showsOnlyActiveMedia = true
         mediaHost.falsingProtectionNeeded = true
 
         // Let's now initialize this view, which also creates the host view for us.
         mediaHost.init(MediaHierarchyManager.LOCATION_LOCKSCREEN)
-        mediaView.setContentView(mediaHost.hostView)
-
-        // Ensure the visibility is correct
-        updateVisibility()
     }
 
-    private fun updateVisibility() {
+    var visibilityChangedListener: ((Boolean) -> Unit)? = null
+
+    /**
+     * single pane media container placed at the top of the notifications list
+     */
+    var singlePaneContainer: MediaHeaderView? = null
+        private set
+    private var splitShadeContainer: ViewGroup? = null
+    private var useSplitShadeContainer: () -> Boolean = { false }
+
+    /**
+     * Attaches media container in single pane mode, situated at the top of the notifications list
+     */
+    fun attachSinglePaneContainer(mediaView: MediaHeaderView?) {
+        singlePaneContainer = mediaView
+
+        // Required to show it for the first time, afterwards visibility is managed automatically
+        mediaHost.visible = true
+        mediaHost.addVisibilityChangeListener { visible ->
+            refreshMediaPosition()
+            if (visible) {
+                mediaHost.hostView.layoutParams.apply {
+                    height = ViewGroup.LayoutParams.WRAP_CONTENT
+                    width = ViewGroup.LayoutParams.MATCH_PARENT
+                }
+            }
+        }
+        refreshMediaPosition()
+    }
+
+    /**
+     * Attaches media container in split shade mode, situated to the left of notifications
+     */
+    fun attachSplitShadeContainer(container: ViewGroup, useContainer: () -> Boolean) {
+        splitShadeContainer = container
+        useSplitShadeContainer = useContainer
+    }
+
+    fun refreshMediaPosition() {
         val keyguardOrUserSwitcher = (statusBarStateController.state == StatusBarState.KEYGUARD ||
                 statusBarStateController.state == StatusBarState.FULLSCREEN_USER_SWITCHER)
+        // mediaHost.visible required for proper animations handling
         val shouldBeVisible = mediaHost.visible &&
                 !bypassController.bypassEnabled &&
                 keyguardOrUserSwitcher &&
                 notifLockscreenUserManager.shouldShowLockscreenNotifications()
-        val previousVisibility = view?.visibility ?: View.GONE
-        val newVisibility = if (shouldBeVisible) View.VISIBLE else View.GONE
+        if (shouldBeVisible) {
+            showMediaPlayer()
+        } else {
+            hideMediaPlayer()
+        }
+    }
+
+    private fun showMediaPlayer() {
+        if (useSplitShadeContainer()) {
+            showMediaPlayer(
+                    activeContainer = splitShadeContainer,
+                    inactiveContainer = singlePaneContainer)
+        } else {
+            showMediaPlayer(
+                    activeContainer = singlePaneContainer,
+                    inactiveContainer = splitShadeContainer)
+        }
+    }
+
+    private fun showMediaPlayer(activeContainer: ViewGroup?, inactiveContainer: ViewGroup?) {
+        if (inactiveContainer?.childCount == 1) {
+            inactiveContainer.removeAllViews()
+        }
+        // might be called a few times for the same view, no need to add hostView again
+        if (activeContainer?.childCount == 0) {
+            // Detach the hostView from its parent view if exists
+            mediaHost.hostView.parent ?.let {
+                (it as? ViewGroup)?.removeView(mediaHost.hostView)
+            }
+            activeContainer.addView(mediaHost.hostView)
+        }
+        setVisibility(activeContainer, View.VISIBLE)
+        setVisibility(inactiveContainer, View.GONE)
+    }
+
+    private fun hideMediaPlayer() {
+        if (useSplitShadeContainer()) {
+            setVisibility(splitShadeContainer, View.GONE)
+        } else {
+            setVisibility(singlePaneContainer, View.GONE)
+        }
+    }
+
+    private fun setVisibility(view: ViewGroup?, newVisibility: Int) {
+        val previousVisibility = view?.visibility
         view?.visibility = newVisibility
         if (previousVisibility != newVisibility) {
-            visibilityChangedListener?.invoke(shouldBeVisible)
+            visibilityChangedListener?.invoke(newVisibility == View.VISIBLE)
         }
     }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index 2ecd405..d87142f 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -1,6 +1,5 @@
 package com.android.systemui.media
 
-import android.animation.ArgbEvaluator
 import android.app.smartspace.SmartspaceTarget
 import android.content.Context
 import android.content.Intent
@@ -116,8 +115,7 @@
     private var needsReordering: Boolean = false
     private var keysNeedRemoval = mutableSetOf<String>()
     private var bgColor = getBackgroundColor()
-    private var fgColor = com.android.settingslib.Utils.getColorAttr(context,
-            com.android.internal.R.attr.textColorPrimary).defaultColor
+    private var fgColor = getForegroundColor()
     private var isRtl: Boolean = false
         set(value) {
             if (value != field) {
@@ -319,7 +317,7 @@
         val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
             ViewGroup.LayoutParams.WRAP_CONTENT)
         newRecs.recommendationViewHolder?.recommendations?.setLayoutParams(lp)
-        newRecs.bindRecommendation(data, bgColor, { v -> removePlayer(key) })
+        newRecs.bindRecommendation(data, bgColor)
         MediaPlayerData.addMediaPlayer(key, newRecs)
         updatePlayerToState(newRecs, noAnimation = true)
         reorderAllPlayers()
@@ -348,20 +346,18 @@
 
             if (dismissMediaData) {
                 // Inform the media manager of a potentially late dismissal
-                mediaManager.dismissMediaData(key, 0L)
+                mediaManager.dismissMediaData(key, 0L /* delaye */)
             }
             if (dismissRecommendation) {
                 // Inform the media manager of a potentially late dismissal
-                mediaManager.dismissSmartspaceRecommendation()
+                mediaManager.dismissSmartspaceRecommendation(0L /* delay */)
             }
         }
     }
 
     private fun recreatePlayers() {
         bgColor = getBackgroundColor()
-
-        fgColor = com.android.settingslib.Utils.getColorAttr(context,
-                com.android.internal.R.attr.textColorPrimary).defaultColor
+        fgColor = getForegroundColor()
         pageIndicator.tintList = ColorStateList.valueOf(fgColor)
 
         MediaPlayerData.mediaData().forEach { (key, data) ->
@@ -371,12 +367,12 @@
     }
 
     private fun getBackgroundColor(): Int {
-        val themeAccent = com.android.settingslib.Utils.getColorAttr(context,
-                com.android.internal.R.attr.colorAccent).defaultColor
-        val themeBackground = com.android.settingslib.Utils.getColorAttr(context,
-                com.android.internal.R.attr.colorBackground).defaultColor
-        // Simulate transparency - cannot be actually transparent because of lockscreen
-        return ArgbEvaluator().evaluate(0.25f, themeBackground, themeAccent) as Int
+        return context.getColor(android.R.color.system_accent2_50)
+    }
+
+    private fun getForegroundColor(): Int {
+        return com.android.settingslib.Utils.getColorAttr(context,
+                com.android.internal.R.attr.textColorPrimary).defaultColor
     }
 
     private fun updatePageIndicator() {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 495461e..96ae2cd 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -25,7 +25,6 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.res.ColorStateList;
-import android.graphics.Outline;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
@@ -33,10 +32,8 @@
 import android.media.session.MediaSession;
 import android.media.session.PlaybackState;
 import android.os.Bundle;
-import android.os.SystemProperties;
 import android.util.Log;
 import android.view.View;
-import android.view.ViewOutlineProvider;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -46,7 +43,6 @@
 import androidx.annotation.UiThread;
 import androidx.constraintlayout.widget.ConstraintSet;
 
-import com.android.settingslib.Utils;
 import com.android.settingslib.widget.AdaptiveIcon;
 import com.android.systemui.R;
 import com.android.systemui.animation.ActivityLaunchAnimator;
@@ -54,6 +50,7 @@
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.media.dialog.MediaOutputDialogFactory;
 import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.shared.system.SysUiStatsLog;
 import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
 import com.android.systemui.util.animation.TransitionLayout;
 
@@ -74,11 +71,6 @@
     private static final String EXTRAS_MEDIA_SOURCE_PACKAGE_NAME = "package_name";
     private static final int MEDIA_RECOMMENDATION_MAX_NUM = 4;
 
-    private final boolean mShowAppName = SystemProperties.getBoolean(
-            "persist.sysui.qs_media_show_app_name", false);
-    private final boolean mShowDeviceName = SystemProperties.getBoolean(
-            "persist.sysui.qs_media_show_device_name", false);
-
     private static final Intent SETTINGS_INTENT = new Intent(ACTION_MEDIA_CONTROLS_SETTINGS);
 
     // Button IDs for QS controls
@@ -105,10 +97,8 @@
     private KeyguardDismissUtil mKeyguardDismissUtil;
     private Lazy<MediaDataManager> mMediaDataManagerLazy;
     private int mBackgroundColor;
+    private int mDevicePadding;
     private int mAlbumArtSize;
-    private int mAlbumArtRadius;
-    // This will provide the corners for the album art.
-    private final ViewOutlineProvider mViewOutlineProvider;
     private final MediaOutputDialogFactory mMediaOutputDialogFactory;
 
     /**
@@ -132,13 +122,6 @@
         mKeyguardDismissUtil = keyguardDismissUtil;
         mMediaOutputDialogFactory = mediaOutputDialogFactory;
         loadDimens();
-
-        mViewOutlineProvider = new ViewOutlineProvider() {
-            @Override
-            public void getOutline(View view, Outline outline) {
-                outline.setRoundRect(0, 0, mAlbumArtSize, mAlbumArtSize, mAlbumArtRadius);
-            }
-        };
     }
 
     public void onDestroy() {
@@ -150,9 +133,9 @@
     }
 
     private void loadDimens() {
-        mAlbumArtRadius = mContext.getResources().getDimensionPixelSize(
-                Utils.getThemeAttr(mContext, android.R.attr.dialogCornerRadius));
         mAlbumArtSize = mContext.getResources().getDimensionPixelSize(R.dimen.qs_media_album_size);
+        mDevicePadding = mContext.getResources()
+                .getDimensionPixelSize(R.dimen.qs_media_album_device_padding);
     }
 
     /**
@@ -210,10 +193,6 @@
         mPlayerViewHolder = vh;
         TransitionLayout player = vh.getPlayer();
 
-        ImageView albumView = vh.getAlbumView();
-        albumView.setOutlineProvider(mViewOutlineProvider);
-        albumView.setClipToOutline(true);
-
         mSeekBarObserver = new SeekBarObserver(vh);
         mSeekBarViewModel.getProgress().observeForever(mSeekBarObserver);
         mSeekBarViewModel.attachTouchHandlers(vh.getSeekBar());
@@ -241,6 +220,21 @@
         TransitionLayout recommendations = vh.getRecommendations();
 
         mMediaViewController.attach(recommendations, MediaViewController.TYPE.RECOMMENDATION);
+
+        mRecommendationViewHolder.getRecommendations().setOnLongClickListener(v -> {
+            if (!mMediaViewController.isGutsVisible()) {
+                mMediaViewController.openGuts();
+                return true;
+            } else {
+                return false;
+            }
+        });
+        mRecommendationViewHolder.getCancel().setOnClickListener(v -> {
+            closeGuts();
+        });
+        mRecommendationViewHolder.getSettings().setOnClickListener(v -> {
+            mActivityStarter.startActivity(SETTINGS_INTENT, true /* dismissShade */);
+        });
     }
 
     /** Bind this player view based on the data given. */
@@ -281,10 +275,19 @@
         boolean hasArtwork = data.getArtwork() != null;
         if (hasArtwork) {
             Drawable artwork = scaleDrawable(data.getArtwork());
+            albumView.setPadding(0, 0, 0, 0);
             albumView.setImageDrawable(artwork);
+        } else {
+            Drawable deviceIcon;
+            if (data.getDevice() != null && data.getDevice().getIcon() != null) {
+                deviceIcon = data.getDevice().getIcon().getConstantState().newDrawable().mutate();
+            } else {
+                deviceIcon = getContext().getDrawable(R.drawable.ic_headphone);
+            }
+            deviceIcon.setTintList(ColorStateList.valueOf(mBackgroundColor));
+            albumView.setPadding(mDevicePadding, mDevicePadding, mDevicePadding, mDevicePadding);
+            albumView.setImageDrawable(deviceIcon);
         }
-        setVisibleAndAlpha(collapsedSet, R.id.album_art, hasArtwork);
-        setVisibleAndAlpha(expandedSet, R.id.album_art, hasArtwork);
 
         // App icon
         ImageView appIcon = mPlayerViewHolder.getAppIcon();
@@ -299,13 +302,6 @@
         TextView titleText = mPlayerViewHolder.getTitleText();
         titleText.setText(data.getSong());
 
-        // App title
-        TextView appName = mPlayerViewHolder.getAppName();
-        appName.setText(data.getApp());
-        appName.setVisibility(mShowAppName ? View.VISIBLE : View.GONE);
-        setVisibleAndAlpha(collapsedSet, R.id.app_name, mShowAppName);
-        setVisibleAndAlpha(expandedSet, R.id.app_name, mShowAppName);
-
         // Artist name
         TextView artistText = mPlayerViewHolder.getArtistText();
         artistText.setText(data.getArtist());
@@ -317,10 +313,6 @@
         mPlayerViewHolder.getSeamless().setOnClickListener(v -> {
             mMediaOutputDialogFactory.create(data.getPackageName(), true);
         });
-        TextView mDeviceName = mPlayerViewHolder.getSeamlessText();
-        mDeviceName.setVisibility(mShowDeviceName ? View.VISIBLE : View.GONE);
-        setVisibleAndAlpha(collapsedSet, R.id.media_seamless_text, mShowDeviceName);
-        setVisibleAndAlpha(expandedSet, R.id.media_seamless_text, mShowDeviceName);
 
         ImageView iconView = mPlayerViewHolder.getSeamlessIcon();
         TextView deviceName = mPlayerViewHolder.getSeamlessText();
@@ -390,8 +382,12 @@
 
         // Hide any unused buttons
         for (; i < ACTION_IDS.length; i++) {
-            setVisibleAndAlpha(expandedSet, ACTION_IDS[i], false /*visible */);
             setVisibleAndAlpha(collapsedSet, ACTION_IDS[i], false /*visible */);
+            setVisibleAndAlpha(expandedSet, ACTION_IDS[i], false /* visible */);
+        }
+        // If no expanded buttons, set the first view as INVISIBLE so z remains constant
+        if (actionIcons.size() == 0) {
+            expandedSet.setVisibility(ACTION_IDS[0], ConstraintSet.INVISIBLE);
         }
 
         // Seek Bar
@@ -460,10 +456,7 @@
     }
 
     /** Bind this recommendation view based on the data given. */
-    public void bindRecommendation(
-            @NonNull SmartspaceTarget target,
-            @NonNull int backgroundColor,
-            @Nullable View.OnClickListener callback) {
+    public void bindRecommendation(@NonNull SmartspaceTarget target, @NonNull int backgroundColor) {
         if (mRecommendationViewHolder == null) {
             return;
         }
@@ -519,7 +512,13 @@
             mediaCoverImageView.setImageIcon(recommendation.getIcon());
 
             // Set up the click listener if applicable.
-            setSmartspaceOnClickListener(mediaCoverImageView, recommendation, callback);
+            setSmartspaceRecItemOnClickListener(
+                    mediaCoverImageView,
+                    recommendation,
+                    target.getSmartspaceTargetId(),
+                    view -> mMediaDataManagerLazy
+                            .get()
+                            .dismissSmartspaceRecommendation(0L /* delay */));
 
             setVisibleAndAlpha(expandedSet, mediaCoverItemsResIds.get(i), true);
             setVisibleAndAlpha(expandedSet, mediaLogoItemsResIds.get(i), true);
@@ -527,6 +526,16 @@
             setVisibleAndAlpha(collapsedSet, mediaLogoItemsResIds.get(i), true);
         }
 
+        // Set up long press to show guts setting panel.
+        mRecommendationViewHolder.getDismiss().setOnClickListener(v -> {
+            closeGuts();
+            mKeyguardDismissUtil.executeWhenUnlocked(() -> {
+                mMediaDataManagerLazy.get().dismissSmartspaceRecommendation(
+                        MediaViewController.GUTS_ANIMATION_DURATION + 100L);
+                return true;
+            }, true /* requiresShadeOpen */);
+        });
+
         mController = null;
         mMediaViewController.refreshState();
     }
@@ -611,9 +620,10 @@
         set.setAlpha(actionId, visible ? 1.0f : 0.0f);
     }
 
-    private void setSmartspaceOnClickListener(
+    private void setSmartspaceRecItemOnClickListener(
             @NonNull View view,
             @NonNull SmartspaceAction action,
+            @NonNull String targetId,
             @Nullable View.OnClickListener callback) {
         if (view == null || action == null || action.getIntent() == null) {
             Log.e(TAG, "No tap action can be set up");
@@ -621,6 +631,16 @@
         }
 
         view.setOnClickListener(v -> {
+            // When media recommendation card is shown, there could be only one card.
+            SysUiStatsLog.write(SysUiStatsLog.SMARTSPACE_CARD_REPORTED,
+                    760, // SMARTSPACE_CARD_CLICK
+                    targetId.hashCode(),
+                    SysUiStatsLog
+                            .SMART_SPACE_CARD_REPORTED__CARD_TYPE__HEADPHONE_MEDIA_RECOMMENDATIONS,
+                    getSurfaceForSmartspaceLogging(mMediaViewController.getCurrentEndLocation()),
+                    /* rank */ 1,
+                    /* cardinality */ 1);
+
             mActivityStarter.postStartActivityDismissingKeyguard(
                     action.getIntent(),
                     0 /* delay */,
@@ -630,4 +650,14 @@
             }
         });
     }
+
+    private int getSurfaceForSmartspaceLogging(int currentEndLocation) {
+        if (currentEndLocation == MediaHierarchyManager.LOCATION_QQS
+                || currentEndLocation == MediaHierarchyManager.LOCATION_QS) {
+            return SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__SHADE;
+        } else if (currentEndLocation == MediaHierarchyManager.LOCATION_LOCKSCREEN) {
+            return SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__LOCKSCREEN;
+        }
+        return SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__DEFAULT_SURFACE;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaData.kt b/packages/SystemUI/src/com/android/systemui/media/MediaData.kt
index 0ed96ee..6f0c887 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaData.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaData.kt
@@ -31,7 +31,7 @@
      */
     val app: String?,
     /**
-     * Icon shown on player, close to app name.
+     * App icon shown on player.
      */
     val appIcon: Icon?,
     /**
@@ -104,7 +104,12 @@
     /**
      * Set from the notification and used as fallback when PlaybackState cannot be determined
      */
-    val isClearable: Boolean = true
+    val isClearable: Boolean = true,
+
+    /**
+     * Timestamp when this player was last active.
+     */
+    var lastActive: Long = 0L
 )
 
 /** State of a media action. */
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt
index a274eab..9163044 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt
@@ -16,7 +16,9 @@
 
 package com.android.systemui.media
 
+import android.app.smartspace.SmartspaceAction
 import android.app.smartspace.SmartspaceTarget
+import android.os.SystemProperties
 import android.util.Log
 import com.android.internal.annotations.VisibleForTesting
 import com.android.systemui.broadcast.BroadcastDispatcher
@@ -24,14 +26,23 @@
 import com.android.systemui.settings.CurrentUserTracker
 import com.android.systemui.statusbar.NotificationLockscreenUserManager
 import java.util.concurrent.Executor
+import java.util.concurrent.TimeUnit
 import javax.inject.Inject
 
 private const val TAG = "MediaDataFilter"
 private const val DEBUG = true
 
 /**
+ * Maximum age of a media control to re-activate on smartspace signal. If there is no media control
+ * available within this time window, smartspace recommendations will be shown instead.
+ */
+private val SMARTSPACE_MAX_AGE = SystemProperties
+        .getLong("debug.sysui.smartspace_max_age", TimeUnit.HOURS.toMillis(3))
+
+/**
  * Filters data updates from [MediaDataCombineLatest] based on the current user ID, and handles user
- * switches (removing entries for the previous user, adding back entries for the current user)
+ * switches (removing entries for the previous user, adding back entries for the current user). Also
+ * filters out smartspace updates in favor of local recent media, when avaialble.
  *
  * This is added at the end of the pipeline since we may still need to handle callbacks from
  * background users (e.g. timeouts).
@@ -52,6 +63,7 @@
     // The filtered userEntries, which will be a subset of all userEntries in MediaDataManager
     private val userEntries: LinkedHashMap<String, MediaData> = LinkedHashMap()
     private var hasSmartspace: Boolean = false
+    private var reactivatedKey: String? = null
 
     init {
         userTracker = object : CurrentUserTracker(broadcastDispatcher) {
@@ -86,6 +98,36 @@
 
     override fun onSmartspaceMediaDataLoaded(key: String, data: SmartspaceTarget) {
         hasSmartspace = true
+
+        // Before forwarding the smartspace target, first check if we have recently inactive media
+        val now = System.currentTimeMillis()
+        val sorted = userEntries.toSortedMap(compareBy {
+            userEntries.get(it)?.lastActive ?: -1
+        })
+        if (sorted.size > 0) {
+            val lastActiveKey = sorted.lastKey() // most recently active
+            val timeSinceActive = sorted.get(lastActiveKey)?.let {
+                now - it.lastActive
+            } ?: Long.MAX_VALUE
+            if (timeSinceActive < SMARTSPACE_MAX_AGE) {
+                // Notify listeners to consider this media active
+                Log.d(TAG, "reactivating $lastActiveKey instead of smartspace")
+                reactivatedKey = lastActiveKey
+                val mediaData = sorted.get(lastActiveKey)!!.copy(active = true)
+                listeners.forEach {
+                    it.onMediaDataLoaded(lastActiveKey, lastActiveKey, mediaData)
+                }
+                return
+            }
+        }
+
+        // If no recent media, continue with smartspace update
+        if (isMediaRecommendationEmpty(data)) {
+            Log.d(TAG, "Empty media recommendations. Skip showing the card")
+            return
+        }
+
+        // Proceed only if the Smartspace recommendation is not empty.
         listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data) }
     }
 
@@ -101,6 +143,21 @@
 
     override fun onSmartspaceMediaDataRemoved(key: String) {
         hasSmartspace = false
+
+        // First check if we had reactivated media instead of forwarding smartspace
+        reactivatedKey?.let {
+            val lastActiveKey = it
+            reactivatedKey = null
+            Log.d(TAG, "expiring reactivated key $lastActiveKey")
+            // Notify listeners to update with actual active value
+            userEntries.get(lastActiveKey)?.let { mediaData ->
+                listeners.forEach {
+                    it.onMediaDataLoaded(lastActiveKey, lastActiveKey, mediaData)
+                }
+            }
+            return
+        }
+
         listeners.forEach { it.onSmartspaceMediaDataRemoved(key) }
     }
 
@@ -137,10 +194,11 @@
         if (DEBUG) Log.d(TAG, "Media carousel swiped away")
         val mediaKeys = userEntries.keys.toSet()
         mediaKeys.forEach {
-            mediaDataManager.setTimedOut(it, timedOut = true)
+            // Force updates to listeners, needed for re-activated card
+            mediaDataManager.setTimedOut(it, timedOut = true, forceUpdate = true)
         }
         if (hasSmartspace) {
-            mediaDataManager.dismissSmartspaceRecommendation()
+            mediaDataManager.dismissSmartspaceRecommendation(0L /* delay */)
         }
     }
 
@@ -163,4 +221,10 @@
      * Remove a listener that was registered with addListener
      */
     fun removeListener(listener: MediaDataManager.Listener) = _listeners.remove(listener)
+
+    /** Check if the Smartspace sends an empty update. */
+    private fun isMediaRecommendationEmpty(data: SmartspaceTarget): Boolean {
+        val mediaRecommendationList: List<SmartspaceAction> = data.getIconGrid()
+        return mediaRecommendationList == null || mediaRecommendationList.isEmpty()
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
index 574ce0d..138c422 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
@@ -115,12 +115,15 @@
         // UI surface label for subscribing Smartspace updates.
         @JvmField
         val SMARTSPACE_UI_SURFACE_LABEL = "media_data_manager"
+
+        // Maximum number of actions allowed in compact view
+        @JvmField
+        val MAX_COMPACT_ACTIONS = 3
     }
 
     private val themeText = com.android.settingslib.Utils.getColorAttr(context,
             com.android.internal.R.attr.textColorPrimary).defaultColor
-    private val bgColor = com.android.settingslib.Utils.getColorAttr(context,
-            com.android.internal.R.attr.colorBackground).defaultColor
+    private val bgColor = context.getColor(android.R.color.system_accent2_50)
 
     // Internal listeners are part of the internal pipeline. External listeners (those registered
     // with [MediaDeviceManager.addListener]) receive events after they have propagated through
@@ -227,7 +230,7 @@
         smartspaceSession = smartspaceManager.createSmartspaceSession(
             SmartspaceConfig.Builder(context, SMARTSPACE_UI_SURFACE_LABEL).build())
         smartspaceSession?.let {
-            it.registerSmartspaceUpdates(
+            it.addOnTargetsAvailableListener(
                 // Use a new thread listening to Smartspace updates instead of using the existing
                 // backgroundExecutor. SmartspaceSession has scheduled routine updates which can be
                 // unpredictable on test simulators, using the backgroundExecutor makes it's hard to
@@ -235,7 +238,7 @@
                 // Switch to use backgroundExecutor when SmartspaceSession has a good way to be
                 // mocked.
                 Executors.newCachedThreadPool(),
-                SmartspaceSession.Callback { targets ->
+                SmartspaceSession.OnTargetsAvailableListener { targets ->
                     smartspaceMediaDataProvider.onTargetsAvailable(targets)
                 })
         }
@@ -394,9 +397,9 @@
      * This will make the player not active anymore, hiding it from QQS and Keyguard.
      * @see MediaData.active
      */
-    internal fun setTimedOut(token: String, timedOut: Boolean) {
+    internal fun setTimedOut(token: String, timedOut: Boolean, forceUpdate: Boolean = false) {
         mediaEntries[token]?.let {
-            if (it.active == !timedOut) {
+            if (it.active == !timedOut && !forceUpdate) {
                 return
             }
             it.active = !timedOut
@@ -429,12 +432,13 @@
      * This will make the recommendation view to not be shown anymore during this headphone
      * connection session.
      */
-    fun dismissSmartspaceRecommendation() {
+    fun dismissSmartspaceRecommendation(delay: Long) {
         Log.d(TAG, "Dismissing Smartspace media target")
         // Do not set smartspaceMediaTarget to null. So the instance is preserved during the entire
         // headphone connection, and will ONLY be set to null when headphones are disconnected.
         smartspaceMediaTarget?.let {
-            notifySmartspaceMediaDataRemoved(it.smartspaceTargetId)
+            foregroundExecutor.executeDelayed(
+                { notifySmartspaceMediaDataRemoved(it.smartspaceTargetId) }, delay)
         }
     }
 
@@ -470,12 +474,13 @@
         }
 
         val mediaAction = getResumeMediaAction(resumeAction)
+        val lastActive = System.currentTimeMillis()
         foregroundExecutor.execute {
             onMediaDataLoaded(packageName, null, MediaData(userId, true, bgColor, appName,
                     null, desc.subtitle, desc.title, artworkIcon, listOf(mediaAction), listOf(0),
                     packageName, token, appIntent, device = null, active = false,
                     resumeAction = resumeAction, resumption = true, notificationKey = packageName,
-                    hasCheckedForResume = true))
+                    hasCheckedForResume = true, lastActive = lastActive))
         }
     }
 
@@ -547,8 +552,12 @@
         // Control buttons
         val actionIcons: MutableList<MediaAction> = ArrayList()
         val actions = notif.actions
-        val actionsToShowCollapsed = notif.extras.getIntArray(
+        var actionsToShowCollapsed = notif.extras.getIntArray(
                 Notification.EXTRA_COMPACT_ACTIONS)?.toMutableList() ?: mutableListOf<Int>()
+        if (actionsToShowCollapsed.size > MAX_COMPACT_ACTIONS) {
+            Log.e(TAG, "Too many compact actions for $key, limiting to first $MAX_COMPACT_ACTIONS")
+            actionsToShowCollapsed = actionsToShowCollapsed.subList(0, MAX_COMPACT_ACTIONS)
+        }
         // TODO: b/153736623 look into creating actions when this isn't a media style notification
 
         if (actions != null) {
@@ -586,9 +595,9 @@
         }
 
         val isLocalSession = mediaController.playbackInfo?.playbackType ==
-            MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL ?: true
+            MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL
         val isPlaying = mediaController.playbackState?.let { isPlayingState(it.state) } ?: null
-
+        val lastActive = System.currentTimeMillis()
         foregroundExecutor.execute {
             val resumeAction: Runnable? = mediaEntries[key]?.resumeAction
             val hasCheckedForResume = mediaEntries[key]?.hasCheckedForResume == true
@@ -598,7 +607,8 @@
                     actionsToShowCollapsed, sbn.packageName, token, notif.contentIntent, null,
                     active, resumeAction = resumeAction, isLocalSession = isLocalSession,
                     notificationKey = key, hasCheckedForResume = hasCheckedForResume,
-                    isPlaying = isPlaying, isClearable = sbn.isClearable()))
+                    isPlaying = isPlaying, isClearable = sbn.isClearable(),
+                    lastActive = lastActive))
         }
     }
 
@@ -724,7 +734,7 @@
         Assert.isMainThread()
         val removed = mediaEntries.remove(key)
         if (useMediaResumption && removed?.resumeAction != null &&
-                !isBlockedFromResume(removed.packageName)) {
+                !isBlockedFromResume(removed.packageName) && removed?.isLocalSession == true) {
             Log.d(TAG, "Not removing $key because resumable")
             // Move to resume key (aka package name) if that key doesn't already exist.
             val resumeAction = getResumeMediaAction(removed.resumeAction!!)
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt
index 8c12a30..28e4640 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt
@@ -25,6 +25,8 @@
 
     private val tmpLocationOnScreen: IntArray = intArrayOf(0, 0)
 
+    private var inited: Boolean = false
+
     /**
      * Get the current bounds on the screen. This makes sure the state is fresh and up to date
      */
@@ -84,6 +86,11 @@
      *                 transitions.
      */
     fun init(@MediaLocation location: Int) {
+        if (inited) {
+            return
+        }
+        inited = true
+
         this.location = location
         hostView = mediaHierarchyManager.register(this)
         hostView.addOnAttachStateChangeListener(object : OnAttachStateChangeListener {
@@ -264,15 +271,20 @@
  */
 interface MediaHostState {
 
+    companion object {
+        const val EXPANDED: Float = 1.0f
+        const val COLLAPSED: Float = 0.0f
+    }
+
     /**
-     * The last measurement input that this state was measured with. Infers with and height of
+     * The last measurement input that this state was measured with. Infers width and height of
      * the players.
      */
     var measurementInput: MeasurementInput?
 
     /**
-     * The expansion of the player, 0 for fully collapsed (up to 3 actions), 1 for fully expanded
-     * (up to 5 actions.)
+     * The expansion of the player, [COLLAPSED] for fully collapsed (up to 3 actions),
+     * [EXPANDED] for fully expanded (up to 5 actions).
      */
     var expansion: Float
 
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt
index 80d1371..b0be576 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt
@@ -173,7 +173,7 @@
             mediaBrowser?.disconnect()
             // If we don't have a resume action, check if we haven't already
             if (data.resumeAction == null && !data.hasCheckedForResume &&
-                    !blockedApps.contains(data.packageName)) {
+                    !blockedApps.contains(data.packageName) && data.isLocalSession) {
                 // TODO also check for a media button receiver intended for restarting (b/154127084)
                 Log.d(TAG, "Checking for service component for " + data.packageName)
                 val pm = context.packageManager
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt
index ce72991..8bfe94b 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt
@@ -51,36 +51,53 @@
     lateinit var timeoutCallback: (String, Boolean) -> Unit
 
     override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) {
-        if (mediaListeners.containsKey(key)) {
-            return
+        var reusedListener: PlaybackStateListener? = null
+
+        // First check if we already have a listener
+        mediaListeners.get(key)?.let {
+            if (!it.destroyed) {
+                return
+            }
+
+            // If listener was destroyed previously, we'll need to re-register it
+            if (DEBUG) {
+                Log.d(TAG, "Reusing destroyed listener $key")
+            }
+            reusedListener = it
         }
+
         // Having an old key means that we're migrating from/to resumption. We should update
         // the old listener to make sure that events will be dispatched to the new location.
         val migrating = oldKey != null && key != oldKey
         if (migrating) {
-            val reusedListener = mediaListeners.remove(oldKey)
+            reusedListener = mediaListeners.remove(oldKey)
             if (reusedListener != null) {
-                val wasPlaying = reusedListener.playing ?: false
                 if (DEBUG) Log.d(TAG, "migrating key $oldKey to $key, for resumption")
-                reusedListener.mediaData = data
-                reusedListener.key = key
-                mediaListeners[key] = reusedListener
-                if (wasPlaying != reusedListener.playing) {
-                    // If a player becomes active because of a migration, we'll need to broadcast
-                    // its state. Doing it now would lead to reentrant callbacks, so let's wait
-                    // until we're done.
-                    mainExecutor.execute {
-                        if (mediaListeners[key]?.playing == true) {
-                            if (DEBUG) Log.d(TAG, "deliver delayed playback state for $key")
-                            timeoutCallback.invoke(key, false /* timedOut */)
-                        }
-                    }
-                }
-                return
             } else {
                 Log.w(TAG, "Old key $oldKey for player $key doesn't exist. Continuing...")
             }
         }
+
+        reusedListener?.let {
+            val wasPlaying = it.playing ?: false
+            if (DEBUG) Log.d(TAG, "updating listener for $key, was playing? $wasPlaying")
+            it.mediaData = data
+            it.key = key
+            mediaListeners[key] = it
+            if (wasPlaying != it.playing) {
+                // If a player becomes active because of a migration, we'll need to broadcast
+                // its state. Doing it now would lead to reentrant callbacks, so let's wait
+                // until we're done.
+                mainExecutor.execute {
+                    if (mediaListeners[key]?.playing == true) {
+                        if (DEBUG) Log.d(TAG, "deliver delayed playback state for $key")
+                        timeoutCallback.invoke(key, false /* timedOut */)
+                    }
+                }
+            }
+            return
+        }
+
         mediaListeners[key] = PlaybackStateListener(key, data)
     }
 
@@ -99,9 +116,11 @@
 
         var timedOut = false
         var playing: Boolean? = null
+        var destroyed = false
 
         var mediaData: MediaData = data
             set(value) {
+                destroyed = false
                 mediaController?.unregisterCallback(this)
                 field = value
                 mediaController = if (field.token != null) {
@@ -126,15 +145,25 @@
         fun destroy() {
             mediaController?.unregisterCallback(this)
             cancellation?.run()
+            destroyed = true
         }
 
         override fun onPlaybackStateChanged(state: PlaybackState?) {
             processState(state, dispatchEvents = true)
         }
 
+        override fun onSessionDestroyed() {
+            // If the session is destroyed, the controller is no longer valid, and we will need to
+            // recreate it if this key is updated later
+            if (DEBUG) {
+                Log.d(TAG, "Session destroyed for $key")
+            }
+            destroy()
+        }
+
         private fun processState(state: PlaybackState?, dispatchEvents: Boolean) {
             if (DEBUG) {
-                Log.v(TAG, "processState: $state")
+                Log.v(TAG, "processState $key: $state")
             }
 
             val isPlaying = state != null && isPlayingState(state.state)
@@ -173,8 +202,7 @@
         private fun expireMediaTimeout(mediaKey: String, reason: String) {
             cancellation?.apply {
                 if (DEBUG) {
-                    Log.v(TAG,
-                            "media timeout cancelled for  $mediaKey, reason: $reason")
+                    Log.v(TAG, "media timeout cancelled for  $mediaKey, reason: $reason")
                 }
                 run()
             }
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
index 7cfe4c4..f78556f 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt
@@ -70,11 +70,10 @@
      * finished
      */
     @MediaLocation
-    private var currentEndLocation: Int = -1
+    var currentEndLocation: Int = -1
 
     /**
-     * The ending location of the view where it ends when all animations and transitions have
-     * finished
+     * The starting location of the view where it starts for all animations and transitions
      */
     @MediaLocation
     private var currentStartLocation: Int = -1
@@ -253,16 +252,30 @@
      * [TransitionViewState].
      */
     private fun setGutsViewState(viewState: TransitionViewState) {
-        PlayerViewHolder.controlsIds.forEach { id ->
-            viewState.widgetStates.get(id)?.let { state ->
-                // Make sure to use the unmodified state if guts are not visible
-                state.alpha = if (isGutsVisible) 0f else state.alpha
-                state.gone = if (isGutsVisible) true else state.gone
+        if (type == TYPE.PLAYER) {
+            PlayerViewHolder.controlsIds.forEach { id ->
+                viewState.widgetStates.get(id)?.let { state ->
+                    // Make sure to use the unmodified state if guts are not visible.
+                    state.alpha = if (isGutsVisible) 0f else state.alpha
+                    state.gone = if (isGutsVisible) true else state.gone
+                }
             }
-        }
-        PlayerViewHolder.gutsIds.forEach { id ->
-            viewState.widgetStates.get(id)?.alpha = if (isGutsVisible) 1f else 0f
-            viewState.widgetStates.get(id)?.gone = !isGutsVisible
+            PlayerViewHolder.gutsIds.forEach { id ->
+                viewState.widgetStates.get(id)?.alpha = if (isGutsVisible) 1f else 0f
+                viewState.widgetStates.get(id)?.gone = !isGutsVisible
+            }
+        } else {
+            RecommendationViewHolder.controlsIds.forEach { id ->
+                viewState.widgetStates.get(id)?.let { state ->
+                    // Make sure to use the unmodified state if guts are not visible.
+                    state.alpha = if (isGutsVisible) 0f else state.alpha
+                    state.gone = if (isGutsVisible) true else state.gone
+                }
+            }
+            RecommendationViewHolder.gutsIds.forEach { id ->
+                viewState.widgetStates.get(id)?.alpha = if (isGutsVisible) 1f else 0f
+                viewState.widgetStates.get(id)?.gone = !isGutsVisible
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt
index 16327bd..08d8726 100644
--- a/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt
@@ -35,7 +35,6 @@
 
     // Player information
     val appIcon = itemView.requireViewById<ImageView>(R.id.icon)
-    val appName = itemView.requireViewById<TextView>(R.id.app_name)
     val albumView = itemView.requireViewById<ImageView>(R.id.album_art)
     val titleText = itemView.requireViewById<TextView>(R.id.header_title)
     val artistText = itemView.requireViewById<TextView>(R.id.header_artist)
@@ -120,6 +119,7 @@
                 R.id.header_title,
                 R.id.header_artist,
                 R.id.media_seamless,
+                R.id.media_seamless_fallback,
                 R.id.notification_media_progress_time,
                 R.id.media_progress_bar,
                 R.id.action0,
@@ -130,7 +130,6 @@
                 R.id.icon
         )
         val gutsIds = setOf(
-                R.id.media_text,
                 R.id.remove_text,
                 R.id.cancel,
                 R.id.dismiss,
diff --git a/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt
index ac201a8..02150c4 100644
--- a/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/RecommendationViewHolder.kt
@@ -28,6 +28,8 @@
 class RecommendationViewHolder private constructor(itemView: View) {
 
     val recommendations = itemView as TransitionLayout
+
+    // Recommendation screen
     val mediaCoverItems = listOf<ImageView>(
         itemView.requireViewById(R.id.media_cover1),
         itemView.requireViewById(R.id.media_cover2),
@@ -49,16 +51,26 @@
         R.id.media_logo3,
         R.id.media_logo4)
 
+    // Settings/Guts screen
+    val cancel = itemView.requireViewById<View>(R.id.cancel)
+    val dismiss = itemView.requireViewById<ViewGroup>(R.id.dismiss)
+    val dismissLabel = dismiss.getChildAt(0)
+    val settings = itemView.requireViewById<View>(R.id.settings)
+
     init {
         (recommendations.background as IlluminationDrawable).let { background ->
             mediaCoverItems.forEach { background.registerLightSource(it) }
             mediaLogoItems.forEach { background.registerLightSource(it) }
+            background.registerLightSource(cancel)
+            background.registerLightSource(dismiss)
+            background.registerLightSource(dismissLabel)
+            background.registerLightSource(settings)
         }
     }
 
     companion object {
         /**
-         * Creates a PlayerViewHolder.
+         * Creates a RecommendationViewHolder.
          *
          * @param inflater LayoutInflater to use to inflate the layout.
          * @param parent Parent of inflated view.
@@ -76,5 +88,25 @@
             itemView.layoutDirection = View.LAYOUT_DIRECTION_LOCALE
             return RecommendationViewHolder(itemView)
         }
+
+        // Res Ids for the control components on the recommendation view.
+        val controlsIds = setOf(
+            R.id.media_cover1,
+            R.id.media_cover2,
+            R.id.media_cover3,
+            R.id.media_cover4,
+            R.id.media_logo1,
+            R.id.media_logo2,
+            R.id.media_logo3,
+            R.id.media_logo4
+        )
+
+        // Res Ids for the components on the guts panel.
+        val gutsIds = setOf(
+            R.id.remove_text,
+            R.id.cancel,
+            R.id.dismiss,
+            R.id.settings
+        )
     }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt
index d789501..f17ad6f 100644
--- a/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarObserver.kt
@@ -78,6 +78,7 @@
     fun setVerticalPadding(padding: Int) {
         val leftPadding = holder.seekBar.paddingLeft
         val rightPadding = holder.seekBar.paddingRight
-        holder.seekBar.setPadding(leftPadding, padding, rightPadding, padding)
+        val bottomPadding = holder.seekBar.paddingBottom
+        holder.seekBar.setPadding(leftPadding, padding, rightPadding, bottomPadding)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 01c80f6..0ed4d86 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -83,7 +83,6 @@
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.recents.Recents;
 import com.android.systemui.recents.RecentsOnboarding;
-import com.android.systemui.shared.plugins.PluginManager;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.shared.system.SysUiStatsLog;
@@ -113,7 +112,6 @@
     private final RegionSamplingHelper mRegionSamplingHelper;
     private final int mNavColorSampleMargin;
     private final SysUiState mSysUiFlagContainer;
-    private final PluginManager mPluginManager;
 
     View mCurrentView = null;
     private View mVertical;
@@ -316,7 +314,6 @@
         boolean isGesturalMode = isGesturalMode(mNavBarMode);
 
         mSysUiFlagContainer = Dependency.get(SysUiState.class);
-        mPluginManager = Dependency.get(PluginManager.class);
         // Set up the context group of buttons
         mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
         final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher,
@@ -366,8 +363,8 @@
 
         mNavColorSampleMargin = getResources()
                         .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
-        mEdgeBackGestureHandler = new EdgeBackGestureHandler(context, mOverviewProxyService,
-                mSysUiFlagContainer, mPluginManager, this::updateStates);
+        mEdgeBackGestureHandler = Dependency.get(EdgeBackGestureHandler.class);
+        mEdgeBackGestureHandler.setStateChangeCallback(this::updateStates);
         mRegionSamplingHelper = new RegionSamplingHelper(this,
                 new RegionSamplingHelper.SamplingCallback() {
                     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index 806ea4f..fc615de 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -15,6 +15,8 @@
  */
 package com.android.systemui.navigationbar.gestural;
 
+import static com.android.systemui.classifier.Classifier.BACK_GESTURE;
+
 import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -27,8 +29,6 @@
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.Region;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
 import android.hardware.input.InputManager;
 import android.os.Looper;
 import android.os.RemoteException;
@@ -41,6 +41,7 @@
 import android.view.Choreographer;
 import android.view.Display;
 import android.view.ISystemGestureExclusionListener;
+import android.view.IWindowManager;
 import android.view.InputDevice;
 import android.view.InputEvent;
 import android.view.InputMonitor;
@@ -50,18 +51,19 @@
 import android.view.Surface;
 import android.view.ViewConfiguration;
 import android.view.WindowManager;
-import android.view.WindowManagerGlobal;
 import android.view.WindowMetrics;
 
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.internal.policy.GestureNavigationSettingsObserver;
-import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.SystemUIFactory;
 import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.navigationbar.NavigationBarView;
 import com.android.systemui.navigationbar.NavigationModeController;
+import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.NavigationEdgeBackPlugin;
 import com.android.systemui.plugins.PluginListener;
 import com.android.systemui.recents.OverviewProxyService;
@@ -85,9 +87,12 @@
 import java.util.Map;
 import java.util.concurrent.Executor;
 
+import javax.inject.Inject;
+
 /**
  * Utility class to handle edge swipes for back gesture
  */
+@SysUISingleton
 public class EdgeBackGestureHandler extends CurrentUserTracker
         implements PluginListener<NavigationEdgeBackPlugin>, ProtoTraceable<SystemUiTraceProto> {
 
@@ -164,9 +169,15 @@
     private final Context mContext;
     private final OverviewProxyService mOverviewProxyService;
     private final SysUiState mSysUiState;
-    private final Runnable mStateChangeCallback;
+    private Runnable mStateChangeCallback;
 
     private final PluginManager mPluginManager;
+    private final ProtoTracer mProtoTracer;
+    private final NavigationModeController mNavigationModeController;
+    private final ViewConfiguration mViewConfiguration;
+    private final WindowManager mWindowManager;
+    private final IWindowManager mWindowManagerService;
+    private final FalsingManager mFalsingManager;
     // Activities which should not trigger Back gesture.
     private final List<ComponentName> mGestureBlockingActivities = new ArrayList<>();
 
@@ -237,6 +248,9 @@
             new NavigationEdgeBackPlugin.BackCallback() {
                 @Override
                 public void triggerBack() {
+                    // Notify FalsingManager that an intentional gesture has occurred.
+                    // TODO(b/186519446): use a different method than isFalseTouch
+                    mFalsingManager.isFalseTouch(BACK_GESTURE);
                     boolean sendDown = sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
                     boolean sendUp = sendEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
                     if (DEBUG_MISSING_GESTURE) {
@@ -267,16 +281,26 @@
         }
     };
 
+    @Inject
     public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService,
-            SysUiState sysUiState, PluginManager pluginManager, Runnable stateChangeCallback) {
-        super(Dependency.get(BroadcastDispatcher.class));
+            SysUiState sysUiState, PluginManager pluginManager, @Main Executor executor,
+            BroadcastDispatcher broadcastDispatcher, ProtoTracer protoTracer,
+            NavigationModeController navigationModeController, ViewConfiguration viewConfiguration,
+            WindowManager windowManager, IWindowManager windowManagerService,
+            FalsingManager falsingManager) {
+        super(broadcastDispatcher);
         mContext = context;
         mDisplayId = context.getDisplayId();
-        mMainExecutor = context.getMainExecutor();
+        mMainExecutor = executor;
         mOverviewProxyService = overviewProxyService;
         mSysUiState = sysUiState;
         mPluginManager = pluginManager;
-        mStateChangeCallback = stateChangeCallback;
+        mProtoTracer = protoTracer;
+        mNavigationModeController = navigationModeController;
+        mViewConfiguration = viewConfiguration;
+        mWindowManager = windowManager;
+        mWindowManagerService = windowManagerService;
+        mFalsingManager = falsingManager;
         ComponentName recentsComponentName = ComponentName.unflattenFromString(
                 context.getString(com.android.internal.R.string.config_recentsComponentName));
         if (recentsComponentName != null) {
@@ -309,9 +333,12 @@
         updateCurrentUserResources();
     }
 
+    public void setStateChangeCallback(Runnable callback) {
+        mStateChangeCallback = callback;
+    }
+
     public void updateCurrentUserResources() {
-        Resources res = Dependency.get(NavigationModeController.class).getCurrentUserContext()
-                .getResources();
+        Resources res = mNavigationModeController.getCurrentUserContext().getResources();
         mEdgeWidthLeft = mGestureNavigationSettingsObserver.getLeftSensitivity(res);
         mEdgeWidthRight = mGestureNavigationSettingsObserver.getRightSensitivity(res);
         mIsBackGestureAllowed =
@@ -336,7 +363,7 @@
         // TODO(b/130352502) Tune this value and extract into a constant
         final float backGestureSlop = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_SYSTEMUI,
                         SystemUiDeviceConfigFlags.BACK_GESTURE_SLOP_MULTIPLIER, 0.75f);
-        mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop() * backGestureSlop;
+        mTouchSlop = mViewConfiguration.getScaledTouchSlop() * backGestureSlop;
     }
 
     private void onNavigationSettingsChanged() {
@@ -358,7 +385,7 @@
      */
     public void onNavBarAttached() {
         mIsAttached = true;
-        Dependency.get(ProtoTracer.class).add(this);
+        mProtoTracer.add(this);
         mOverviewProxyService.addCallback(mQuickSwitchListener);
         mSysUiState.addCallback(mSysUiStateCallback);
         updateIsEnabled();
@@ -370,7 +397,7 @@
      */
     public void onNavBarDetached() {
         mIsAttached = false;
-        Dependency.get(ProtoTracer.class).remove(this);
+        mProtoTracer.remove(this);
         mOverviewProxyService.removeCallback(mQuickSwitchListener);
         mSysUiState.removeCallback(mSysUiStateCallback);
         updateIsEnabled();
@@ -424,9 +451,8 @@
             DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
 
             try {
-                WindowManagerGlobal.getWindowManagerService()
-                        .unregisterSystemGestureExclusionListener(
-                                mGestureExclusionListener, mDisplayId);
+                mWindowManagerService.unregisterSystemGestureExclusionListener(
+                        mGestureExclusionListener, mDisplayId);
             } catch (RemoteException | IllegalArgumentException e) {
                 Log.e(TAG, "Failed to unregister window manager callbacks", e);
             }
@@ -439,13 +465,11 @@
             }
             TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener);
             DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
-                    runnable -> (mContext.getMainThreadHandler()).post(runnable),
-                    mOnPropertiesChangedListener);
+                    mMainExecutor::execute, mOnPropertiesChangedListener);
 
             try {
-                WindowManagerGlobal.getWindowManagerService()
-                        .registerSystemGestureExclusionListener(
-                                mGestureExclusionListener, mDisplayId);
+                mWindowManagerService.registerSystemGestureExclusionListener(
+                        mGestureExclusionListener, mDisplayId);
             } catch (RemoteException | IllegalArgumentException e) {
                 Log.e(TAG, "Failed to register window manager callbacks", e);
             }
@@ -801,7 +825,7 @@
             }
         }
 
-        Dependency.get(ProtoTracer.class).scheduleFrameUpdate();
+        mProtoTracer.scheduleFrameUpdate();
     }
 
     private void updateDisabledForQuickstep(Configuration newConfig) {
@@ -822,8 +846,7 @@
     }
 
     private void updateDisplaySize() {
-        WindowMetrics metrics = mContext.getSystemService(WindowManager.class)
-                .getMaximumWindowMetrics();
+        WindowMetrics metrics = mWindowManager.getMaximumWindowMetrics();
         Rect bounds = metrics.getBounds();
         mDisplaySize.set(bounds.width(), bounds.height());
         if (DEBUG_MISSING_GESTURE) {
diff --git a/packages/SystemUI/src/com/android/systemui/people/NotificationHelper.java b/packages/SystemUI/src/com/android/systemui/people/NotificationHelper.java
new file mode 100644
index 0000000..0efef02
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/people/NotificationHelper.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.people;
+
+import static android.Manifest.permission.READ_CONTACTS;
+import static android.app.Notification.CATEGORY_MISSED_CALL;
+import static android.app.Notification.EXTRA_MESSAGES;
+import static android.app.Notification.EXTRA_PEOPLE_LIST;
+
+import android.annotation.Nullable;
+import android.app.Notification;
+import android.app.Person;
+import android.content.pm.PackageManager;
+import android.os.Parcelable;
+import android.service.notification.StatusBarNotification;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/** Helper functions to handle notifications in People Tiles. */
+public class NotificationHelper {
+    private static final boolean DEBUG = PeopleSpaceUtils.DEBUG;
+    private static final String TAG = "PeopleNotifHelper";
+
+    /** Returns the notification with highest priority to be shown in People Tiles. */
+    public static NotificationEntry getHighestPriorityNotification(
+            Set<NotificationEntry> notificationEntries) {
+        if (notificationEntries == null || notificationEntries.isEmpty()) {
+            return null;
+        }
+
+        return notificationEntries
+                .stream()
+                .filter(NotificationHelper::isMissedCallOrHasContent)
+                .sorted(notificationEntryComparator)
+                .findFirst().orElse(null);
+    }
+
+
+    /** Notification comparator, checking category and timestamps, in reverse order of priority. */
+    public static Comparator<NotificationEntry> notificationEntryComparator =
+            new Comparator<NotificationEntry>() {
+                @Override
+                public int compare(NotificationEntry e1, NotificationEntry e2) {
+                    Notification n1 = e1.getSbn().getNotification();
+                    Notification n2 = e2.getSbn().getNotification();
+
+                    boolean missedCall1 = isMissedCall(n1);
+                    boolean missedCall2 = isMissedCall(n2);
+                    if (missedCall1 && !missedCall2) {
+                        return -1;
+                    }
+                    if (!missedCall1 && missedCall2) {
+                        return 1;
+                    }
+
+                    // Get messages in reverse chronological order.
+                    List<Notification.MessagingStyle.Message> messages1 =
+                            getMessagingStyleMessages(n1);
+                    List<Notification.MessagingStyle.Message> messages2 =
+                            getMessagingStyleMessages(n2);
+
+                    if (messages1 != null && messages2 != null) {
+                        Notification.MessagingStyle.Message message1 = messages1.get(0);
+                        Notification.MessagingStyle.Message message2 = messages2.get(0);
+                        return (int) (message2.getTimestamp() - message1.getTimestamp());
+                    }
+
+                    if (messages1 == null) {
+                        return 1;
+                    }
+                    if (messages2 == null) {
+                        return -1;
+                    }
+                    return (int) (n2.when - n1.when);
+                }
+            };
+
+    /** Returns whether {@code e} is a missed call notification. */
+    public static boolean isMissedCall(NotificationEntry e) {
+        return e != null && e.getSbn().getNotification() != null
+                && isMissedCall(e.getSbn().getNotification());
+    }
+
+    /** Returns whether {@code notification} is a missed call notification. */
+    public static boolean isMissedCall(Notification notification) {
+        return notification != null && Objects.equals(notification.category, CATEGORY_MISSED_CALL);
+    }
+
+    private static boolean hasContent(NotificationEntry e) {
+        if (e == null) {
+            return false;
+        }
+        List<Notification.MessagingStyle.Message> messages =
+                getMessagingStyleMessages(e.getSbn().getNotification());
+        return messages != null && !messages.isEmpty();
+    }
+
+    /** Returns whether {@code e} is a valid conversation notification. */
+    public static boolean isValid(NotificationEntry e) {
+        return e != null && e.getRanking() != null
+                && e.getRanking().getConversationShortcutInfo() != null
+                && e.getSbn().getNotification() != null;
+    }
+
+    /** Returns whether conversation notification should be shown in People Tile. */
+    public static boolean isMissedCallOrHasContent(NotificationEntry e) {
+        return isMissedCall(e) || hasContent(e);
+    }
+
+    /** Returns whether {@code sbn}'s package has permission to read contacts. */
+    public static boolean hasReadContactsPermission(
+            PackageManager packageManager, StatusBarNotification sbn) {
+        return packageManager.checkPermission(READ_CONTACTS,
+                sbn.getPackageName()) == PackageManager.PERMISSION_GRANTED;
+    }
+
+    /**
+     * Returns whether a notification should be matched to other Tiles by Uri.
+     *
+     * <p>Currently only matches missed calls.
+     */
+    public static boolean shouldMatchNotificationByUri(StatusBarNotification sbn) {
+        Notification notification = sbn.getNotification();
+        if (notification == null) {
+            if (DEBUG) Log.d(TAG, "Notification is null");
+            return false;
+        }
+        boolean isMissedCall = isMissedCall(notification);
+        if (!isMissedCall) {
+            if (DEBUG) Log.d(TAG, "Not missed call");
+        }
+        return isMissedCall;
+    }
+
+    /**
+     * Try to retrieve a valid Uri via {@code sbn}, falling back to the {@code
+     * contactUriFromShortcut} if valid.
+     */
+    @Nullable
+    public static String getContactUri(StatusBarNotification sbn) {
+        // First, try to get a Uri from the Person directly set on the Notification.
+        ArrayList<Person> people = sbn.getNotification().extras.getParcelableArrayList(
+                EXTRA_PEOPLE_LIST);
+        if (people != null && people.get(0) != null) {
+            String contactUri = people.get(0).getUri();
+            if (contactUri != null && !contactUri.isEmpty()) {
+                return contactUri;
+            }
+        }
+
+        // Then, try to get a Uri from the Person set on the Notification message.
+        List<Notification.MessagingStyle.Message> messages =
+                getMessagingStyleMessages(sbn.getNotification());
+        if (messages != null && !messages.isEmpty()) {
+            Notification.MessagingStyle.Message message = messages.get(0);
+            Person sender = message.getSenderPerson();
+            if (sender != null && sender.getUri() != null && !sender.getUri().isEmpty()) {
+                return sender.getUri();
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Returns {@link Notification.MessagingStyle.Message}s from the Notification in chronological
+     * order from most recent to least.
+     */
+    @VisibleForTesting
+    @Nullable
+    public static List<Notification.MessagingStyle.Message> getMessagingStyleMessages(
+            Notification notification) {
+        if (notification == null) {
+            return null;
+        }
+        if (Notification.MessagingStyle.class.equals(notification.getNotificationStyle())
+                && notification.extras != null) {
+            final Parcelable[] messages = notification.extras.getParcelableArray(EXTRA_MESSAGES);
+            if (!ArrayUtils.isEmpty(messages)) {
+                List<Notification.MessagingStyle.Message> sortedMessages =
+                        Notification.MessagingStyle.Message.getMessagesFromBundleArray(messages);
+                sortedMessages.sort(Collections.reverseOrder(
+                        Comparator.comparing(Notification.MessagingStyle.Message::getTimestamp)));
+                return sortedMessages;
+            }
+        }
+        return null;
+    }
+
+    /** Returns whether {@code notification} is a group conversation. */
+    private static boolean isGroupConversation(Notification notification) {
+        return notification.extras.getBoolean(Notification.EXTRA_IS_GROUP_CONVERSATION, false);
+    }
+
+    /**
+     * Returns {@code message}'s sender's name if {@code notification} is from a group conversation.
+     */
+    public static CharSequence getSenderIfGroupConversation(Notification notification,
+            Notification.MessagingStyle.Message message) {
+        if (!isGroupConversation(notification)) {
+            if (DEBUG) {
+                Log.d(TAG, "Notification is not from a group conversation, not checking sender.");
+            }
+            return null;
+        }
+        Person person = message.getSenderPerson();
+        if (person == null) {
+            if (DEBUG) Log.d(TAG, "Notification from group conversation doesn't include sender.");
+            return null;
+        }
+        if (DEBUG) Log.d(TAG, "Returning sender from group conversation notification.");
+        return person.getName();
+    }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleProvider.java b/packages/SystemUI/src/com/android/systemui/people/PeopleProvider.java
index 41957bc..a964056 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleProvider.java
@@ -16,36 +16,28 @@
 
 package com.android.systemui.people;
 
-import android.app.people.IPeopleManager;
 import android.content.ContentProvider;
 import android.content.ContentValues;
-import android.content.Context;
-import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
-import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.util.Log;
 import android.widget.RemoteViews;
 
-import com.android.systemui.Dependency;
+import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
 import com.android.systemui.shared.system.PeopleProviderUtils;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
 
 /** API that returns a People Tile preview. */
 public class PeopleProvider extends ContentProvider {
-
-    LauncherApps mLauncherApps;
-    IPeopleManager mPeopleManager;
-    NotificationEntryManager mNotificationEntryManager;
-
     private static final String TAG = "PeopleProvider";
     private static final boolean DEBUG = PeopleSpaceUtils.DEBUG;
     private static final String EMPTY_STRING = "";
 
+    PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
+
     @Override
     public Bundle call(String method, String arg, Bundle extras) {
         if (!doesCallerHavePermission()) {
@@ -83,17 +75,11 @@
             throw new IllegalArgumentException("Null user handle");
         }
 
-        // If services are not set as mocks in tests, fetch them now.
-        mPeopleManager = mPeopleManager != null ? mPeopleManager
-                : IPeopleManager.Stub.asInterface(
-                        ServiceManager.getService(Context.PEOPLE_SERVICE));
-        mLauncherApps = mLauncherApps != null ? mLauncherApps
-                : getContext().getSystemService(LauncherApps.class);
-        mNotificationEntryManager = mNotificationEntryManager != null ? mNotificationEntryManager
-                : Dependency.get(NotificationEntryManager.class);
-
-        RemoteViews view = PeopleSpaceUtils.getPreview(getContext(), mPeopleManager, mLauncherApps,
-                mNotificationEntryManager, shortcutId, userHandle, packageName, extras);
+        if (mPeopleSpaceWidgetManager == null) {
+            mPeopleSpaceWidgetManager = new PeopleSpaceWidgetManager(getContext());
+        }
+        RemoteViews view =
+                mPeopleSpaceWidgetManager.getPreview(shortcutId, userHandle, packageName, extras);
         if (view == null) {
             if (DEBUG) Log.d(TAG, "No preview available for shortcutId: " + shortcutId);
             return null;
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
index 38a6186..98d8866 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
@@ -39,6 +39,7 @@
 
 import com.android.systemui.R;
 import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
+import com.android.systemui.people.widget.PeopleTileKey;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -131,19 +132,22 @@
     /** Sets {@code tileView} with the data in {@code conversation}. */
     private void setTileView(PeopleSpaceTileView tileView, PeopleSpaceTile tile) {
         try {
-            tileView.setName(tile.getUserName().toString());
+            if (tile.getUserName() != null) {
+                tileView.setName(tile.getUserName().toString());
+            }
             tileView.setPersonIcon(getPersonIconBitmap(mContext, tile,
                     getSizeInDp(mContext, R.dimen.avatar_size_for_medium,
                             mContext.getResources().getDisplayMetrics().density)));
 
-            tileView.setOnClickListener(v -> storeWidgetConfiguration(tile));
+            PeopleTileKey key = new PeopleTileKey(tile);
+            tileView.setOnClickListener(v -> storeWidgetConfiguration(tile, key));
         } catch (Exception e) {
             Log.e(TAG, "Couldn't retrieve shortcut information", e);
         }
     }
 
     /** Stores the user selected configuration for {@code mAppWidgetId}. */
-    private void storeWidgetConfiguration(PeopleSpaceTile tile) {
+    private void storeWidgetConfiguration(PeopleSpaceTile tile, PeopleTileKey key) {
         if (PeopleSpaceUtils.DEBUG) {
             if (DEBUG) {
                 Log.d(TAG, "Put " + tile.getUserName() + "'s shortcut ID: "
@@ -151,7 +155,7 @@
                         + mAppWidgetId);
             }
         }
-        mPeopleSpaceWidgetManager.addNewWidget(mAppWidgetId, tile);
+        mPeopleSpaceWidgetManager.addNewWidget(mAppWidgetId, key);
         finishActivity();
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
index c0a16e1..99a17ffb 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
@@ -16,8 +16,12 @@
 
 package com.android.systemui.people;
 
-import static android.app.Notification.CATEGORY_MISSED_CALL;
-import static android.app.Notification.EXTRA_MESSAGES;
+import static com.android.systemui.people.NotificationHelper.getContactUri;
+import static com.android.systemui.people.NotificationHelper.getMessagingStyleMessages;
+import static com.android.systemui.people.NotificationHelper.getSenderIfGroupConversation;
+import static com.android.systemui.people.NotificationHelper.hasReadContactsPermission;
+import static com.android.systemui.people.NotificationHelper.isMissedCall;
+import static com.android.systemui.people.NotificationHelper.shouldMatchNotificationByUri;
 
 import android.app.Notification;
 import android.app.people.ConversationChannel;
@@ -27,6 +31,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.pm.LauncherApps;
+import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
 import android.database.Cursor;
 import android.database.SQLException;
@@ -36,9 +41,6 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.Parcelable;
-import android.os.ServiceManager;
-import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.ContactsContract;
 import android.service.notification.StatusBarNotification;
@@ -56,19 +58,16 @@
 import com.android.systemui.R;
 import com.android.systemui.people.widget.AppWidgetOptionsHelper;
 import com.android.systemui.people.widget.PeopleTileKey;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -185,115 +184,109 @@
         editor.putStringSet(storageKey, storedWidgetIds);
     }
 
-    /** Augments a single {@link PeopleSpaceTile} with notification content, if one is present. */
-    public static PeopleSpaceTile augmentSingleTileFromVisibleNotifications(Context context,
-            PeopleSpaceTile tile, NotificationEntryManager notificationEntryManager) {
-        List<PeopleSpaceTile> augmentedTile = augmentTilesFromVisibleNotifications(
-                context, Arrays.asList(tile), notificationEntryManager);
-        return augmentedTile.get(0);
-    }
-
-    /** Adds to {@code tiles} any visible notifications. */
-    public static List<PeopleSpaceTile> augmentTilesFromVisibleNotifications(Context context,
-            List<PeopleSpaceTile> tiles, NotificationEntryManager notificationEntryManager) {
-        if (notificationEntryManager == null) {
-            Log.w(TAG, "NotificationEntryManager is null");
-            return tiles;
+    /** Returns notifications that match provided {@code contactUri}. */
+    public static List<NotificationEntry> getNotificationsByUri(
+            PackageManager packageManager, String contactUri,
+            Map<PeopleTileKey, Set<NotificationEntry>> notifications) {
+        if (DEBUG) Log.d(TAG, "Getting notifications by contact URI.");
+        if (TextUtils.isEmpty(contactUri)) {
+            return new ArrayList<>();
         }
-        Map<PeopleTileKey, NotificationEntry> visibleNotifications = notificationEntryManager
-                .getVisibleNotifications()
-                .stream()
-                .filter(entry -> entry.getRanking() != null
-                        && entry.getRanking().getConversationShortcutInfo() != null)
-                .collect(Collectors.toMap(PeopleTileKey::new, e -> e,
-                        // Handle duplicate keys to avoid crashes.
-                        (e1, e2) -> e1.getSbn().getNotification().when
-                                > e2.getSbn().getNotification().when ? e1 : e2));
-        if (DEBUG) {
-            Log.d(TAG, "Number of visible notifications:" + visibleNotifications.size());
-        }
-        return tiles
-                .stream()
-                .map(entry -> augmentTileFromVisibleNotifications(
-                        context, entry, visibleNotifications))
+        return notifications.entrySet().stream().flatMap(e -> e.getValue().stream())
+                .filter(e ->
+                        hasReadContactsPermission(packageManager, e.getSbn())
+                                && shouldMatchNotificationByUri(e.getSbn())
+                                && Objects.equals(contactUri, getContactUri(e.getSbn()))
+                )
                 .collect(Collectors.toList());
     }
 
-    static PeopleSpaceTile augmentTileFromVisibleNotifications(Context context,
-            PeopleSpaceTile tile, Map<PeopleTileKey, NotificationEntry> visibleNotifications) {
-        PeopleTileKey key = new PeopleTileKey(
-                tile.getId(), getUserId(tile), tile.getPackageName());
-        // TODO: Match missed calls with matching Uris in addition to keys.
-        if (!visibleNotifications.containsKey(key)) {
-            if (DEBUG) Log.d(TAG, "No existing notifications for key:" + key.toString());
-            return tile;
+    /** Returns the total messages in {@code notificationEntries}.*/
+    public static int getMessagesCount(Set<NotificationEntry> notificationEntries) {
+        if (DEBUG) {
+            Log.d(TAG, "Calculating messages count from " + notificationEntries.size()
+                    + " notifications.");
         }
-        if (DEBUG) Log.d(TAG, "Augmenting tile from visible notifications, key:" + key.toString());
-        return augmentTileFromNotification(context, tile, visibleNotifications.get(key).getSbn());
+        int messagesCount = 0;
+        for (NotificationEntry entry : notificationEntries) {
+            Notification notification = entry.getSbn().getNotification();
+            // Should not count messages from missed call notifications.
+            if (isMissedCall(notification)) {
+                continue;
+            }
+
+            List<Notification.MessagingStyle.Message> messages =
+                    getMessagingStyleMessages(notification);
+            if (messages != null) {
+                messagesCount += messages.size();
+            }
+        }
+        return messagesCount;
     }
 
-    /** Augments {@code tile} with the notification content from {@code sbn}. */
-    public static PeopleSpaceTile augmentTileFromNotification(Context context, PeopleSpaceTile tile,
-            StatusBarNotification sbn) {
-        Notification notification = sbn.getNotification();
-        if (notification == null) {
-            if (DEBUG) Log.d(TAG, "Notification is null");
-            return tile;
+    /** Removes all notification related fields from {@code tile}. */
+    public static PeopleSpaceTile removeNotificationFields(PeopleSpaceTile tile) {
+        if (DEBUG) {
+            Log.i(TAG, "Removing any notification stored for tile Id: " + tile.getId());
         }
-        boolean isMissedCall = Objects.equals(notification.category, CATEGORY_MISSED_CALL);
+        return tile
+                .toBuilder()
+                // Reset notification content.
+                .setNotificationKey(null)
+                .setNotificationContent(null)
+                .setNotificationSender(null)
+                .setNotificationDataUri(null)
+                .setMessagesCount(0)
+                // Reset missed calls category.
+                .setNotificationCategory(null)
+                .build();
+    }
+
+    /**
+     * Augments {@code tile} with the notification content from {@code notificationEntry} and
+     * {@code messagesCount}.
+     */
+    public static PeopleSpaceTile augmentTileFromNotification(Context context, PeopleSpaceTile tile,
+            PeopleTileKey key, NotificationEntry notificationEntry, int messagesCount) {
+        if (notificationEntry == null || notificationEntry.getSbn().getNotification() == null) {
+            if (DEBUG) Log.d(TAG, "Tile key: " + key.toString() + ". Notification is null");
+            return removeNotificationFields(tile);
+        }
+        Notification notification = notificationEntry.getSbn().getNotification();
+        boolean isMissedCall = isMissedCall(notification);
         List<Notification.MessagingStyle.Message> messages =
                 getMessagingStyleMessages(notification);
 
         if (!isMissedCall && ArrayUtils.isEmpty(messages)) {
-            if (DEBUG) Log.d(TAG, "Notification has no content");
-            return tile;
+            if (DEBUG) Log.d(TAG, "Tile key: " + key.toString() + ". Notification has no content");
+            return removeNotificationFields(tile);
         }
 
         // messages are in chronological order from most recent to least.
         Notification.MessagingStyle.Message message = messages != null ? messages.get(0) : null;
-        int messagesCount = messages != null ? messages.size() : 0;
         // If it's a missed call notification and it doesn't include content, use fallback value,
         // otherwise, use notification content.
         boolean hasMessageText = message != null && !TextUtils.isEmpty(message.getText());
         CharSequence content = (isMissedCall && !hasMessageText)
                 ? context.getString(R.string.missed_call) : message.getText();
         Uri dataUri = message != null ? message.getDataUri() : null;
-        if (DEBUG) Log.d(TAG, "Notification message has text: " + hasMessageText);
+        if (DEBUG) {
+            Log.d(TAG, "Tile key: " + key.toString() + ". Notification message has text: "
+                    + hasMessageText);
+        }
+        CharSequence sender = getSenderIfGroupConversation(notification, message);
 
         return tile
                 .toBuilder()
-                .setNotificationKey(sbn.getKey())
+                .setNotificationKey(notificationEntry.getSbn().getKey())
                 .setNotificationCategory(notification.category)
                 .setNotificationContent(content)
+                .setNotificationSender(sender)
                 .setNotificationDataUri(dataUri)
                 .setMessagesCount(messagesCount)
                 .build();
     }
 
-    /**
-     * Returns {@link Notification.MessagingStyle.Message}s from the Notification in chronological
-     * order from most recent to least.
-     */
-    @VisibleForTesting
-    public static List<Notification.MessagingStyle.Message> getMessagingStyleMessages(
-            Notification notification) {
-        if (notification == null) {
-            return null;
-        }
-        if (Notification.MessagingStyle.class.equals(notification.getNotificationStyle())
-                && notification.extras != null) {
-            final Parcelable[] messages = notification.extras.getParcelableArray(EXTRA_MESSAGES);
-            if (!ArrayUtils.isEmpty(messages)) {
-                List<Notification.MessagingStyle.Message> sortedMessages =
-                        Notification.MessagingStyle.Message.getMessagesFromBundleArray(messages);
-                sortedMessages.sort(Collections.reverseOrder(
-                        Comparator.comparing(Notification.MessagingStyle.Message::getTimestamp)));
-                return sortedMessages;
-            }
-        }
-        return null;
-    }
-
     /** Returns a list sorted by ascending last interaction time from {@code stream}. */
     public static List<PeopleSpaceTile> getSortedTiles(IPeopleManager peopleManager,
             LauncherApps launcherApps, UserManager userManager,
@@ -467,7 +460,14 @@
     /** Updates the current widget view with provided {@link PeopleSpaceTile}. */
     public static void updateAppWidgetViews(AppWidgetManager appWidgetManager,
             Context context, int appWidgetId, PeopleSpaceTile tile, Bundle options) {
-        if (DEBUG) Log.d(TAG, "Widget: " + appWidgetId + ", " + tile.getUserName());
+        if (tile == null) {
+            if (DEBUG) Log.d(TAG, "Widget: " + appWidgetId + ". Tile is null, skipping update");
+            return;
+        }
+        if (DEBUG) {
+            Log.d(TAG, "Widget: " + appWidgetId + ", " + tile.getUserName() + ", "
+                    + tile.getPackageName() + ". Updating app widget view.");
+        }
         RemoteViews views = new PeopleTileViewHelper(context, tile, appWidgetId,
                 options).getViews();
 
@@ -478,10 +478,29 @@
     /** Updates tile in app widget options and the current view. */
     public static void updateAppWidgetOptionsAndView(AppWidgetManager appWidgetManager,
             Context context, int appWidgetId, PeopleSpaceTile tile) {
+        if (tile == null) {
+            if (DEBUG) {
+                Log.w(TAG, "Widget: " + appWidgetId + "Tile is null, skipping storage and update.");
+            }
+            return;
+        }
         Bundle options = AppWidgetOptionsHelper.setPeopleTile(appWidgetManager, appWidgetId, tile);
         updateAppWidgetViews(appWidgetManager, context, appWidgetId, tile, options);
     }
 
+    /** Wrapper around {@link #updateAppWidgetOptionsAndView} with optional tile as a parameter. */
+    public static void updateAppWidgetOptionsAndView(AppWidgetManager appWidgetManager,
+            Context context, int appWidgetId, Optional<PeopleSpaceTile> optionalTile) {
+        if (!optionalTile.isPresent()) {
+            if (DEBUG) {
+                Log.w(TAG, "Widget: " + appWidgetId
+                        + "Optional tile is not present, skipping storage and update.");
+            }
+            return;
+        }
+        updateAppWidgetOptionsAndView(appWidgetManager, context, appWidgetId, optionalTile.get());
+    }
+
     /**
      * Returns lookup keys for all contacts with a birthday today.
      *
@@ -523,42 +542,6 @@
         return lookupKeysWithBirthdaysToday;
     }
 
-    /**
-     * Returns a {@link RemoteViews} preview of a Conversation's People Tile. Returns null if one
-     * is not available.
-     */
-    public static RemoteViews getPreview(Context context, IPeopleManager peopleManager,
-            LauncherApps launcherApps, NotificationEntryManager notificationEntryManager,
-            String shortcutId, UserHandle userHandle, String packageName, Bundle options) {
-        peopleManager = (peopleManager != null) ? peopleManager : IPeopleManager.Stub.asInterface(
-                ServiceManager.getService(Context.PEOPLE_SERVICE));
-        launcherApps = (launcherApps != null) ? launcherApps
-                : context.getSystemService(LauncherApps.class);
-        if (peopleManager == null || launcherApps == null) {
-            return null;
-        }
-
-        ConversationChannel channel;
-        try {
-            channel = peopleManager.getConversation(
-                    packageName, userHandle.getIdentifier(), shortcutId);
-        } catch (Exception e) {
-            Log.w(TAG, "Exception getting tiles: " + e);
-            return null;
-        }
-        PeopleSpaceTile tile = PeopleSpaceUtils.getTile(channel, launcherApps);
-
-        if (tile == null) {
-            if (DEBUG) Log.i(TAG, "No tile was returned");
-            return null;
-        }
-        PeopleSpaceTile augmentedTile = augmentSingleTileFromVisibleNotifications(
-                context, tile, notificationEntryManager);
-
-        if (DEBUG) Log.i(TAG, "Returning tile preview for shortcutId: " + shortcutId);
-        return new PeopleTileViewHelper(context, augmentedTile, 0, options).getViews();
-    }
-
     /** Returns the userId associated with a {@link PeopleSpaceTile} */
     public static int getUserId(PeopleSpaceTile tile) {
         return tile.getUserHandle().getIdentifier();
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
index 145fee5..81df107 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
@@ -23,16 +23,17 @@
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
 import android.graphics.Paint;
+import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.util.IconDrawableFactory;
 import android.util.Log;
 import android.util.TypedValue;
 
-import com.android.launcher3.icons.BaseIconFactory;
+import com.android.settingslib.Utils;
 import com.android.systemui.R;
 
-class PeopleStoryIconFactory extends BaseIconFactory {
+class PeopleStoryIconFactory implements AutoCloseable {
 
     private static final int PADDING = 2;
     private static final int RING_WIDTH = 2;
@@ -44,11 +45,13 @@
     private int mAccentColor;
     private float mDensity;
     private float mIconSize;
+    private Context mContext;
+
+    private final int mIconBitmapSize;
 
     PeopleStoryIconFactory(Context context, PackageManager pm,
             IconDrawableFactory iconDrawableFactory, int iconSizeDp) {
-        super(context, context.getResources().getConfiguration().densityDpi,
-                (int) (iconSizeDp * context.getResources().getDisplayMetrics().density));
+        mIconBitmapSize = (int) (iconSizeDp * context.getResources().getDisplayMetrics().density);
         mDensity = context.getResources().getDisplayMetrics().density;
         mIconSize = mDensity * iconSizeDp;
         mPackageManager = pm;
@@ -57,6 +60,7 @@
         TypedValue typedValue = new TypedValue();
         context.getTheme().resolveAttribute(android.R.attr.colorAccent, typedValue, true);
         mAccentColor = context.getColor(typedValue.resourceId);
+        mContext = context;
     }
 
 
@@ -69,7 +73,7 @@
         try {
             final ApplicationInfo appInfo = mPackageManager.getApplicationInfoAsUser(
                     packageName, PackageManager.GET_META_DATA, userId);
-            badge = mIconDrawableFactory.getBadgedIcon(appInfo, userId);
+            badge = Utils.getBadgedIcon(mContext, appInfo);
         } catch (PackageManager.NameNotFoundException e) {
             badge = mPackageManager.getDefaultActivityIcon();
         }
@@ -209,7 +213,11 @@
 
         @Override
         public int getOpacity() {
-            return 0;
+            return PixelFormat.TRANSLUCENT;
         }
     }
-}
+
+    @Override
+    public void close() {
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
index 6b917c5..d4ddc65 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
@@ -59,6 +59,7 @@
 import com.android.systemui.R;
 import com.android.systemui.people.widget.LaunchConversationActivity;
 import com.android.systemui.people.widget.PeopleSpaceWidgetProvider;
+import com.android.systemui.people.widget.PeopleTileKey;
 
 import java.text.NumberFormat;
 import java.time.Duration;
@@ -71,7 +72,8 @@
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
-class PeopleTileViewHelper {
+/** Functions that help creating the People tile layouts. */
+public class PeopleTileViewHelper {
     /** Turns on debugging information about People Space. */
     public static final boolean DEBUG = true;
     private static final String TAG = "PeopleTileView";
@@ -93,7 +95,7 @@
     private static final int FIXED_HEIGHT_DIMENS_FOR_SMALL = 6 + 4 + 8;
     private static final int FIXED_WIDTH_DIMENS_FOR_SMALL = 4 + 4;
 
-    private static final int MESSAGES_COUNT_OVERFLOW = 7;
+    private static final int MESSAGES_COUNT_OVERFLOW = 6;
 
     private static final Pattern DOUBLE_EXCLAMATION_PATTERN = Pattern.compile("[!][!]+");
     private static final Pattern DOUBLE_QUESTION_PATTERN = Pattern.compile("[?][?]+");
@@ -115,7 +117,7 @@
     private Locale mLocale;
     private NumberFormat mIntegerFormat;
 
-    PeopleTileViewHelper(Context context, PeopleSpaceTile tile,
+    public PeopleTileViewHelper(Context context, PeopleSpaceTile tile,
             int appWidgetId, Bundle options) {
         mContext = context;
         mTile = tile;
@@ -147,6 +149,8 @@
      * content, then birthdays, then the most recent status, and finally last interaction.
      */
     private RemoteViews getViewForTile() {
+        PeopleTileKey key = new PeopleTileKey(mTile);
+        if (DEBUG) Log.d(TAG, "Creating view for tile key: " + key.toString());
         if (Objects.equals(mTile.getNotificationCategory(), CATEGORY_MISSED_CALL)) {
             if (DEBUG) Log.d(TAG, "Create missed call view");
             return createMissedCallRemoteViews();
@@ -178,7 +182,7 @@
         return createLastInteractionRemoteViews();
     }
 
-    private void setMaxLines(RemoteViews views) {
+    private void setMaxLines(RemoteViews views, boolean showSender) {
         int textSize = mLayoutSize == LAYOUT_LARGE ? getSizeInDp(
                 R.dimen.content_text_size_for_medium)
                 : getSizeInDp(R.dimen.content_text_size_for_medium);
@@ -186,6 +190,9 @@
         int notificationContentHeight = getContentHeightForLayout(lineHeight);
         int maxAdaptiveLines = Math.floorDiv(notificationContentHeight, lineHeight);
         int maxLines = Math.max(MIN_CONTENT_MAX_LINES, maxAdaptiveLines);
+
+        // Save a line for sender's name, if present.
+        if (showSender) maxLines--;
         views.setInt(R.id.text_content, "setMaxLines", maxLines);
     }
 
@@ -304,7 +311,9 @@
                 views.setViewVisibility(R.id.availability, View.GONE);
             }
 
-            views.setTextViewText(R.id.name, mTile.getUserName().toString());
+            if (mTile.getUserName() != null) {
+                views.setTextViewText(R.id.name, mTile.getUserName().toString());
+            }
             views.setBoolean(R.id.image, "setClipToOutline", true);
             views.setImageViewBitmap(R.id.person_icon,
                     getPersonIconBitmap(mContext, mTile, maxAvatarSize));
@@ -346,7 +355,8 @@
     private RemoteViews createMissedCallRemoteViews() {
         RemoteViews views = getViewForContentLayout();
         views.setViewVisibility(R.id.predefined_icon, View.VISIBLE);
-        setMaxLines(views);
+        views.setViewVisibility(R.id.messages_count, View.GONE);
+        setMaxLines(views, false);
         views.setTextViewText(R.id.text_content, mTile.getNotificationContent());
         views.setImageViewResource(R.id.predefined_icon, R.drawable.ic_phone_missed);
         return views;
@@ -354,6 +364,7 @@
 
     private RemoteViews createNotificationRemoteViews() {
         RemoteViews views = getViewForContentLayout();
+        CharSequence sender = mTile.getNotificationSender();
         Uri image = mTile.getNotificationDataUri();
         if (image != null) {
             // TODO: Use NotificationInlineImageCache
@@ -362,7 +373,7 @@
             views.setViewVisibility(R.id.text_content, View.GONE);
             views.setImageViewResource(R.id.predefined_icon, R.drawable.ic_photo_camera);
         } else {
-            setMaxLines(views);
+            setMaxLines(views, !TextUtils.isEmpty(sender));
             CharSequence content = mTile.getNotificationContent();
             views = setPunctuationRemoteViewsFields(views, content);
             views.setColorAttr(R.id.text_content, "setTextColor", android.R.attr.textColorPrimary);
@@ -378,13 +389,16 @@
                 views.setViewVisibility(R.id.predefined_icon, View.GONE);
             }
         }
-        // TODO: Set subtext as Group Sender name once storing the name in PeopleSpaceTile and
-        //  subtract 1 from maxLines when present.
-        views.setViewVisibility(R.id.subtext, View.GONE);
+        if (!TextUtils.isEmpty(sender)) {
+            views.setViewVisibility(R.id.subtext, View.VISIBLE);
+            views.setTextViewText(R.id.subtext, sender);
+        } else {
+            views.setViewVisibility(R.id.subtext, View.GONE);
+        }
         return views;
     }
 
-    // Some messaging apps only include up to 7 messages in their notifications.
+    // Some messaging apps only include up to 6 messages in their notifications.
     private String getMessagesCountText(int count) {
         if (count >= MESSAGES_COUNT_OVERFLOW) {
             return mContext.getResources().getString(
@@ -410,7 +424,7 @@
         }
         views.setViewVisibility(R.id.predefined_icon, View.VISIBLE);
         views.setViewVisibility(R.id.messages_count, View.GONE);
-        setMaxLines(views);
+        setMaxLines(views, false);
         // Secondary text color for statuses.
         views.setColorAttr(R.id.text_content, "setTextColor", android.R.attr.textColorSecondary);
         views.setTextViewText(R.id.text_content, statusText);
@@ -546,7 +560,6 @@
         if (mLayoutSize == LAYOUT_SMALL) {
             views.setViewVisibility(R.id.predefined_icon, View.VISIBLE);
             views.setViewVisibility(R.id.name, View.GONE);
-            views.setViewVisibility(R.id.messages_count, View.GONE);
         } else {
             views.setViewVisibility(R.id.predefined_icon, View.GONE);
             views.setViewVisibility(R.id.name, View.VISIBLE);
@@ -561,6 +574,7 @@
             views.setViewPadding(R.id.item, horizontalPadding, verticalPadding, horizontalPadding,
                     verticalPadding);
         }
+        views.setViewVisibility(R.id.messages_count, View.GONE);
         return views;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/AppWidgetOptionsHelper.java b/packages/SystemUI/src/com/android/systemui/people/widget/AppWidgetOptionsHelper.java
index 7254eec..73c43eb 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/AppWidgetOptionsHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/AppWidgetOptionsHelper.java
@@ -41,7 +41,7 @@
             PeopleSpaceTile tile) {
         Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
         if (tile == null) {
-            if (DEBUG) Log.d(TAG, "Requested to store null tile");
+            if (DEBUG) Log.w(TAG, "Requested to store null tile");
             return options;
         }
         options.putParcelable(OPTIONS_PEOPLE_TILE, tile);
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
index fb0dcc2..64a6509 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
@@ -17,24 +17,25 @@
 package com.android.systemui.people.widget;
 
 import static android.Manifest.permission.READ_CONTACTS;
-import static android.app.Notification.CATEGORY_MISSED_CALL;
-import static android.app.Notification.EXTRA_PEOPLE_LIST;
 
+import static com.android.systemui.people.NotificationHelper.getContactUri;
+import static com.android.systemui.people.NotificationHelper.getHighestPriorityNotification;
+import static com.android.systemui.people.NotificationHelper.shouldMatchNotificationByUri;
 import static com.android.systemui.people.PeopleSpaceUtils.EMPTY_STRING;
 import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
 import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
 import static com.android.systemui.people.PeopleSpaceUtils.SHORTCUT_ID;
 import static com.android.systemui.people.PeopleSpaceUtils.USER_ID;
 import static com.android.systemui.people.PeopleSpaceUtils.augmentTileFromNotification;
-import static com.android.systemui.people.PeopleSpaceUtils.getMessagingStyleMessages;
-import static com.android.systemui.people.PeopleSpaceUtils.getStoredWidgetIds;
+import static com.android.systemui.people.PeopleSpaceUtils.getMessagesCount;
+import static com.android.systemui.people.PeopleSpaceUtils.getNotificationsByUri;
+import static com.android.systemui.people.PeopleSpaceUtils.removeNotificationFields;
 import static com.android.systemui.people.PeopleSpaceUtils.updateAppWidgetOptionsAndView;
 import static com.android.systemui.people.PeopleSpaceUtils.updateAppWidgetViews;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.INotificationManager;
-import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.PendingIntent;
 import android.app.Person;
@@ -49,6 +50,7 @@
 import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
+import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.ServiceManager;
@@ -67,10 +69,13 @@
 import com.android.internal.logging.UiEventLoggerImpl;
 import com.android.settingslib.utils.ThreadUtils;
 import com.android.systemui.Dependency;
+import com.android.systemui.people.NotificationHelper;
 import com.android.systemui.people.PeopleSpaceUtils;
+import com.android.systemui.people.PeopleTileViewHelper;
 import com.android.systemui.statusbar.NotificationListener;
 import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -78,8 +83,10 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -229,7 +236,7 @@
     @Nullable
     public PeopleSpaceTile getTileFromPersistentStorage(PeopleTileKey key) {
         if (!key.isValid()) {
-            Log.e(TAG, "PeopleTileKey invalid: " + key);
+            Log.e(TAG, "PeopleTileKey invalid: " + key.toString());
             return null;
         }
 
@@ -260,7 +267,14 @@
      */
     public void updateWidgetsWithNotificationChanged(StatusBarNotification sbn,
             PeopleSpaceUtils.NotificationAction notificationAction) {
-        if (DEBUG) Log.d(TAG, "updateWidgetsWithNotificationChanged called");
+        if (DEBUG) {
+            Log.d(TAG, "updateWidgetsWithNotificationChanged called");
+            if (notificationAction == PeopleSpaceUtils.NotificationAction.POSTED) {
+                Log.d(TAG, "Notification posted, key: " + sbn.getKey());
+            } else {
+                Log.d(TAG, "Notification removed, key: " + sbn.getKey());
+            }
+        }
         if (mIsForTesting) {
             updateWidgetsWithNotificationChangedInBackground(sbn, notificationAction);
             return;
@@ -272,9 +286,10 @@
     private void updateWidgetsWithNotificationChangedInBackground(StatusBarNotification sbn,
             PeopleSpaceUtils.NotificationAction action) {
         try {
-            String sbnShortcutId = sbn.getShortcutId();
-            if (sbnShortcutId == null) {
-                if (DEBUG) Log.d(TAG, "Sbn shortcut id is null");
+            PeopleTileKey key = new PeopleTileKey(
+                    sbn.getShortcutId(), sbn.getUser().getIdentifier(), sbn.getPackageName());
+            if (!key.isValid()) {
+                Log.d(TAG, "Sbn doesn't contain valid PeopleTileKey: " + key.toString());
                 return;
             }
             int[] widgetIds = mAppWidgetManager.getAppWidgetIds(
@@ -284,21 +299,15 @@
                 Log.d(TAG, "No app widget ids returned");
                 return;
             }
-            PeopleTileKey key = new PeopleTileKey(
-                    sbnShortcutId,
-                    sbn.getUser().getIdentifier(),
-                    sbn.getPackageName());
-            if (!key.isValid()) {
-                Log.d(TAG, "Invalid key");
-                return;
-            }
             synchronized (mLock) {
-                // First, update People Tiles associated with the Notification's package/shortcut.
-                Set<String> tilesUpdatedByKey = getStoredWidgetIds(mSharedPrefs, key);
-                updateWidgetIdsForNotificationAction(tilesUpdatedByKey, sbn, action);
-
-                // Then, update People Tiles across other packages that use the same Uri.
-                updateTilesByUri(key, sbn, action);
+                Set<String> tilesUpdated = getMatchingKeyWidgetIds(key);
+                Set<String> tilesUpdatedByUri = getMatchingUriWidgetIds(sbn, action);
+                if (DEBUG) {
+                    Log.d(TAG, "Widgets by key to be updated:" + tilesUpdated.toString());
+                    Log.d(TAG, "Widgets by URI to be updated:" + tilesUpdatedByUri.toString());
+                }
+                tilesUpdated.addAll(tilesUpdatedByUri);
+                updateWidgetIdsBasedOnNotifications(tilesUpdated);
             }
         } catch (Exception e) {
             Log.e(TAG, "Throwing exception: " + e);
@@ -306,36 +315,152 @@
     }
 
     /** Updates {@code widgetIdsToUpdate} with {@code action}. */
-    private void updateWidgetIdsForNotificationAction(Set<String> widgetIdsToUpdate,
-            StatusBarNotification sbn, PeopleSpaceUtils.NotificationAction action) {
-        for (String widgetIdString : widgetIdsToUpdate) {
-            int widgetId = Integer.parseInt(widgetIdString);
-            PeopleSpaceTile storedTile = getTileForExistingWidget(widgetId);
-            if (storedTile == null) {
-                if (DEBUG) Log.d(TAG, "Could not find stored tile for notification");
-                continue;
-            }
-            if (DEBUG) Log.d(TAG, "Storing notification change, key:" + sbn.getKey());
-            updateStorageAndViewWithNotificationData(sbn, action, widgetId,
-                    storedTile);
+    private void updateWidgetIdsBasedOnNotifications(Set<String> widgetIdsToUpdate) {
+        if (widgetIdsToUpdate.isEmpty()) {
+            if (DEBUG) Log.d(TAG, "No widgets to update, returning.");
+            return;
+        }
+        try {
+            if (DEBUG) Log.d(TAG, "Fetching grouped notifications");
+            Map<PeopleTileKey, Set<NotificationEntry>> groupedNotifications =
+                    getGroupedConversationNotifications();
+
+            widgetIdsToUpdate
+                    .stream()
+                    .map(Integer::parseInt)
+                    .collect(Collectors.toMap(
+                            Function.identity(),
+                            id -> getAugmentedTileForExistingWidget(id, groupedNotifications)))
+                    .forEach((id, tile) ->
+                            updateAppWidgetOptionsAndView(mAppWidgetManager, mContext, id, tile));
+        } catch (Exception e) {
+            Log.e(TAG, "Exception updating widgets: " + e);
         }
     }
 
     /**
-     * Updates tiles with matched Uris, dependent on the {@code action}.
+     * Augments {@code tile} based on notifications returned from {@code notificationEntryManager}.
+     */
+    public PeopleSpaceTile augmentTileFromNotificationEntryManager(PeopleSpaceTile tile) {
+        PeopleTileKey key = new PeopleTileKey(tile);
+        Log.d(TAG, "Augmenting tile from NotificationEntryManager widget: " + key.toString());
+        Map<PeopleTileKey, Set<NotificationEntry>> notifications =
+                getGroupedConversationNotifications();
+        String contactUri = null;
+        if (tile.getContactUri() != null) {
+            contactUri = tile.getContactUri().toString();
+        }
+        return augmentTileFromNotifications(tile, key, contactUri, notifications);
+    }
+
+    /** Returns active and pending notifications grouped by {@link PeopleTileKey}. */
+    public Map<PeopleTileKey, Set<NotificationEntry>> getGroupedConversationNotifications() {
+        List<NotificationEntry> notifications =
+                new ArrayList<>(mNotificationEntryManager.getVisibleNotifications());
+        Iterable<NotificationEntry> pendingNotifications =
+                mNotificationEntryManager.getPendingNotificationsIterator();
+        for (NotificationEntry entry : pendingNotifications) {
+            notifications.add(entry);
+        }
+        if (DEBUG) Log.d(TAG, "Number of total notifications: " + notifications.size());
+        Map<PeopleTileKey, Set<NotificationEntry>> groupedNotifications =
+                notifications
+                        .stream()
+                        .filter(entry -> NotificationHelper.isValid(entry)
+                                && NotificationHelper.isMissedCallOrHasContent(entry))
+                        .collect(Collectors.groupingBy(
+                                PeopleTileKey::new,
+                                Collectors.mapping(Function.identity(), Collectors.toSet())));
+        if (DEBUG) {
+            Log.d(TAG, "Number of grouped conversation notifications keys: "
+                    + groupedNotifications.keySet().size());
+        }
+        return groupedNotifications;
+    }
+
+    /** Augments {@code tile} based on {@code notifications}, matching {@code contactUri}. */
+    public PeopleSpaceTile augmentTileFromNotifications(PeopleSpaceTile tile, PeopleTileKey key,
+            String contactUri, Map<PeopleTileKey, Set<NotificationEntry>> notifications) {
+        if (DEBUG) Log.d(TAG, "Augmenting tile from notifications. Tile key: " + key.toString());
+        boolean hasReadContactsPermission =  mPackageManager.checkPermission(READ_CONTACTS,
+                tile.getPackageName()) == PackageManager.PERMISSION_GRANTED;
+
+        List<NotificationEntry> notificationsByUri = new ArrayList<>();
+        if (hasReadContactsPermission) {
+            notificationsByUri = getNotificationsByUri(mPackageManager, contactUri, notifications);
+            if (!notificationsByUri.isEmpty()) {
+                if (DEBUG) {
+                    Log.d(TAG, "Number of notifications matched by contact URI: "
+                            + notificationsByUri.size());
+                }
+            }
+        }
+
+        Set<NotificationEntry> allNotifications = notifications.get(key);
+        if (allNotifications == null) {
+            allNotifications = new HashSet<>();
+        }
+        if (allNotifications.isEmpty() && notificationsByUri.isEmpty()) {
+            if (DEBUG) Log.d(TAG, "No existing notifications for tile: " + key.toString());
+            return removeNotificationFields(tile);
+        }
+
+        // Merge notifications matched by key and by contact URI.
+        allNotifications.addAll(notificationsByUri);
+        if (DEBUG) Log.d(TAG, "Total notifications matching tile: " + allNotifications.size());
+
+        int messagesCount = getMessagesCount(allNotifications);
+        NotificationEntry highestPriority = getHighestPriorityNotification(allNotifications);
+
+        if (DEBUG) Log.d(TAG, "Augmenting tile from notification, key: " + key.toString());
+        return augmentTileFromNotification(mContext, tile, key, highestPriority, messagesCount);
+    }
+
+    /** Returns an augmented tile for an existing widget. */
+    @Nullable
+    public Optional<PeopleSpaceTile> getAugmentedTileForExistingWidget(int widgetId,
+            Map<PeopleTileKey, Set<NotificationEntry>> notifications) {
+        Log.d(TAG, "Augmenting tile for existing widget: " + widgetId);
+        PeopleSpaceTile tile = getTileForExistingWidget(widgetId);
+        if (tile == null) {
+            if (DEBUG) {
+                Log.w(TAG, "Widget: " + widgetId
+                        + ". Null tile for existing widget, skipping update.");
+            }
+            return Optional.empty();
+        }
+        String contactUriString = mSharedPrefs.getString(String.valueOf(widgetId), null);
+        // Should never be null, but using ofNullable for extra safety.
+        PeopleTileKey key = new PeopleTileKey(tile);
+        if (DEBUG) Log.d(TAG, "Existing widget: " + widgetId + ". Tile key: " + key.toString());
+        return Optional.ofNullable(
+                augmentTileFromNotifications(tile, key, contactUriString, notifications));
+    }
+
+    /** Returns stored widgets for the conversation specified. */
+    public Set<String> getMatchingKeyWidgetIds(PeopleTileKey key) {
+        if (!key.isValid()) {
+            return new HashSet<>();
+        }
+        return new HashSet<>(mSharedPrefs.getStringSet(key.toString(), new HashSet<>()));
+    }
+
+    /**
+     * Updates in-memory map of tiles with matched Uris, dependent on the {@code action}.
      *
      * <p>If the notification was added, adds the notification based on the contact Uri within
      * {@code sbn}.
      * <p>If the notification was removed, removes the notification based on the in-memory map of
      * widgets previously updated by Uri (since the contact Uri is stripped from the {@code sbn}).
      */
-    private void updateTilesByUri(PeopleTileKey key, StatusBarNotification sbn,
+    @Nullable
+    private Set<String> getMatchingUriWidgetIds(StatusBarNotification sbn,
             PeopleSpaceUtils.NotificationAction action) {
         if (action.equals(PeopleSpaceUtils.NotificationAction.POSTED)) {
-            Set<String> widgetIdsUpdatedByUri = supplementTilesByUri(sbn, action, key);
+            Set<String> widgetIdsUpdatedByUri = fetchMatchingUriWidgetIds(sbn);
             if (widgetIdsUpdatedByUri != null && !widgetIdsUpdatedByUri.isEmpty()) {
-                if (DEBUG) Log.d(TAG, "Added due to uri: " + widgetIdsUpdatedByUri);
                 mNotificationKeyToWidgetIdsMatchedByUri.put(sbn.getKey(), widgetIdsUpdatedByUri);
+                return widgetIdsUpdatedByUri;
             }
         } else {
             // Remove the notification on any widgets where the notification was added
@@ -343,21 +468,16 @@
             Set<String> widgetsPreviouslyUpdatedByUri =
                     mNotificationKeyToWidgetIdsMatchedByUri.remove(sbn.getKey());
             if (widgetsPreviouslyUpdatedByUri != null && !widgetsPreviouslyUpdatedByUri.isEmpty()) {
-                if (DEBUG) Log.d(TAG, "Remove due to uri: " + widgetsPreviouslyUpdatedByUri);
-                updateWidgetIdsForNotificationAction(widgetsPreviouslyUpdatedByUri, sbn,
-                        action);
+                return widgetsPreviouslyUpdatedByUri;
             }
         }
+        return new HashSet<>();
     }
 
-    /**
-     * Retrieves from storage any tiles with the same contact Uri as linked via the {@code sbn}.
-     * Supplements the tiles with the notification content only if they still have {@link
-     * android.Manifest.permission.READ_CONTACTS} permission.
-     */
+    /** Fetches widget Ids that match the contact URI in {@code sbn}. */
     @Nullable
-    private Set<String> supplementTilesByUri(StatusBarNotification sbn,
-            PeopleSpaceUtils.NotificationAction notificationAction, PeopleTileKey key) {
+    private Set<String> fetchMatchingUriWidgetIds(StatusBarNotification sbn) {
+        // Check if it's a missed call notification
         if (!shouldMatchNotificationByUri(sbn)) {
             if (DEBUG) Log.d(TAG, "Should not supplement conversation");
             return null;
@@ -377,80 +497,7 @@
             if (DEBUG) Log.d(TAG, "No tiles for contact");
             return null;
         }
-
-        if (mPackageManager.checkPermission(READ_CONTACTS,
-                sbn.getPackageName()) != PackageManager.PERMISSION_GRANTED) {
-            if (DEBUG) Log.d(TAG, "Notifying app missing permissions");
-            return null;
-        }
-
-        Set<String> widgetIdsUpdatedByUri = new HashSet<>();
-        for (String widgetIdString : storedWidgetIdsByUri) {
-            int widgetId = Integer.parseInt(widgetIdString);
-            PeopleSpaceTile storedTile = getTileForExistingWidget(widgetId);
-            // Don't update a widget already updated.
-            if (key.equals(new PeopleTileKey(storedTile))) {
-                continue;
-            }
-            if (storedTile == null || mPackageManager.checkPermission(READ_CONTACTS,
-                    storedTile.getPackageName()) != PackageManager.PERMISSION_GRANTED) {
-                if (DEBUG) Log.d(TAG, "Cannot supplement tile: " + storedTile.getUserName());
-                continue;
-            }
-            if (DEBUG) Log.d(TAG, "Adding notification by uri: " + sbn.getKey());
-            updateStorageAndViewWithNotificationData(sbn, notificationAction,
-                    widgetId, storedTile);
-            widgetIdsUpdatedByUri.add(String.valueOf(widgetId));
-        }
-        return widgetIdsUpdatedByUri;
-    }
-
-    /**
-     * Try to retrieve a valid Uri via {@code sbn}, falling back to the {@code
-     * contactUriFromShortcut} if valid.
-     */
-    @Nullable
-    private String getContactUri(StatusBarNotification sbn) {
-        // First, try to get a Uri from the Person directly set on the Notification.
-        ArrayList<Person> people = sbn.getNotification().extras.getParcelableArrayList(
-                EXTRA_PEOPLE_LIST);
-        if (people != null && people.get(0) != null) {
-            String contactUri = people.get(0).getUri();
-            if (contactUri != null && !contactUri.isEmpty()) {
-                return contactUri;
-            }
-        }
-
-        // Then, try to get a Uri from the Person set on the Notification message.
-        List<Notification.MessagingStyle.Message> messages =
-                getMessagingStyleMessages(sbn.getNotification());
-        if (messages != null && !messages.isEmpty()) {
-            Notification.MessagingStyle.Message message = messages.get(0);
-            Person sender = message.getSenderPerson();
-            if (sender != null && sender.getUri() != null && !sender.getUri().isEmpty()) {
-                return sender.getUri();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns whether a notification should be matched to other Tiles by Uri.
-     *
-     * <p>Currently only matches missed calls.
-     */
-    private boolean shouldMatchNotificationByUri(StatusBarNotification sbn) {
-        Notification notification = sbn.getNotification();
-        if (notification == null) {
-            if (DEBUG) Log.d(TAG, "Notification is null");
-            return false;
-        }
-        if (!Objects.equals(notification.category, CATEGORY_MISSED_CALL)) {
-            if (DEBUG) Log.d(TAG, "Not missed call");
-            return false;
-        }
-        return true;
+        return storedWidgetIdsByUri;
     }
 
     /**
@@ -461,7 +508,7 @@
         synchronized (mLock) {
             PeopleTileKey key = new PeopleTileKey(
                     info.getId(), info.getUserId(), info.getPackage());
-            Set<String> storedWidgetIds = getStoredWidgetIds(mSharedPrefs, key);
+            Set<String> storedWidgetIds = getMatchingKeyWidgetIds(key);
             for (String widgetIdString : storedWidgetIds) {
                 if (DEBUG) {
                     Log.d(TAG,
@@ -469,7 +516,7 @@
                                     + info.getLabel());
                 }
                 updateStorageAndViewWithConversationData(conversation,
-                        Integer.valueOf(widgetIdString));
+                        Integer.parseInt(widgetIdString));
             }
         }
     }
@@ -484,52 +531,31 @@
             if (DEBUG) Log.d(TAG, "Could not find stored tile to add conversation to");
             return;
         }
+        PeopleSpaceTile.Builder updatedTile = storedTile.toBuilder();
         ShortcutInfo info = conversation.getShortcutInfo();
         Uri uri = null;
         if (info.getPersons() != null && info.getPersons().length > 0) {
             Person person = info.getPersons()[0];
             uri = person.getUri() == null ? null : Uri.parse(person.getUri());
         }
-        storedTile = storedTile.toBuilder()
-                .setUserName(info.getLabel())
-                .setUserIcon(
-                        PeopleSpaceTile.convertDrawableToIcon(mLauncherApps.getShortcutIconDrawable(
-                                info, 0)))
+        CharSequence label = info.getLabel();
+        if (label != null) {
+            updatedTile.setUserName(label);
+        }
+        Icon icon = PeopleSpaceTile.convertDrawableToIcon(mLauncherApps.getShortcutIconDrawable(
+                info, 0));
+        if (icon != null) {
+            updatedTile.setUserIcon(icon);
+        }
+        updatedTile
                 .setContactUri(uri)
                 .setStatuses(conversation.getStatuses())
                 .setLastInteractionTimestamp(conversation.getLastEventTimestamp())
                 .setIsImportantConversation(conversation.getParentNotificationChannel() != null
                         && conversation.getParentNotificationChannel().isImportantConversation())
                 .build();
-        updateAppWidgetOptionsAndView(mAppWidgetManager, mContext, appWidgetId, storedTile);
-    }
-
-    /**
-     * Update {@code appWidgetId} with the new data provided by {@code sbn}.
-     */
-    private void updateStorageAndViewWithNotificationData(
-            StatusBarNotification sbn,
-            PeopleSpaceUtils.NotificationAction notificationAction,
-            int appWidgetId, PeopleSpaceTile storedTile) {
-        if (notificationAction == PeopleSpaceUtils.NotificationAction.POSTED) {
-            if (DEBUG) Log.i(TAG, "Adding notification to storage, appWidgetId: " + appWidgetId);
-            storedTile = augmentTileFromNotification(mContext, storedTile, sbn);
-        } else if (Objects.equals(storedTile.getNotificationKey(), sbn.getKey())) {
-            if (DEBUG) {
-                Log.i(TAG, "Removing notification from storage, appWidgetId: " + appWidgetId);
-            }
-            storedTile = storedTile
-                    .toBuilder()
-                    // Reset notification content.
-                    .setNotificationKey(null)
-                    .setNotificationContent(null)
-                    .setNotificationDataUri(null)
-                    .setMessagesCount(0)
-                    // Reset missed calls category.
-                    .setNotificationCategory(null)
-                    .build();
-        }
-        updateAppWidgetOptionsAndView(mAppWidgetManager, mContext, appWidgetId, storedTile);
+        updateAppWidgetOptionsAndView(mAppWidgetManager, mContext, appWidgetId,
+                updatedTile.build());
     }
 
     /**
@@ -615,22 +641,10 @@
     public void addNewWidget(int appWidgetId, PeopleTileKey key) {
         if (DEBUG) Log.d(TAG, "addNewWidget called with key for appWidgetId: " + appWidgetId);
         PeopleSpaceTile tile = getTileFromPersistentStorage(key);
-        tile = PeopleSpaceUtils.augmentSingleTileFromVisibleNotifications(
-                mContext, tile, mNotificationEntryManager);
-        if (tile != null) {
-            addNewWidget(appWidgetId, tile);
-        }
-    }
-
-    /**
-     * Adds a widget based on {@code tile} mapped to {@code appWidgetId}.
-     * The tile provided should already be augmented.
-     */
-    public void addNewWidget(int appWidgetId, PeopleSpaceTile tile) {
-        if (DEBUG) Log.d(TAG, "addNewWidget called for appWidgetId: " + appWidgetId);
         if (tile == null) {
             return;
         }
+        tile = augmentTileFromNotificationEntryManager(tile);
 
         PeopleTileKey existingKeyIfStored;
         synchronized (mLock) {
@@ -647,13 +661,12 @@
         }
 
         synchronized (mLock) {
-            if (DEBUG) Log.d(TAG, "Add storage for : " + tile.getId());
-            PeopleTileKey key = new PeopleTileKey(tile);
+            if (DEBUG) Log.d(TAG, "Add storage for : " + key.toString());
             PeopleSpaceUtils.setSharedPreferencesStorageForTile(mContext, key, appWidgetId,
                     tile.getContactUri());
         }
         try {
-            if (DEBUG) Log.d(TAG, "Caching shortcut for PeopleTile: " + tile.getId());
+            if (DEBUG) Log.d(TAG, "Caching shortcut for PeopleTile: " + key.toString());
             mLauncherApps.cacheShortcuts(tile.getPackageName(),
                     Collections.singletonList(tile.getId()),
                     tile.getUserHandle(), LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS);
@@ -683,7 +696,7 @@
                 if (DEBUG) Log.d(TAG, "Already registered listener");
                 return;
             }
-            if (DEBUG) Log.d(TAG, "Register listener for " + widgetId + " with " + key);
+            if (DEBUG) Log.d(TAG, "Register listener for " + widgetId + " with " + key.toString());
             mListeners.put(key, newListener);
         }
         mPeopleManager.registerConversationListener(key.getPackageName(),
@@ -754,7 +767,9 @@
                 if (DEBUG) Log.d(TAG, "Cannot find listener to unregister");
                 return;
             }
-            if (DEBUG) Log.d(TAG, "Unregister listener for " + appWidgetId + " with " + key);
+            if (DEBUG) {
+                Log.d(TAG, "Unregister listener for " + appWidgetId + " with " + key.toString());
+            }
             mListeners.remove(key);
         }
         mPeopleManager.unregisterConversationListener(registeredListener);
@@ -780,8 +795,7 @@
     public boolean requestPinAppWidget(ShortcutInfo shortcutInfo, Bundle options) {
         if (DEBUG) Log.d(TAG, "Requesting pin widget, shortcutId: " + shortcutInfo.getId());
 
-        RemoteViews widgetPreview = PeopleSpaceUtils.getPreview(mContext, mIPeopleManager,
-                mLauncherApps, mNotificationEntryManager, shortcutInfo.getId(),
+        RemoteViews widgetPreview = getPreview(shortcutInfo.getId(),
                 shortcutInfo.getUserHandle(), shortcutInfo.getPackage(), options);
         if (widgetPreview == null) {
             Log.w(TAG, "Skipping pinning widget: no tile for shortcutId: " + shortcutInfo.getId());
@@ -811,8 +825,6 @@
         List<PeopleSpaceTile> priorityTiles = PeopleSpaceUtils.getSortedTiles(mIPeopleManager,
                 mLauncherApps, mUserManager,
                 priorityConversations);
-        priorityTiles = PeopleSpaceUtils.augmentTilesFromVisibleNotifications(
-                mContext, priorityTiles, mNotificationEntryManager);
         return priorityTiles;
     }
 
@@ -839,9 +851,33 @@
         List<PeopleSpaceTile> recentTiles =
                 PeopleSpaceUtils.getSortedTiles(mIPeopleManager, mLauncherApps, mUserManager,
                         mergedStream);
-
-        recentTiles = PeopleSpaceUtils.augmentTilesFromVisibleNotifications(
-                mContext, recentTiles, mNotificationEntryManager);
         return recentTiles;
     }
+
+    /**
+     * Returns a {@link RemoteViews} preview of a Conversation's People Tile. Returns null if one
+     * is not available.
+     */
+    public RemoteViews getPreview(String shortcutId, UserHandle userHandle, String packageName,
+            Bundle options) {
+        PeopleSpaceTile tile;
+        ConversationChannel channel;
+        try {
+            channel = mIPeopleManager.getConversation(
+                    packageName, userHandle.getIdentifier(), shortcutId);
+            tile = PeopleSpaceUtils.getTile(channel, mLauncherApps);
+        } catch (Exception e) {
+            Log.w(TAG, "Exception getting tiles: " + e);
+            return null;
+        }
+        if (tile == null) {
+            if (DEBUG) Log.i(TAG, "No tile was returned");
+            return null;
+        }
+
+        PeopleSpaceTile augmentedTile = augmentTileFromNotificationEntryManager(tile);
+
+        if (DEBUG) Log.i(TAG, "Returning tile preview for shortcutId: " + shortcutId);
+        return new PeopleTileViewHelper(mContext, augmentedTile, 0, options).getViews();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt
index dc22dc1..9e8f6b8 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialog.kt
@@ -119,7 +119,7 @@
         } else {
             app
         }
-        val firstLine = context.getString(stringId, appName, element.type.getName(context))
+        val firstLine = context.getString(stringId, appName)
         val finalText = element.attribution?.let {
             TextUtils.concat(
                     firstLine,
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogController.kt
index feb27d80..a626681 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogController.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogController.kt
@@ -179,12 +179,16 @@
             }
             uiExecutor.execute {
                 val elements = filterAndSelect(items)
-                val d = dialogProvider.makeDialog(context, elements, this::startActivity)
-                d.setShowForAllUsers(true)
-                d.addOnDismissListener(onDialogDismissed)
-                d.show()
-                privacyLogger.logShowDialogContents(elements)
-                dialog = d
+                if (elements.isNotEmpty()) {
+                    val d = dialogProvider.makeDialog(context, elements, this::startActivity)
+                    d.setShowForAllUsers(true)
+                    d.addOnDismissListener(onDialogDismissed)
+                    d.show()
+                    privacyLogger.logShowDialogContents(elements)
+                    dialog = d
+                } else {
+                    Log.w(TAG, "Trying to show empty dialog")
+                }
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt
index 63ec6e5..76199bf 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt
@@ -58,7 +58,7 @@
     val paused: Boolean = false
 ) {
     val log = "(${privacyType.logName}, ${application.packageName}(${application.uid}), " +
-            "$timeStampElapsed)"
+            "$timeStampElapsed, paused=$paused)"
 }
 
 data class PrivacyApplication(val packageName: String, val uid: Int)
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt b/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt
index acce945..7c82a82 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt
@@ -116,6 +116,12 @@
         })
     }
 
+    fun logEmptyDialog() {
+        log(LogLevel.WARNING, {}, {
+            "Trying to show an empty dialog"
+        })
+    }
+
     fun logPrivacyDialogDismissed() {
         log(LogLevel.INFO, {}, {
             "Privacy dialog dismissed"
diff --git a/packages/SystemUI/src/com/android/systemui/qs/NonInterceptingScrollView.java b/packages/SystemUI/src/com/android/systemui/qs/NonInterceptingScrollView.java
index 309b32f..cd36091 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/NonInterceptingScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/NonInterceptingScrollView.java
@@ -29,6 +29,7 @@
 
     private final int mTouchSlop;
     private float mDownY;
+    private boolean mScrollEnabled = true;
 
     public NonInterceptingScrollView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -85,6 +86,16 @@
         return super.onInterceptTouchEvent(ev);
     }
 
+    @Override
+    public boolean canScrollVertically(int direction) {
+        return mScrollEnabled && super.canScrollVertically(direction);
+    }
+
+    @Override
+    public boolean canScrollHorizontally(int direction) {
+        return mScrollEnabled && super.canScrollHorizontally(direction);
+    }
+
     public int getScrollRange() {
         int scrollRange = 0;
         if (getChildCount() > 0) {
@@ -94,4 +105,12 @@
         }
         return scrollRange;
     }
+
+    /**
+     * Enable scrolling for this view. Needed because the view might be clipped but still intercepts
+     * touches on the lockscreen.
+     */
+    public void setScrollingEnabled(boolean enabled) {
+        mScrollEnabled = enabled;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index cefcd4a..488ada9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -54,6 +54,7 @@
     private static final String MOVE_FULL_ROWS = "sysui_qs_move_whole_rows";
 
     public static final float EXPANDED_TILE_DELAY = .86f;
+    public static final float SHORT_PARALLAX_AMOUNT = 0.1f;
     private static final long QQS_FADE_IN_DURATION = 200L;
     // Fade out faster than fade in to finish before QQS hides.
     private static final long QQS_FADE_OUT_DURATION = 50L;
@@ -79,7 +80,6 @@
     private QSExpansionPathInterpolator mQSExpansionPathInterpolator;
     private TouchAnimator mFirstPageAnimator;
     private TouchAnimator mFirstPageDelayedAnimator;
-    private TouchAnimator mTranslationXAnimator;
     private TouchAnimator mTranslationYAnimator;
     private TouchAnimator mNonfirstPageAnimator;
     private TouchAnimator mNonfirstPageDelayedAnimator;
@@ -101,6 +101,7 @@
     private final Executor mExecutor;
     private final TunerService mTunerService;
     private boolean mShowCollapsedOnKeyguard;
+    private boolean mTranslateWhileExpanding;
 
     @Inject
     public QSAnimator(QS qs, QuickQSPanel quickPanel, QuickStatusBarHeader quickStatusBarHeader,
@@ -217,10 +218,29 @@
         mOnFirstPage = isFirst;
     }
 
+    private void translateContent(
+            View qqsView,
+            View qsView,
+            View commonParent,
+            int yOffset,
+            int[] temp,
+            TouchAnimator.Builder animatorBuilder
+    ) {
+        getRelativePosition(temp, qqsView, commonParent);
+        int qqsPos = temp[1];
+        getRelativePosition(temp, qsView, commonParent);
+        int qsPos = temp[1];
+
+        int diff = qsPos - qqsPos - yOffset;
+        animatorBuilder.addFloat(qqsView, "translationY", 0, diff);
+        animatorBuilder.addFloat(qsView, "translationY", -diff, 0);
+        mAllViews.add(qqsView);
+        mAllViews.add(qsView);
+    }
+
     private void updateAnimators() {
         mNeedsAnimatorUpdate = false;
         TouchAnimator.Builder firstPageBuilder = new Builder();
-        TouchAnimator.Builder translationXBuilder = new Builder();
         TouchAnimator.Builder translationYBuilder = new Builder();
 
         Collection<QSTile> tiles = mHost.getTiles();
@@ -239,9 +259,11 @@
         QSTileLayout tileLayout = mQsPanelController.getTileLayout();
         mAllViews.add((View) tileLayout);
         int height = mQs.getView() != null ? mQs.getView().getMeasuredHeight() : 0;
-        int width = mQs.getView() != null ? mQs.getView().getMeasuredWidth() : 0;
         int heightDiff = height - mQs.getHeader().getBottom()
                 + mQs.getHeader().getPaddingBottom();
+        if (!mTranslateWhileExpanding) {
+            heightDiff *= SHORT_PARALLAX_AMOUNT;
+        }
         firstPageBuilder.addFloat(tileLayout, "translationY", heightDiff, 0);
 
         int qqsTileHeight = 0;
@@ -263,68 +285,62 @@
                     QSTileView quickTileView = mQuickQSPanelController.getTileView(tile);
                     if (quickTileView == null) continue;
 
-                    getRelativePosition(loc1, quickTileView.getIcon().getIconView(), view);
-                    getRelativePosition(loc2, tileIcon, view);
-                    final int xDiff = loc2[0] - loc1[0];
-                    int yDiff = loc2[1] - loc1[1];
+                    getRelativePosition(loc1, quickTileView, view);
+                    getRelativePosition(loc2, tileView, view);
+                    int yOffset = loc2[1] - loc1[1];
 
-                    if (count < tileLayout.getNumVisibleTiles()) {
-                        getRelativePosition(loc1, quickTileView, view);
-                        getRelativePosition(loc2, tileView, view);
-                        int yOffset = loc2[1] - loc1[1];
-                        // Move the quick tile right from its location to the new one.
-                        View v = quickTileView.getIcon();
-                        translationXBuilder.addFloat(v, "translationX", 0, xDiff);
-                        translationYBuilder.addFloat(v, "translationY", 0, yDiff - yOffset);
-                        mAllViews.add(v);
+                    // Offset the translation animation on the views
+                    // (that goes from 0 to getOffsetTranslation)
+                    int offsetWithQSBHTranslation =
+                            yOffset - mQuickStatusBarHeader.getOffsetTranslation();
+                    translationYBuilder.addFloat(quickTileView, "translationY", 0,
+                            offsetWithQSBHTranslation);
+                    translationYBuilder.addFloat(tileView, "translationY",
+                            -offsetWithQSBHTranslation, 0);
 
-                        // Move the real tile from the quick tile position to its final
-                        // location.
-                        v = tileIcon;
-                        translationXBuilder.addFloat(v, "translationX", -xDiff, 0);
-                        translationYBuilder.addFloat(v, "translationY", -yDiff + yOffset, 0);
-
-                        // Offset the translation animation on the views
-                        // (that goes from 0 to getOffsetTranslation)
-                        int offsetWithQSBHTranslation =
-                                yOffset - mQuickStatusBarHeader.getOffsetTranslation();
-                        translationYBuilder.addFloat(quickTileView, "translationY", 0,
-                                offsetWithQSBHTranslation);
-                        translationYBuilder.addFloat(tileView, "translationY",
-                                -offsetWithQSBHTranslation, 0);
-
-                        if (mQQSTileHeightAnimator == null) {
-                            mQQSTileHeightAnimator = new HeightExpansionAnimator(this,
-                                    quickTileView.getHeight(), tileView.getHeight());
-                            qqsTileHeight = quickTileView.getHeight();
-                        }
-
-                        mQQSTileHeightAnimator.addView(quickTileView);
-                        View qqsLabelContainer = quickTileView.getLabelContainer();
-                        View qsLabelContainer = tileView.getLabelContainer();
-
-                        getRelativePosition(loc1, qqsLabelContainer, view);
-                        getRelativePosition(loc2, qsLabelContainer, view);
-                        yDiff = loc2[1] - loc1[1] - yOffset;
-
-                        translationYBuilder.addFloat(qqsLabelContainer, "translationY", 0, yDiff);
-                        translationYBuilder.addFloat(qsLabelContainer, "translationY", -yDiff, 0);
-                        mAllViews.add(qqsLabelContainer);
-                        mAllViews.add(qsLabelContainer);
-                    } else { // These tiles disappear when expanding
-                        firstPageBuilder.addFloat(quickTileView, "alpha", 1, 0);
-                        translationYBuilder.addFloat(quickTileView, "translationY", 0, yDiff);
-
-                        // xDiff is negative here and this makes it "more" negative
-                        final int translationX =
-                                mQsPanelController.isLayoutRtl() ? xDiff - width : xDiff + width;
-                        translationXBuilder.addFloat(quickTileView, "translationX", 0,
-                                translationX);
+                    if (mQQSTileHeightAnimator == null) {
+                        mQQSTileHeightAnimator = new HeightExpansionAnimator(this,
+                                quickTileView.getHeight(), tileView.getHeight());
+                        qqsTileHeight = quickTileView.getHeight();
                     }
 
+                    mQQSTileHeightAnimator.addView(quickTileView);
+
+                    // Icons
+                    translateContent(
+                            quickTileView.getIcon(),
+                            tileView.getIcon(),
+                            view,
+                            yOffset,
+                            loc1,
+                            translationYBuilder
+                    );
+
+                    // Label containers
+                    translateContent(
+                            quickTileView.getLabelContainer(),
+                            tileView.getLabelContainer(),
+                            view,
+                            yOffset,
+                            loc1,
+                            translationYBuilder
+                    );
+
+                    // Secondary icon
+                    translateContent(
+                            quickTileView.getSecondaryIcon(),
+                            tileView.getSecondaryIcon(),
+                            view,
+                            yOffset,
+                            loc1,
+                            translationYBuilder
+                    );
+
+                    firstPageBuilder.addFloat(quickTileView.getSecondaryLabel(), "alpha", 0, 1);
+
                     mQuickQsViews.add(tileView);
-                    mAllViews.add(tileView.getIcon());
                     mAllViews.add(quickTileView);
+                    mAllViews.add(quickTileView.getSecondaryLabel());
                 } else if (mFullRows && isIconInAnimatedRow(count)) {
 
                     firstPageBuilder.addFloat(tileView, "translationY", -heightDiff, 0);
@@ -386,17 +402,7 @@
             if (mQsPanelController.getDivider() != null) {
                 mAllViews.add(mQsPanelController.getDivider());
             }
-
-            float px = 0;
-            if (tiles.size() <= 3) {
-                px = 1;
-            } else if (tiles.size() <= 6) {
-                px = .4f;
-            }
-            mQSExpansionPathInterpolator.setControlX2(px);
-            translationXBuilder.setInterpolator(mQSExpansionPathInterpolator.getXInterpolator());
             translationYBuilder.setInterpolator(mQSExpansionPathInterpolator.getYInterpolator());
-            mTranslationXAnimator = translationXBuilder.build();
             mTranslationYAnimator = translationYBuilder.build();
             if (mQQSTileHeightAnimator != null) {
                 mQQSTileHeightAnimator.setInterpolator(
@@ -469,7 +475,6 @@
             mQuickQsPanel.setAlpha(1);
             mFirstPageAnimator.setPosition(position);
             mFirstPageDelayedAnimator.setPosition(position);
-            mTranslationXAnimator.setPosition(position);
             mTranslationYAnimator.setPosition(position);
             if (mBrightnessAnimator != null) {
                 mBrightnessAnimator.setPosition(position);
@@ -570,6 +575,13 @@
         setCurrentPosition();
     };
 
+    /**
+     * True whe QS will be pulled from the top, false when it will be clipped.
+     */
+    public void setTranslateWhileExpanding(boolean shouldTranslate) {
+        mTranslateWhileExpanding = shouldTranslate;
+    }
+
     static class HeightExpansionAnimator {
         private final List<View> mViews = new ArrayList<>();
         private final ValueAnimator mAnimator;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index bf9acc2..661dbf6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -20,6 +20,8 @@
 
 import android.content.Context;
 import android.content.res.Configuration;
+import android.graphics.Canvas;
+import android.graphics.Path;
 import android.graphics.Point;
 import android.util.AttributeSet;
 import android.view.View;
@@ -54,6 +56,10 @@
     private static final PhysicsAnimator.SpringConfig BACKGROUND_SPRING
             = new PhysicsAnimator.SpringConfig(SpringForce.STIFFNESS_MEDIUM,
             SpringForce.DAMPING_RATIO_LOW_BOUNCY);
+    private int mFancyClippingTop;
+    private int mFancyClippingBottom;
+    private final float[] mFancyClippingRadii = new float[] {0, 0, 0, 0, 0, 0, 0, 0};
+    private  final Path mFancyClippingPath = new Path();
     private int mBackgroundBottom = -1;
     private int mHeightOverride = -1;
     private View mQSDetail;
@@ -70,6 +76,7 @@
     private int mContentPadding = -1;
     private boolean mAnimateBottomOnNextLayout;
     private int mNavBarInset = 0;
+    private boolean mClippingEnabled;
 
     public QSContainerImpl(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -147,11 +154,9 @@
         // bottom and footer are inside the screen.
         MarginLayoutParams layoutParams = (MarginLayoutParams) mQSPanelContainer.getLayoutParams();
 
-        // The footer is pinned to the bottom of QSPanel (same bottoms), therefore we don't need to
-        // subtract its height. We do not care if the collapsed notifications fit in the screen.
-        int maxQs = getDisplayHeight() - layoutParams.topMargin - layoutParams.bottomMargin
+        int availableScreenHeight = getDisplayHeight() - mNavBarInset;
+        int maxQs = availableScreenHeight - layoutParams.topMargin - layoutParams.bottomMargin
                 - getPaddingBottom();
-        maxQs -= mNavBarInset;
         int padding = mPaddingLeft + mPaddingRight + layoutParams.leftMargin
                 + layoutParams.rightMargin;
         final int qsPanelWidthSpec = getChildMeasureSpec(widthMeasureSpec, padding,
@@ -162,13 +167,22 @@
         int height = layoutParams.topMargin + layoutParams.bottomMargin
                 + mQSPanelContainer.getMeasuredHeight() + getPaddingBottom();
         super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
-                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
+                MeasureSpec.makeMeasureSpec(availableScreenHeight, MeasureSpec.EXACTLY));
         // QSCustomizer will always be the height of the screen, but do this after
         // other measuring to avoid changing the height of the QS.
         mQSCustomizer.measure(widthMeasureSpec,
                 MeasureSpec.makeMeasureSpec(getDisplayHeight(), MeasureSpec.EXACTLY));
     }
 
+    @Override
+    public void dispatchDraw(Canvas canvas) {
+        if (!mFancyClippingPath.isEmpty()) {
+            canvas.translate(0, -getTranslationY());
+            canvas.clipOutPath(mFancyClippingPath);
+            canvas.translate(0, getTranslationY());
+        }
+        super.dispatchDraw(canvas);
+    }
 
     @Override
     protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
@@ -187,6 +201,7 @@
         super.onLayout(changed, left, top, right, bottom);
         updateExpansion(mAnimateBottomOnNextLayout /* animate */);
         mAnimateBottomOnNextLayout = false;
+        updateClippingPath();
     }
 
     public void disable(int state1, int state2, boolean animate) {
@@ -206,6 +221,12 @@
         layoutParams.topMargin = mContext.getResources().getDimensionPixelSize(
                 com.android.internal.R.dimen.quick_qs_offset_height);
         mQSPanelContainer.setLayoutParams(layoutParams);
+        mQSPanelContainer.setPaddingRelative(
+                mQSPanelContainer.getPaddingStart(),
+                mQSPanelContainer.getPaddingTop(),
+                mQSPanelContainer.getPaddingEnd(),
+                mContext.getResources().getDimensionPixelSize(R.dimen.qs_container_bottom_padding)
+        );
 
         mSideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings);
         int padding = getResources().getDimensionPixelSize(
@@ -237,6 +258,8 @@
         int scrollBottom = calculateContainerBottom();
         setBottom(getTop() + height);
         mQSDetail.setBottom(getTop() + scrollBottom);
+        int qsDetailBottomMargin = ((MarginLayoutParams) mQSDetail.getLayoutParams()).bottomMargin;
+        mQSDetail.setBottom(getTop() + scrollBottom - qsDetailBottomMargin);
         mBackground.setTop(mQSPanelContainer.getTop());
         updateBackgroundBottom(scrollBottom, animate);
     }
@@ -273,6 +296,7 @@
 
     public void setExpansion(float expansion) {
         mQsExpansion = expansion;
+        mQSPanelContainer.setScrollingEnabled(expansion > 0.0f);
         updateExpansion();
     }
 
@@ -310,4 +334,46 @@
         }
         return mSizePoint.y;
     }
+
+    /**
+     * Clip QS bottom using a concave shape.
+     */
+    public void setFancyClipping(int top, int bottom, int radius, boolean enabled) {
+        boolean updatePath = false;
+        if (mFancyClippingRadii[0] != radius) {
+            mFancyClippingRadii[0] = radius;
+            mFancyClippingRadii[1] = radius;
+            mFancyClippingRadii[2] = radius;
+            mFancyClippingRadii[3] = radius;
+            updatePath = true;
+        }
+        if (mFancyClippingTop != top) {
+            mFancyClippingTop = top;
+            updatePath = true;
+        }
+        if (mFancyClippingBottom != bottom) {
+            mFancyClippingBottom = bottom;
+            updatePath = true;
+        }
+        if (mClippingEnabled != enabled) {
+            mClippingEnabled = enabled;
+            updatePath = true;
+        }
+
+        if (updatePath) {
+            updateClippingPath();
+        }
+    }
+
+    private void updateClippingPath() {
+        mFancyClippingPath.reset();
+        if (!mClippingEnabled) {
+            invalidate();
+            return;
+        }
+
+        mFancyClippingPath.addRoundRect(0, mFancyClippingTop, getWidth(),
+                mFancyClippingBottom, mFancyClippingRadii, Path.Direction.CW);
+        invalidate();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
index 980024e..05197e4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
@@ -150,6 +150,12 @@
 
     public void updateResources() {
         updateDetailText();
+        MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();
+        lp.topMargin = mContext.getResources().getDimensionPixelSize(
+                com.android.internal.R.dimen.quick_qs_offset_height);
+        lp.bottomMargin = mContext.getResources().getDimensionPixelSize(
+                R.dimen.qs_container_bottom_padding);
+        setLayoutParams(lp);
     }
 
     public boolean isClosingDetail() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
index c4986cc..40967ed 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
@@ -195,10 +195,10 @@
         mExpandClickListener = onClickListener;
     }
 
-    void setExpanded(boolean expanded, boolean isTunerEnabled) {
+    void setExpanded(boolean expanded, boolean isTunerEnabled, boolean multiUserEnabled) {
         if (mExpanded == expanded) return;
         mExpanded = expanded;
-        updateEverything(isTunerEnabled);
+        updateEverything(isTunerEnabled, multiUserEnabled);
     }
 
     /** */
@@ -251,16 +251,16 @@
         info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND);
     }
 
-    void disable(int state2, boolean isTunerEnabled) {
+    void disable(int state2, boolean isTunerEnabled, boolean multiUserEnabled) {
         final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
         if (disabled == mQsDisabled) return;
         mQsDisabled = disabled;
-        updateEverything(isTunerEnabled);
+        updateEverything(isTunerEnabled, multiUserEnabled);
     }
 
-    void updateEverything(boolean isTunerEnabled) {
+    void updateEverything(boolean isTunerEnabled, boolean multiUserEnabled) {
         post(() -> {
-            updateVisibilities(isTunerEnabled);
+            updateVisibilities(isTunerEnabled, multiUserEnabled);
             updateClickabilities();
             setClickable(false);
         });
@@ -273,18 +273,19 @@
         mBuildText.setLongClickable(mBuildText.getVisibility() == View.VISIBLE);
     }
 
-    private void updateVisibilities(boolean isTunerEnabled) {
+    private void updateVisibilities(boolean isTunerEnabled, boolean multiUserEnabled) {
         mSettingsContainer.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
         mTunerIcon.setVisibility(isTunerEnabled ? View.VISIBLE : View.INVISIBLE);
         final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
-        mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.GONE);
+        mMultiUserSwitch.setVisibility(
+                showUserSwitcher(multiUserEnabled) ? View.VISIBLE : View.GONE);
         mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
 
         mBuildText.setVisibility(mExpanded && mShouldShowBuildText ? View.VISIBLE : View.INVISIBLE);
     }
 
-    private boolean showUserSwitcher() {
-        return mExpanded && mMultiUserSwitch.isMultiUserEnabled();
+    private boolean showUserSwitcher(boolean multiUserEnabled) {
+        return mExpanded && multiUserEnabled;
     }
 
     void onUserInfoChanged(Drawable picture, boolean isGuestUser) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
index 74ae3a6..1fa9260 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
@@ -38,7 +38,7 @@
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.qs.dagger.QSScope;
 import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.MultiUserSwitch;
+import com.android.systemui.statusbar.phone.MultiUserSwitchController;
 import com.android.systemui.statusbar.phone.SettingsButton;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.UserInfoController;
@@ -60,16 +60,15 @@
     private final DeviceProvisionedController mDeviceProvisionedController;
     private final UserTracker mUserTracker;
     private final QSPanelController mQsPanelController;
-    private final QSDetailDisplayer mQsDetailDisplayer;
     private final QuickQSPanelController mQuickQSPanelController;
     private final TunerService mTunerService;
     private final MetricsLogger mMetricsLogger;
     private final FalsingManager mFalsingManager;
+    private final MultiUserSwitchController mMultiUserSwitchController;
     private final SettingsButton mSettingsButton;
     private final View mSettingsButtonContainer;
     private final TextView mBuildText;
     private final View mEdit;
-    private final MultiUserSwitch mMultiUserSwitch;
     private final PageIndicator mPageIndicator;
     private final View mPowerMenuLite;
     private final boolean mShowPMLiteButton;
@@ -135,7 +134,8 @@
     QSFooterViewController(QSFooterView view, UserManager userManager,
             UserInfoController userInfoController, ActivityStarter activityStarter,
             DeviceProvisionedController deviceProvisionedController, UserTracker userTracker,
-            QSPanelController qsPanelController, QSDetailDisplayer qsDetailDisplayer,
+            QSPanelController qsPanelController,
+            MultiUserSwitchController multiUserSwitchController,
             QuickQSPanelController quickQSPanelController,
             TunerService tunerService, MetricsLogger metricsLogger, FalsingManager falsingManager,
             @Named(PM_LITE_ENABLED) boolean showPMLiteButton,
@@ -147,17 +147,16 @@
         mDeviceProvisionedController = deviceProvisionedController;
         mUserTracker = userTracker;
         mQsPanelController = qsPanelController;
-        mQsDetailDisplayer = qsDetailDisplayer;
         mQuickQSPanelController = quickQSPanelController;
         mTunerService = tunerService;
         mMetricsLogger = metricsLogger;
         mFalsingManager = falsingManager;
+        mMultiUserSwitchController = multiUserSwitchController;
 
         mSettingsButton = mView.findViewById(R.id.settings_button);
         mSettingsButtonContainer = mView.findViewById(R.id.settings_button_container);
         mBuildText = mView.findViewById(R.id.build);
         mEdit = mView.findViewById(android.R.id.edit);
-        mMultiUserSwitch = mView.findViewById(R.id.multi_user_switch);
         mPageIndicator = mView.findViewById(R.id.footer_page_indicator);
         mPowerMenuLite = mView.findViewById(R.id.pm_lite);
         mShowPMLiteButton = showPMLiteButton;
@@ -165,6 +164,12 @@
     }
 
     @Override
+    protected void onInit() {
+        super.onInit();
+        mMultiUserSwitchController.init();
+    }
+
+    @Override
     protected void onViewAttached() {
         if (mShowPMLiteButton) {
             mPowerMenuLite.setVisibility(View.VISIBLE);
@@ -199,9 +204,8 @@
                     mQsPanelController.showEdit(view));
         });
 
-        mMultiUserSwitch.setQSDetailDisplayer(mQsDetailDisplayer);
         mQsPanelController.setFooterPageIndicator(mPageIndicator);
-        mView.updateEverything(isTunerEnabled());
+        mView.updateEverything(isTunerEnabled(), mMultiUserSwitchController.isMultiUserEnabled());
     }
 
     @Override
@@ -217,10 +221,10 @@
     @Override
     public void setExpanded(boolean expanded) {
         mExpanded = expanded;
-        mView.setExpanded(expanded, isTunerEnabled());
+        mView.setExpanded(
+                expanded, isTunerEnabled(), mMultiUserSwitchController.isMultiUserEnabled());
     }
 
-
     @Override
     public int getHeight() {
         return mView.getHeight();
@@ -258,7 +262,7 @@
 
     @Override
     public void disable(int state1, int state2, boolean animate) {
-        mView.disable(state2, isTunerEnabled());
+        mView.disable(state2, isTunerEnabled(), mMultiUserSwitchController.isMultiUserEnabled());
     }
 
     private void startSettingsActivity() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index b95194a..d5cb777 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -107,6 +107,11 @@
     private QuickQSPanelController mQuickQSPanelController;
     private QSCustomizerController mQSCustomizerController;
     private FeatureFlags mFeatureFlags;
+    /**
+     * When true, QS will translate from outside the screen. It will be clipped with parallax
+     * otherwise.
+     */
+    private boolean mTranslateWhileExpanding;
 
     @Inject
     public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
@@ -254,6 +259,13 @@
         }
     }
 
+    @Override
+    public void setFancyClipping(int top, int bottom, int cornerRadius, boolean visible) {
+        if (getView() instanceof QSContainerImpl) {
+            ((QSContainerImpl) getView()).setFancyClipping(top, bottom, cornerRadius, visible);
+        }
+    }
+
     private void setEditLocation(View view) {
         View edit = view.findViewById(android.R.id.edit);
         int[] loc = edit.getLocationOnScreen();
@@ -394,16 +406,23 @@
     }
 
     @Override
+    public void setTranslateWhileExpanding(boolean shouldTranslate) {
+        mTranslateWhileExpanding = shouldTranslate;
+        mQSAnimator.setTranslateWhileExpanding(shouldTranslate);
+    }
+
+    @Override
     public void setQsExpansion(float expansion, float headerTranslation) {
         if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + headerTranslation);
 
         if (mQSAnimator != null) {
             final boolean showQSOnLockscreen = expansion > 0;
-            final boolean showQSUnlocked = headerTranslation == 0;
+            final boolean showQSUnlocked = headerTranslation == 0 || !mTranslateWhileExpanding;
             mQSAnimator.startAlphaAnimation(showQSOnLockscreen || showQSUnlocked);
         }
         mContainer.setExpansion(expansion);
-        final float translationScaleY = expansion - 1;
+        final float translationScaleY = (mTranslateWhileExpanding
+                ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1);
         boolean onKeyguardAndExpanded = isKeyguardShowing() && !mShowCollapsedOnKeyguard;
         if (!mHeaderAnimating && !headerWillBeAnimating()) {
             getView().setTranslationY(
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index f89e70a..f7b6686 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -138,7 +138,7 @@
 
             mHorizontalTileLayout = createHorizontalTileLayout();
             LayoutParams lp = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
-            int marginSize = (int) mContext.getResources().getDimension(R.dimen.qqs_media_spacing);
+            int marginSize = (int) mContext.getResources().getDimension(R.dimen.qs_media_padding);
             lp.setMarginStart(0);
             lp.setMarginEnd(marginSize);
             lp.gravity = Gravity.CENTER_VERTICAL;
@@ -301,12 +301,6 @@
     protected void updatePadding() {
         final Resources res = mContext.getResources();
         int padding = res.getDimensionPixelSize(R.dimen.qs_panel_padding_top);
-        if (mUsingHorizontalLayout) {
-            // When using the horizontal layout, our space is quite constrained. We therefore
-            // reduce some of the padding on the top, which makes the brightness bar overlapp,
-            // but since that has naturally quite a bit of built in padding, that's fine.
-            padding = (int) (padding * 0.6f);
-        }
         setPaddingRelative(getPaddingStart(),
                 padding,
                 getPaddingEnd(),
@@ -326,6 +320,7 @@
         super.onConfigurationChanged(newConfig);
         mOnConfigurationChangedListeners.forEach(
                 listener -> listener.onConfigurationChange(newConfig));
+        switchSecurityFooter();
     }
 
     @Override
@@ -364,19 +359,25 @@
         switchToParent((View) newLayout, parent, index);
         index++;
 
-        if (mSecurityFooter != null) {
-            if (mUsingHorizontalLayout && mHeaderContainer != null) {
-                // Adding the security view to the header, that enables us to avoid scrolling
-                switchToParent(mSecurityFooter, mHeaderContainer, 0);
-            } else {
-                switchToParent(mSecurityFooter, parent, index);
-                index++;
-            }
-        }
-
         if (mFooter != null) {
             // Then the footer with the settings
             switchToParent(mFooter, parent, index);
+            index++;
+        }
+
+        // The security footer is switched on orientation changes
+    }
+
+    private void switchSecurityFooter() {
+        if (mSecurityFooter != null) {
+            if (mContext.getResources().getConfiguration().orientation
+                    == Configuration.ORIENTATION_LANDSCAPE && mHeaderContainer != null
+                    && !mSecurityFooter.getParent().equals(mHeaderContainer)) {
+                // Adding the security view to the header, that enables us to avoid scrolling
+                switchToParent(mSecurityFooter, mHeaderContainer, 0);
+            } else {
+                switchToParent(mSecurityFooter, this, -1);
+            }
         }
     }
 
@@ -668,6 +669,7 @@
 
     public void setSecurityFooter(View view) {
         mSecurityFooter = view;
+        switchSecurityFooter();
     }
 
     void setUsingHorizontalLayout(boolean horizontal, ViewGroup mediaHostView, boolean force,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index 925c9eb..e40f293 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -210,7 +210,7 @@
         final String spec = CustomTile.toSpec(tile);
         for (TileRecord record : mRecords) {
             if (record.tile.getTileSpec().equals(spec)) {
-                record.tile.click();
+                record.tile.click(null /* view */);
                 break;
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 670475f..baf781d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -16,6 +16,8 @@
 package com.android.systemui.qs;
 
 import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 
 import static com.android.systemui.qs.dagger.QSFragmentModule.QS_SECURITY_FOOTER_VIEW;
 
@@ -26,6 +28,8 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.UserInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.Looper;
@@ -68,7 +72,6 @@
 
     private final View mRootView;
     private final TextView mFooterText;
-    private final ImageView mFooterIcon;
     private final ImageView mPrimaryFooterIcon;
     private final Context mContext;
     private final Callback mCallback = new Callback();
@@ -83,7 +86,6 @@
 
     private boolean mIsVisible;
     private CharSequence mFooterTextContent = null;
-    private int mFooterTextId;
     private int mFooterIconId;
     private Drawable mPrimaryFooterIconDrawable;
 
@@ -94,7 +96,6 @@
         mRootView = rootView;
         mRootView.setOnClickListener(this);
         mFooterText = mRootView.findViewById(R.id.footer_text);
-        mFooterIcon = mRootView.findViewById(R.id.footer_icon);
         mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon);
         mFooterIconId = R.drawable.ic_info_outline;
         mContext = rootView.getContext();
@@ -120,6 +121,23 @@
 
     public void onConfigurationChanged() {
         FontSizeUtils.updateFontSize(mFooterText, R.dimen.qs_tile_text_size);
+
+        Resources r = mContext.getResources();
+
+        mFooterText.setMaxLines(r.getInteger(R.integer.qs_security_footer_maxLines));
+        int padding = r.getDimensionPixelSize(R.dimen.qs_footer_padding);
+        mRootView.setPaddingRelative(padding, padding, padding, padding);
+
+        int verticalMargin = r.getDimensionPixelSize(R.dimen.qs_security_footer_vertical_margin);
+        ViewGroup.MarginLayoutParams lp =
+                (ViewGroup.MarginLayoutParams) mRootView.getLayoutParams();
+        lp.topMargin = verticalMargin;
+        lp.bottomMargin = verticalMargin;
+        lp.width = r.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
+                ? MATCH_PARENT : WRAP_CONTENT;
+        mRootView.setLayoutParams(lp);
+
+        mRootView.setBackground(mContext.getDrawable(R.drawable.qs_security_footer_background));
     }
 
     public View getView() {
@@ -189,7 +207,6 @@
         }
         if (mFooterIconId != footerIconId) {
             mFooterIconId = footerIconId;
-            mMainHandler.post(mUpdateIcon);
         }
 
         // Update the primary icon
@@ -315,7 +332,7 @@
         mDialog.setView(createDialogView());
 
         mDialog.show();
-        mDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
+        mDialog.getWindow().setLayout(MATCH_PARENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT);
     }
 
@@ -575,19 +592,14 @@
                 == DEVICE_OWNER_TYPE_FINANCED;
     }
 
-    private final Runnable mUpdateIcon = new Runnable() {
-        @Override
-        public void run() {
-            mFooterIcon.setImageResource(mFooterIconId);
-        }
-    };
-
     private final Runnable mUpdatePrimaryIcon = new Runnable() {
         @Override
         public void run() {
-            mPrimaryFooterIcon.setVisibility(mPrimaryFooterIconDrawable != null
-                    ? View.VISIBLE : View.GONE);
-            mPrimaryFooterIcon.setImageDrawable(mPrimaryFooterIconDrawable);
+            if (mPrimaryFooterIconDrawable != null) {
+                mPrimaryFooterIcon.setImageDrawable(mPrimaryFooterIconDrawable);
+            } else {
+                mPrimaryFooterIcon.setImageResource(mFooterIconId);
+            }
         }
     };
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 7123e49..e3f00f4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -85,10 +85,13 @@
     private int mTopViewMeasureHeight;
 
     private final String mMobileSlotName;
+    private final String mCallStrengthSlotName;
 
     public QuickStatusBarHeader(Context context, AttributeSet attrs) {
         super(context, attrs);
         mMobileSlotName = context.getString(com.android.internal.R.string.status_bar_no_calling);
+        mCallStrengthSlotName =
+                context.getString(com.android.internal.R.string.status_bar_call_strength);
     }
 
     /**
@@ -218,28 +221,38 @@
     }
 
     private void updateAlphaAnimator() {
-        StatusBarIconView icon =
+        StatusBarIconView noCallingIcon =
                 ((StatusBarIconView) mIconContainer.getViewForSlot(mMobileSlotName));
+        StatusBarIconView callStrengthIcon =
+                ((StatusBarIconView) mIconContainer.getViewForSlot(mCallStrengthSlotName));
         TouchAnimator.Builder builder = new TouchAnimator.Builder()
                 .addFloat(mQSCarriers, "alpha", 0, 1)
                 .addFloat(mDatePrivacyView, "alpha", 0, mDatePrivacyAlpha);
-        if (icon != null) {
-            builder.addFloat(icon, "alpha", 1, 0);
+        if (noCallingIcon != null || callStrengthIcon != null) {
+            if (noCallingIcon != null) {
+                builder.addFloat(noCallingIcon, "alpha", 1, 0);
+            }
+            if (callStrengthIcon != null) {
+                builder.addFloat(callStrengthIcon, "alpha", 1, 0);
+            }
             builder.setListener(new TouchAnimator.ListenerAdapter() {
                 @Override
                 public void onAnimationAtEnd() {
                     mIconContainer.addIgnoredSlot(mMobileSlotName);
+                    mIconContainer.addIgnoredSlot(mCallStrengthSlotName);
                 }
 
                 @Override
                 public void onAnimationStarted() {
                     mIconContainer.removeIgnoredSlot(mMobileSlotName);
+                    mIconContainer.removeIgnoredSlot(mCallStrengthSlotName);
                 }
 
                 @Override
                 public void onAnimationAtStart() {
                     super.onAnimationAtStart();
                     mIconContainer.removeIgnoredSlot(mMobileSlotName);
+                    mIconContainer.removeIgnoredSlot(mCallStrengthSlotName);
                 }
             });
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFlagsModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFlagsModule.java
index a1e1d64..6fa44eb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFlagsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFlagsModule.java
@@ -34,6 +34,7 @@
     String RBC_AVAILABLE = "rbc_available";
     String PM_LITE_ENABLED = "pm_lite";
     String PM_LITE_SETTING = "sysui_pm_lite";
+    int PM_LITE_SETTING_DEFAULT = 1;
 
     /** */
     @Provides
@@ -47,6 +48,7 @@
     @SysUISingleton
     @Named(PM_LITE_ENABLED)
     static boolean isPMLiteEnabled(FeatureFlags featureFlags, GlobalSettings globalSettings) {
-        return featureFlags.isPMLiteEnabled() && globalSettings.getInt(PM_LITE_SETTING, 0) != 0;
+        return featureFlags.isPMLiteEnabled()
+                && globalSettings.getInt(PM_LITE_SETTING, PM_LITE_SETTING_DEFAULT) != 0;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
index 3a5adce..34aac49 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
@@ -34,6 +34,7 @@
 import com.android.systemui.qs.QuickQSPanel;
 import com.android.systemui.qs.QuickStatusBarHeader;
 import com.android.systemui.qs.customize.QSCustomizer;
+import com.android.systemui.statusbar.phone.MultiUserSwitch;
 
 import javax.inject.Named;
 
@@ -74,6 +75,12 @@
 
     /** */
     @Provides
+    static MultiUserSwitch providesMultiUserSWitch(QSFooterView qsFooterView) {
+        return qsFooterView.findViewById(R.id.multi_user_switch);
+    }
+
+    /** */
+    @Provides
     static QSPanel provideQSPanel(@RootView View view) {
         return view.findViewById(R.id.quick_settings_panel);
     }
@@ -129,7 +136,7 @@
             @QSThemedContext LayoutInflater layoutInflater,
             QSPanel qsPanel
     ) {
-        return layoutInflater.inflate(R.layout.quick_settings_footer, qsPanel, false);
+        return layoutInflater.inflate(R.layout.quick_settings_security_footer, qsPanel, false);
     }
 
     /** */
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
index 1699a34..10eea82 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -40,10 +40,12 @@
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.view.IWindowManager;
+import android.view.View;
 import android.view.WindowManagerGlobal;
 import android.widget.Switch;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -311,7 +313,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (mTile.getState() == Tile.STATE_UNAVAILABLE) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java
index 2c17b87..962537a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java
@@ -16,11 +16,17 @@
 
 import android.content.Context;
 import android.util.AttributeSet;
+import android.view.View;
 import android.widget.Button;
 import android.widget.RelativeLayout;
 
+/**
+ * Used for QS tile labels
+ */
 public class ButtonRelativeLayout extends RelativeLayout {
 
+    private View mIgnoredView;
+
     public ButtonRelativeLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
@@ -29,4 +35,27 @@
     public CharSequence getAccessibilityClassName() {
         return Button.class.getName();
     }
+
+    /**
+     * Set a view to be ignored for measure.
+     *
+     * The view will be measured and laid out, but its size will be subtracted from the total size
+     * of this view. It assumes that this view only contributes vertical height.
+     */
+    public void setIgnoredView(View view) {
+        if (mIgnoredView == null || mIgnoredView.getParent() == this) {
+            mIgnoredView = view;
+        }
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        if (mIgnoredView != null && mIgnoredView.getVisibility() != GONE) {
+            int height = mIgnoredView.getMeasuredHeight();
+            MarginLayoutParams lp = (MarginLayoutParams) mIgnoredView.getLayoutParams();
+            height = height - lp.bottomMargin - lp.topMargin;
+            setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() - height);
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
index 7e72f1a..c973e8c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
@@ -170,7 +170,7 @@
 
     @Override
     public void init(QSTile tile) {
-        init(v -> tile.click(), v -> tile.secondaryClick(), view -> {
+        init(v -> tile.click(this), v -> tile.secondaryClick(this), view -> {
             tile.longClick(this);
             return true;
         });
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index ba69dd5..5ff785d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -31,7 +31,6 @@
 
 import android.annotation.CallSuper;
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
@@ -46,6 +45,7 @@
 import android.util.SparseArray;
 import android.view.View;
 
+import androidx.annotation.Nullable;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.LifecycleRegistry;
@@ -135,8 +135,10 @@
      * Handles clicks by the user.
      *
      * Calls to the controller should be made here to set the new state of the device.
+     *
+     * @param view The view that was clicked.
      */
-    abstract protected void handleClick();
+    protected abstract void handleClick(@Nullable View view);
 
     /**
      * Update state of the tile based on device state
@@ -272,7 +274,7 @@
         mHandler.sendEmptyMessage(H.REMOVE_CALLBACKS);
     }
 
-    public void click() {
+    public void click(@Nullable View view) {
         mMetricsLogger.write(populate(new LogMaker(ACTION_QS_CLICK).setType(TYPE_ACTION)
                 .addTaggedData(FIELD_STATUS_BAR_STATE,
                         mStatusBarStateController.getState())));
@@ -280,11 +282,11 @@
                 getInstanceId());
         mQSLogger.logTileClick(mTileSpec, mStatusBarStateController.getState(), mState.state);
         if (!mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
-            mHandler.sendEmptyMessage(H.CLICK);
+            mHandler.obtainMessage(H.CLICK, view).sendToTarget();
         }
     }
 
-    public void secondaryClick() {
+    public void secondaryClick(@Nullable View view) {
         mMetricsLogger.write(populate(new LogMaker(ACTION_QS_SECONDARY_CLICK).setType(TYPE_ACTION)
                 .addTaggedData(FIELD_STATUS_BAR_STATE,
                         mStatusBarStateController.getState())));
@@ -292,7 +294,7 @@
                 getInstanceId());
         mQSLogger.logTileSecondaryClick(mTileSpec, mStatusBarStateController.getState(),
                 mState.state);
-        mHandler.sendEmptyMessage(H.SECONDARY_CLICK);
+        mHandler.obtainMessage(H.SECONDARY_CLICK, view).sendToTarget();
     }
 
     @Override
@@ -370,10 +372,12 @@
      * Handles secondary click on the tile.
      *
      * Defaults to {@link QSTileImpl#handleClick}
+     *
+     * @param view The view that was clicked.
      */
-    protected void handleSecondaryClick() {
+    protected void handleSecondaryClick(@Nullable View view) {
         // Default to normal click.
-        handleClick();
+        handleClick(view);
     }
 
     /**
@@ -616,11 +620,11 @@
                                 mContext, mEnforcedAdmin);
                         mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
                     } else {
-                        handleClick();
+                        handleClick((View) msg.obj);
                     }
                 } else if (msg.what == SECONDARY_CLICK) {
                     name = "handleSecondaryClick";
-                    handleSecondaryClick();
+                    handleSecondaryClick((View) msg.obj);
                 } else if (msg.what == LONG_CLICK) {
                     name = "handleLongClick";
                     handleLongClick((View) msg.obj);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
index 3d5a709..50417e9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
@@ -22,7 +22,6 @@
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -44,7 +43,7 @@
     protected TextView mSecondLine;
     private ImageView mPadLock;
     protected int mState;
-    protected ViewGroup mLabelContainer;
+    protected ButtonRelativeLayout mLabelContainer;
     private View mExpandIndicator;
     private View mExpandSpace;
     protected ColorStateList mColorLabelActive;
@@ -92,7 +91,7 @@
     }
 
     protected void createLabel() {
-        mLabelContainer = (ViewGroup) LayoutInflater.from(getContext())
+        mLabelContainer = (ButtonRelativeLayout) LayoutInflater.from(getContext())
                 .inflate(R.layout.qs_tile_label, this, false);
         mLabelContainer.setClipChildren(false);
         mLabelContainer.setClipToPadding(false);
@@ -140,7 +139,7 @@
         }
         if (!Objects.equals(mSecondLine.getText(), state.secondaryLabel)) {
             mSecondLine.setText(state.secondaryLabel);
-            mSecondLine.setVisibility(TextUtils.isEmpty(state.secondaryLabel) || mCollapsedView
+            mSecondLine.setVisibility(TextUtils.isEmpty(state.secondaryLabel)
                     ? View.GONE : View.VISIBLE);
         }
         boolean dualTarget = mDualTargetAllowed && state.dualTarget;
@@ -193,4 +192,9 @@
     public View getLabelContainer() {
         return mLabelContainer;
     }
+
+    @Override
+    public View getSecondaryLabel() {
+        return mSecondLine;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt
index b953323..70d51ee 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt
@@ -25,6 +25,7 @@
 import android.service.quicksettings.Tile.STATE_ACTIVE
 import android.view.Gravity
 import android.view.View
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
 import android.widget.ImageView
 import android.widget.LinearLayout
 import android.widget.RelativeLayout
@@ -43,7 +44,7 @@
     private var paintColor = Color.WHITE
     private var paintAnimator: ValueAnimator? = null
     private var labelAnimator: ValueAnimator? = null
-    private var mSideView: ImageView = ImageView(mContext)
+    private var sideView: ImageView = ImageView(mContext)
     override var heightOverride: Int = HeightOverrideable.NO_OVERRIDE
 
     init {
@@ -59,13 +60,14 @@
         val iconSize = context.resources.getDimensionPixelSize(R.dimen.qs_icon_size)
         addView(mIcon, 0, LayoutParams(iconSize, iconSize))
 
-        mSideView.visibility = View.GONE
-        addView(
-                mSideView,
-                -1,
-                LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply {
-                    gravity = Gravity.CENTER_VERTICAL
-        })
+        sideView.visibility = View.GONE
+        val sideViewLayoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
+            gravity = Gravity.CENTER_VERTICAL
+            marginStart = context.resources.getDimensionPixelSize(R.dimen.qs_label_container_margin)
+        }
+        addView(sideView, -1, sideViewLayoutParams)
+        sideView.adjustViewBounds = true
+        sideView.scaleType = ImageView.ScaleType.FIT_CENTER
 
         mColorLabelActive = ColorStateList.valueOf(getColorForState(getContext(), STATE_ACTIVE))
         changeLabelColor(getLabelColor(mState)) // Matches the default state of the tile
@@ -89,16 +91,17 @@
         mLabelContainer.setPadding(0, 0, 0, 0)
         (mLabelContainer.layoutParams as MarginLayoutParams).apply {
             marginStart = context.resources.getDimensionPixelSize(R.dimen.qs_label_container_margin)
+            marginEnd = 0
+            gravity = Gravity.CENTER_VERTICAL or Gravity.START
         }
         mLabel.gravity = Gravity.START
         mLabel.textDirection = TEXT_DIRECTION_LOCALE
         mSecondLine.gravity = Gravity.START
         mSecondLine.textDirection = TEXT_DIRECTION_LOCALE
 
-        (mLabelContainer.layoutParams as LayoutParams).gravity =
-            Gravity.CENTER_VERTICAL or Gravity.START
         if (mCollapsedView) {
-            mSecondLine.visibility = GONE
+            mSecondLine.alpha = 0f
+            mLabelContainer.setIgnoredView(mSecondLine)
         }
     }
 
@@ -183,9 +186,7 @@
 
     private fun setLabelsColor(color: ColorStateList) {
         mLabel.setTextColor(color)
-        if (!mCollapsedView) {
-            mSecondLine.setTextColor(color)
-        }
+        mSecondLine.setTextColor(color)
     }
 
     private fun clearBackgroundAnimator() {
@@ -198,19 +199,17 @@
 
     private fun loadSideViewDrawableIfNecessary(state: QSTile.State) {
         if (state.sideViewDrawable != null) {
-            (mSideView.layoutParams as MarginLayoutParams).apply {
-                marginStart =
-                        context.resources.getDimensionPixelSize(R.dimen.qs_label_container_margin)
-            }
-            mSideView.setImageDrawable(state.sideViewDrawable)
-            mSideView.visibility = View.VISIBLE
-            mSideView.adjustViewBounds = true
-            mSideView.scaleType = ImageView.ScaleType.FIT_CENTER
+            sideView.setImageDrawable(state.sideViewDrawable)
+            sideView.visibility = View.VISIBLE
         } else {
-            mSideView.setImageDrawable(null)
-            mSideView.visibility = GONE
+            sideView.setImageDrawable(null)
+            sideView.visibility = GONE
         }
     }
 
     override fun handleExpand(dualTarget: Boolean) {}
+
+    override fun getSecondaryIcon(): View {
+        return sideView
+    }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
index 07abb90..22cd6f8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
@@ -29,8 +29,11 @@
 import android.service.quicksettings.Tile;
 import android.sysprop.TelephonyProperties;
 import android.telephony.TelephonyManager;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -92,7 +95,7 @@
     }
 
     @Override
-    public void handleClick() {
+    public void handleClick(@Nullable View view) {
         boolean airplaneModeEnabled = mState.value;
         MetricsLogger.action(mContext, getMetricsCategory(), !airplaneModeEnabled);
         if (!airplaneModeEnabled && TelephonyProperties.in_ecm_mode().orElse(false)) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt
index 2945c6b..c2a6255 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt
@@ -9,9 +9,11 @@
 import android.service.quicksettings.Tile
 import android.text.TextUtils
 import android.text.format.DateFormat
+import android.view.View
 import androidx.annotation.VisibleForTesting
 import com.android.internal.logging.MetricsLogger
 import com.android.systemui.R
+import com.android.systemui.animation.ActivityLaunchAnimator
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.plugins.ActivityStarter
@@ -73,14 +75,15 @@
         }
     }
 
-    private fun startDefaultSetAlarm() {
-        mActivityStarter.postStartActivityDismissingKeyguard(defaultIntent, 0)
-    }
-
-    override fun handleClick() {
-        lastAlarmInfo?.showIntent?.let {
-                mActivityStarter.postStartActivityDismissingKeyguard(it)
-        } ?: startDefaultSetAlarm()
+    override fun handleClick(view: View?) {
+        val animationController = view?.let { ActivityLaunchAnimator.Controller.fromView(it) }
+        val pendingIntent = lastAlarmInfo?.showIntent
+        if (pendingIntent != null) {
+            mActivityStarter.postStartActivityDismissingKeyguard(pendingIntent, animationController)
+        } else {
+            mActivityStarter.postStartActivityDismissingKeyguard(defaultIntent, 0,
+                    animationController)
+        }
     }
 
     override fun handleUpdateState(state: QSTile.State, arg: Any?) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
index 49d3ff9..e3024fa 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
@@ -20,8 +20,11 @@
 import android.os.Looper;
 import android.provider.Settings.Secure;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -120,7 +123,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (getState().state == Tile.STATE_UNAVAILABLE) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index 56df4d8..65b6617 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.qs.tiles;
 
-import android.annotation.Nullable;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothClass;
 import android.bluetooth.BluetoothDevice;
@@ -33,6 +32,8 @@
 import android.view.ViewGroup;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settingslib.Utils;
@@ -96,7 +97,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         // Secondary clicks are header clicks, just toggle.
         final boolean isEnabled = mState.value;
         // Immediately enter transient enabling state when turning bluetooth on.
@@ -110,7 +111,7 @@
     }
 
     @Override
-    protected void handleSecondaryClick() {
+    protected void handleSecondaryClick(@Nullable View view) {
         if (!mController.canConfigBluetooth()) {
             mActivityStarter.postStartActivityDismissingKeyguard(
                     new Intent(Settings.ACTION_BLUETOOTH_SETTINGS), 0);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java
index e055585..45c7174 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CameraToggleTile.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.qs.tiles;
 
-import static android.content.pm.PackageManager.FEATURE_CAMERA_TOGGLE;
 import static android.hardware.SensorPrivacyManager.Sensors.CAMERA;
 
 import static com.android.systemui.DejankUtils.whitelistIpcs;
@@ -63,7 +62,7 @@
 
     @Override
     public boolean isAvailable() {
-        return getHost().getContext().getPackageManager().hasSystemFeature(FEATURE_CAMERA_TOGGLE)
+        return mSensorPrivacyController.supportsSensorToggle(CAMERA)
                 && whitelistIpcs(() -> DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
                 "camera_toggle_enabled",
                 true));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index d78dbae9..4b13015 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -33,6 +33,8 @@
 import android.view.WindowManager.LayoutParams;
 import android.widget.Button;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.app.MediaRouteDialogPresenter;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -137,17 +139,12 @@
     }
 
     @Override
-    protected void handleSecondaryClick() {
-        handleClick();
+    protected void handleLongClick(@Nullable View view) {
+        handleClick(view);
     }
 
     @Override
-    protected void handleLongClick(View view) {
-        handleClick();
-    }
-
-    @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (getState().state == Tile.STATE_UNAVAILABLE) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 8cc6ff2..8e886e8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -37,6 +37,8 @@
 import android.view.WindowManager.LayoutParams;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settingslib.net.DataUsageController;
@@ -116,7 +118,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (getState().state == Tile.STATE_UNAVAILABLE) {
             return;
         }
@@ -157,7 +159,7 @@
     }
 
     @Override
-    protected void handleSecondaryClick() {
+    protected void handleSecondaryClick(@Nullable View view) {
         if (mDataController.isMobileDataSupported()) {
             showDetail(true);
         } else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
index ca7cf83..5e502cc 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
@@ -23,8 +23,11 @@
 import android.provider.Settings;
 import android.provider.Settings.Secure;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -115,7 +118,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         mSetting.setValue(mState.value ? 0 : 1);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
index 61376f0..5a11ff8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
@@ -20,8 +20,11 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.Prefs;
@@ -73,7 +76,7 @@
         return new Intent(Settings.ACTION_DATA_SAVER_SETTINGS);
     }
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (mState.value
                 || Prefs.getBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, false)) {
             // Do it right away.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt
index a2c7633..71f42d8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt
@@ -20,10 +20,11 @@
 import android.content.Intent
 import android.os.Handler
 import android.os.Looper
-import android.provider.Settings
 import android.service.quicksettings.Tile
+import android.view.View
 import com.android.internal.logging.MetricsLogger
 import com.android.systemui.R
+import com.android.systemui.animation.ActivityLaunchAnimator
 import com.android.systemui.controls.ControlsServiceInfo
 import com.android.systemui.controls.dagger.ControlsComponent
 import com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE
@@ -64,7 +65,6 @@
 ) {
 
     private var hasControlsApps = AtomicBoolean(false)
-    private val intent = Intent(Settings.ACTION_DEVICE_CONTROLS_SETTINGS)
 
     private val icon = ResourceIcon.get(R.drawable.ic_device_light)
 
@@ -89,23 +89,23 @@
     override fun newTileState(): QSTile.State {
         return QSTile.State().also {
             it.state = Tile.STATE_UNAVAILABLE // Start unavailable matching `hasControlsApps`
+            it.handlesLongClick = false
         }
     }
 
-    override fun handleDestroy() {
-        super.handleDestroy()
-    }
-
-    override fun handleClick() {
+    override fun handleClick(view: View?) {
         if (state.state == Tile.STATE_ACTIVE) {
             mUiHandler.post {
-                mHost.collapsePanels()
                 val i = Intent().apply {
                     component = ComponentName(mContext, ControlsActivity::class.java)
                     addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
                     putExtra(ControlsUiController.EXTRA_ANIMATE, true)
                 }
-                mContext.startActivity(i)
+
+                val animationController = view?.let {
+                    ActivityLaunchAnimator.Controller.fromView(it)
+                }
+                mActivityStarter.startActivity(i, true /* dismissShade */, animationController)
             }
         }
     }
@@ -133,10 +133,12 @@
         return 0
     }
 
-    override fun getLongClickIntent(): Intent {
-        return intent
+    override fun getLongClickIntent(): Intent? {
+        return null
     }
 
+    override fun handleLongClick(view: View?) {}
+
     override fun getTileLabel(): CharSequence {
         return mContext.getText(R.string.quick_controls_title)
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 4b96cf3..e896c7c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -45,6 +45,8 @@
 import android.widget.Switch;
 import android.widget.Toast;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settingslib.notification.EnableZenModeDialog;
@@ -137,7 +139,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         // Zen is currently on
         if (mState.value) {
             mController.setZen(ZEN_MODE_OFF, null, TAG);
@@ -191,7 +193,7 @@
     }
 
     @Override
-    protected void handleSecondaryClick() {
+    protected void handleSecondaryClick(@Nullable View view) {
         if (mController.isVolumeRestricted()) {
             // Collapse the panels, so the user can see the toast.
             mHost.collapsePanels();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
index b7cb615..c0065a0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
@@ -25,6 +25,8 @@
 import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -93,7 +95,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (ActivityManager.isUserAMonkey()) {
             return;
         }
@@ -108,8 +110,8 @@
     }
 
     @Override
-    protected void handleLongClick(View view) {
-        handleClick();
+    protected void handleLongClick(@Nullable View view) {
+        handleClick(view);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index 4e0f634..34f2b63 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.qs.tiles;
 
-import android.annotation.Nullable;
 import android.content.Intent;
 import android.os.Handler;
 import android.os.Looper;
@@ -24,8 +23,11 @@
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
 import android.util.Log;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -105,7 +107,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         final boolean isEnabled = mState.value;
         if (!isEnabled && mDataSaverController.isDataSaverEnabled()) {
             return;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
index 1a17e61..5dcbf49 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
@@ -29,8 +29,11 @@
 import android.text.Html;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settingslib.graph.SignalDrawable;
@@ -110,7 +113,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         mActivityStarter.postStartActivityDismissingKeyguard(INTERNET_PANEL, 0);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
index 830a1fd..6a018f6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
@@ -22,8 +22,11 @@
 import android.os.UserManager;
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -83,7 +86,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (mKeyguard.isMethodSecure() && mKeyguard.isShowing()) {
             mActivityStarter.postQSRunnableDismissingKeyguard(() -> {
                 final boolean wasEnabled = mState.value;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java
index 9c01bb9..48a1ad6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/MicrophoneToggleTile.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.qs.tiles;
 
-import static android.content.pm.PackageManager.FEATURE_MICROPHONE_TOGGLE;
 import static android.hardware.SensorPrivacyManager.Sensors.MICROPHONE;
 
 import static com.android.systemui.DejankUtils.whitelistIpcs;
@@ -63,8 +62,7 @@
 
     @Override
     public boolean isAvailable() {
-        return getHost().getContext().getPackageManager()
-                .hasSystemFeature(FEATURE_MICROPHONE_TOGGLE)
+        return mSensorPrivacyController.supportsSensorToggle(MICROPHONE)
                 && whitelistIpcs(() -> DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
                 "mic_toggle_enabled",
                 true));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
index 6ac2f9ae..cd2e27a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
@@ -27,8 +27,11 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -111,7 +114,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (getAdapter() == null) {
             return;
         }
@@ -123,11 +126,6 @@
     }
 
     @Override
-    protected void handleSecondaryClick() {
-        handleClick();
-    }
-
-    @Override
     public CharSequence getTileLabel() {
         return mContext.getString(R.string.quick_settings_nfc_label);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
index 5369086..81813db 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -18,7 +18,6 @@
 
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_MODE;
 
-import android.annotation.Nullable;
 import android.content.Intent;
 import android.hardware.display.ColorDisplayManager;
 import android.hardware.display.NightDisplayListener;
@@ -29,8 +28,10 @@
 import android.service.quicksettings.Tile;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
 import com.android.internal.logging.MetricsLogger;
@@ -107,7 +108,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         // Enroll in forced auto mode if eligible.
         if ("1".equals(Settings.Global.getString(mContext.getContentResolver(),
                 Settings.Global.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE))
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index 6f19276..ff830bc 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -30,12 +30,15 @@
 import android.service.quickaccesswallet.WalletCard;
 import android.service.quicksettings.Tile;
 import android.util.Log;
+import android.view.View;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
 import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.plugins.ActivityStarter;
@@ -117,21 +120,25 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
+        ActivityLaunchAnimator.Controller animationController =
+                view == null ? null : ActivityLaunchAnimator.Controller.fromView(view);
+
         mUiHandler.post(() -> {
-            mHost.collapsePanels();
             if (mHasCard) {
                 Intent intent = new Intent(mContext, WalletActivity.class)
                         .setAction(Intent.ACTION_VIEW)
                         .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
-                mContext.startActivity(intent);
+                mActivityStarter.startActivity(intent, true /* dismissShade */,
+                        animationController);
             } else {
                 if (mQuickAccessWalletClient.createWalletIntent() == null) {
                     Log.w(TAG, "Could not get intent of the wallet app.");
                     return;
                 }
                 mActivityStarter.postStartActivityDismissingKeyguard(
-                        mQuickAccessWalletClient.createWalletIntent(), /* delay= */ 0);
+                        mQuickAccessWalletClient.createWalletIntent(), /* delay= */ 0,
+                        animationController);
             }
         });
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java
index 44eeaf4..6921ad5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java
@@ -23,8 +23,11 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.R;
 import com.android.internal.logging.MetricsLogger;
 import com.android.systemui.R.drawable;
@@ -92,7 +95,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         mReduceBrightColorsController.setReduceBrightColorsActivated(!mState.value);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
index 173cc05..0bbb5bd 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
@@ -23,8 +23,11 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -77,7 +80,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         final boolean newState = !mState.value;
         mController.setRotationLocked(!newState);
         refreshState(newState);
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 6845dc5..a4148ee 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
@@ -22,8 +22,11 @@
 import android.service.quicksettings.Tile;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.systemui.R;
 import com.android.systemui.dagger.qualifiers.Background;
@@ -80,7 +83,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (mController.isStarting()) {
             cancelCountdown();
         } else if (mController.isRecording()) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
index 5d2d6f8..f13576c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
@@ -21,9 +21,11 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
 import androidx.annotation.DrawableRes;
+import androidx.annotation.Nullable;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.systemui.R;
@@ -47,7 +49,7 @@
         IndividualSensorPrivacyController.Callback {
 
     private final KeyguardStateController mKeyguard;
-    private IndividualSensorPrivacyController mSensorPrivacyController;
+    protected IndividualSensorPrivacyController mSensorPrivacyController;
 
     /**
      * @return Id of the sensor that will be toggled
@@ -82,7 +84,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (mKeyguard.isMethodSecure() && mKeyguard.isShowing()) {
             mActivityStarter.postQSRunnableDismissingKeyguard(() -> {
                 mSensorPrivacyController.setSensorBlocked(getSensorId(),
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java
index 0ef5bc8..596d8f0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java
@@ -24,8 +24,11 @@
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
 import android.text.TextUtils;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.systemui.R;
@@ -101,7 +104,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         if (getState().state == Tile.STATE_UNAVAILABLE) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
index 8ddd4c9..2458223 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
@@ -34,10 +34,13 @@
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.drawable.CircleFramedDrawable;
 import com.android.systemui.R;
+import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.qs.PseudoGridView;
 import com.android.systemui.qs.QSUserSwitcherEvent;
 import com.android.systemui.statusbar.policy.UserSwitcherController;
 
+import javax.inject.Inject;
+
 /**
  * Quick settings detail view for user switching.
  */
@@ -54,9 +57,9 @@
                 R.layout.qs_user_detail, parent, attach);
     }
 
-    public void createAndSetAdapter(UserSwitcherController controller,
-            UiEventLogger uiEventLogger) {
-        mAdapter = new Adapter(mContext, controller, uiEventLogger);
+    /** Set a {@link android.widget.BaseAdapter} */
+    public void setAdapter(Adapter adapter) {
+        mAdapter = adapter;
         ViewGroupAdapterBridge.link(this, mAdapter);
     }
 
@@ -71,13 +74,16 @@
         protected UserSwitcherController mController;
         private View mCurrentUserView;
         private final UiEventLogger mUiEventLogger;
+        private final FalsingManager mFalsingManager;
 
+        @Inject
         public Adapter(Context context, UserSwitcherController controller,
-                UiEventLogger uiEventLogger) {
+                UiEventLogger uiEventLogger, FalsingManager falsingManager) {
             super(controller);
             mContext = context;
             mController = controller;
             mUiEventLogger = uiEventLogger;
+            mFalsingManager = falsingManager;
         }
 
         @Override
@@ -140,6 +146,10 @@
 
         @Override
         public void onClick(View view) {
+            if (mFalsingManager.isFalseTap(FalsingManager.MODERATE_PENALTY)) {
+                return;
+            }
+
             UserSwitcherController.UserRecord tag =
                     (UserSwitcherController.UserRecord) view.getTag();
             if (tag.isDisabledByAdmin) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
index 2590f37..e110a64 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
@@ -22,6 +22,9 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.util.Pair;
+import android.view.View;
+
+import androidx.annotation.Nullable;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -78,7 +81,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         showDetail(true);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 86ea50c..efac141 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -30,6 +30,8 @@
 import android.view.ViewGroup;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settingslib.wifi.AccessPoint;
@@ -129,7 +131,7 @@
     }
 
     @Override
-    protected void handleClick() {
+    protected void handleClick(@Nullable View view) {
         // Secondary clicks are header clicks, just toggle.
         mState.copyTo(mStateBeforeClick);
         boolean wifiEnabled = mState.value;
@@ -148,7 +150,7 @@
     }
 
     @Override
-    protected void handleSecondaryClick() {
+    protected void handleSecondaryClick(@Nullable View view) {
         if (!mWifiController.canConfigWifi()) {
             mActivityStarter.postStartActivityDismissingKeyguard(
                     new Intent(Settings.ACTION_WIFI_SETTINGS), 0);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
index c88a002..ef2c1c9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
@@ -21,8 +21,11 @@
 import android.os.Looper;
 import android.provider.Settings;
 import android.service.quicksettings.Tile;
+import android.view.View;
 import android.widget.Switch;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.systemui.R;
@@ -75,7 +78,7 @@
     }
 
     @Override
-    public void handleClick() {
+    public void handleClick(@Nullable View view) {
         mProfileController.setWorkModeEnabled(!mState.value);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 6d23739..850f8a5 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -524,6 +524,8 @@
                     startingwindow.createExternalInterface().asBinder()));
 
             try {
+                Log.d(TAG_OPS + " b/182478748", "OverviewProxyService.onInitialize: curUser="
+                        + mCurrentBoundedUserId);
                 mOverviewProxy.onInitialize(params);
             } catch (RemoteException e) {
                 mCurrentBoundedUserId = -1;
@@ -554,6 +556,7 @@
 
         @Override
         public void onServiceDisconnected(ComponentName name) {
+            Log.w(TAG_OPS, "Service disconnected");
             // Do nothing
             mCurrentBoundedUserId = -1;
         }
@@ -606,6 +609,7 @@
 
         // Listen for nav bar mode changes
         mNavBarMode = navModeController.addListener(this);
+        Log.d(TAG_OPS + " b/182478748", "OverviewProxyService: mode=" + mNavBarMode);
 
         // Listen for launcher package changes
         IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
@@ -765,6 +769,7 @@
                     mOverviewServiceConnection,
                     Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
                     UserHandle.of(getCurrentUserId()));
+            Log.d(TAG_OPS + " b/182478748", "OverviewProxyService.connect: bound=" + mBound);
         } catch (SecurityException e) {
             Log.e(TAG_OPS, "Unable to bind because of security error", e);
         }
@@ -817,6 +822,9 @@
 
     private void disconnectFromLauncherService() {
         if (mBound) {
+            Log.d(TAG_OPS + " b/182478748", "OverviewProxyService.disconnect: curUser="
+                    + mCurrentBoundedUserId);
+
             // Always unbind the service (ie. if called through onNullBinding or onBindingDied)
             mContext.unbindService(mOverviewServiceConnection);
             mBound = false;
@@ -917,27 +925,38 @@
     }
 
     private void updateEnabledState() {
+        final int currentUser = ActivityManagerWrapper.getInstance().getCurrentUserId();
         mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent,
-                MATCH_SYSTEM_ONLY,
-                ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;
+                MATCH_SYSTEM_ONLY, currentUser) != null;
+        Log.d(TAG_OPS + " b/182478748", "OverviewProxyService.updateEnabledState: curUser="
+                + currentUser + " enabled=" + mIsEnabled);
     }
 
     @Override
     public void onNavigationModeChanged(int mode) {
         mNavBarMode = mode;
+        Log.d(TAG_OPS + " b/182478748", "OverviewProxyService.onNavModeChanged: mode=" + mode);
     }
 
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println(TAG_OPS + " state:");
-        pw.print("  recentsComponentName="); pw.println(mRecentsComponentName);
         pw.print("  isConnected="); pw.println(mOverviewProxy != null);
-        pw.print("  connectionBackoffAttempts="); pw.println(mConnectionBackoffAttempts);
-
-        pw.print("  quickStepIntent="); pw.println(mQuickStepIntent);
-        pw.print("  quickStepIntentResolved="); pw.println(isEnabled());
+        pw.print("  mIsEnabled="); pw.println(isEnabled());
+        pw.print("  mRecentsComponentName="); pw.println(mRecentsComponentName);
+        pw.print("  mQuickStepIntent="); pw.println(mQuickStepIntent);
+        pw.print("  mBound="); pw.println(mBound);
+        pw.print("  mCurrentBoundedUserId="); pw.println(mCurrentBoundedUserId);
+        pw.print("  mConnectionBackoffAttempts="); pw.println(mConnectionBackoffAttempts);
+        pw.print("  mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted);
+        pw.print("  mInputFocusTransferStartY="); pw.println(mInputFocusTransferStartY);
+        pw.print("  mInputFocusTransferStartMillis="); pw.println(mInputFocusTransferStartMillis);
+        pw.print("  mWindowCornerRadius="); pw.println(mWindowCornerRadius);
+        pw.print("  mSupportsRoundedCornersOnWindows="); pw.println(mSupportsRoundedCornersOnWindows);
+        pw.print("  mNavBarButtonAlpha="); pw.println(mNavBarButtonAlpha);
+        pw.print("  mActiveNavBarRegion="); pw.println(mActiveNavBarRegion);
+        pw.print("  mNavBarMode="); pw.println(mNavBarMode);
         mSysUiState.dump(fd, pw, args);
-        pw.print(" mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted);
     }
 
     public interface OverviewProxyListener {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index 0106f43..b5e51c6 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -20,6 +20,8 @@
 import static com.android.systemui.screenshot.LogConfig.DEBUG_CALLBACK;
 import static com.android.systemui.screenshot.LogConfig.DEBUG_STORAGE;
 import static com.android.systemui.screenshot.LogConfig.logTag;
+import static com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider.ScreenshotSmartActionType.QUICK_SHARE_ACTION;
+import static com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider.ScreenshotSmartActionType.REGULAR_SMART_ACTIONS;
 
 import android.app.ActivityTaskManager;
 import android.app.Notification;
@@ -74,6 +76,7 @@
     private final ScreenshotSmartActions mScreenshotSmartActions;
     private final ScreenshotController.SaveImageInBackgroundData mParams;
     private final ScreenshotController.SavedImageData mImageData;
+    private final ScreenshotController.QuickShareData mQuickShareData;
 
     private final ScreenshotNotificationSmartActionsProvider mSmartActionsProvider;
     private String mScreenshotId;
@@ -90,6 +93,7 @@
         mContext = context;
         mScreenshotSmartActions = screenshotSmartActions;
         mImageData = new ScreenshotController.SavedImageData();
+        mQuickShareData = new ScreenshotController.QuickShareData();
         mSharedElementTransition = sharedElementTransition;
         mImageExporter = exporter;
 
@@ -127,6 +131,13 @@
         Bitmap image = mParams.image;
         mScreenshotId = String.format(SCREENSHOT_ID_TEMPLATE, requestId);
         try {
+            if (mSmartActionsEnabled && mParams.mQuickShareActionsReadyListener != null) {
+                // Since Quick Share target recommendation does not rely on image URL, it is
+                // queried and surfaced before image compress/export. Action intent would not be
+                // used, because it does not contain image URL.
+                queryQuickShareAction(image, user);
+            }
+
             // Call synchronously here since already on a background thread.
             ListenableFuture<ImageExporter.Result> future =
                     mImageExporter.export(Runnable::run, requestId, image);
@@ -136,7 +147,7 @@
 
             CompletableFuture<List<Notification.Action>> smartActionsFuture =
                     mScreenshotSmartActions.getSmartActionsFuture(
-                            mScreenshotId, uri, image, mSmartActionsProvider,
+                            mScreenshotId, uri, image, mSmartActionsProvider, REGULAR_SMART_ACTIONS,
                             mSmartActionsEnabled, user);
 
             List<Notification.Action> smartActions = new ArrayList<>();
@@ -148,7 +159,7 @@
                 smartActions.addAll(buildSmartActions(
                         mScreenshotSmartActions.getSmartActions(
                                 mScreenshotId, smartActionsFuture, timeoutMs,
-                                mSmartActionsProvider),
+                                mSmartActionsProvider, REGULAR_SMART_ACTIONS),
                         mContext));
             }
 
@@ -157,6 +168,8 @@
             mImageData.shareTransition = createShareAction(mContext, mContext.getResources(), uri);
             mImageData.editTransition = createEditAction(mContext, mContext.getResources(), uri);
             mImageData.deleteAction = createDeleteAction(mContext, mContext.getResources(), uri);
+            mImageData.quickShareAction = createQuickShareAction(mContext,
+                    mQuickShareData.quickShareAction, uri);
 
             mParams.mActionsReadyListener.onActionsReady(mImageData);
             if (DEBUG_CALLBACK) {
@@ -173,6 +186,7 @@
             }
             mParams.clearImage();
             mImageData.reset();
+            mQuickShareData.reset();
             mParams.mActionsReadyListener.onActionsReady(mImageData);
             if (DEBUG_CALLBACK) {
                 Log.d(TAG, "Calling (Consumer<Uri>) finisher.accept(null)");
@@ -197,6 +211,7 @@
         // params. The finisher is expected to always be called back, so just use the baked-in
         // params from the ctor in any case.
         mImageData.reset();
+        mQuickShareData.reset();
         mParams.mActionsReadyListener.onActionsReady(mImageData);
         if (DEBUG_CALLBACK) {
             Log.d(TAG, "onCancelled, calling (Consumer<Uri>) finisher.accept(null)");
@@ -389,4 +404,74 @@
                 .putExtra(ScreenshotController.EXTRA_ID, screenshotId)
                 .putExtra(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED, smartActionsEnabled);
     }
+
+    /**
+     * Populate image uri into intent of Quick Share action.
+     */
+    @VisibleForTesting
+    private Notification.Action createQuickShareAction(Context context, Notification.Action action,
+            Uri uri) {
+        if (action == null) {
+            return null;
+        }
+        // Populate image URI into Quick Share chip intent
+        Intent sharingIntent = action.actionIntent.getIntent();
+        sharingIntent.setType("image/png");
+        sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
+        String subjectDate = DateFormat.getDateTimeInstance().format(new Date(mImageTime));
+        String subject = String.format(SCREENSHOT_SHARE_SUBJECT_TEMPLATE, subjectDate);
+        sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
+        // Include URI in ClipData also, so that grantPermission picks it up.
+        // We don't use setData here because some apps interpret this as "to:".
+        ClipData clipdata = new ClipData(new ClipDescription("content",
+                new String[]{"image/png"}),
+                new ClipData.Item(uri));
+        sharingIntent.setClipData(clipdata);
+        sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        PendingIntent updatedPendingIntent = PendingIntent.getActivity(
+                context, 0, sharingIntent,
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+
+        // Proxy smart actions through {@link GlobalScreenshot.SmartActionsReceiver}
+        // for logging smart actions.
+        Bundle extras = action.getExtras();
+        String actionType = extras.getString(
+                ScreenshotNotificationSmartActionsProvider.ACTION_TYPE,
+                ScreenshotNotificationSmartActionsProvider.DEFAULT_ACTION_TYPE);
+        Intent intent = new Intent(context, SmartActionsReceiver.class)
+                .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, updatedPendingIntent)
+                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+        addIntentExtras(mScreenshotId, intent, actionType, mSmartActionsEnabled);
+        PendingIntent broadcastIntent = PendingIntent.getBroadcast(context,
+                mRandom.nextInt(),
+                intent,
+                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+        return new Notification.Action.Builder(action.getIcon(), action.title,
+                broadcastIntent).setContextual(true).addExtras(extras).build();
+    }
+
+    /**
+     * Query and surface Quick Share chip if it is available. Action intent would not be used,
+     * because it does not contain image URL which would be populated in {@link
+     * #createQuickShareAction(Context, Notification.Action, Uri)}
+     */
+    private void queryQuickShareAction(Bitmap image, UserHandle user) {
+        CompletableFuture<List<Notification.Action>> quickShareActionsFuture =
+                mScreenshotSmartActions.getSmartActionsFuture(
+                        mScreenshotId, null, image, mSmartActionsProvider,
+                        QUICK_SHARE_ACTION,
+                        mSmartActionsEnabled, user);
+        int timeoutMs = DeviceConfig.getInt(
+                DeviceConfig.NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.SCREENSHOT_NOTIFICATION_QUICK_SHARE_ACTIONS_TIMEOUT_MS,
+                500);
+        List<Notification.Action> quickShareActions =
+                mScreenshotSmartActions.getSmartActions(
+                        mScreenshotId, quickShareActionsFuture, timeoutMs,
+                        mSmartActionsProvider, QUICK_SHARE_ACTION);
+        if (!quickShareActions.isEmpty()) {
+            mQuickShareData.quickShareAction = quickShareActions.get(0);
+            mParams.mQuickShareActionsReadyListener.onActionsReady(mQuickShareData);
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index 9d01986..7c2d476 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -114,6 +114,7 @@
         public Bitmap image;
         public Consumer<Uri> finisher;
         public ScreenshotController.ActionsReadyListener mActionsReadyListener;
+        public ScreenshotController.QuickShareActionReadyListener mQuickShareActionsReadyListener;
 
         void clearImage() {
             image = null;
@@ -129,6 +130,7 @@
         public Supplier<ActionTransition> editTransition;
         public Notification.Action deleteAction;
         public List<Notification.Action> smartActions;
+        public Notification.Action quickShareAction;
 
         /**
          * POD for shared element transition.
@@ -148,6 +150,21 @@
             editTransition = null;
             deleteAction = null;
             smartActions = null;
+            quickShareAction = null;
+        }
+    }
+
+    /**
+     * Structure returned by the QueryQuickShareInBackgroundTask
+     */
+    static class QuickShareData {
+        public Notification.Action quickShareAction;
+
+        /**
+         * Used to reset the return data on error
+         */
+        public void reset() {
+            quickShareAction = null;
         }
     }
 
@@ -155,6 +172,10 @@
         void onActionsReady(ScreenshotController.SavedImageData imageData);
     }
 
+    interface QuickShareActionReadyListener {
+        void onActionsReady(ScreenshotController.QuickShareData quickShareData);
+    }
+
     // These strings are used for communicating the action invoked to
     // ScreenshotNotificationSmartActionsProvider.
     static final String EXTRA_ACTION_TYPE = "android:screenshot_action_type";
@@ -519,7 +540,8 @@
         mScreenBitmap.setHasAlpha(false);
         mScreenBitmap.prepareToDraw();
 
-        saveScreenshotInWorkerThread(finisher, this::showUiOnActionsReady);
+        saveScreenshotInWorkerThread(finisher, this::showUiOnActionsReady,
+                this::showUiOnQuickShareActionReady);
 
         // The window is focusable by default
         setWindowFocusable(true);
@@ -664,20 +686,21 @@
         saveScreenshotInWorkerThread(
                 /* onComplete */ finisher,
                 /* actionsReadyListener */ imageData -> {
-            if (DEBUG_CALLBACK) {
-                Log.d(TAG, "returning URI to finisher (Consumer<URI>): " + imageData.uri);
-            }
-            finisher.accept(imageData.uri);
-            if (imageData.uri == null) {
-                mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_NOT_SAVED);
-                mNotificationsController.notifyScreenshotError(
-                        R.string.screenshot_failed_to_save_text);
-            } else {
-                mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED);
-                mScreenshotHandler.post(() -> Toast.makeText(mContext,
-                        R.string.screenshot_saved_title, Toast.LENGTH_SHORT).show());
-            }
-        });
+                    if (DEBUG_CALLBACK) {
+                        Log.d(TAG, "returning URI to finisher (Consumer<URI>): " + imageData.uri);
+                    }
+                    finisher.accept(imageData.uri);
+                    if (imageData.uri == null) {
+                        mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_NOT_SAVED);
+                        mNotificationsController.notifyScreenshotError(
+                                R.string.screenshot_failed_to_save_text);
+                    } else {
+                        mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED);
+                        mScreenshotHandler.post(() -> Toast.makeText(mContext,
+                                R.string.screenshot_saved_title, Toast.LENGTH_SHORT).show());
+                    }
+                },
+                null);
     }
 
     /**
@@ -718,12 +741,15 @@
      * Creates a new worker thread and saves the screenshot to the media store.
      */
     private void saveScreenshotInWorkerThread(Consumer<Uri> finisher,
-            @Nullable ScreenshotController.ActionsReadyListener actionsReadyListener) {
+            @Nullable ScreenshotController.ActionsReadyListener actionsReadyListener,
+            @Nullable ScreenshotController.QuickShareActionReadyListener
+                    quickShareActionsReadyListener) {
         ScreenshotController.SaveImageInBackgroundData
                 data = new ScreenshotController.SaveImageInBackgroundData();
         data.image = mScreenBitmap;
         data.finisher = finisher;
         data.mActionsReadyListener = actionsReadyListener;
+        data.mQuickShareActionsReadyListener = quickShareActionsReadyListener;
 
         if (mSaveInBgTask != null) {
             // just log success/failure for the pre-existing screenshot
@@ -786,6 +812,30 @@
     }
 
     /**
+     * Sets up the action shade and its entrance animation, once we get the Quick Share action data.
+     */
+    private void showUiOnQuickShareActionReady(ScreenshotController.QuickShareData quickShareData) {
+        if (DEBUG_UI) {
+            Log.d(TAG, "Showing UI for Quick Share action");
+        }
+        if (quickShareData.quickShareAction != null) {
+            mScreenshotHandler.post(() -> {
+                if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) {
+                    mScreenshotAnimation.addListener(new AnimatorListenerAdapter() {
+                        @Override
+                        public void onAnimationEnd(Animator animation) {
+                            super.onAnimationEnd(animation);
+                            mScreenshotView.addQuickShareChip(quickShareData.quickShareAction);
+                        }
+                    });
+                } else {
+                    mScreenshotView.addQuickShareChip(quickShareData.quickShareAction);
+                }
+            });
+        }
+    }
+
+    /**
      * Supplies the necessary bits for the shared element transition to share sheet.
      * Note that once supplied, the action intent to share must be sent immediately after.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java
index 9bd7923..99238cd 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSmartActions.java
@@ -60,11 +60,14 @@
     CompletableFuture<List<Notification.Action>> getSmartActionsFuture(
             String screenshotId, Uri screenshotUri, Bitmap image,
             ScreenshotNotificationSmartActionsProvider smartActionsProvider,
+            ScreenshotSmartActionType actionType,
             boolean smartActionsEnabled, UserHandle userHandle) {
         if (DEBUG_ACTIONS) {
-            Log.d(TAG, String.format("getSmartActionsFuture id=%s, uri=%s, provider=%s, "
-                            + "smartActionsEnabled=%b, userHandle=%s", screenshotId, screenshotUri,
-                    smartActionsProvider.getClass(), smartActionsEnabled, userHandle));
+            Log.d(TAG, String.format(
+                    "getSmartActionsFuture id=%s, uri=%s, provider=%s, actionType=%s, "
+                            + "smartActionsEnabled=%b, userHandle=%s",
+                    screenshotId, screenshotUri, smartActionsProvider.getClass(), actionType,
+                    smartActionsEnabled, userHandle));
         }
         if (!smartActionsEnabled) {
             if (DEBUG_ACTIONS) {
@@ -89,7 +92,7 @@
                             ? runningTask.topActivity
                             : new ComponentName("", "");
             smartActionsFuture = smartActionsProvider.getActions(screenshotId, screenshotUri, image,
-                    componentName, ScreenshotSmartActionType.REGULAR_SMART_ACTIONS, userHandle);
+                    componentName, actionType, userHandle);
         } catch (Throwable e) {
             long waitTimeMs = SystemClock.uptimeMillis() - startTimeMs;
             smartActionsFuture = CompletableFuture.completedFuture(Collections.emptyList());
@@ -107,19 +110,21 @@
     @VisibleForTesting
     List<Notification.Action> getSmartActions(String screenshotId,
             CompletableFuture<List<Notification.Action>> smartActionsFuture, int timeoutMs,
-            ScreenshotNotificationSmartActionsProvider smartActionsProvider) {
+            ScreenshotNotificationSmartActionsProvider smartActionsProvider,
+            ScreenshotSmartActionType actionType) {
         long startTimeMs = SystemClock.uptimeMillis();
         if (DEBUG_ACTIONS) {
-            Log.d(TAG, String.format("getSmartActions id=%s, timeoutMs=%d, provider=%s",
-                    screenshotId, timeoutMs, smartActionsProvider.getClass()));
+            Log.d(TAG,
+                    String.format("getSmartActions id=%s, timeoutMs=%d, actionType=%s, provider=%s",
+                            screenshotId, timeoutMs, actionType, smartActionsProvider.getClass()));
         }
         try {
             List<Notification.Action> actions = smartActionsFuture.get(timeoutMs,
                     TimeUnit.MILLISECONDS);
             long waitTimeMs = SystemClock.uptimeMillis() - startTimeMs;
             if (DEBUG_ACTIONS) {
-                Log.d(TAG, String.format("Got %d smart actions. Wait time: %d ms",
-                        actions.size(), waitTimeMs));
+                Log.d(TAG, String.format("Got %d smart actions. Wait time: %d ms, actionType=%s",
+                        actions.size(), waitTimeMs, actionType));
             }
             notifyScreenshotOp(screenshotId, smartActionsProvider,
                     ScreenshotNotificationSmartActionsProvider.ScreenshotOp.WAIT_FOR_SMART_ACTIONS,
@@ -129,8 +134,9 @@
         } catch (Throwable e) {
             long waitTimeMs = SystemClock.uptimeMillis() - startTimeMs;
             if (DEBUG_ACTIONS) {
-                Log.e(TAG, String.format("Error getting smart actions. Wait time: %d ms",
-                        waitTimeMs), e);
+                Log.e(TAG, String.format(
+                        "Error getting smart actions. Wait time: %d ms, actionType=%s",
+                        waitTimeMs, actionType), e);
             }
             ScreenshotNotificationSmartActionsProvider.ScreenshotOpStatus status =
                     (e instanceof TimeoutException)
@@ -165,7 +171,7 @@
                     SystemUIFactory.getInstance().createScreenshotNotificationSmartActionsProvider(
                             context, THREAD_POOL_EXECUTOR, new Handler());
             if (DEBUG_ACTIONS) {
-                Log.e(TAG, String.format("%s notifyAction: %s id=%s, isSmartAction=%b",
+                Log.d(TAG, String.format("%s notifyAction: %s id=%s, isSmartAction=%b",
                         provider.getClass(), action, screenshotId, isSmartAction));
             }
             provider.notifyAction(screenshotId, action, isSmartAction);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index d15f1ff..70b1133 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -137,6 +137,7 @@
     private ScreenshotActionChip mShareChip;
     private ScreenshotActionChip mEditChip;
     private ScreenshotActionChip mScrollChip;
+    private ScreenshotActionChip mQuickShareChip;
 
     private UiEventLogger mUiEventLogger;
     private ScreenshotViewCallback mCallbacks;
@@ -151,7 +152,8 @@
     private enum PendingInteraction {
         PREVIEW,
         EDIT,
-        SHARE
+        SHARE,
+        QUICK_SHARE
     }
 
     public ScreenshotView(Context context) {
@@ -505,6 +507,9 @@
         mShareChip.setOnClickListener(v -> {
             mShareChip.setIsPending(true);
             mEditChip.setIsPending(false);
+            if (mQuickShareChip != null) {
+                mQuickShareChip.setIsPending(false);
+            }
             mPendingInteraction = PendingInteraction.SHARE;
         });
         chips.add(mShareChip);
@@ -514,6 +519,9 @@
         mEditChip.setOnClickListener(v -> {
             mEditChip.setIsPending(true);
             mShareChip.setIsPending(false);
+            if (mQuickShareChip != null) {
+                mQuickShareChip.setIsPending(false);
+            }
             mPendingInteraction = PendingInteraction.EDIT;
         });
         chips.add(mEditChip);
@@ -521,6 +529,9 @@
         mScreenshotPreview.setOnClickListener(v -> {
             mShareChip.setIsPending(false);
             mEditChip.setIsPending(false);
+            if (mQuickShareChip != null) {
+                mQuickShareChip.setIsPending(false);
+            }
             mPendingInteraction = PendingInteraction.PREVIEW;
         });
 
@@ -582,6 +593,13 @@
             startSharedTransition(
                     imageData.editTransition.get());
         });
+        if (mQuickShareChip != null) {
+            mQuickShareChip.setPendingIntent(imageData.quickShareAction.actionIntent,
+                    () -> {
+                        mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SMART_ACTION_TAPPED);
+                        animateDismissal();
+                    });
+        }
 
         if (mPendingInteraction != null) {
             switch (mPendingInteraction) {
@@ -594,6 +612,9 @@
                 case EDIT:
                     mEditChip.callOnClick();
                     break;
+                case QUICK_SHARE:
+                    mQuickShareChip.callOnClick();
+                    break;
             }
         } else {
             LayoutInflater inflater = LayoutInflater.from(mContext);
@@ -615,6 +636,25 @@
         }
     }
 
+    void addQuickShareChip(Notification.Action quickShareAction) {
+        if (mPendingInteraction == null) {
+            LayoutInflater inflater = LayoutInflater.from(mContext);
+            mQuickShareChip = (ScreenshotActionChip) inflater.inflate(
+                    R.layout.global_screenshot_action_chip, mActionsView, false);
+            mQuickShareChip.setText(quickShareAction.title);
+            mQuickShareChip.setIcon(quickShareAction.getIcon(), false);
+            mQuickShareChip.setOnClickListener(v -> {
+                mShareChip.setIsPending(false);
+                mEditChip.setIsPending(false);
+                mQuickShareChip.setIsPending(true);
+                mPendingInteraction = PendingInteraction.QUICK_SHARE;
+            });
+            mQuickShareChip.setAlpha(1);
+            mActionsView.addView(mQuickShareChip);
+            mSmartChips.add(mQuickShareChip);
+        }
+    }
+
     boolean isDismissing() {
         return (mDismissAnimation != null && mDismissAnimation.isRunning());
     }
@@ -700,6 +740,7 @@
             mActionsView.removeView(chip);
         }
         mSmartChips.clear();
+        mQuickShareChip = null;
         setAlpha(1);
         mDismissButton.setTranslationY(0);
         mActionsContainer.setTranslationY(0);
diff --git a/core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java b/packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java
similarity index 60%
rename from core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java
rename to packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java
index 1fc126e..3c6ab34 100644
--- a/core/java/com/android/internal/colorextraction/drawable/ScrimDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/scrim/ScrimDrawable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.internal.colorextraction.drawable;
+package com.android.systemui.scrim;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -47,8 +47,9 @@
     private ValueAnimator mColorAnimation;
     private int mMainColorTo;
     private float mCornerRadius;
-    private Rect mBounds;
     private ConcaveInfo mConcaveInfo;
+    private int mBottomEdgePosition;
+    private boolean mCornerRadiusEnabled;
 
     public ScrimDrawable() {
         mPaint = new Paint();
@@ -133,19 +134,61 @@
     }
 
     /**
-     * Enable drawable shape to have rounded corners with provided radius
+     * Corner radius used by either concave or convex corners.
      */
     public void setRoundedCorners(float radius) {
+        if (radius == mCornerRadius) {
+            return;
+        }
         mCornerRadius = radius;
+        if (mConcaveInfo != null) {
+            mConcaveInfo.setCornerRadius(radius);
+            updatePath();
+        }
+        invalidateSelf();
     }
 
     /**
-     * Make bottom edge concave with provided corner radius
+     * If we should draw a rounded rect instead of a rect.
      */
-    public void setBottomEdgeConcave(float radius) {
-        // only rounding top corners for clip out path
-        float[] cornerRadii = new float[]{radius, radius, radius, radius, 0, 0, 0, 0};
-        mConcaveInfo = new ConcaveInfo(radius, cornerRadii);
+    public void setRoundedCornersEnabled(boolean enabled) {
+        if (mCornerRadiusEnabled == enabled) {
+            return;
+        }
+        mCornerRadiusEnabled = enabled;
+        invalidateSelf();
+    }
+
+    /**
+     * If we should draw a concave rounded rect instead of a rect.
+     */
+    public void setBottomEdgeConcave(boolean enabled) {
+        if (enabled && mConcaveInfo != null) {
+            return;
+        }
+        if (!enabled) {
+            mConcaveInfo = null;
+        } else {
+            mConcaveInfo = new ConcaveInfo();
+            mConcaveInfo.setCornerRadius(mCornerRadius);
+        }
+        invalidateSelf();
+    }
+
+    /**
+     * Location of concave edge.
+     * @see #setBottomEdgeConcave(boolean)
+     */
+    public void setBottomEdgePosition(int y) {
+        if (mBottomEdgePosition == y) {
+            return;
+        }
+        mBottomEdgePosition = y;
+        if (mConcaveInfo == null) {
+            return;
+        }
+        updatePath();
+        invalidateSelf();
     }
 
     @Override
@@ -154,30 +197,36 @@
         mPaint.setAlpha(mAlpha);
         if (mConcaveInfo != null) {
             drawConcave(canvas);
+        } else if (mCornerRadiusEnabled && mCornerRadius > 0) {
+            canvas.drawRoundRect(getBounds().left, getBounds().top, getBounds().right,
+                    getBounds().bottom + mCornerRadius,
+                    /* x radius*/ mCornerRadius, /* y radius*/ mCornerRadius, mPaint);
+        } else {
+            canvas.drawRect(getBounds().left, getBounds().top, getBounds().right,
+                    getBounds().bottom, mPaint);
         }
-        canvas.drawRoundRect(getBounds().left, getBounds().top, getBounds().right,
-                getBounds().bottom + mCornerRadius,
-                /* x radius*/ mCornerRadius, /* y radius*/ mCornerRadius, mPaint);
+    }
+
+    @Override
+    protected void onBoundsChange(Rect bounds) {
+        updatePath();
     }
 
     private void drawConcave(Canvas canvas) {
-        // checking if width of clip out path needs to change
-        if (mBounds == null
-                || getBounds().right != mBounds.right
-                || getBounds().left != mBounds.left) {
-            mConcaveInfo.mPath.reset();
-            float left = getBounds().left;
-            float right = getBounds().right;
-            float top = 0f;
-            float bottom = mConcaveInfo.mPathOverlap;
-            mConcaveInfo.mPath.addRoundRect(left, top, right, bottom,
-                    mConcaveInfo.mCornerRadii, Path.Direction.CW);
-        }
-        mBounds = getBounds();
-        int translation = (int) (mBounds.bottom - mConcaveInfo.mPathOverlap);
-        canvas.translate(0, translation);
         canvas.clipOutPath(mConcaveInfo.mPath);
-        canvas.translate(0, -translation);
+        canvas.drawRect(getBounds().left, getBounds().top, getBounds().right,
+                mBottomEdgePosition + mConcaveInfo.mPathOverlap, mPaint);
+    }
+
+    private void updatePath() {
+        if (mConcaveInfo == null) {
+            return;
+        }
+        mConcaveInfo.mPath.reset();
+        float top = mBottomEdgePosition;
+        float bottom = mBottomEdgePosition + mConcaveInfo.mPathOverlap;
+        mConcaveInfo.mPath.addRoundRect(getBounds().left, top, getBounds().right, bottom,
+                mConcaveInfo.mCornerRadii, Path.Direction.CW);
     }
 
     @VisibleForTesting
@@ -186,13 +235,20 @@
     }
 
     private static class ConcaveInfo {
-        private final float mPathOverlap;
+        private float mPathOverlap;
         private final float[] mCornerRadii;
         private final Path mPath = new Path();
 
-        ConcaveInfo(float pathOverlap, float[] cornerRadii) {
-            mPathOverlap = pathOverlap;
-            mCornerRadii = cornerRadii;
+        ConcaveInfo() {
+            mCornerRadii = new float[] {0, 0, 0, 0, 0, 0, 0, 0};
+        }
+
+        public void setCornerRadius(float radius) {
+            mPathOverlap = radius;
+            mCornerRadii[0] = radius;
+            mCornerRadii[1] = radius;
+            mCornerRadii[2] = radius;
+            mCornerRadii[3] = radius;
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java b/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java
similarity index 82%
rename from packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
rename to packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java
index a537299..1a5c9ee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
+++ b/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -11,10 +11,10 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
  */
 
-package com.android.systemui.statusbar;
+package com.android.systemui.scrim;
 
 import static java.lang.Float.isNaN;
 
@@ -31,15 +31,12 @@
 import android.util.AttributeSet;
 import android.view.View;
 
-import androidx.annotation.DimenRes;
 import androidx.annotation.Nullable;
 import androidx.core.graphics.ColorUtils;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.colorextraction.ColorExtractor;
-import com.android.internal.colorextraction.drawable.ScrimDrawable;
-import com.android.systemui.R;
 
 import java.util.concurrent.Executor;
 
@@ -51,9 +48,6 @@
  */
 public class ScrimView extends View {
 
-    @DimenRes
-    private static final int CORNER_RADIUS = R.dimen.notification_scrim_corner_radius;
-
     private final Object mColorLock = new Object();
 
     @GuardedBy("mColorLock")
@@ -96,6 +90,9 @@
         });
     }
 
+    /**
+     * Needed for WM Shell, which has its own thread structure.
+     */
     public void setExecutor(Executor executor, Looper looper) {
         mExecutor = executor;
         mExecutorLooper = looper;
@@ -108,7 +105,8 @@
         }
     }
 
-    public void setDrawable(Drawable drawable) {
+    @VisibleForTesting
+    void setDrawable(Drawable drawable) {
         executeOnExecutor(() -> {
             mDrawable = drawable;
             mDrawable.setCallback(this);
@@ -144,16 +142,24 @@
         });
     }
 
+    /**
+     * Sets the color of the scrim, without animating them.
+     */
     public void setColors(@NonNull ColorExtractor.GradientColors colors) {
         setColors(colors, false);
     }
 
+    /**
+     * Sets the scrim colors, optionally animating them.
+     * @param colors The colors.
+     * @param animated If we should animate the transition.
+     */
     public void setColors(@NonNull ColorExtractor.GradientColors colors, boolean animated) {
         if (colors == null) {
             throw new IllegalArgumentException("Colors cannot be null");
         }
         executeOnExecutor(() -> {
-            synchronized(mColorLock) {
+            synchronized (mColorLock) {
                 if (mColors.equals(colors)) {
                     return;
                 }
@@ -168,17 +174,28 @@
         return mDrawable;
     }
 
+    /**
+     * Returns current scrim colors.
+     */
     public ColorExtractor.GradientColors getColors() {
-        synchronized(mColorLock) {
+        synchronized (mColorLock) {
             mTmpColors.set(mColors);
         }
         return mTmpColors;
     }
 
+    /**
+     * Applies tint to this view, without animations.
+     */
     public void setTint(int color) {
         setTint(color, false);
     }
 
+    /**
+     * Tints this view, optionally animating it.
+     * @param color The color.
+     * @param animated If we should animate.
+     */
     public void setTint(int color, boolean animated) {
         executeOnExecutor(() -> {
             if (mTintColor == color) {
@@ -200,8 +217,8 @@
         } else {
             boolean hasAlpha = Color.alpha(mTintColor) != 0;
             if (hasAlpha) {
-                PorterDuff.Mode targetMode = mColorFilter == null ? Mode.SRC_OVER :
-                    mColorFilter.getMode();
+                PorterDuff.Mode targetMode = mColorFilter == null
+                        ? Mode.SRC_OVER : mColorFilter.getMode();
                 if (mColorFilter == null || mColorFilter.getColor() != mTintColor) {
                     mColorFilter = new PorterDuffColorFilter(mTintColor, targetMode);
                 }
@@ -254,6 +271,9 @@
         return mViewAlpha;
     }
 
+    /**
+     * Sets a callback that is invoked whenever the alpha, color, or tint change.
+     */
     public void setChangeRunnable(Runnable changeRunnable, Executor changeRunnableExecutor) {
         mChangeRunnable = changeRunnable;
         mChangeRunnableExecutor = changeRunnableExecutor;
@@ -276,22 +296,28 @@
      * Make bottom edge concave so overlap between layers is not visible for alphas between 0 and 1
      * @return height of concavity
      */
-    public float enableBottomEdgeConcave() {
+    public void enableBottomEdgeConcave(boolean clipScrim) {
         if (mDrawable instanceof ScrimDrawable) {
-            float radius = getResources().getDimensionPixelSize(CORNER_RADIUS);
-            ((ScrimDrawable) mDrawable).setBottomEdgeConcave(radius);
-            return radius;
+            ((ScrimDrawable) mDrawable).setBottomEdgeConcave(clipScrim);
         }
-        return 0;
     }
 
     /**
-     * Enable view to have rounded corners with radius of {@link #CORNER_RADIUS}
+     * The position of the bottom of the scrim, used for clipping.
+     * @see #enableBottomEdgeConcave(boolean)
      */
-    public void enableRoundedCorners() {
+    public void setBottomEdgePosition(int y) {
         if (mDrawable instanceof ScrimDrawable) {
-            int radius = getResources().getDimensionPixelSize(CORNER_RADIUS);
-            ((ScrimDrawable) mDrawable).setRoundedCorners(radius);
+            ((ScrimDrawable) mDrawable).setBottomEdgePosition(y);
+        }
+    }
+
+    /**
+     * Enable view to have rounded corners.
+     */
+    public void enableRoundedCorners(boolean enabled) {
+        if (mDrawable instanceof ScrimDrawable) {
+            ((ScrimDrawable) mDrawable).setRoundedCornersEnabled(enabled);
         }
     }
 
@@ -305,4 +331,15 @@
         mDrawableBounds.set((int) left, (int) top, (int) right, (int) bottom);
         mDrawable.setBounds(mDrawableBounds);
     }
+
+    /**
+     * Corner radius of both concave or convex corners.
+     * @see #enableRoundedCorners(boolean)
+     * @see #enableBottomEdgeConcave(boolean)
+     */
+    public void setCornerRadius(int radius) {
+        if (mDrawable instanceof ScrimDrawable) {
+            ((ScrimDrawable) mDrawable).setRoundedCorners(radius);
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt
index 6f6bf82..a4bb095 100644
--- a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt
@@ -111,9 +111,10 @@
                     }
             sensorPrivacyController.addCallback(sensorPrivacyListener)
 
-            if (!sensorPrivacyController.isSensorBlocked(sensor)) {
-                finish()
-                return
+            sensorPrivacyController.addCallback { _, isBlocked ->
+                if (!isBlocked) {
+                    dismiss()
+                }
             }
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
index 357256c..1ad253e 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
@@ -24,7 +24,9 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
+import android.hardware.display.BrightnessInfo;
 import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Handler;
@@ -64,17 +66,11 @@
 
     private static final Uri BRIGHTNESS_MODE_URI =
             Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
-    private static final Uri BRIGHTNESS_URI =
-            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
-    private static final Uri BRIGHTNESS_FLOAT_URI =
-            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FLOAT);
     private static final Uri BRIGHTNESS_FOR_VR_FLOAT_URI =
             Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT);
 
-    private final float mDefaultBacklight;
     private final float mMinimumBacklightForVr;
     private final float mMaximumBacklightForVr;
-    private final float mDefaultBacklightForVr;
 
     private final int mDisplayId;
     private final Context mContext;
@@ -86,6 +82,20 @@
     private final Handler mBackgroundHandler;
     private final BrightnessObserver mBrightnessObserver;
 
+    private final DisplayListener mDisplayListener = new DisplayListener() {
+        @Override
+        public void onDisplayAdded(int displayId) {}
+
+        @Override
+        public void onDisplayRemoved(int displayId) {}
+
+        @Override
+        public void onDisplayChanged(int displayId) {
+            mBackgroundHandler.post(mUpdateSliderRunnable);
+            notifyCallbacks();
+        }
+    };
+
     private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
             new ArrayList<BrightnessStateChangeCallback>();
 
@@ -94,6 +104,8 @@
     private boolean mListening;
     private boolean mExternalChange;
     private boolean mControlValueInitialized;
+    private float mBrightnessMin = PowerManager.BRIGHTNESS_MIN;
+    private float mBrightnessMax = PowerManager.BRIGHTNESS_MAX;
 
     private ValueAnimator mSliderAnimator;
 
@@ -110,28 +122,19 @@
         }
 
         @Override
-        public void onChange(boolean selfChange) {
-            onChange(selfChange, null);
-        }
-
-        @Override
         public void onChange(boolean selfChange, Uri uri) {
             if (selfChange) return;
 
             if (BRIGHTNESS_MODE_URI.equals(uri)) {
                 mBackgroundHandler.post(mUpdateModeRunnable);
                 mBackgroundHandler.post(mUpdateSliderRunnable);
-            } else if (BRIGHTNESS_FLOAT_URI.equals(uri)) {
-                mBackgroundHandler.post(mUpdateSliderRunnable);
             } else if (BRIGHTNESS_FOR_VR_FLOAT_URI.equals(uri)) {
                 mBackgroundHandler.post(mUpdateSliderRunnable);
             } else {
                 mBackgroundHandler.post(mUpdateModeRunnable);
                 mBackgroundHandler.post(mUpdateSliderRunnable);
             }
-            for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
-                cb.onBrightnessLevelChanged();
-            }
+            notifyCallbacks();
         }
 
         public void startObserving() {
@@ -141,19 +144,16 @@
                     BRIGHTNESS_MODE_URI,
                     false, this, UserHandle.USER_ALL);
             cr.registerContentObserver(
-                    BRIGHTNESS_URI,
-                    false, this, UserHandle.USER_ALL);
-            cr.registerContentObserver(
-                    BRIGHTNESS_FLOAT_URI,
-                    false, this, UserHandle.USER_ALL);
-            cr.registerContentObserver(
                     BRIGHTNESS_FOR_VR_FLOAT_URI,
                     false, this, UserHandle.USER_ALL);
+            mDisplayManager.registerDisplayListener(mDisplayListener, mHandler,
+                    DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS);
         }
 
         public void stopObserving() {
             final ContentResolver cr = mContext.getContentResolver();
             cr.unregisterContentObserver(this);
+            mDisplayManager.unregisterDisplayListener(mDisplayListener);
         }
 
     }
@@ -233,11 +233,15 @@
     private final Runnable mUpdateSliderRunnable = new Runnable() {
         @Override
         public void run() {
-            final float valFloat;
             final boolean inVrMode = mIsVrModeEnabled;
-            valFloat = mDisplayManager.getBrightness(mDisplayId);
+            final BrightnessInfo info = mContext.getDisplay().getBrightnessInfo();
+            if (info == null) {
+                return;
+            }
+            mBrightnessMax = info.brightnessMaximum;
+            mBrightnessMin = info.brightnessMinimum;
             // Value is passed as intbits, since this is what the message takes.
-            final int valueAsIntBits = Float.floatToIntBits(valFloat);
+            final int valueAsIntBits = Float.floatToIntBits(info.brightness);
             mHandler.obtainMessage(MSG_UPDATE_SLIDER, valueAsIntBits,
                     inVrMode ? 1 : 0).sendToTarget();
         }
@@ -295,13 +299,10 @@
 
         mDisplayId = mContext.getDisplayId();
         PowerManager pm = context.getSystemService(PowerManager.class);
-        mDefaultBacklight = mContext.getDisplay().getBrightnessDefault();
         mMinimumBacklightForVr = pm.getBrightnessConstraint(
                 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR);
         mMaximumBacklightForVr = pm.getBrightnessConstraint(
                 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR);
-        mDefaultBacklightForVr = pm.getBrightnessConstraint(
-                PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR);
 
         mDisplayManager = context.getSystemService(DisplayManager.class);
         mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
@@ -337,7 +338,6 @@
         final float minBacklight;
         final float maxBacklight;
         final int metric;
-        final String settingToChange;
 
         if (mIsVrModeEnabled) {
             metric = MetricsEvent.ACTION_BRIGHTNESS_FOR_VR;
@@ -347,12 +347,12 @@
             metric = mAutomatic
                     ? MetricsEvent.ACTION_BRIGHTNESS_AUTO
                     : MetricsEvent.ACTION_BRIGHTNESS;
-            minBacklight = PowerManager.BRIGHTNESS_MIN;
-            maxBacklight = PowerManager.BRIGHTNESS_MAX;
+            minBacklight = mBrightnessMin;
+            maxBacklight = mBrightnessMax;
         }
-        final float valFloat = MathUtils.min(convertGammaToLinearFloat(value,
-                minBacklight, maxBacklight),
-                1.0f);
+        final float valFloat = MathUtils.min(
+                convertGammaToLinearFloat(value, minBacklight, maxBacklight),
+                maxBacklight);
         if (stopTracking) {
             // TODO(brightnessfloat): change to use float value instead.
             MetricsLogger.action(mContext, metric,
@@ -403,8 +403,8 @@
             min = mMinimumBacklightForVr;
             max = mMaximumBacklightForVr;
         } else {
-            min = PowerManager.BRIGHTNESS_MIN;
-            max = PowerManager.BRIGHTNESS_MAX;
+            min = mBrightnessMin;
+            max = mBrightnessMax;
         }
         // convertGammaToLinearFloat returns 0-1
         if (BrightnessSynchronizer.floatEquals(brightnessValue,
@@ -439,6 +439,13 @@
         mSliderAnimator.start();
     }
 
+    private void notifyCallbacks() {
+        final int size = mChangeCallbacks.size();
+        for (int i = 0; i < size; i++) {
+            mChangeCallbacks.get(i).onBrightnessLevelChanged();
+        }
+    }
+
     /** Factory for creating a {@link BrightnessController}. */
     public static class Factory {
         private final Context mContext;
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
index 3ba4646..0f97e43 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
@@ -16,12 +16,17 @@
 
 package com.android.systemui.settings.brightness;
 
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
 import android.app.Activity;
 import android.os.Bundle;
 import android.view.Gravity;
 import android.view.KeyEvent;
+import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
+import android.widget.FrameLayout;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -62,10 +67,15 @@
         window.setLayout(
                 WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
 
-        BrightnessSlider controller = mToggleSliderFactory.create(this, null);
+        setContentView(R.layout.brightness_mirror_container);
+        FrameLayout frame = findViewById(R.id.brightness_mirror_container);
+        // The brightness mirror container is INVISIBLE by default.
+        frame.setVisibility(View.VISIBLE);
+
+        BrightnessSlider controller = mToggleSliderFactory.create(this, frame);
         controller.init();
-        setContentView(controller.getRootView());
-        controller.getRootView().setBackgroundResource(R.drawable.brightness_mirror_background);
+        frame.addView(controller.getRootView(), MATCH_PARENT, WRAP_CONTENT);
+
         mBrightnessController = new BrightnessController(this, controller, mBroadcastDispatcher);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java
index db82057..0ff6216 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java
@@ -44,11 +44,10 @@
  *
  * @see BrightnessMirrorController
  */
-public class BrightnessSlider extends ViewController<View> implements ToggleSlider {
+public class BrightnessSlider extends ViewController<BrightnessSliderView> implements ToggleSlider {
 
     private Listener mListener;
     private ToggleSlider mMirror;
-    private final BrightnessSliderView mBrightnessSliderView;
     private BrightnessMirrorController mMirrorController;
     private boolean mTracking;
     private final FalsingManager mFalsingManager;
@@ -71,11 +70,9 @@
     };
 
     BrightnessSlider(
-            View rootView,
             BrightnessSliderView brightnessSliderView,
             FalsingManager falsingManager) {
-        super(rootView);
-        mBrightnessSliderView = brightnessSliderView;
+        super(brightnessSliderView);
         mFalsingManager = falsingManager;
     }
 
@@ -86,21 +83,18 @@
         return mView;
     }
 
-    private void enableSlider(boolean enable) {
-        mBrightnessSliderView.enableSlider(enable);
-    }
 
     @Override
     protected void onViewAttached() {
-        mBrightnessSliderView.setOnSeekBarChangeListener(mSeekListener);
-        mBrightnessSliderView.setOnInterceptListener(mOnInterceptListener);
+        mView.setOnSeekBarChangeListener(mSeekListener);
+        mView.setOnInterceptListener(mOnInterceptListener);
     }
 
     @Override
     protected void onViewDetached() {
-        mBrightnessSliderView.setOnSeekBarChangeListener(null);
-        mBrightnessSliderView.setOnDispatchTouchEventListener(null);
-        mBrightnessSliderView.setOnInterceptListener(null);
+        mView.setOnSeekBarChangeListener(null);
+        mView.setOnDispatchTouchEventListener(null);
+        mView.setOnInterceptListener(null);
     }
 
     @Override
@@ -109,7 +103,7 @@
             return copyEventToMirror(ev);
         } else {
             // We are the mirror, so we have to dispatch the event
-            return mBrightnessSliderView.dispatchTouchEvent(ev);
+            return mView.dispatchTouchEvent(ev);
         }
     }
 
@@ -122,19 +116,19 @@
 
     @Override
     public void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
-        mBrightnessSliderView.setEnforcedAdmin(admin);
+        mView.setEnforcedAdmin(admin);
     }
 
     private void setMirror(ToggleSlider toggleSlider) {
         mMirror = toggleSlider;
         if (mMirror != null) {
-            mMirror.setMax(mBrightnessSliderView.getMax());
-            mMirror.setValue(mBrightnessSliderView.getValue());
-            mBrightnessSliderView.setOnDispatchTouchEventListener(this::mirrorTouchEvent);
+            mMirror.setMax(mView.getMax());
+            mMirror.setValue(mView.getValue());
+            mView.setOnDispatchTouchEventListener(this::mirrorTouchEvent);
         } else {
             // If there's no mirror, we may be the ones dispatching, events but we should not mirror
             // them
-            mBrightnessSliderView.setOnDispatchTouchEventListener(null);
+            mView.setOnDispatchTouchEventListener(null);
         }
     }
 
@@ -151,7 +145,7 @@
         } else {
             // If there's no mirror, we may be the ones dispatching, events but we should not mirror
             // them
-            mBrightnessSliderView.setOnDispatchTouchEventListener(null);
+            mView.setOnDispatchTouchEventListener(null);
         }
     }
 
@@ -162,7 +156,7 @@
 
     @Override
     public void setMax(int max) {
-        mBrightnessSliderView.setMax(max);
+        mView.setMax(max);
         if (mMirror != null) {
             mMirror.setMax(max);
         }
@@ -170,12 +164,12 @@
 
     @Override
     public int getMax() {
-        return mBrightnessSliderView.getMax();
+        return mView.getMax();
     }
 
     @Override
     public void setValue(int value) {
-        mBrightnessSliderView.setValue(value);
+        mView.setValue(value);
         if (mMirror != null) {
             mMirror.setValue(value);
         }
@@ -183,7 +177,7 @@
 
     @Override
     public int getValue() {
-        return mBrightnessSliderView.getValue();
+        return mView.getValue();
     }
 
     private final SeekBar.OnSeekBarChangeListener mSeekListener =
@@ -205,7 +199,7 @@
 
             if (mMirrorController != null) {
                 mMirrorController.showMirror();
-                mMirrorController.setLocation((View) mBrightnessSliderView.getParent());
+                mMirrorController.setLocationAndSize(mView);
             }
         }
 
@@ -244,15 +238,9 @@
          */
         public BrightnessSlider create(Context context, @Nullable ViewGroup viewRoot) {
             int layout = getLayout();
-            ViewGroup root = (ViewGroup) LayoutInflater.from(context)
+            BrightnessSliderView root = (BrightnessSliderView) LayoutInflater.from(context)
                     .inflate(layout, viewRoot, false);
-            return fromTree(root);
-        }
-
-        private BrightnessSlider fromTree(ViewGroup root) {
-            BrightnessSliderView v = root.requireViewById(R.id.brightness_slider);
-
-            return new BrightnessSlider(root, v, mFalsingManager);
+            return new BrightnessSlider(root, mFalsingManager);
         }
 
         /** Get the layout to inflate based on what slider to use */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index c1eaaaf..6b68fc6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -888,7 +888,14 @@
             if (msgId == FaceManager.FACE_ERROR_TIMEOUT) {
                 // The face timeout message is not very actionable, let's ask the user to
                 // manually retry.
-                showSwipeUpToUnlock();
+                if (!mStatusBarKeyguardViewManager.isBouncerShowing()
+                        && mKeyguardUpdateMonitor.isUdfpsEnrolled()) {
+                    // suggest trying fingerprint
+                    showTransientIndication(R.string.keyguard_try_fingerprint);
+                } else {
+                    // suggest swiping up to unlock (try face auth again or swipe up to bouncer)
+                    showSwipeUpToUnlock();
+                }
             } else if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
                 mStatusBarKeyguardViewManager.showBouncerMessage(errString, mInitialTextColorState);
             } else if (mKeyguardUpdateMonitor.isScreenOn()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
index 2a46893..e8ce5f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
@@ -98,15 +98,6 @@
     var globalActionsSpring = DepthAnimation()
     var showingHomeControls: Boolean = false
 
-    @VisibleForTesting
-    var brightnessMirrorSpring = DepthAnimation()
-    var brightnessMirrorVisible: Boolean = false
-        set(value) {
-            field = value
-            brightnessMirrorSpring.animateTo(if (value) blurUtils.blurRadiusOfRatio(1f)
-                else 0)
-        }
-
     var qsPanelExpansion = 0f
         set(value) {
             if (field == value) return
@@ -169,7 +160,6 @@
                 normalizedBlurRadius * ANIMATION_BLUR_FRACTION).toInt()
         combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsPanelExpansion))
         var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius).toFloat()
-        shadeRadius *= 1f - brightnessMirrorSpring.ratio
         val launchProgress = notificationLaunchAnimationParams?.linearProgress ?: 0f
         shadeRadius *= (1f - launchProgress) * (1f - launchProgress)
 
@@ -263,7 +253,6 @@
                 shadeSpring.finishIfRunning()
                 shadeAnimation.finishIfRunning()
                 globalActionsSpring.finishIfRunning()
-                brightnessMirrorSpring.finishIfRunning()
             }
         }
 
@@ -425,7 +414,6 @@
             it.println("shadeRadius: ${shadeSpring.radius}")
             it.println("shadeAnimation: ${shadeAnimation.radius}")
             it.println("globalActionsRadius: ${globalActionsSpring.radius}")
-            it.println("brightnessMirrorRadius: ${brightnessMirrorSpring.radius}")
             it.println("wakeAndUnlockBlur: $wakeAndUnlockBlurRadius")
             it.println("notificationLaunchAnimationProgress: " +
                     "${notificationLaunchAnimationParams?.linearProgress}")
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index f4266a2..fb109f3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -84,7 +84,6 @@
     private int mCutoutHeight;
     private int mGapHeight;
     private int mIndexOfFirstViewInShelf = -1;
-    private int mIndexOfFirstViewInOverflowingSection = -1;
 
     private NotificationShelfController mController;
 
@@ -180,7 +179,6 @@
             viewState.xTranslation = getTranslationX();
             viewState.hasItemsInStableShelf = lastViewState.inShelf;
             viewState.firstViewInShelf = algorithmState.firstViewInShelf;
-            viewState.firstViewInOverflowSection = algorithmState.firstViewInOverflowSection;
             if (mNotGoneIndex != -1) {
                 viewState.notGoneIndex = Math.min(viewState.notGoneIndex, mNotGoneIndex);
             }
@@ -268,17 +266,6 @@
             // TODO(b/172289889) scale mPaddingBetweenElements with expansion amount
             if ((isLastChild && !child.isInShelf()) || aboveShelf || backgroundForceHidden) {
                 notificationClipEnd = stackEnd;
-            } else if (mAmbientState.isExpansionChanging()) {
-                if (mIndexOfFirstViewInOverflowingSection != -1
-                    && i >= mIndexOfFirstViewInOverflowingSection) {
-                    // Clip notifications in (section overflowing into shelf) to shelf start.
-                    notificationClipEnd = shelfStart - mPaddingBetweenElements;
-                } else {
-                    // Clip notifications before the section overflowing into shelf
-                    // to stackEnd because we do not show the shelf if the section right before the
-                    // shelf is still hidden.
-                    notificationClipEnd = stackEnd;
-                }
             } else {
                 notificationClipEnd = shelfStart - mPaddingBetweenElements;
             }
@@ -692,7 +679,6 @@
     private void setHideBackground(boolean hideBackground) {
         if (mHideBackground != hideBackground) {
             mHideBackground = hideBackground;
-            updateBackground();
             updateOutline();
         }
     }
@@ -702,10 +688,6 @@
         return !mHideBackground && super.needsOutline();
     }
 
-    @Override
-    protected boolean shouldHideBackground() {
-        return super.shouldHideBackground() || mHideBackground;
-    }
 
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
@@ -836,11 +818,6 @@
         mIndexOfFirstViewInShelf = mHostLayoutController.indexOfChild(firstViewInShelf);
     }
 
-    public void setFirstViewInOverflowingSection(ExpandableView firstViewInOverflowingSection) {
-        mIndexOfFirstViewInOverflowingSection =
-                mHostLayoutController.indexOfChild(firstViewInOverflowingSection);
-    }
-
     private class ShelfState extends ExpandableViewState {
         private boolean hasItemsInStableShelf;
         private ExpandableView firstViewInShelf;
@@ -854,7 +831,6 @@
 
             super.applyToView(view);
             setIndexOfFirstViewInShelf(firstViewInShelf);
-            setFirstViewInOverflowingSection(firstViewInOverflowSection);
             updateAppearance();
             setHasItemsInStableShelf(hasItemsInStableShelf);
             mShelfIcons.setAnimationsEnabled(mAnimationsEnabled);
@@ -868,7 +844,6 @@
 
             super.animateTo(child, properties);
             setIndexOfFirstViewInShelf(firstViewInShelf);
-            setFirstViewInOverflowingSection(firstViewInOverflowSection);
             updateAppearance();
             setHasItemsInStableShelf(hasItemsInStableShelf);
             mShelfIcons.setAnimationsEnabled(mAnimationsEnabled);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
index 718a85a..761a1d6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
@@ -17,8 +17,10 @@
 package com.android.systemui.statusbar.charging
 
 import android.content.Context
+import android.content.res.Configuration
 import android.graphics.PixelFormat
 import android.graphics.PointF
+import android.os.SystemProperties
 import android.util.DisplayMetrics
 import android.view.View
 import android.view.WindowManager
@@ -31,8 +33,15 @@
 import com.android.systemui.statusbar.policy.BatteryController
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.util.leak.RotationUtils
+import com.android.systemui.R
+import com.android.systemui.util.time.SystemClock
 import java.io.PrintWriter
 import javax.inject.Inject
+import kotlin.math.min
+import kotlin.math.pow
+
+private const val MAX_DEBOUNCE_LEVEL = 3
+private const val BASE_DEBOUNCE_TIME = 2000
 
 /***
  * Controls the ripple effect that shows when wired charging begins.
@@ -44,10 +53,17 @@
     batteryController: BatteryController,
     configurationController: ConfigurationController,
     featureFlags: FeatureFlags,
-    private val context: Context
+    private val context: Context,
+    private val windowManager: WindowManager,
+    private val systemClock: SystemClock
 ) {
     private var charging: Boolean? = null
-    private val rippleEnabled: Boolean = featureFlags.isChargingRippleEnabled
+    private val rippleEnabled: Boolean = featureFlags.isChargingRippleEnabled &&
+            !SystemProperties.getBoolean("persist.debug.suppress-charging-ripple", false)
+    private var normalizedPortPosX: Float = context.resources.getFloat(
+            R.dimen.physical_charger_port_location_normalized_x)
+    private var normalizedPortPosY: Float = context.resources.getFloat(
+            R.dimen.physical_charger_port_location_normalized_y)
     private val windowLayoutParams = WindowManager.LayoutParams().apply {
         width = WindowManager.LayoutParams.MATCH_PARENT
         height = WindowManager.LayoutParams.MATCH_PARENT
@@ -60,6 +76,8 @@
                 or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
         setTrustedOverlay()
     }
+    private var lastTriggerTime: Long? = null
+    private var debounceLevel = 0
 
     @VisibleForTesting
     var rippleView: ChargingRippleView = ChargingRippleView(context, attrs = null)
@@ -80,7 +98,7 @@
                 charging = nowCharging
                 // Only triggers when the keyguard is active and the device is just plugged in.
                 if ((wasCharging == null || !wasCharging) && nowCharging) {
-                    startRipple()
+                    startRippleWithDebounce()
                 }
             }
         }
@@ -96,6 +114,13 @@
             override fun onOverlayChanged() {
                 updateRippleColor()
             }
+
+            override fun onConfigChanged(newConfig: Configuration?) {
+                normalizedPortPosX = context.resources.getFloat(
+                        R.dimen.physical_charger_port_location_normalized_x)
+                normalizedPortPosY = context.resources.getFloat(
+                        R.dimen.physical_charger_port_location_normalized_y)
+            }
         }
         configurationController.addCallback(configurationChangedListener)
 
@@ -103,14 +128,29 @@
         updateRippleColor()
     }
 
+    // Lazily debounce ripple to avoid triggering ripple constantly (e.g. from flaky chargers).
+    internal fun startRippleWithDebounce() {
+        val now = systemClock.elapsedRealtime()
+        // Debounce wait time = 2 ^ debounce level
+        if (lastTriggerTime == null ||
+                (now - lastTriggerTime!!) > BASE_DEBOUNCE_TIME * (2.0.pow(debounceLevel))) {
+            // Not waiting for debounce. Start ripple.
+            startRipple()
+            debounceLevel = 0
+        } else {
+            // Still waiting for debounce. Ignore ripple and bump debounce level.
+            debounceLevel = min(MAX_DEBOUNCE_LEVEL, debounceLevel + 1)
+        }
+        lastTriggerTime = now
+    }
+
     fun startRipple() {
-        if (rippleView.rippleInProgress || rippleView.parent != null) {
+        if (!rippleEnabled || rippleView.rippleInProgress || rippleView.parent != null) {
             // Skip if ripple is still playing, or not playing but already added the parent
             // (which might happen just before the animation starts or right after
             // the animation ends.)
             return
         }
-        val mWM = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
         windowLayoutParams.packageName = context.opPackageName
         rippleView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
             override fun onViewDetachedFromWindow(view: View?) {}
@@ -118,12 +158,12 @@
             override fun onViewAttachedToWindow(view: View?) {
                 layoutRipple()
                 rippleView.startRipple(Runnable {
-                    mWM.removeView(rippleView)
+                    windowManager.removeView(rippleView)
                 })
                 rippleView.removeOnAttachStateChangeListener(this)
             }
         })
-        mWM.addView(rippleView, windowLayoutParams)
+        windowManager.addView(rippleView, windowLayoutParams)
     }
 
     private fun layoutRipple() {
@@ -132,23 +172,19 @@
         val width = displayMetrics.widthPixels
         val height = displayMetrics.heightPixels
         rippleView.radius = Integer.max(width, height).toFloat()
-
-        // Always show the ripple from the charging cable location.
-        // Currently assuming the charging cable is at the bottom of the screen.
-        // TODO(shanh): Pull charging port location into configurations.
         rippleView.origin = when (RotationUtils.getRotation(context)) {
             RotationUtils.ROTATION_LANDSCAPE -> {
-                PointF(width.toFloat(), height / 2f)
+                PointF(width * normalizedPortPosY, height * (1 - normalizedPortPosX))
             }
             RotationUtils.ROTATION_UPSIDE_DOWN -> {
-                PointF(width / 2f, 0f)
+                PointF(width * (1 - normalizedPortPosX), height * (1 - normalizedPortPosY))
             }
             RotationUtils.ROTATION_SEASCAPE -> {
-                PointF(0f, height / 2f)
+                PointF(width * (1 - normalizedPortPosY), height * normalizedPortPosX)
             }
             else -> {
                 // ROTATION_NONE
-                PointF(width / 2f, height.toFloat())
+                PointF(width * normalizedPortPosX, height * normalizedPortPosY)
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt
index b85d031..1e07131 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt
@@ -23,6 +23,7 @@
 import android.annotation.IntDef
 import android.content.Context
 import android.os.Process
+import android.provider.DeviceConfig
 import android.util.Log
 import android.view.View
 
@@ -62,6 +63,14 @@
     @Main private val executor: DelayableExecutor
 ) : CallbackController<SystemStatusAnimationCallback> {
 
+    companion object {
+        private const val PROPERTY_ENABLE_IMMERSIVE_INDICATOR = "enable_immersive_indicator"
+    }
+    private fun isImmersiveIndicatorEnabled(): Boolean {
+        return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+                PROPERTY_ENABLE_IMMERSIVE_INDICATOR, true)
+    }
+
     /** True from the time a scheduled event starts until it's animation finishes */
     var isActive = false
         private set
@@ -83,7 +92,7 @@
 
     fun onStatusEvent(event: StatusEvent) {
         // Ignore any updates until the system is up and running
-        if (isTooEarly()) {
+        if (isTooEarly() || !isImmersiveIndicatorEnabled()) {
             return
         }
 
@@ -106,7 +115,7 @@
     }
 
     fun setShouldShowPersistentPrivacyIndicator(should: Boolean) {
-        if (hasPersistentDot == should) {
+        if (hasPersistentDot == should || !isImmersiveIndicatorEnabled()) {
             return
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
index 0b6a5c9..c85b62f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
@@ -6,7 +6,6 @@
 import com.android.systemui.statusbar.NotificationShadeDepthController
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer
-import com.android.systemui.statusbar.phone.NotificationPanelViewController
 import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController
 import kotlin.math.ceil
 import kotlin.math.max
@@ -14,7 +13,6 @@
 /** A provider of [NotificationLaunchAnimatorController]. */
 class NotificationLaunchAnimatorControllerProvider(
     private val notificationShadeWindowViewController: NotificationShadeWindowViewController,
-    private val notificationPanelViewController: NotificationPanelViewController,
     private val notificationListContainer: NotificationListContainer,
     private val depthController: NotificationShadeDepthController
 ) {
@@ -23,7 +21,6 @@
     ): NotificationLaunchAnimatorController {
         return NotificationLaunchAnimatorController(
             notificationShadeWindowViewController,
-            notificationPanelViewController,
             notificationListContainer,
             depthController,
             notification
@@ -38,7 +35,6 @@
  */
 class NotificationLaunchAnimatorController(
     private val notificationShadeWindowViewController: NotificationShadeWindowViewController,
-    private val notificationPanelViewController: NotificationPanelViewController,
     private val notificationListContainer: NotificationListContainer,
     private val depthController: NotificationShadeDepthController,
     private val notification: ExpandableNotificationRow
@@ -88,16 +84,7 @@
         notificationShadeWindowViewController.setExpandAnimationRunning(false)
     }
 
-    override fun onLaunchAnimationTimedOut() {
-        notificationShadeWindowViewController.setExpandAnimationRunning(false)
-    }
-
-    override fun onLaunchAnimationAborted() {
-        notificationShadeWindowViewController.setExpandAnimationRunning(false)
-    }
-
     override fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) {
-        notificationPanelViewController.setLaunchingNotification(true)
         notification.isExpandAnimationRunning = true
         notificationListContainer.setExpandingNotification(notification)
 
@@ -108,7 +95,6 @@
     override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {
         InteractionJankMonitor.getInstance().end(InteractionJankMonitor.CUJ_NOTIFICATION_APP_START)
 
-        notificationPanelViewController.setLaunchingNotification(false)
         notification.isExpandAnimationRunning = false
         notificationShadeWindowViewController.setExpandAnimationRunning(false)
         notificationListContainer.setExpandingNotification(null)
@@ -118,7 +104,6 @@
     private fun applyParams(params: ExpandAnimationParameters?) {
         notification.applyExpandAnimationParams(params)
         notificationListContainer.applyExpandAnimationParams(params)
-        notificationPanelViewController.applyExpandAnimationParams(params)
         depthController.notificationLaunchAnimationParams = params
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt
index fb42c42..fad0e49 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.notification.collection
 
+import android.app.Notification
 import android.app.NotificationManager.IMPORTANCE_HIGH
 import android.app.NotificationManager.IMPORTANCE_MIN
 import android.service.notification.NotificationListenerService.Ranking
@@ -25,6 +26,7 @@
 import com.android.systemui.statusbar.notification.NotificationEntryManagerLogger
 import com.android.systemui.statusbar.notification.NotificationFilter
 import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
+import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy
 import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider
 import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier
 import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON
@@ -33,11 +35,11 @@
 import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE
 import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
 import com.android.systemui.statusbar.notification.stack.PriorityBucket
-import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy
 import com.android.systemui.statusbar.policy.HeadsUpManager
 import dagger.Lazy
 import java.util.Objects
 import javax.inject.Inject
+import kotlin.Comparator
 
 private const val TAG = "NotifRankingManager"
 
@@ -77,6 +79,9 @@
         val aIsFsn = a.isColorizedForegroundService()
         val bIsFsn = b.isColorizedForegroundService()
 
+        val aCall = a.isImportantCall()
+        val bCall = b.isImportantCall()
+
         val aPersonType = a.getPeopleNotificationType()
         val bPersonType = b.getPeopleNotificationType()
 
@@ -96,6 +101,7 @@
             // Provide consistent ranking with headsUpManager
             aHeadsUp -> headsUpManager.compare(a, b)
             aIsFsn != bIsFsn -> if (aIsFsn) -1 else 1
+            aCall != bCall -> if (aCall) -1 else 1
             usePeopleFiltering && aPersonType != bPersonType ->
                 peopleNotificationIdentifier.compareTo(aPersonType, bPersonType)
             // Upsort current media notification.
@@ -150,11 +156,12 @@
 
     @PriorityBucket
     private fun getBucketForEntry(entry: NotificationEntry): Int {
+        val isImportantCall = entry.isImportantCall()
         val isHeadsUp = entry.isRowHeadsUp
         val isMedia = entry.isImportantMedia()
         val isSystemMax = entry.isSystemMax()
         return when {
-            entry.isColorizedForegroundService() -> BUCKET_FOREGROUND_SERVICE
+            entry.isColorizedForegroundService() || isImportantCall -> BUCKET_FOREGROUND_SERVICE
             usePeopleFiltering && entry.isConversation() -> BUCKET_PEOPLE
             isHeadsUp || isMedia || isSystemMax || entry.isHighPriority() -> BUCKET_ALERTING
             else -> BUCKET_SILENT
@@ -186,7 +193,7 @@
     }
 
     private fun NotificationEntry.isImportantMedia() =
-            key == mediaManager.mediaNotificationKey && ranking.importance > IMPORTANCE_MIN
+            key == mediaManager.mediaNotificationKey && importance > IMPORTANCE_MIN
 
     private fun NotificationEntry.isConversation() = getPeopleNotificationType() != TYPE_NON_PERSON
 
@@ -204,6 +211,10 @@
 private fun StatusBarNotification.isSystemNotification() =
         "android" == packageName || "com.android.systemui" == packageName
 
+private fun NotificationEntry.isImportantCall() =
+        sbn.notification.extras?.getString(Notification.EXTRA_TEMPLATE) ==
+                "android.app.Notification\$CallStyle" && importance > IMPORTANCE_MIN
+
 private fun NotificationEntry.isColorizedForegroundService() = sbn.notification.run {
     isForegroundService && isColorized && importance > IMPORTANCE_MIN
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
index 3db5440..d6356de 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java
@@ -242,12 +242,12 @@
         int childCount = 0;
         boolean hasBubbles = false;
         for (NotificationEntry entry : group.children.values()) {
-            if (mBubblesOptional.isPresent() && !mBubblesOptional.get()
+            if (mBubblesOptional.isPresent() && mBubblesOptional.get()
                     .isBubbleNotificationSuppressedFromShade(
                             entry.getKey(), entry.getSbn().getGroupKey())) {
-                childCount++;
-            } else {
                 hasBubbles = true;
+            } else {
+                childCount++;
             }
         }
 
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 f8543f7..b237f6f 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
@@ -22,13 +22,11 @@
 import android.animation.ValueAnimator;
 import android.content.Context;
 import android.graphics.Canvas;
-import android.graphics.Color;
 import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.util.MathUtils;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewAnimationUtils;
 import android.view.accessibility.AccessibilityManager;
 import android.view.animation.Interpolator;
 import android.view.animation.PathInterpolator;
@@ -50,9 +48,6 @@
  */
 public abstract class ActivatableNotificationView extends ExpandableOutlineView {
 
-    private static final int BACKGROUND_ANIMATION_LENGTH_MS = 220;
-    private static final int ACTIVATE_ANIMATION_LENGTH = 220;
-
     /**
      * The amount of width, which is kept in the end when performing a disappear animation (also
      * the amount from which the horizontal appearing begins)
@@ -97,8 +92,6 @@
     private int mNormalRippleColor;
     private Gefingerpoken mTouchHandler;
 
-    private boolean mDimmed;
-
     int mBgTint = NO_COLOR;
 
     /**
@@ -115,7 +108,6 @@
     private Interpolator mCurrentAlphaInterpolator;
 
     NotificationBackgroundView mBackgroundNormal;
-    private NotificationBackgroundView mBackgroundDimmed;
     private ObjectAnimator mBackgroundAnimator;
     private RectF mAppearAnimationRect = new RectF();
     private float mAnimationTranslationY;
@@ -129,13 +121,11 @@
     private long mLastActionUpTime;
 
     private float mNormalBackgroundVisibilityAmount;
-    private float mDimmedBackgroundFadeInAmount = -1;
     private ValueAnimator.AnimatorUpdateListener mBackgroundVisibilityUpdater
             = new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
             setNormalBackgroundVisibilityAmount(mBackgroundNormal.getAlpha());
-            mDimmedBackgroundFadeInAmount = mBackgroundDimmed.getAlpha();
         }
     };
     private FakeShadowView mFakeShadow;
@@ -145,18 +135,12 @@
     private int mOverrideTint;
     private float mOverrideAmount;
     private boolean mShadowHidden;
-    /**
-     * Similar to mDimmed but is also true if it's not dimmable but should be
-     */
-    private boolean mNeedsDimming;
-    private int mDimmedAlpha;
     private boolean mIsHeadsUpAnimation;
     private int mHeadsUpAddStartLocation;
     private float mHeadsUpLocation;
     private boolean mIsAppearing;
     private boolean mDismissed;
     private boolean mRefocusOnDismiss;
-    private OnDimmedListener mOnDimmedListener;
     private AccessibilityManager mAccessibilityManager;
 
     public ActivatableNotificationView(Context context, AttributeSet attrs) {
@@ -176,8 +160,6 @@
                 R.color.notification_ripple_tinted_color);
         mNormalRippleColor = mContext.getColor(
                 R.color.notification_ripple_untinted_color);
-        mDimmedAlpha = Color.alpha(mContext.getColor(
-                R.color.notification_background_dimmed_color));
     }
 
     private void initDimens() {
@@ -206,21 +188,18 @@
         mBackgroundNormal = findViewById(R.id.backgroundNormal);
         mFakeShadow = findViewById(R.id.fake_shadow);
         mShadowHidden = mFakeShadow.getVisibility() != VISIBLE;
-        mBackgroundDimmed = findViewById(R.id.backgroundDimmed);
         initBackground();
-        updateBackground();
         updateBackgroundTint();
         updateOutlineAlpha();
     }
 
     /**
-     * Sets the custom backgrounds on {@link #mBackgroundNormal} and {@link #mBackgroundDimmed}.
+     * Sets the custom background on {@link #mBackgroundNormal}
      * This method can also be used to reload the backgrounds on both of those views, which can
      * be useful in a configuration change.
      */
     protected void initBackground() {
         mBackgroundNormal.setCustomBackground(R.drawable.notification_material_bg);
-        mBackgroundDimmed.setCustomBackground(R.drawable.notification_material_bg_dim);
     }
 
 
@@ -264,20 +243,9 @@
     }
 
     @Override
-    public void drawableHotspotChanged(float x, float y) {
-        if (!mDimmed){
-            mBackgroundNormal.drawableHotspotChanged(x, y);
-        }
-    }
-
-    @Override
     protected void drawableStateChanged() {
         super.drawableStateChanged();
-        if (mDimmed) {
-            mBackgroundDimmed.setState(getDrawableState());
-        } else {
-            mBackgroundNormal.setState(getDrawableState());
-        }
+        mBackgroundNormal.setState(getDrawableState());
     }
 
     void setRippleAllowed(boolean allowed) {
@@ -285,7 +253,6 @@
     }
 
     void makeActive() {
-        startActivateAnimation(false /* reverse */);
         mActivated = true;
         if (mOnActivatedListener != null) {
             mOnActivatedListener.onActivated(this);
@@ -296,106 +263,18 @@
         return mActivated;
     }
 
-    private void startActivateAnimation(final boolean reverse) {
-        if (!isAttachedToWindow()) {
-            return;
-        }
-        if (!isDimmable()) {
-            return;
-        }
-        int widthHalf = mBackgroundNormal.getWidth()/2;
-        int heightHalf = mBackgroundNormal.getActualHeight()/2;
-        float radius = (float) Math.sqrt(widthHalf*widthHalf + heightHalf*heightHalf);
-        Animator animator;
-        if (reverse) {
-            animator = ViewAnimationUtils.createCircularReveal(mBackgroundNormal,
-                    widthHalf, heightHalf, radius, 0);
-        } else {
-            animator = ViewAnimationUtils.createCircularReveal(mBackgroundNormal,
-                    widthHalf, heightHalf, 0, radius);
-        }
-        mBackgroundNormal.setVisibility(View.VISIBLE);
-        Interpolator interpolator;
-        Interpolator alphaInterpolator;
-        if (!reverse) {
-            interpolator = Interpolators.LINEAR_OUT_SLOW_IN;
-            alphaInterpolator = Interpolators.LINEAR_OUT_SLOW_IN;
-        } else {
-            interpolator = ACTIVATE_INVERSE_INTERPOLATOR;
-            alphaInterpolator = ACTIVATE_INVERSE_ALPHA_INTERPOLATOR;
-        }
-        animator.setInterpolator(interpolator);
-        animator.setDuration(ACTIVATE_ANIMATION_LENGTH);
-        if (reverse) {
-            mBackgroundNormal.setAlpha(1f);
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    updateBackground();
-                }
-            });
-            animator.start();
-        } else {
-            mBackgroundNormal.setAlpha(0.4f);
-            animator.start();
-        }
-        mBackgroundNormal.animate()
-                .alpha(reverse ? 0f : 1f)
-                .setInterpolator(alphaInterpolator)
-                .setUpdateListener(animation -> {
-                    float animatedFraction = animation.getAnimatedFraction();
-                    if (reverse) {
-                        animatedFraction = 1.0f - animatedFraction;
-                    }
-                    setNormalBackgroundVisibilityAmount(animatedFraction);
-                })
-                .setDuration(ACTIVATE_ANIMATION_LENGTH);
-    }
-
     /**
      * Cancels the hotspot and makes the notification inactive.
      */
     public void makeInactive(boolean animate) {
         if (mActivated) {
             mActivated = false;
-            if (mDimmed) {
-                if (animate) {
-                    startActivateAnimation(true /* reverse */);
-                } else {
-                    updateBackground();
-                }
-            }
         }
         if (mOnActivatedListener != null) {
             mOnActivatedListener.onActivationReset(this);
         }
     }
 
-    public void setDimmed(boolean dimmed, boolean fade) {
-        mNeedsDimming = dimmed;
-        if (mOnDimmedListener != null) {
-            mOnDimmedListener.onSetDimmed(dimmed);
-        }
-        dimmed &= isDimmable();
-        if (mDimmed != dimmed) {
-            mDimmed = dimmed;
-            resetBackgroundAlpha();
-            if (fade) {
-                fadeDimmedBackground();
-            } else {
-                updateBackground();
-            }
-        }
-    }
-
-    public boolean isDimmable() {
-        return true;
-    }
-
-    public boolean isDimmed() {
-        return mDimmed;
-    }
-
     private void updateOutlineAlpha() {
         float alpha = NotificationStackScrollLayout.BACKGROUND_ALPHA_DIMMED;
         alpha = (alpha + (1.0f - alpha) * mNormalBackgroundVisibilityAmount);
@@ -448,7 +327,6 @@
     public void setDistanceToTopRoundness(float distanceToTopRoundness) {
         super.setDistanceToTopRoundness(distanceToTopRoundness);
         mBackgroundNormal.setDistanceToTopRoundness(distanceToTopRoundness);
-        mBackgroundDimmed.setDistanceToTopRoundness(distanceToTopRoundness);
     }
 
     /** Sets whether this view is the last notification in a section. */
@@ -457,7 +335,6 @@
         if (lastInSection != mLastInSection) {
             super.setLastInSection(lastInSection);
             mBackgroundNormal.setLastInSection(lastInSection);
-            mBackgroundDimmed.setLastInSection(lastInSection);
         }
     }
 
@@ -467,7 +344,6 @@
         if (firstInSection != mFirstInSection) {
             super.setFirstInSection(firstInSection);
             mBackgroundNormal.setFirstInSection(firstInSection);
-            mBackgroundDimmed.setFirstInSection(firstInSection);
         }
     }
 
@@ -486,13 +362,6 @@
         mOverrideAmount = overrideAmount;
         int newColor = calculateBgColor();
         setBackgroundTintColor(newColor);
-        if (!isDimmable() && mNeedsDimming) {
-           mBackgroundNormal.setDrawableAlpha((int) NotificationUtils.interpolate(255,
-                   mDimmedAlpha,
-                   overrideAmount));
-        } else {
-            mBackgroundNormal.setDrawableAlpha(255);
-        }
     }
 
     protected void updateBackgroundTint() {
@@ -504,7 +373,6 @@
             mBackgroundColorAnimator.cancel();
         }
         int rippleColor = getRippleColor();
-        mBackgroundDimmed.setRippleColor(rippleColor);
         mBackgroundNormal.setRippleColor(rippleColor);
         int color = calculateBgColor();
         if (!animated) {
@@ -537,110 +405,12 @@
                 // We don't need to tint a normal notification
                 color = 0;
             }
-            mBackgroundDimmed.setTint(color);
             mBackgroundNormal.setTint(color);
         }
     }
 
-    /**
-     * Fades the background when the dimmed state changes.
-     */
-    private void fadeDimmedBackground() {
-        mBackgroundDimmed.animate().cancel();
-        mBackgroundNormal.animate().cancel();
-        if (mActivated) {
-            updateBackground();
-            return;
-        }
-        if (!shouldHideBackground()) {
-            if (mDimmed) {
-                mBackgroundDimmed.setVisibility(View.VISIBLE);
-            } else {
-                mBackgroundNormal.setVisibility(View.VISIBLE);
-            }
-        }
-        float startAlpha = mDimmed ? 1f : 0;
-        float endAlpha = mDimmed ? 0 : 1f;
-        int duration = BACKGROUND_ANIMATION_LENGTH_MS;
-        // Check whether there is already a background animation running.
-        if (mBackgroundAnimator != null) {
-            startAlpha = (Float) mBackgroundAnimator.getAnimatedValue();
-            duration = (int) mBackgroundAnimator.getCurrentPlayTime();
-            mBackgroundAnimator.removeAllListeners();
-            mBackgroundAnimator.cancel();
-            if (duration <= 0) {
-                updateBackground();
-                return;
-            }
-        }
-        mBackgroundNormal.setAlpha(startAlpha);
-        mBackgroundAnimator =
-                ObjectAnimator.ofFloat(mBackgroundNormal, View.ALPHA, startAlpha, endAlpha);
-        mBackgroundAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
-        mBackgroundAnimator.setDuration(duration);
-        mBackgroundAnimator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                updateBackground();
-                mBackgroundAnimator = null;
-                mDimmedBackgroundFadeInAmount = -1;
-            }
-        });
-        mBackgroundAnimator.addUpdateListener(mBackgroundVisibilityUpdater);
-        mBackgroundAnimator.start();
-    }
-
-    protected void updateBackgroundAlpha(float transformationAmount) {
-        float bgAlpha = isChildInGroup() && mDimmed ? transformationAmount : 1f;
-        if (mDimmedBackgroundFadeInAmount != -1) {
-            bgAlpha *= mDimmedBackgroundFadeInAmount;
-        }
-        mBackgroundDimmed.setAlpha(bgAlpha);
-    }
-
-    protected void resetBackgroundAlpha() {
-        updateBackgroundAlpha(0f /* transformationAmount */);
-    }
-
-    protected void updateBackground() {
-        cancelFadeAnimations();
-        if (shouldHideBackground()) {
-            mBackgroundDimmed.setVisibility(INVISIBLE);
-            mBackgroundNormal.setVisibility(mActivated ? VISIBLE : INVISIBLE);
-        } else if (mDimmed) {
-            // When groups are animating to the expanded state from the lockscreen, show the
-            // normal background instead of the dimmed background.
-            final boolean dontShowDimmed = isGroupExpansionChanging() && isChildInGroup();
-            mBackgroundDimmed.setVisibility(dontShowDimmed ? View.INVISIBLE : View.VISIBLE);
-            mBackgroundNormal.setVisibility((mActivated || dontShowDimmed)
-                    ? View.VISIBLE
-                    : View.INVISIBLE);
-        } else {
-            mBackgroundDimmed.setVisibility(View.INVISIBLE);
-            mBackgroundNormal.setVisibility(View.VISIBLE);
-            mBackgroundNormal.setAlpha(1f);
-            // make in inactive to avoid it sticking around active
-            makeInactive(false /* animate */);
-        }
-        setNormalBackgroundVisibilityAmount(
-                mBackgroundNormal.getVisibility() == View.VISIBLE ? 1.0f : 0.0f);
-    }
-
     protected void updateBackgroundClipping() {
         mBackgroundNormal.setBottomAmountClips(!isChildInGroup());
-        mBackgroundDimmed.setBottomAmountClips(!isChildInGroup());
-    }
-
-    protected boolean shouldHideBackground() {
-        return false;
-    }
-
-    private void cancelFadeAnimations() {
-        if (mBackgroundAnimator != null) {
-            mBackgroundAnimator.cancel();
-        }
-        mBackgroundDimmed.animate().cancel();
-        mBackgroundNormal.animate().cancel();
     }
 
     @Override
@@ -654,21 +424,18 @@
         super.setActualHeight(actualHeight, notifyListeners);
         setPivotY(actualHeight / 2);
         mBackgroundNormal.setActualHeight(actualHeight);
-        mBackgroundDimmed.setActualHeight(actualHeight);
     }
 
     @Override
     public void setClipTopAmount(int clipTopAmount) {
         super.setClipTopAmount(clipTopAmount);
         mBackgroundNormal.setClipTopAmount(clipTopAmount);
-        mBackgroundDimmed.setClipTopAmount(clipTopAmount);
     }
 
     @Override
     public void setClipBottomAmount(int clipBottomAmount) {
         super.setClipBottomAmount(clipBottomAmount);
         mBackgroundNormal.setClipBottomAmount(clipBottomAmount);
-        mBackgroundDimmed.setClipBottomAmount(clipBottomAmount);
     }
 
     @Override
@@ -891,13 +658,11 @@
     }
 
     private void applyBackgroundRoundness(float topRadius, float bottomRadius) {
-        mBackgroundDimmed.setRadius(topRadius, bottomRadius);
         mBackgroundNormal.setRadius(topRadius, bottomRadius);
     }
 
     @Override
     protected void setBackgroundTop(int backgroundTop) {
-        mBackgroundDimmed.setBackgroundTop(backgroundTop);
         mBackgroundNormal.setBackgroundTop(backgroundTop);
     }
 
@@ -1033,10 +798,6 @@
         mTouchHandler = touchHandler;
     }
 
-    void setOnDimmedListener(OnDimmedListener onDimmedListener) {
-        mOnDimmedListener = onDimmedListener;
-    }
-
     public void setAccessibilityManager(AccessibilityManager accessibilityManager) {
         mAccessibilityManager = accessibilityManager;
     }
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 edd97af..0a63e19 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
@@ -85,7 +85,6 @@
         mExpandableOutlineViewController.init();
         mView.setOnTouchListener(mTouchHandler);
         mView.setTouchHandler(mTouchHandler);
-        mView.setOnDimmedListener(dimmed -> mNeedsDimming = dimmed);
         mView.setAccessibilityManager(mAccessibilityManager);
     }
 
@@ -116,14 +115,8 @@
             if (mAccessibilityManager.isTouchExplorationEnabled()) {
                 return false;
             }
-            if (mNeedsDimming && mView.isInteractive()) {
-                if (mNeedsDimming && !mView.isDimmed()) {
-                    // We're actually dimmed, but our content isn't dimmable,
-                    // let's ensure we have a ripple
-                    return false;
-                }
-                result = mNotificationTapHelper.onTouchEvent(ev, mView.getActualHeight());
-            } else if (ev.getAction() == MotionEvent.ACTION_UP) {
+
+            if (ev.getAction() == MotionEvent.ACTION_UP) {
                 // If this is a false tap, capture the even so it doesn't result in a click.
                 return mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY);
             }
@@ -132,17 +125,6 @@
 
         @Override
         public boolean onInterceptTouchEvent(MotionEvent ev) {
-            if (mNeedsDimming && ev.getActionMasked() == MotionEvent.ACTION_DOWN
-                    && mView.disallowSingleClick(ev)
-                    && !mAccessibilityManager.isTouchExplorationEnabled()) {
-                if (!mView.isActive()) {
-                    return true;
-                } else if (mFalsingManager.isFalseDoubleTap()) {
-                    mBlockNextTouch = true;
-                    mView.makeInactive(true /* animate */);
-                    return true;
-                }
-            }
             return false;
         }
 
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 500838f..b5d2ea5 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
@@ -630,17 +630,6 @@
         mSecureStateProvider = secureStateProvider;
     }
 
-    @Override
-    public boolean isDimmable() {
-        if (!getShowingLayout().isDimmable()) {
-            return false;
-        }
-        if (showingPulsing()) {
-            return false;
-        }
-        return super.isDimmable();
-    }
-
     private void updateLimits() {
         for (NotificationContentView l : mLayouts) {
             updateLimitsForView(l);
@@ -853,7 +842,6 @@
         mNotificationParent = isChildInGroup ? parent : null;
         mPrivateLayout.setIsChildInGroup(isChildInGroup);
 
-        resetBackgroundAlpha();
         updateBackgroundForGroupState();
         updateClickAndFocus();
         if (mNotificationParent != null) {
@@ -895,11 +883,6 @@
     }
 
     @Override
-    protected boolean shouldHideBackground() {
-        return super.shouldHideBackground() || mShowNoBackground;
-    }
-
-    @Override
     public boolean isSummaryWithChildren() {
         return mIsSummaryWithChildren;
     }
@@ -2085,7 +2068,7 @@
             contentView.animate()
                     .alpha(0f)
                     .setDuration(ActivityLaunchAnimator.ANIMATION_DURATION_FADE_OUT_CONTENT)
-                    .setInterpolator(Interpolators.ALPHA_OUT);
+                    .setInterpolator(ActivityLaunchAnimator.CONTENT_FADE_OUT_INTERPOLATOR);
             setAboveShelf(true);
             mExpandAnimationRunning = true;
             getViewState().cancelAnimations(this);
@@ -2873,7 +2856,6 @@
             mShowNoBackground = false;
         }
         updateOutline();
-        updateBackground();
     }
 
     public int getPositionOfChild(ExpandableNotificationRow childRow) {
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 3bf0ddb..298d4f0 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
@@ -19,6 +19,7 @@
 import android.annotation.ColorInt;
 import android.content.Context;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.util.AttributeSet;
 import android.view.View;
 
@@ -93,14 +94,16 @@
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
+        int textColor = getResources().getColor(R.color.notif_pill_text);
+        Resources.Theme theme = getContext().getTheme();
         mDismissButton.setBackground(
-                getResources().getDrawable(R.drawable.notif_footer_btn_background));
-        mDismissButton.setTextColor(getResources().getColor(R.color.notif_pill_text));
+                getResources().getDrawable(R.drawable.notif_footer_btn_background, theme));
+        mDismissButton.setTextColor(textColor);
         mManageButton.setBackground(
-                getResources().getDrawable(R.drawable.notif_footer_btn_background));
-        mManageButton.setTextColor(getResources().getColor(R.color.notif_pill_text));
+                getResources().getDrawable(R.drawable.notif_footer_btn_background, theme));
         mManageButton = findViewById(R.id.manage_text);
         mDismissButton.setText(R.string.clear_all_notifications_text);
+        mManageButton.setTextColor(textColor);
         mDismissButton.setContentDescription(
                 mContext.getString(R.string.accessibility_clear_all));
         showHistory(mShowHistory);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java
index 9e70f0a..caba3ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java
@@ -37,8 +37,9 @@
     private ImageView mConversationIconView;
     private TextView mConversationSenderName;
     private View mConversationFacePile;
-    private int mConversationIconSize;
+    private int mSingleAvatarSize;
     private int mFacePileSize;
+    private int mFacePileAvatarSize;
     private int mFacePileProtectionWidth;
 
     public HybridConversationNotificationView(Context context) {
@@ -67,7 +68,9 @@
         mConversationSenderName = requireViewById(R.id.conversation_notification_sender);
         mFacePileSize = getResources()
                 .getDimensionPixelSize(R.dimen.conversation_single_line_face_pile_size);
-        mConversationIconSize = getResources()
+        mFacePileAvatarSize = getResources()
+                .getDimensionPixelSize(R.dimen.conversation_single_line_face_pile_avatar_size);
+        mSingleAvatarSize = getResources()
                 .getDimensionPixelSize(R.dimen.conversation_single_line_avatar_size);
         mFacePileProtectionWidth = getResources().getDimensionPixelSize(
                 R.dimen.conversation_single_line_face_pile_protection_width);
@@ -89,6 +92,7 @@
             mConversationFacePile.setVisibility(GONE);
             mConversationIconView.setVisibility(VISIBLE);
             mConversationIconView.setImageIcon(conversationIcon);
+            setSize(mConversationIconView, mSingleAvatarSize);
         } else {
             // If there isn't an icon, generate a "face pile" based on the sender avatars
             mConversationIconView.setVisibility(GONE);
@@ -104,9 +108,9 @@
                     com.android.internal.R.id.conversation_face_pile_top);
             conversationLayout.bindFacePile(facePileBottomBg, facePileBottom, facePileTop);
             setSize(mConversationFacePile, mFacePileSize);
-            setSize(facePileBottom, mConversationIconSize);
-            setSize(facePileTop, mConversationIconSize);
-            setSize(facePileBottomBg, mConversationIconSize + 2 * mFacePileProtectionWidth);
+            setSize(facePileBottom, mFacePileAvatarSize);
+            setSize(facePileTop, mFacePileAvatarSize);
+            setSize(facePileBottomBg, mFacePileAvatarSize + 2 * mFacePileProtectionWidth);
             mTransformationHelper.addViewTransformingToSimilar(facePileTop);
             mTransformationHelper.addViewTransformingToSimilar(facePileBottom);
             mTransformationHelper.addViewTransformingToSimilar(facePileBottomBg);
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 a0b0b3d..fe4ea28 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,7 +16,6 @@
 
 package com.android.systemui.statusbar.notification.row;
 
-
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.Notification;
@@ -59,6 +58,7 @@
 import com.android.systemui.statusbar.policy.SmartReplyConstants;
 import com.android.systemui.statusbar.policy.SmartReplyStateInflaterKt;
 import com.android.systemui.statusbar.policy.SmartReplyView;
+import com.android.systemui.wmshell.BubblesManager;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -693,7 +693,6 @@
             endColor = NotificationUtils.interpolateColors(startColor, endColor,
                     transformationAmount);
         }
-        mContainingNotification.updateBackgroundAlpha(transformationAmount);
         mContainingNotification.setContentBackground(endColor, false, this);
     }
 
@@ -868,7 +867,6 @@
 
     public void updateBackgroundColor(boolean animate) {
         int customBackgroundColor = getBackgroundColor(mVisibleType);
-        mContainingNotification.resetBackgroundAlpha();
         mContainingNotification.setContentBackground(customBackgroundColor, animate, this);
     }
 
@@ -1260,7 +1258,7 @@
                     RemoteInputView riv = RemoteInputView.inflate(
                             mContext, actionContainer, entry, mRemoteInputController);
 
-                    riv.setVisibility(View.INVISIBLE);
+                    riv.setVisibility(View.GONE);
                     actionContainer.addView(riv, new LayoutParams(
                             ViewGroup.LayoutParams.MATCH_PARENT,
                             ViewGroup.LayoutParams.MATCH_PARENT)
@@ -1315,11 +1313,6 @@
         applyBubbleAction(mExpandedChild, entry);
     }
 
-    private boolean isBubblesEnabled() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.NOTIFICATION_BUBBLES, 0) == 1;
-    }
-
     /**
      * Setup icon buttons provided by System UI.
      */
@@ -1340,7 +1333,7 @@
         boolean isPersonWithShortcut =
                 mPeopleIdentifier.getPeopleNotificationType(entry)
                         >= PeopleNotificationIdentifier.TYPE_FULL_PERSON;
-        boolean showButton = isBubblesEnabled()
+        boolean showButton = BubblesManager.areBubblesEnabled(mContext, entry.getSbn().getUser())
                 && isPersonWithShortcut
                 && entry.getBubbleMetadata() != null;
         if (showButton) {
@@ -1481,18 +1474,26 @@
             return null;
         }
 
-        SmartReplyView smartReplyView = null;
-        if (smartReplyContainer.getChildCount() == 1
-                && smartReplyContainer.getChildAt(0) instanceof SmartReplyView) {
+        // Search for an existing SmartReplyView
+        int index = 0;
+        final int childCount = smartReplyContainer.getChildCount();
+        for (; index < childCount; index++) {
+            View child = smartReplyContainer.getChildAt(index);
+            if (child.getId() == R.id.smart_reply_view && child instanceof SmartReplyView) {
+                break;
+            }
+        }
+
+        if (index < childCount) {
             // If we already have a SmartReplyView - replace it with the newly inflated one. The
             // newly inflated one is connected to the new inflated smart reply/action buttons.
-            smartReplyContainer.removeAllViews();
+            smartReplyContainer.removeViewAt(index);
         }
-        if (smartReplyContainer.getChildCount() == 0
-                && inflatedSmartReplyViewHolder != null
+        SmartReplyView smartReplyView = null;
+        if (inflatedSmartReplyViewHolder != null
                 && inflatedSmartReplyViewHolder.getSmartReplyView() != null) {
             smartReplyView = inflatedSmartReplyViewHolder.getSmartReplyView();
-            smartReplyContainer.addView(smartReplyView);
+            smartReplyContainer.addView(smartReplyView, index);
         }
         if (smartReplyView != null) {
             smartReplyView.resetSmartSuggestions(smartReplyContainer);
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 3434f67..40be4bf 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
@@ -22,7 +22,6 @@
 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.animation.Interpolators.FAST_OUT_SLOW_IN;
 
@@ -48,7 +47,6 @@
 import android.os.Handler;
 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;
@@ -573,8 +571,7 @@
 
         boolean showAsBubble = mBubbleMetadata != null
                 && mBubbleMetadata.getAutoExpandBubble()
-                && Settings.Global.getInt(mContext.getContentResolver(),
-                        NOTIFICATION_BUBBLES, 0) == 1;
+                && BubblesManager.areBubblesEnabled(mContext, mSbn.getUser());
 
         Drawable person =  mIconFactory.getBaseIconDrawable(mShortcutInfo);
         if (person == null) {
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 15ca24e..8ee9134 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
@@ -20,14 +20,12 @@
 
 import android.app.Notification;
 import android.content.Context;
-import android.content.res.ColorStateList;
 import android.util.ArraySet;
 import android.util.Pair;
 import android.view.NotificationHeaderView;
 import android.view.NotificationTopLineView;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
 import android.view.animation.Interpolator;
 import android.view.animation.PathInterpolator;
 import android.widget.ImageButton;
@@ -168,53 +166,6 @@
         }
     }
 
-    public void applyConversationSkin() {
-        if (mAppNameText != null) {
-            final ColorStateList colors = mAppNameText.getTextColors();
-            mAppNameText.setTextAppearance(
-                    com.android.internal.R.style
-                            .TextAppearance_DeviceDefault_Notification_Conversation_AppName);
-            mAppNameText.setTextColor(colors);
-            MarginLayoutParams layoutParams = (MarginLayoutParams) mAppNameText.getLayoutParams();
-            layoutParams.setMarginStart(0);
-        }
-        if (mNotificationTopLine != null) {
-            int paddingStart = mNotificationTopLine.getResources().getDimensionPixelSize(
-                    com.android.internal.R.dimen.conversation_content_start);
-            mNotificationTopLine.setPaddingStart(paddingStart);
-        }
-        if (mIcon != null) {
-            MarginLayoutParams layoutParams = (MarginLayoutParams) mIcon.getLayoutParams();
-            int marginStart = mIcon.getResources().getDimensionPixelSize(
-                    com.android.internal.R.dimen.conversation_icon_circle_start);
-            layoutParams.setMarginStart(marginStart);
-        }
-    }
-
-    public void clearConversationSkin() {
-        if (mAppNameText != null) {
-            final ColorStateList colors = mAppNameText.getTextColors();
-            mAppNameText.setTextAppearance(
-                    com.android.internal.R.style.TextAppearance_DeviceDefault_Notification_Info);
-            mAppNameText.setTextColor(colors);
-            MarginLayoutParams layoutParams = (MarginLayoutParams) mAppNameText.getLayoutParams();
-            final int marginStart = mAppNameText.getResources().getDimensionPixelSize(
-                    com.android.internal.R.dimen.notification_header_app_name_margin_start);
-            layoutParams.setMarginStart(marginStart);
-        }
-        if (mNotificationTopLine != null) {
-            int paddingStart = mNotificationTopLine.getResources().getDimensionPixelSize(
-                    com.android.internal.R.dimen.notification_content_margin_start);
-            mNotificationTopLine.setPaddingStart(paddingStart);
-        }
-        if (mIcon != null) {
-            MarginLayoutParams layoutParams = (MarginLayoutParams) mIcon.getLayoutParams();
-            int marginStart = mIcon.getResources().getDimensionPixelSize(
-                    com.android.internal.R.dimen.notification_icon_circle_start);
-            layoutParams.setMarginStart(marginStart);
-        }
-    }
-
     /**
      * Adds the remaining TransformTypes to the TransformHelper. This is done to make sure that each
      * child is faded automatically and doesn't have to be manually added.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
index 040f707..0247a99 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
@@ -19,7 +19,6 @@
 import android.animation.AnimatorListenerAdapter;
 import android.content.Context;
 import android.util.AttributeSet;
-import android.view.ViewGroup;
 
 import com.android.systemui.statusbar.notification.row.ExpandableView;
 
@@ -43,11 +42,4 @@
     public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear) {
         // No animation, it doesn't need it, this would be local
     }
-
-    public void setContentView(ViewGroup contentView) {
-        addView(contentView);
-        ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams();
-        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
-        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
-    }
 }
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 5f3933b..99fe541 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
@@ -43,7 +43,6 @@
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.HybridGroupManager;
 import com.android.systemui.statusbar.notification.row.HybridNotificationView;
-import com.android.systemui.statusbar.notification.row.wrapper.NotificationHeaderViewWrapper;
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
 
 import java.util.ArrayList;
@@ -336,15 +335,6 @@
         }
         mNotificationHeaderWrapper.setExpanded(mChildrenExpanded);
         mNotificationHeaderWrapper.onContentUpdated(mContainingNotification);
-        if (mNotificationHeaderWrapper instanceof NotificationHeaderViewWrapper) {
-            NotificationHeaderViewWrapper headerWrapper =
-                    (NotificationHeaderViewWrapper) mNotificationHeaderWrapper;
-            if (isConversation) {
-                headerWrapper.applyConversationSkin();
-            } else {
-                headerWrapper.clearConversationSkin();
-            }
-        }
         recreateLowPriorityHeader(builder, isConversation);
         updateHeaderVisibility(false /* animate */);
         updateChildrenAppearance();
@@ -378,15 +368,6 @@
                 header.reapply(getContext(), mNotificationHeaderLowPriority);
             }
             mNotificationHeaderWrapperLowPriority.onContentUpdated(mContainingNotification);
-            if (mNotificationHeaderWrapper instanceof NotificationHeaderViewWrapper) {
-                NotificationHeaderViewWrapper headerWrapper =
-                        (NotificationHeaderViewWrapper) mNotificationHeaderWrapper;
-                if (isConversation) {
-                    headerWrapper.applyConversationSkin();
-                } else {
-                    headerWrapper.clearConversationSkin();
-                }
-            }
             resetHeaderVisibilityIfNeeded(mNotificationHeaderLowPriority, calculateDesiredHeader());
         } else {
             removeView(mNotificationHeaderLowPriority);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
index b06f7d2..45ce20a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
@@ -138,7 +138,7 @@
         incomingHeaderController.reinflateView(parent)
         mediaControlsView =
                 reinflateView(mediaControlsView, layoutInflater, R.layout.keyguard_media_header)
-                        .also(keyguardMediaController::attach)
+        keyguardMediaController.attachSinglePaneContainer(mediaControlsView)
     }
 
     override fun beginsSection(view: View, previous: View?): Boolean =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index 4fc49ed..527443e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -708,9 +708,10 @@
             mView.setKeyguardMediaControllorVisible(visible);
             if (visible) {
                 mView.generateAddAnimation(
-                        mKeyguardMediaController.getView(), false /*fromMoreCard */);
+                        mKeyguardMediaController.getSinglePaneContainer(),
+                        false /*fromMoreCard */);
             } else {
-                mView.generateRemoveAnimation(mKeyguardMediaController.getView());
+                mView.generateRemoveAnimation(mKeyguardMediaController.getSinglePaneContainer());
             }
             mView.requestChildrenUpdate();
             return Unit.INSTANCE;
@@ -780,7 +781,7 @@
         return mView.isLayoutRtl();
     }
 
-    public float getLeft() {
+    public int getLeft() {
         return  mView.getLeft();
     }
 
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 3e1a781..27ee13a 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
@@ -33,9 +33,7 @@
 import com.android.systemui.statusbar.notification.row.FooterView;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * The Algorithm of the {@link com.android.systemui.statusbar.notification.stack
@@ -153,9 +151,7 @@
 
     private void updateClipping(StackScrollAlgorithmState algorithmState,
             AmbientState ambientState) {
-        float drawStart = !ambientState.isOnKeyguard() ? ambientState.getTopPadding()
-                + ambientState.getStackTranslation()
-                : 0;
+        float drawStart = !ambientState.isOnKeyguard() ? ambientState.getStackY() : 0;
         float clipStart = 0;
         int childCount = algorithmState.visibleChildren.size();
         boolean firstHeadsUp = true;
@@ -168,8 +164,7 @@
             float newYTranslation = state.yTranslation;
             float newHeight = state.height;
             float newNotificationEnd = newYTranslation + newHeight;
-            boolean isHeadsUp = (child instanceof ExpandableNotificationRow)
-                    && ((ExpandableNotificationRow) child).isPinned();
+            boolean isHeadsUp = (child instanceof ExpandableNotificationRow) && child.isPinned();
             if (mClipNotificationScrollToTop
                     && (!state.inShelf || (isHeadsUp && !firstHeadsUp))
                     && newYTranslation < clipStart
@@ -255,16 +250,16 @@
             }
         }
 
-        state.firstViewInShelf = null;
-        // Save y, sectionStart, sectionEnd from when shade is fully expanded.
-        // Consider updating these states in updateContentView instead so that we don't have to
-        // recalculate in every frame.
+        // Save (height of view before shelf, index of first view in shelf) from when shade is fully
+        // expanded. Consider updating these states in updateContentView instead so that we don't
+        // have to recalculate in every frame.
         float currentY = -scrollY;
-        int sectionStartIndex = 0;
-        int sectionEndIndex = 0;
+        float previousY = 0;
+        state.firstViewInShelf = null;
+        state.viewHeightBeforeShelf = -1;
         for (int i = 0; i < state.visibleChildren.size(); i++) {
             final ExpandableView view = state.visibleChildren.get(i);
-            // Add space between sections.
+
             final boolean applyGapHeight = childNeedsGapHeight(
                     ambientState.getSectionProvider(), i,
                     view, getPreviousView(i, state));
@@ -272,83 +267,28 @@
                 currentY += mGapHeight;
             }
 
-            // Save index of first view in the shelf
-            final float shelfStart = ambientState.getStackEndHeight()
-                    - ambientState.getShelf().getIntrinsicHeight();
-            if (currentY >= shelfStart
-                    && !(view instanceof FooterView)
-                    && state.firstViewInShelf == null) {
-                state.firstViewInShelf = view;
-            }
-
-            // Record y position when fully expanded
-            ExpansionData expansionData = new ExpansionData();
-            expansionData.fullyExpandedY = currentY;
-            state.expansionData.put(view, expansionData);
-
-            if (ambientState.getSectionProvider()
-                    .beginsSection(view, getPreviousView(i, state))) {
-
-                // Save section start/end for views in the section before this new section
-                ExpandableView sectionStartView = state.visibleChildren.get(sectionStartIndex);
-                final float sectionStart =
-                        state.expansionData.get(sectionStartView).fullyExpandedY;
-
-                ExpandableView sectionEndView = state.visibleChildren.get(sectionEndIndex);
-                float sectionEnd = state.expansionData.get(sectionEndView).fullyExpandedY
-                        + sectionEndView.getIntrinsicHeight();
-
-                // If we show the shelf, trim section end to shelf start
-                // This means section end > start for views in the shelf
-                if (state.firstViewInShelf != null && sectionEnd > shelfStart) {
-                    sectionEnd = shelfStart;
-                }
-
-                // Update section bounds of every view in the previous section
-                // Consider using shared SectionInfo for views in same section to avoid looping back
-                for (int j = sectionStartIndex; j < i; j++) {
-                    ExpandableView sectionView = state.visibleChildren.get(j);
-                    ExpansionData viewExpansionData =
-                            state.expansionData.get(sectionView);
-                    viewExpansionData.sectionStart = sectionStart;
-                    viewExpansionData.sectionEnd = sectionEnd;
-                    state.expansionData.put(sectionView, viewExpansionData);
-                }
-                sectionStartIndex = i;
-
-                if (view instanceof FooterView) {
-                    // Also record section bounds for FooterView (same as its own)
-                    // because it is the last view and we won't get to this point again
-                    // after the loop ends
-                    ExpansionData footerExpansionData = state.expansionData.get(view);
-                    footerExpansionData.sectionStart = expansionData.fullyExpandedY;
-                    footerExpansionData.sectionEnd = expansionData.fullyExpandedY
-                            + view.getIntrinsicHeight();
-                    state.expansionData.put(view, footerExpansionData);
+            if (ambientState.getShelf() != null) {
+                final float shelfStart = ambientState.getStackEndHeight()
+                        - ambientState.getShelf().getIntrinsicHeight();
+                if (currentY >= shelfStart
+                        && !(view instanceof FooterView)
+                        && state.firstViewInShelf == null) {
+                    state.firstViewInShelf = view;
+                    // There might be a section gap right before the shelf.
+                    // Limit the height of the view before the shelf so that it does not include
+                    // a gap and become taller than it normally is.
+                    state.viewHeightBeforeShelf = Math.min(getMaxAllowedChildHeight(view),
+                            ambientState.getStackEndHeight()
+                            - ambientState.getShelf().getIntrinsicHeight()
+                            - mPaddingBetweenElements
+                            - previousY);
                 }
             }
-            sectionEndIndex = i;
+            previousY = currentY;
             currentY = currentY
                     + getMaxAllowedChildHeight(view)
                     + mPaddingBetweenElements;
         }
-
-        // Which view starts the section of the view right before the shelf?
-        // Save it for later when we clip views in that section to shelf start.
-        state.firstViewInOverflowSection = null;
-        if (state.firstViewInShelf != null) {
-            ExpandableView nextView = null;
-            final int startIndex = state.visibleChildren.indexOf(state.firstViewInShelf);
-            for (int i = startIndex - 1; i >= 0; i--) {
-                ExpandableView view = state.visibleChildren.get(i);
-                if (nextView != null && ambientState.getSectionProvider()
-                        .beginsSection(nextView, view)) {
-                    break;
-                }
-                nextView = view;
-            }
-            state.firstViewInOverflowSection = nextView;
-        }
     }
 
     private int updateNotGoneIndex(StackScrollAlgorithmState state, int notGoneIndex,
@@ -388,6 +328,26 @@
         }
     }
 
+    /**
+     * @return Fraction to apply to view height and gap between views.
+     *         Does not include shelf height even if shelf is showing.
+     */
+    private float getExpansionFractionWithoutShelf(
+            StackScrollAlgorithmState algorithmState,
+            AmbientState ambientState) {
+
+        final boolean isShowingShelf = ambientState.getShelf() != null
+                && algorithmState.firstViewInShelf != null;
+
+        final float stackHeight = ambientState.getStackHeight()
+                - (isShowingShelf ? ambientState.getShelf().getIntrinsicHeight() : 0f);
+
+        float stackEndHeight = ambientState.getStackEndHeight()
+                - (isShowingShelf ? ambientState.getShelf().getIntrinsicHeight() : 0f);
+
+        return stackHeight / stackEndHeight;
+    }
+
     // TODO(b/172289889) polish shade open from HUN
     /**
      * Populates the {@link ExpandableViewState} for a single child.
@@ -420,22 +380,8 @@
             viewState.headsUpIsVisible = end < ambientState.getMaxHeadsUpTranslation();
         }
 
-        // TODO(b/172289889) move sectionFraction and showSection to initAlgorithmState
-        // Get fraction of section showing, and later apply it to view height and gaps between views
-        float sectionFraction = 1f;
-        boolean showSection = true;
-
-        if (!ambientState.isOnKeyguard()
-                && !ambientState.isPulseExpanding()
-                && ambientState.isExpansionChanging()) {
-
-            final ExpansionData expansionData = algorithmState.expansionData.get(view);
-            final float sectionHeight = expansionData.sectionEnd - expansionData.sectionStart;
-            sectionFraction = MathUtils.constrain(
-                    (ambientState.getStackHeight() - expansionData.sectionStart) / sectionHeight,
-                    0f, 1f);
-            showSection = expansionData.sectionStart < ambientState.getStackHeight();
-        }
+        final float expansionFraction = getExpansionFractionWithoutShelf(
+                algorithmState, ambientState);
 
         // Add gap between sections.
         final boolean applyGapHeight =
@@ -443,46 +389,58 @@
                         ambientState.getSectionProvider(), i,
                         view, getPreviousView(i, algorithmState));
         if (applyGapHeight) {
-            currentYPosition += sectionFraction * mGapHeight;
+            currentYPosition += expansionFraction * mGapHeight;
         }
 
         viewState.yTranslation = currentYPosition;
-
         if (view instanceof SectionHeaderView) {
             // Add padding before sections for overscroll effect.
-            viewState.yTranslation += ambientState.getSectionPadding();
+            viewState.yTranslation += expansionFraction * ambientState.getSectionPadding();
         }
 
-        if (view != ambientState.getTrackedHeadsUpRow()) {
+        if (view instanceof FooterView) {
+            viewState.yTranslation = Math.min(viewState.yTranslation,
+                    ambientState.getStackHeight());
+            // Hide footer if shelf is showing
+            viewState.hidden = algorithmState.firstViewInShelf != null;
+        } else if (view != ambientState.getTrackedHeadsUpRow()) {
             if (ambientState.isExpansionChanging()) {
-                viewState.hidden = !showSection;
+                // Show all views. Views below the shelf will later be clipped (essentially hidden)
+                // in NotificationShelf.
+                viewState.hidden = false;
                 viewState.inShelf = algorithmState.firstViewInShelf != null
                         && i >= algorithmState.visibleChildren.indexOf(
-                                algorithmState.firstViewInShelf)
-                        && !(view instanceof FooterView);
-            } else {
+                                algorithmState.firstViewInShelf);
+            } else if (ambientState.getShelf() != null) {
                 // When pulsing (incoming notification on AOD), innerHeight is 0; clamp all
                 // to shelf start, thereby hiding all notifications (except the first one, which we
                 // later unhide in updatePulsingState)
                 final int shelfStart = ambientState.getInnerHeight()
                         - ambientState.getShelf().getIntrinsicHeight();
-                if (!(view instanceof FooterView)) {
-                    viewState.yTranslation = Math.min(viewState.yTranslation, shelfStart);
-                }
+                viewState.yTranslation = Math.min(viewState.yTranslation, shelfStart);
                 if (viewState.yTranslation >= shelfStart) {
                     viewState.hidden = !view.isExpandAnimationRunning()
-                            && !view.hasExpandingChild()
-                            && !(view instanceof FooterView);
+                            && !view.hasExpandingChild();
                     viewState.inShelf = true;
                     // Notifications in the shelf cannot be visible HUNs.
                     viewState.headsUpIsVisible = false;
                 }
             }
-            viewState.height = (int) MathUtils.lerp(
-                    0, getMaxAllowedChildHeight(view), sectionFraction);
+
+            // Clip height of view right before shelf.
+            float maxViewHeight = getMaxAllowedChildHeight(view);
+            if (ambientState.isExpansionChanging()
+                    && algorithmState.viewHeightBeforeShelf != -1) {
+                final int indexOfFirstViewInShelf = algorithmState.visibleChildren.indexOf(
+                        algorithmState.firstViewInShelf);
+                if (i == indexOfFirstViewInShelf - 1) {
+                    maxViewHeight = algorithmState.viewHeightBeforeShelf;
+                }
+            }
+            viewState.height = (int) MathUtils.lerp(0, maxViewHeight, expansionFraction);
         }
 
-        currentYPosition += viewState.height + sectionFraction * mPaddingBetweenElements;
+        currentYPosition += viewState.height + expansionFraction * mPaddingBetweenElements;
         setLocation(view.getViewState(), currentYPosition, i);
         viewState.yTranslation += ambientState.getStackY();
         return currentYPosition;
@@ -737,35 +695,6 @@
         this.mIsExpanded = isExpanded;
     }
 
-    /**
-     * Data used to layout views while shade expansion changes.
-     */
-    public class ExpansionData {
-
-        /**
-         * Y position of top of first view in section.
-         */
-        public float sectionStart;
-
-        /**
-         * Y position of bottom of last view in section.
-         */
-        public float sectionEnd;
-
-        /**
-         * Y position of view when shade is fully expanded.
-         * Does not include distance between top notifications panel and top of screen.
-         */
-        public float fullyExpandedY;
-
-        /**
-         * Whether this notification is in the same section as the notification right before the
-         * shelf. Used to determine which notification should be clipped to shelf start while
-         * shade expansion changes.
-         */
-        public boolean inOverflowingSection;
-    }
-
     public class StackScrollAlgorithmState {
 
         /**
@@ -779,16 +708,9 @@
         public ExpandableView firstViewInShelf;
 
         /**
-         * First view in section overflowing into shelf while shade expansion changes.
+         * Height of view right before the shelf.
          */
-        public ExpandableView firstViewInOverflowSection;
-
-        /**
-         * Map of view to ExpansionData used for layout during shade expansion.
-         * Use view instead of index as key, because visibleChildren indices do not match the ones
-         * used in the shelf.
-         */
-        public Map<ExpandableView, ExpansionData> expansionData = new HashMap<>();
+        public float viewHeightBeforeShelf;
 
         /**
          * The children from the host view which are not gone.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
index 3dd4a3b..fa32620 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
@@ -16,6 +16,7 @@
 
 import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.res.Resources;
 import android.hardware.display.ColorDisplayManager;
@@ -294,9 +295,11 @@
     private final DeviceControlsController.Callback mDeviceControlsCallback =
             new DeviceControlsController.Callback() {
         @Override
-        public void onControlsAvailable(int position) {
+        public void onControlsUpdate(@Nullable Integer position) {
             if (mAutoTracker.isAdded(DEVICE_CONTROLS)) return;
-            mHost.addTile(DEVICE_CONTROLS, position);
+            if (position != null) {
+                mHost.addTile(DEVICE_CONTROLS, position);
+            }
             mAutoTracker.setTileAdded(DEVICE_CONTROLS);
             mHandler.post(() -> mDeviceControlsController.removeCallback());
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index e996378..5399094 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -411,8 +411,18 @@
                 Trace.endSection();
                 break;
             case MODE_UNLOCK_COLLAPSING:
+                Trace.beginSection("MODE_UNLOCK_COLLAPSING");
+                if (!wasDeviceInteractive) {
+                    mPendingShowBouncer = true;
+                } else {
+                    showBouncer();
+                    mKeyguardViewController.notifyKeyguardAuthenticated(
+                            false /* strongAuth */);
+                }
+                Trace.endSection();
+                break;
             case MODE_SHOW_BOUNCER:
-                Trace.beginSection("MODE_UNLOCK_COLLAPSING or MODE_SHOW_BOUNCER");
+                Trace.beginSection("MODE_SHOW_BOUNCER");
                 if (!wasDeviceInteractive) {
                     mPendingShowBouncer = true;
                 } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index 1eccfd8..76657ad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -17,6 +17,7 @@
 import static android.app.StatusBarManager.DISABLE2_SYSTEM_ICONS;
 import static android.app.StatusBarManager.DISABLE_CLOCK;
 import static android.app.StatusBarManager.DISABLE_NOTIFICATION_ICONS;
+import static android.app.StatusBarManager.DISABLE_ONGOING_CALL_CHIP;
 import static android.app.StatusBarManager.DISABLE_SYSTEM_INFO;
 
 import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_IN;
@@ -92,6 +93,7 @@
     private OngoingCallController mOngoingCallController;
     private final SystemStatusAnimationScheduler mAnimationScheduler;
     private final PrivacyDotViewController mDotViewController;
+    private NotificationIconAreaController mNotificationIconAreaController;
 
     private List<String> mBlockedIcons = new ArrayList<>();
 
@@ -106,13 +108,11 @@
         @Override
         public void onOngoingCallStarted(boolean animate) {
             disable(getContext().getDisplayId(), mDisabled1, mDisabled2, animate);
-            animateShow(mOngoingCallChip, animate);
         }
 
         @Override
         public void onOngoingCallEnded(boolean animate) {
             disable(getContext().getDisplayId(), mDisabled1, mDisabled2, animate);
-            animateHiddenState(mOngoingCallChip, View.GONE, animate);
         }
     };
 
@@ -120,11 +120,13 @@
     public CollapsedStatusBarFragment(
             OngoingCallController ongoingCallController,
             SystemStatusAnimationScheduler animationScheduler,
-            PrivacyDotViewController dotViewController
+            PrivacyDotViewController dotViewController,
+            NotificationIconAreaController notificationIconAreaController
     ) {
         mOngoingCallController = ongoingCallController;
         mAnimationScheduler = animationScheduler;
         mDotViewController = dotViewController;
+        mNotificationIconAreaController = notificationIconAreaController;
     }
 
     @Override
@@ -158,6 +160,7 @@
         mDarkIconManager.setShouldLog(true);
         mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_volume));
         mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_alarm_clock));
+        mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_call_strength));
         mDarkIconManager.setBlockList(mBlockedIcons);
         Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
         mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
@@ -167,6 +170,7 @@
         showClock(false);
         initEmergencyCryptkeeperText();
         initOperatorName();
+        initNotificationIconArea();
         mAnimationScheduler.addCallback(this);
     }
 
@@ -203,11 +207,11 @@
         }
     }
 
-    public void initNotificationIconArea(NotificationIconAreaController
-            notificationIconAreaController) {
+    /** Initializes views related to the notification icon area. */
+    public void initNotificationIconArea() {
         ViewGroup notificationIconArea = mStatusBar.findViewById(R.id.notification_icon_area);
         mNotificationIconAreaInner =
-                notificationIconAreaController.getNotificationInnerAreaView();
+                mNotificationIconAreaController.getNotificationInnerAreaView();
         if (mNotificationIconAreaInner.getParent() != null) {
             ((ViewGroup) mNotificationIconAreaInner.getParent())
                     .removeView(mNotificationIconAreaInner);
@@ -215,15 +219,15 @@
         notificationIconArea.addView(mNotificationIconAreaInner);
 
         ViewGroup statusBarCenteredIconArea = mStatusBar.findViewById(R.id.centered_icon_area);
-        mCenteredIconArea = notificationIconAreaController.getCenteredNotificationAreaView();
+        mCenteredIconArea = mNotificationIconAreaController.getCenteredNotificationAreaView();
         if (mCenteredIconArea.getParent() != null) {
             ((ViewGroup) mCenteredIconArea.getParent())
                     .removeView(mCenteredIconArea);
         }
         statusBarCenteredIconArea.addView(mCenteredIconArea);
 
-        // Default to showing until we know otherwise.
-        showNotificationIconArea(false);
+        // #disable should have already been called, so use the disable values to set visibility.
+        updateNotificationIconAreaAndCallChip(mDisabled1, false);
     }
 
     @Override
@@ -248,13 +252,14 @@
                 showOperatorName(animate);
             }
         }
-        if ((diff1 & DISABLE_NOTIFICATION_ICONS) != 0) {
-            if ((state1 & DISABLE_NOTIFICATION_ICONS) != 0) {
-                hideNotificationIconArea(animate);
-            } else {
-                showNotificationIconArea(animate);
-            }
+
+        // The ongoing call chip and notification icon visibilities are intertwined, so update both
+        // if either change.
+        if (((diff1 & DISABLE_ONGOING_CALL_CHIP) != 0)
+                || ((diff1 & DISABLE_NOTIFICATION_ICONS) != 0)) {
+            updateNotificationIconAreaAndCallChip(state1, animate);
         }
+
         // The clock may have already been hidden, but we might want to shift its
         // visibility to GONE from INVISIBLE or vice versa
         if ((diff1 & DISABLE_CLOCK) != 0 || mClockView.getVisibility() != clockHiddenMode()) {
@@ -272,10 +277,6 @@
             state |= DISABLE_CLOCK;
         }
 
-        if (mOngoingCallController.hasOngoingCall()) {
-            state |= DISABLE_NOTIFICATION_ICONS;
-        }
-
         if (!mKeyguardStateController.isLaunchTransitionFadingAway()
                 && !mKeyguardStateController.isKeyguardFadingAway()
                 && shouldHideNotificationIcons()
@@ -303,9 +304,40 @@
             state |= DISABLE_CLOCK | DISABLE_SYSTEM_INFO;
         }
 
+        if (mOngoingCallController.hasOngoingCall()) {
+            state &= ~DISABLE_ONGOING_CALL_CHIP;
+        } else {
+            state |= DISABLE_ONGOING_CALL_CHIP;
+        }
+
         return state;
     }
 
+    /**
+     * Updates the visibility of the notification icon area and ongoing call chip based on disabled1
+     * state.
+     */
+    private void updateNotificationIconAreaAndCallChip(int state1, boolean animate) {
+        boolean disableNotifications = (state1 & DISABLE_NOTIFICATION_ICONS) != 0;
+        boolean hasOngoingCall = (state1 & DISABLE_ONGOING_CALL_CHIP) == 0;
+
+        // Hide notifications if the disable flag is set or we have an ongoing call.
+        if (disableNotifications || hasOngoingCall) {
+            hideNotificationIconArea(animate);
+        } else {
+            showNotificationIconArea(animate);
+        }
+
+        // Show the ongoing call chip only if there is an ongoing call *and* notification icons
+        // are allowed. (The ongoing call chip occupies the same area as the notification icons,
+        // so if the icons are disabled then the call chip should be, too.)
+        if (hasOngoingCall && !disableNotifications) {
+            showOngoingCallChip(animate);
+        } else {
+            hideOngoingCallChip(animate);
+        }
+    }
+
     private boolean shouldHideNotificationIcons() {
         if (!mStatusBar.isClosed() && mStatusBarComponent.hideStatusBarIconsWhenExpanded()) {
             return true;
@@ -335,6 +367,16 @@
         animateShow(mClockView, animate);
     }
 
+    /** Hides the ongoing call chip. */
+    public void hideOngoingCallChip(boolean animate) {
+        animateHiddenState(mOngoingCallChip, View.GONE, animate);
+    }
+
+    /** Displays the ongoing call chip. */
+    public void showOngoingCallChip(boolean animate) {
+        animateShow(mOngoingCallChip, animate);
+    }
+
     /**
      * If panel is expanded/expanding it usually means QS shade is opening, so
      * don't set the clock GONE otherwise it'll mess up the animation.
@@ -456,7 +498,7 @@
 
     @Override
     public void onDozingChanged(boolean isDozing) {
-        disable(getContext().getDisplayId(), mDisabled1, mDisabled1, false /* animate */);
+        disable(getContext().getDisplayId(), mDisabled1, mDisabled2, false /* animate */);
     }
 
     @Override
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 8cef23f..cabfbca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -935,7 +935,9 @@
 
     private void onWalletClick(View v) {
         // More coming here; need to inform the user about how to proceed
-        mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY);
+        if (!mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
+            return;
+        }
 
         if (mHasCard) {
             Intent intent = new Intent(mContext, WalletActivity.class)
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 5ff9b703..ae68462 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -59,8 +59,8 @@
     private static final String TAG = "KeyguardBouncer";
     static final long BOUNCER_FACE_DELAY = 1200;
     public static final float ALPHA_EXPANSION_THRESHOLD = 0.95f;
-    static final float EXPANSION_HIDDEN = 1f;
-    static final float EXPANSION_VISIBLE = 0f;
+    public static final float EXPANSION_HIDDEN = 1f;
+    public static final float EXPANSION_VISIBLE = 0f;
 
     protected final Context mContext;
     protected final ViewMediatorCallback mCallback;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index 481b2db..069c197 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -155,6 +155,8 @@
 
     private int mLockScreenMode;
 
+    private boolean mIsSplitShade;
+
     /**
      * Refreshes the dimension values.
      */
@@ -180,7 +182,7 @@
             int keyguardStatusHeight, int userSwitchHeight, int clockPreferredY,
             int userSwitchPreferredY, boolean hasCustomClock, boolean hasVisibleNotifs, float dark,
             float emptyDragAmount, boolean bypassEnabled, int unlockedStackScrollerPadding,
-            float qsExpansion, int cutoutTopInset) {
+            float qsExpansion, int cutoutTopInset, boolean isSplitShade) {
         mMinTopMargin = keyguardStatusBarHeaderHeight + Math.max(mContainerTopPadding,
                 userSwitchHeight);
         mMaxShadeBottom = maxShadeBottom;
@@ -199,6 +201,7 @@
         mUnlockedStackScrollerPadding = unlockedStackScrollerPadding;
         mQsExpansion = qsExpansion;
         mCutoutTopInset = cutoutTopInset;
+        mIsSplitShade = isSplitShade;
     }
 
     public void run(Result result) {
@@ -208,14 +211,23 @@
         result.clockYFullyDozing = getClockY(
                 1.0f /* panelExpansion */, 1.0f /* darkAmount */);
         result.clockAlpha = getClockAlpha(y);
-        result.stackScrollerPadding = mBypassEnabled ? mUnlockedStackScrollerPadding
-                : y + mKeyguardStatusHeight;
+        result.stackScrollerPadding = getStackScrollerPadding(y);
         result.stackScrollerPaddingExpanded = mBypassEnabled ? mUnlockedStackScrollerPadding
                 : getClockY(1.0f, mDarkAmount) + mKeyguardStatusHeight;
         result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount);
         result.clockScale = interpolate(getBurnInScale(), 1.0f, 1.0f - mDarkAmount);
     }
 
+    private int getStackScrollerPadding(int clockYPosition) {
+        if (mBypassEnabled) {
+            return mUnlockedStackScrollerPadding;
+        } else if (mIsSplitShade) {
+            return clockYPosition;
+        } else {
+            return clockYPosition + mKeyguardStatusHeight;
+        }
+    }
+
     /**
      * Update lock screen mode for testing different layouts
      */
@@ -232,15 +244,11 @@
         return mHeight / 2 - mKeyguardStatusHeight - mClockNotificationsMargin;
     }
 
-    private int getPreferredClockY() {
-        return mClockPreferredY;
-    }
-
     private int getExpandedPreferredClockY() {
         if (mLockScreenMode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL) {
             return mMinTopMargin + mUserSwitchHeight;
         }
-        return (mHasCustomClock && (!mHasVisibleNotifs || mBypassEnabled)) ? getPreferredClockY()
+        return (mHasCustomClock && (!mHasVisibleNotifs || mBypassEnabled)) ? mClockPreferredY
                 : getExpandedClockPosition();
     }
 
@@ -271,7 +279,7 @@
 
     private int getClockY(float panelExpansion, float darkAmount) {
         // Dark: Align the bottom edge of the clock at about half of the screen:
-        float clockYDark = (mHasCustomClock ? getPreferredClockY() : getMaxClockY())
+        float clockYDark = (mHasCustomClock ? mClockPreferredY : getMaxClockY())
                 + burnInPreventionOffsetY();
         clockYDark = MathUtils.max(0, clockYDark);
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index c22fec9..0c4bec2c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -200,6 +200,7 @@
         Resources r = getResources();
         mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_volume));
         mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_alarm_clock));
+        mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_call_strength));
     }
 
     private void updateVisibilities() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
index 16f36b7..5168533 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
@@ -16,127 +16,25 @@
 
 package com.android.systemui.statusbar.phone;
 
-import static com.android.systemui.DejankUtils.whitelistIpcs;
-
 import android.content.Context;
-import android.os.UserManager;
 import android.text.TextUtils;
 import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.Button;
 import android.widget.FrameLayout;
 
-import com.android.systemui.Dependency;
-import com.android.systemui.Prefs;
-import com.android.systemui.Prefs.Key;
 import com.android.systemui.R;
-import com.android.systemui.plugins.qs.DetailAdapter;
-import com.android.systemui.qs.QSDetailDisplayer;
-import com.android.systemui.statusbar.policy.UserSwitcherController;
 
 /**
  * Container for image of the multi user switcher (tappable).
  */
-public class MultiUserSwitch extends FrameLayout implements View.OnClickListener {
-
-    protected QSDetailDisplayer mQSDetailDisplayer;
-    private UserSwitcherController.BaseUserAdapter mUserListener;
-
-    final UserManager mUserManager;
-
-
-    protected UserSwitcherController mUserSwitcherController;
-
+public class MultiUserSwitch extends FrameLayout {
     public MultiUserSwitch(Context context, AttributeSet attrs) {
         super(context, attrs);
-        mUserManager = UserManager.get(getContext());
     }
 
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-        setOnClickListener(this);
-        refreshContentDescription();
-    }
-
-    /** */
-    public void setQSDetailDisplayer(QSDetailDisplayer detailDisplayer) {
-        mQSDetailDisplayer = detailDisplayer;
-        setUserSwitcherController(Dependency.get(UserSwitcherController.class));
-    }
-
-    public boolean hasMultipleUsers() {
-        if (mUserListener == null) {
-            return false;
-        }
-        return mUserListener.getUserCount() != 0
-                && Prefs.getBoolean(getContext(), Key.SEEN_MULTI_USER, false);
-    }
-
-    public void setUserSwitcherController(UserSwitcherController userSwitcherController) {
-        mUserSwitcherController = userSwitcherController;
-        registerListener();
-        refreshContentDescription();
-    }
-
-    public boolean isMultiUserEnabled() {
-        // TODO(b/138661450) Move IPC calls to background
-        return whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled(
-                mContext.getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user)));
-    }
-
-    private void registerListener() {
-        if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) {
-
-            final UserSwitcherController controller = mUserSwitcherController;
-            if (controller != null) {
-                mUserListener = new UserSwitcherController.BaseUserAdapter(controller) {
-                    @Override
-                    public void notifyDataSetChanged() {
-                        refreshContentDescription();
-                    }
-
-                    @Override
-                    public View getView(int position, View convertView, ViewGroup parent) {
-                        return null;
-                    }
-                };
-                refreshContentDescription();
-            }
-        }
-    }
-
-    @Override
-    public void onClick(View v) {
-        if (mQSDetailDisplayer != null && mUserSwitcherController != null) {
-            View center = getChildCount() > 0 ? getChildAt(0) : this;
-
-            int[] tmpInt = new int[2];
-            center.getLocationInWindow(tmpInt);
-            tmpInt[0] += center.getWidth() / 2;
-            tmpInt[1] += center.getHeight() / 2;
-
-            mQSDetailDisplayer.showDetailAdapter(getUserDetailAdapter(), tmpInt[0], tmpInt[1]);
-        }
-    }
-
-    @Override
-    public void setClickable(boolean clickable) {
-        super.setClickable(clickable);
-        refreshContentDescription();
-    }
-
-    private void refreshContentDescription() {
-        String currentUser = null;
-        // TODO(b/138661450)
-        if (whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled())
-                && mUserSwitcherController != null) {
-            currentUser = mUserSwitcherController.getCurrentUserName(mContext);
-        }
-
+    void refreshContentDescription(String currentUser) {
         String text = null;
 
         if (!TextUtils.isEmpty(currentUser)) {
@@ -166,8 +64,4 @@
     public boolean hasOverlappingRendering() {
         return false;
     }
-
-    protected DetailAdapter getUserDetailAdapter() {
-        return mUserSwitcherController.mUserDetailAdapter;
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java
new file mode 100644
index 0000000..f27c7d2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import static com.android.systemui.DejankUtils.whitelistIpcs;
+
+import android.os.UserManager;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.systemui.R;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.qs.DetailAdapter;
+import com.android.systemui.qs.QSDetailDisplayer;
+import com.android.systemui.qs.dagger.QSScope;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.util.ViewController;
+
+import javax.inject.Inject;
+
+/** View Controller for {@link MultiUserSwitch}. */
+@QSScope
+public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
+    private final UserManager mUserManager;
+    private final UserSwitcherController mUserSwitcherController;
+    private final QSDetailDisplayer mQsDetailDisplayer;
+    private final FalsingManager mFalsingManager;
+
+    private UserSwitcherController.BaseUserAdapter mUserListener;
+
+    private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
+                return;
+            }
+
+            View center = mView.getChildCount() > 0 ? mView.getChildAt(0) : mView;
+
+            int[] tmpInt = new int[2];
+            center.getLocationInWindow(tmpInt);
+            tmpInt[0] += center.getWidth() / 2;
+            tmpInt[1] += center.getHeight() / 2;
+
+            mQsDetailDisplayer.showDetailAdapter(getUserDetailAdapter(), tmpInt[0], tmpInt[1]);
+        }
+    };
+
+    @Inject
+    public MultiUserSwitchController(MultiUserSwitch view, UserManager userManager,
+            UserSwitcherController userSwitcherController, QSDetailDisplayer qsDetailDisplayer,
+            FalsingManager falsingManager) {
+        super(view);
+        mUserManager = userManager;
+        mUserSwitcherController = userSwitcherController;
+        mQsDetailDisplayer = qsDetailDisplayer;
+        mFalsingManager = falsingManager;
+    }
+
+    @Override
+    protected void onInit() {
+        registerListener();
+        mView.refreshContentDescription(getCurrentUser());
+    }
+
+    @Override
+    protected void onViewAttached() {
+        mView.setOnClickListener(mOnClickListener);
+    }
+
+    @Override
+    protected void onViewDetached() {
+        mView.setOnClickListener(null);
+    }
+
+    protected DetailAdapter getUserDetailAdapter() {
+        return mUserSwitcherController.mUserDetailAdapter;
+    }
+
+    private void registerListener() {
+        if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) {
+
+            final UserSwitcherController controller = mUserSwitcherController;
+            if (controller != null) {
+                mUserListener = new UserSwitcherController.BaseUserAdapter(controller) {
+                    @Override
+                    public void notifyDataSetChanged() {
+                        mView.refreshContentDescription(getCurrentUser());
+                    }
+
+                    @Override
+                    public View getView(int position, View convertView, ViewGroup parent) {
+                        return null;
+                    }
+                };
+                mView.refreshContentDescription(getCurrentUser());
+            }
+        }
+    }
+
+    private String getCurrentUser() {
+        // TODO(b/138661450)
+        if (whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled())) {
+            return mUserSwitcherController.getCurrentUserName();
+        }
+
+        return null;
+    }
+
+    /** Returns true if view should be made visible. */
+    public boolean isMultiUserEnabled() {
+        // TODO(b/138661450) Move IPC calls to background
+        return whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled(
+                getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user)));
+    }
+
+}
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 c4d8840..f319022 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -28,6 +28,7 @@
 import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
 import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
 import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL;
+import static com.android.systemui.util.Utils.shouldUseSplitNotificationShade;
 
 import static java.lang.Float.isNaN;
 
@@ -53,6 +54,7 @@
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.os.UserManager;
+import android.os.VibrationEffect;
 import android.service.quickaccesswallet.QuickAccessWalletClient;
 import android.util.Log;
 import android.util.MathUtils;
@@ -98,9 +100,11 @@
 import com.android.systemui.doze.DozeLog;
 import com.android.systemui.fragments.FragmentHostManager;
 import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
+import com.android.systemui.media.KeyguardMediaController;
 import com.android.systemui.media.MediaDataManager;
 import com.android.systemui.media.MediaHierarchyManager;
 import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.FalsingManager.FalsingTapListener;
 import com.android.systemui.plugins.qs.DetailAdapter;
 import com.android.systemui.plugins.qs.QS;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -122,7 +126,6 @@
 import com.android.systemui.statusbar.notification.AnimatableProperty;
 import com.android.systemui.statusbar.notification.ConversationNotificationManager;
 import com.android.systemui.statusbar.notification.DynamicPrivacyController;
-import com.android.systemui.statusbar.notification.ExpandAnimationParameters;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
 import com.android.systemui.statusbar.notification.PropertyAnimator;
@@ -183,7 +186,7 @@
     private static final int FLING_HIDE = 2;
     private static final long ANIMATION_DELAY_ICON_FADE_IN =
             ActivityLaunchAnimator.ANIMATION_DURATION - CollapsedStatusBarFragment.FADE_IN_DURATION
-                    - CollapsedStatusBarFragment.FADE_IN_DELAY - 16;
+                    - CollapsedStatusBarFragment.FADE_IN_DELAY - 48;
 
     private final DozeParameters mDozeParameters;
     private final OnHeightChangedListener mOnHeightChangedListener = new OnHeightChangedListener();
@@ -207,6 +210,7 @@
     private final ExpansionCallback mExpansionCallback = new ExpansionCallback();
     private final BiometricUnlockController mBiometricUnlockController;
     private final NotificationPanelView mView;
+    private final VibratorHelper mVibratorHelper;
     private final MetricsLogger mMetricsLogger;
     private final ActivityManager mActivityManager;
     private final ConfigurationController mConfigurationController;
@@ -444,7 +448,7 @@
     private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
     private boolean mUserSetupComplete;
     private int mQsNotificationTopPadding;
-    private boolean mHideIconsDuringNotificationLaunch = true;
+    private boolean mHideIconsDuringLaunchAnimation = true;
     private int mStackScrollerMeasuringPass;
     private ArrayList<Consumer<ExpandableNotificationRow>>
             mTrackingHeadsUpListeners =
@@ -516,13 +520,17 @@
     private boolean mDelayShowingKeyguardStatusBar;
 
     private boolean mAnimatingQS;
+    private final Rect mKeyguardStatusAreaClipBounds = new Rect();
     private int mOldLayoutDirection;
     private NotificationShelfController mNotificationShelfController;
+    private int mScrimCornerRadius;
+    private int mScreenCornerRadius;
 
     private final QuickAccessWalletClient mQuickAccessWalletClient;
     private final Executor mUiExecutor;
 
     private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
+    private KeyguardMediaController mKeyguardMediaController;
 
     private View.AccessibilityDelegate mAccessibilityDelegate = new View.AccessibilityDelegate() {
         @Override
@@ -544,6 +552,14 @@
         }
     };
 
+    private final FalsingTapListener mFalsingTapListener = new FalsingTapListener() {
+        @Override
+        public void onDoubleTapRequired() {
+            showTransientIndication(R.string.notification_tap_again);
+            mVibratorHelper.vibrate(VibrationEffect.EFFECT_STRENGTH_MEDIUM);
+        }
+    };
+
     @Inject
     public NotificationPanelViewController(NotificationPanelView view,
             @Main Resources resources,
@@ -585,12 +601,15 @@
             LockIconViewController lockIconViewController,
             FeatureFlags featureFlags,
             QuickAccessWalletClient quickAccessWalletClient,
+            KeyguardMediaController keyguardMediaController,
             @Main Executor uiExecutor) {
         super(view, falsingManager, dozeLog, keyguardStateController,
                 (SysuiStatusBarStateController) statusBarStateController, vibratorHelper,
                 statusBarKeyguardViewManager, latencyTracker, flingAnimationUtilsBuilder.get(),
                 statusBarTouchableRegionManager, ambientState);
         mView = view;
+        mVibratorHelper = vibratorHelper;
+        mKeyguardMediaController = keyguardMediaController;
         mMetricsLogger = metricsLogger;
         mActivityManager = activityManager;
         mConfigurationController = configurationController;
@@ -629,6 +648,7 @@
         mDozeParameters = dozeParameters;
         mBiometricUnlockController = biometricUnlockController;
         mScrimController = scrimController;
+        mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade);
         mUserManager = userManager;
         mMediaDataManager = mediaDataManager;
         mQuickAccessWalletClient = quickAccessWalletClient;
@@ -757,7 +777,6 @@
         });
 
         mView.setAccessibilityDelegate(mAccessibilityDelegate);
-        // dynamically apply the split shade value overrides.
         if (mShouldUseSplitNotificationShade) {
             updateResources();
         }
@@ -789,6 +808,10 @@
                 com.android.internal.R.dimen.status_bar_height);
         mHeadsUpInset = statusbarHeight + mResources.getDimensionPixelSize(
                 R.dimen.heads_up_status_bar_padding);
+        mScrimCornerRadius = mResources.getDimensionPixelSize(
+                R.dimen.notification_scrim_corner_radius);
+        mScreenCornerRadius = mResources.getDimensionPixelSize(
+                com.android.internal.R.dimen.rounded_corner_radius);
     }
 
     private void updateViewControllers(KeyguardStatusView keyguardStatusView,
@@ -857,6 +880,10 @@
         int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
         mShouldUseSplitNotificationShade =
                 Utils.shouldUseSplitNotificationShade(mFeatureFlags, mResources);
+        mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade);
+        if (mQs != null) {
+            mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade);
+        }
         // To change the constraints at runtime, all children of the ConstraintLayout must have ids
         ensureAllViewsHaveIds(mNotificationContainerParent);
         ConstraintSet constraintSet = new ConstraintSet();
@@ -869,13 +896,17 @@
             constraintSet.connect(
                     R.id.notification_stack_scroller, START,
                     R.id.qs_edge_guideline, START);
+            constraintSet.connect(R.id.keyguard_status_view, END, R.id.qs_edge_guideline, END);
         } else {
             constraintSet.connect(R.id.qs_frame, END, PARENT_ID, END);
             constraintSet.connect(R.id.notification_stack_scroller, START, PARENT_ID, START);
+            constraintSet.connect(R.id.keyguard_status_view, END, PARENT_ID, END);
         }
         constraintSet.getConstraint(R.id.notification_stack_scroller).layout.mWidth = panelWidth;
         constraintSet.getConstraint(R.id.qs_frame).layout.mWidth = qsWidth;
         constraintSet.applyTo(mNotificationContainerParent);
+
+        mKeyguardMediaController.refreshMediaPosition();
     }
 
     private static void ensureAllViewsHaveIds(ViewGroup parentView) {
@@ -909,12 +940,18 @@
     private void reInflateViews() {
         if (DEBUG) Log.d(TAG, "reInflateViews");
         // Re-inflate the status view group.
-        KeyguardStatusView keyguardStatusView = mView.findViewById(R.id.keyguard_status_view);
-        int index = mView.indexOfChild(keyguardStatusView);
-        mView.removeView(keyguardStatusView);
+        KeyguardStatusView keyguardStatusView =
+                mNotificationContainerParent.findViewById(R.id.keyguard_status_view);
+        int statusIndex = mNotificationContainerParent.indexOfChild(keyguardStatusView);
+        mNotificationContainerParent.removeView(keyguardStatusView);
         keyguardStatusView = (KeyguardStatusView) mLayoutInflater.inflate(
-                R.layout.keyguard_status_view, mView, false);
-        mView.addView(keyguardStatusView, index);
+                R.layout.keyguard_status_view, mNotificationContainerParent, false);
+        mNotificationContainerParent.addView(keyguardStatusView, statusIndex);
+        attachSplitShadeMediaPlayerContainer(
+                keyguardStatusView.findViewById(R.id.status_view_media_container));
+
+        // we need to update KeyguardStatusView constraints after reinflating it
+        updateResources();
 
         // Re-inflate the keyguard user switcher group.
         boolean isUserSwitcherEnabled = mUserManager.isUserSwitcherEnabled();
@@ -936,11 +973,11 @@
                         showKeyguardUserSwitcher /* enabled */);
 
         mBigClockContainer.removeAllViews();
-        updateViewControllers(
-                keyguardStatusView, userAvatarView, mKeyguardStatusBar, keyguardUserSwitcherView);
+        updateViewControllers(mView.findViewById(R.id.keyguard_status_view), userAvatarView,
+                mKeyguardStatusBar, keyguardUserSwitcherView);
 
         // Update keyguard bottom area
-        index = mView.indexOfChild(mKeyguardBottomArea);
+        int index = mView.indexOfChild(mKeyguardBottomArea);
         mView.removeView(mKeyguardBottomArea);
         KeyguardBottomAreaView oldBottomArea = mKeyguardBottomArea;
         mKeyguardBottomArea = (KeyguardBottomAreaView) mLayoutInflater.inflate(
@@ -978,6 +1015,11 @@
         setKeyguardBottomAreaVisibility(mBarState, false);
     }
 
+    private void attachSplitShadeMediaPlayerContainer(FrameLayout container) {
+        mKeyguardMediaController.attachSplitShadeContainer(container,
+                () -> mShouldUseSplitNotificationShade);
+    }
+
     private void initBottomArea() {
         mAffordanceHelper = new KeyguardAffordanceHelper(
                 mKeyguardAffordanceHelperCallback, mView.getContext(), mFalsingManager);
@@ -1090,7 +1132,8 @@
                     hasVisibleNotifications, mInterpolatedDarkAmount, mEmptyDragAmount,
                     bypassEnabled, getUnlockedStackScrollerPadding(),
                     getQsExpansionFraction(),
-                    mDisplayCutoutTopInset);
+                    mDisplayCutoutTopInset,
+                    shouldUseSplitNotificationShade(mFeatureFlags, mResources));
             mClockPositionAlgorithm.run(mClockPositionResult);
             mKeyguardStatusViewController.updatePosition(
                     mClockPositionResult.clockX, mClockPositionResult.clockY,
@@ -1375,6 +1418,7 @@
     protected void flingToHeight(float vel, boolean expand, float target,
             float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) {
         mHeadsUpTouchHelper.notifyFling(!expand);
+        mKeyguardStateController.notifyPanelFlingStart(!expand /* flingingToDismiss */);
         setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f);
         super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing);
     }
@@ -2004,18 +2048,29 @@
         mDepthController.setQsPanelExpansion(qsExpansionFraction);
     }
 
-    private void setNotificationBounds(float qsExpansionFraction, int qsPanelBottomY) {
-        float top = 0;
-        float bottom = 0;
-        float left = 0;
-        float right = 0;
-        if (qsPanelBottomY > 0) {
-            // notification shade is expanding/expanded
+    /**
+     * Updates scrim bounds, QS clipping, and KSV clipping as well based on the bounds of the shade
+     * and QS state.
+     *
+     * @param qsFraction QS expansion fraction, from getQsExpansionFraction().
+     * @param qsPanelBottomY Absolute y position of the bottom of QS as it's being pulled.
+     */
+    private void setNotificationBounds(float qsFraction, int qsPanelBottomY) {
+        int top = 0;
+        int bottom = 0;
+        int left = 0;
+        int right = 0;
+        boolean visible = qsFraction > 0 || qsPanelBottomY > 0;
+        int radius = mScrimCornerRadius;
+        if (visible || !mShouldUseSplitNotificationShade) {
             if (!mShouldUseSplitNotificationShade) {
-                top = qsPanelBottomY;
+                float notificationTop = mAmbientState.getStackY() - mQsNotificationTopPadding;
+                top = (int) Math.min(qsPanelBottomY, notificationTop);
                 bottom = getView().getBottom();
                 left = getView().getLeft();
                 right = getView().getRight();
+                radius = (int) MathUtils.lerp(mScreenCornerRadius, mScrimCornerRadius,
+                        Math.min(top / (float) mScrimCornerRadius, 1f));
             } else {
                 top = Math.min(qsPanelBottomY, mSplitShadeNotificationsTopPadding);
                 bottom = mNotificationStackScrollLayoutController.getHeight();
@@ -2023,7 +2078,19 @@
                 right = mNotificationStackScrollLayoutController.getRight();
             }
         }
+
+        if (!mShouldUseSplitNotificationShade) {
+            // Fancy clipping for quick settings
+            if (mQs != null) {
+                mQs.setFancyClipping(top, bottom, radius, visible);
+            }
+            // The padding on this area is large enough that we can use a cheaper clipping strategy
+            mKeyguardStatusAreaClipBounds.set(left, top, right, bottom);
+            mKeyguardStatusViewController.setClipBounds(visible
+                    ? mKeyguardStatusAreaClipBounds : null);
+        }
         mScrimController.setNotificationsBounds(left, top, right, bottom);
+        mScrimController.setScrimCornerRadius(radius);
     }
 
     private int calculateQsBottomPosition(float qsExpansionFraction) {
@@ -2494,6 +2561,10 @@
         float appearAmount = mNotificationStackScrollLayoutController
                 .calculateAppearFraction(mExpandedHeight);
         float startHeight = -mQsExpansionHeight;
+        if (!mShouldUseSplitNotificationShade && mBarState == StatusBarState.SHADE) {
+            // Small parallax as we pull down and clip QS
+            startHeight = -mQsExpansionHeight * 0.2f;
+        }
         if (mKeyguardBypassController.getBypassEnabled() && isOnKeyguard()
                 && mNotificationStackScrollLayoutController.isPulseExpanding()) {
             if (!mPulseExpansionHandler.isExpanding()
@@ -3112,8 +3183,8 @@
     }
 
     public boolean hideStatusBarIconsWhenExpanded() {
-        if (mLaunchingNotification) {
-            return mHideIconsDuringNotificationLaunch;
+        if (mIsLaunchAnimationRunning) {
+            return mHideIconsDuringLaunchAnimation;
         }
         if (mHeadsUpAppearanceController != null
                 && mHeadsUpAppearanceController.shouldBeVisible()) {
@@ -3129,8 +3200,10 @@
             mQs.setPanelView(mHeightListener);
             mQs.setExpandClickListener(mOnClickListener);
             mQs.setHeaderClickable(mQsExpansionEnabled);
+            mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade);
             updateQSPulseExpansion();
             mQs.setOverscrolling(mStackScrollerOverscrolling);
+            mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade);
 
             // recompute internal state when qspanel height changes
             mQs.getView().addOnLayoutChangeListener(
@@ -3242,14 +3315,11 @@
         mKeyguardBottomArea.setUserSetupComplete(userSetupComplete);
     }
 
-    public void applyExpandAnimationParams(ExpandAnimationParameters params) {
-        if (params == null) {
-            return;
-        }
-
-        boolean hideIcons = params.getProgress(ANIMATION_DELAY_ICON_FADE_IN, 100) == 0.0f;
-        if (hideIcons != mHideIconsDuringNotificationLaunch) {
-            mHideIconsDuringNotificationLaunch = hideIcons;
+    public void applyLaunchAnimationProgress(float linearProgress) {
+        boolean hideIcons = ActivityLaunchAnimator.getProgress(linearProgress,
+                ANIMATION_DELAY_ICON_FADE_IN, 100) == 0.0f;
+        if (hideIcons != mHideIconsDuringLaunchAnimation) {
+            mHideIconsDuringLaunchAnimation = hideIcons;
             if (!hideIcons) {
                 mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */);
             }
@@ -3443,9 +3513,6 @@
         return new TouchHandler() {
             @Override
             public boolean onInterceptTouchEvent(MotionEvent event) {
-                if (mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()) {
-                    return true;
-                }
                 if (mBlockTouches || mQsFullyExpanded && mQs.disallowPanelTouches()) {
                     return false;
                 }
@@ -3473,12 +3540,6 @@
 
             @Override
             public boolean onTouch(View v, MotionEvent event) {
-                final boolean showingOrAnimatingAltAuth =
-                        mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating();
-                if (showingOrAnimatingAltAuth && event.getAction() == MotionEvent.ACTION_DOWN) {
-                    mStatusBarKeyguardViewManager.resetAlternateAuth();
-                }
-
                 if (mBlockTouches || (mQsFullyExpanded && mQs != null
                         && mQs.disallowPanelTouches())) {
                     return false;
@@ -3536,7 +3597,7 @@
                 }
 
                 handled |= super.onTouch(v, event);
-                return !mDozing || mPulsing || handled || showingOrAnimatingAltAuth;
+                return !mDozing || mPulsing || handled;
             }
         };
     }
@@ -3938,7 +3999,10 @@
                 // animate out
                 // the top of QS
                 if (!mQsExpanded) {
-                    mQs.animateHeaderSlidingOut();
+                    // TODO(b/185683835) Nicer clipping when using new spacial model
+                    if (mShouldUseSplitNotificationShade) {
+                        mQs.animateHeaderSlidingOut();
+                    }
                 }
             } else {
                 mKeyguardStatusBar.setAlpha(1f);
@@ -3991,6 +4055,7 @@
             // window, so
             // force a call to onThemeChanged
             mConfigurationListener.onThemeChanged();
+            mFalsingManager.addTapListener(mFalsingTapListener);
         }
 
         @Override
@@ -3999,6 +4064,7 @@
             mStatusBarStateController.removeCallback(mStatusBarStateListener);
             mConfigurationController.removeCallback(mConfigurationListener);
             mUpdateMonitor.removeCallback(mKeyguardUpdateCallback);
+            mFalsingManager.removeTapListener(mFalsingTapListener);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
index 0c8122c..388d72d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
@@ -256,7 +256,12 @@
                 state.mScrimsVisibility == ScrimController.OPAQUE;
         final boolean keyguardOrAod = state.mKeyguardShowing
                 || (state.mDozing && mDozeParameters.getAlwaysOn());
-        if (keyguardOrAod && !state.mBackdropShowing && !scrimsOccludingWallpaper) {
+        if ((keyguardOrAod && !state.mBackdropShowing && !scrimsOccludingWallpaper)
+                || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe()) {
+            // Show the wallpaper if we're on keyguard/AOD and the wallpaper is not occluded by a
+            // solid backdrop or scrim. Also, show it if we are currently animating between the
+            // keyguard and the surface behind the keyguard - we want to use the wallpaper as a
+            // backdrop for this animation.
             mLpChanged.flags |= LayoutParams.FLAG_SHOW_WALLPAPER;
         } else {
             mLpChanged.flags &= ~LayoutParams.FLAG_SHOW_WALLPAPER;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
index 72f7ff8..4d70237 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
@@ -87,6 +87,7 @@
     private final ShadeController mShadeController;
     private final NotificationShadeDepthController mDepthController;
     private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
+    private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
 
     private GestureDetector mGestureDetector;
     private View mBrightnessMirror;
@@ -135,7 +136,8 @@
             NotificationShadeWindowView notificationShadeWindowView,
             NotificationPanelViewController notificationPanelViewController,
             SuperStatusBarViewFactory statusBarViewFactory,
-            NotificationStackScrollLayoutController notificationStackScrollLayoutController) {
+            NotificationStackScrollLayoutController notificationStackScrollLayoutController,
+            StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
         mInjectionInflationController = injectionInflationController;
         mCoordinator = coordinator;
         mPulseExpansionHandler = pulseExpansionHandler;
@@ -159,9 +161,10 @@
         mDepthController = depthController;
         mStatusBarViewFactory = statusBarViewFactory;
         mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
+        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
 
         // This view is not part of the newly inflated expanded status bar.
-        mBrightnessMirror = mView.findViewById(R.id.brightness_mirror);
+        mBrightnessMirror = mView.findViewById(R.id.brightness_mirror_container);
     }
 
     /** Inflates the {@link R.layout#status_bar_expanded} layout and sets it up. */
@@ -239,6 +242,7 @@
                 }
                 mFalsingCollector.onTouchEvent(ev);
                 mGestureDetector.onTouchEvent(ev);
+                mStatusBarKeyguardViewManager.onTouch(ev);
                 if (mBrightnessMirror != null
                         && mBrightnessMirror.getVisibility() == View.VISIBLE) {
                     // Disallow new pointers while the brightness mirror is visible. This is so that
@@ -392,7 +396,7 @@
         mView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
             @Override
             public void onChildViewAdded(View parent, View child) {
-                if (child.getId() == R.id.brightness_mirror) {
+                if (child.getId() == R.id.brightness_mirror_container) {
                     mBrightnessMirror = child;
                 }
             }
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 a80e270..4714c4b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
@@ -83,7 +83,7 @@
     private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
     private boolean mPanelUpdateWhenAnimatorEnds;
     private boolean mVibrateOnOpening;
-    protected boolean mLaunchingNotification;
+    protected boolean mIsLaunchAnimationRunning;
     private int mFixedDuration = NO_FIXED_DURATION;
     protected ArrayList<PanelExpansionListener> mExpansionListeners = new ArrayList<>();
 
@@ -147,9 +147,6 @@
     private float mInitialTouchX;
     private boolean mTouchDisabled;
 
-    // AmbientState will never be null since it provides an @Inject constructor for Dagger to call.
-    private AmbientState mAmbientState;
-
     /**
      * Whether or not the PanelView can be expanded or collapsed with a drag.
      */
@@ -172,6 +169,7 @@
     protected final Resources mResources;
     protected final KeyguardStateController mKeyguardStateController;
     protected final SysuiStatusBarStateController mStatusBarStateController;
+    protected final AmbientState mAmbientState;
 
     protected void onExpandingFinished() {
         mBar.onExpandingFinished();
@@ -594,6 +592,7 @@
             float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) {
         if (target == mExpandedHeight || getOverExpansionAmount() > 0f && expand) {
             InteractionJankMonitor.getInstance().end(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
+            mKeyguardStateController.notifyPanelFlingEnd();
             notifyExpandingFinished();
             return;
         }
@@ -681,6 +680,7 @@
 
     private void onFlingEnd(boolean cancelled) {
         setAnimator(null);
+        mKeyguardStateController.notifyPanelFlingEnd();
         if (!cancelled) {
             InteractionJankMonitor.getInstance()
                     .end(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
@@ -830,7 +830,7 @@
     }
 
     public boolean isCollapsing() {
-        return mClosing || mLaunchingNotification;
+        return mClosing || mIsLaunchAnimationRunning;
     }
 
     public boolean isTracking() {
@@ -1130,8 +1130,8 @@
         mHeadsUpManager = headsUpManager;
     }
 
-    public void setLaunchingNotification(boolean launchingNotification) {
-        mLaunchingNotification = launchingNotification;
+    public void setIsLaunchAnimationRunning(boolean running) {
+        mIsLaunchAnimationRunning = running;
     }
 
     public void collapseWithDuration(int animationDuration) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 5e9c758..6fb18d4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -48,8 +48,8 @@
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dock.DockManager;
+import com.android.systemui.scrim.ScrimView;
 import com.android.systemui.statusbar.FeatureFlags;
-import com.android.systemui.statusbar.ScrimView;
 import com.android.systemui.statusbar.notification.stack.ViewState;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -96,6 +96,7 @@
      * When at least 1 scrim is fully opaque (alpha set to 1.)
      */
     public static final int OPAQUE = 2;
+    private boolean mClipsQsScrim;
 
     @IntDef(prefix = {"VISIBILITY_"}, value = {
             TRANSPARENT,
@@ -165,6 +166,7 @@
     // Assuming the shade is expanded during initialization
     private float mExpansionFraction = 1f;
     private float mQsExpansion;
+    private boolean mQsBottomVisible;
 
     private boolean mDarkenWhileDragging;
     private boolean mExpansionAffectsAlpha = true;
@@ -183,6 +185,7 @@
 
     private int mInFrontTint;
     private int mBehindTint;
+    private int mNotificationsTint;
     private int mBubbleTint;
 
     private boolean mWallpaperVisibilityTimedOut;
@@ -265,7 +268,8 @@
         mScrimForBubble = scrimForBubble;
         updateThemeColors();
 
-        mNotificationsScrim.enableRoundedCorners();
+        behindScrim.enableBottomEdgeConcave(mClipsQsScrim);
+        mNotificationsScrim.enableRoundedCorners(true);
 
         if (mScrimBehindChangeRunnable != null) {
             mScrimBehind.setChangeRunnable(mScrimBehindChangeRunnable, mMainExecutor);
@@ -290,6 +294,17 @@
         mKeyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback);
     }
 
+    /**
+     * Sets corner radius of scrims.
+     */
+    public void setScrimCornerRadius(int radius) {
+        if (mScrimBehind == null || mNotificationsScrim == null) {
+            return;
+        }
+        mScrimBehind.setCornerRadius(radius);
+        mNotificationsScrim.setCornerRadius(radius);
+    }
+
     void setScrimVisibleListener(Consumer<Integer> listener) {
         mScrimVisibleListener = listener;
     }
@@ -331,14 +346,17 @@
 
         mInFrontTint = state.getFrontTint();
         mBehindTint = state.getBehindTint();
+        mNotificationsTint = state.getNotifTint();
         mBubbleTint = state.getBubbleTint();
 
         mInFrontAlpha = state.getFrontAlpha();
         mBehindAlpha = state.getBehindAlpha();
         mBubbleAlpha = state.getBubbleAlpha();
-        if (isNaN(mBehindAlpha) || isNaN(mInFrontAlpha)) {
+        mNotificationsAlpha = state.getNotifAlpha();
+        if (isNaN(mBehindAlpha) || isNaN(mInFrontAlpha) || isNaN(mNotificationsAlpha)) {
             throw new IllegalStateException("Scrim opacity is NaN for state: " + state + ", front: "
-                    + mInFrontAlpha + ", back: " + mBehindAlpha);
+                    + mInFrontAlpha + ", back: " + mBehindAlpha + ", notif: "
+                    + mNotificationsAlpha);
         }
         applyExpansionToAlpha();
 
@@ -397,7 +415,7 @@
             scheduleUpdate();
         }
 
-        dispatchScrimState(mScrimBehind.getViewAlpha());
+        dispatchBackScrimState(mScrimBehind.getViewAlpha());
     }
 
     private boolean shouldFadeAwayWallpaper() {
@@ -491,21 +509,25 @@
      */
     public void setNotificationsBounds(float left, float top, float right, float bottom) {
         mNotificationsScrim.setDrawableBounds(left, top, right, bottom);
+        if (mClipsQsScrim) {
+            mScrimBehind.setBottomEdgePosition((int) top);
+        }
     }
 
     /**
      * Current state of the QuickSettings when pulling it from the top.
      *
      * @param expansionFraction From 0 to 1 where 0 means collapsed and 1 expanded.
-     * @param qsPanelBottomY absolute Y position of qs panel bottom
+     * @param qsPanelBottomY Absolute Y position of qs panel bottom
      */
     public void setQsPosition(float expansionFraction, int qsPanelBottomY) {
         if (isNaN(expansionFraction)) {
             return;
         }
-        updateNotificationsScrimAlpha(expansionFraction, qsPanelBottomY);
-        if (mQsExpansion != expansionFraction) {
+        boolean qsBottomVisible = qsPanelBottomY > 0;
+        if (mQsExpansion != expansionFraction || mQsBottomVisible != qsBottomVisible) {
             mQsExpansion = expansionFraction;
+            mQsBottomVisible = qsBottomVisible;
             boolean relevantState = (mState == ScrimState.SHADE_LOCKED
                     || mState == ScrimState.KEYGUARD
                     || mState == ScrimState.PULSING
@@ -517,22 +539,26 @@
         }
     }
 
-    private void updateNotificationsScrimAlpha(float qsExpansion, int qsPanelBottomY) {
-        float newAlpha = 0;
-        if (qsPanelBottomY > 0) {
-            float interpolator = 0;
-            if (mState == ScrimState.UNLOCKED || mState == ScrimState.SHADE_LOCKED) {
-                interpolator = getInterpolatedFraction();
-            } else {
-                interpolator = qsExpansion;
-            }
-            newAlpha = MathUtils.lerp(0, 1, interpolator);
+    /**
+     * If QS and notification scrims should not overlap, and should be clipped to each other's
+     * bounds instead.
+     */
+    public void setClipsQsScrim(boolean clipScrim) {
+        if (clipScrim == mClipsQsScrim) {
+            return;
         }
-        if (newAlpha != mNotificationsAlpha) {
-            mNotificationsAlpha = newAlpha;
-            // update alpha without animating
-            mNotificationsScrim.setViewAlpha(newAlpha);
+        mClipsQsScrim = clipScrim;
+        for (ScrimState state : ScrimState.values()) {
+            state.setClipQsScrim(mClipsQsScrim);
         }
+        if (mScrimBehind != null) {
+            mScrimBehind.enableBottomEdgeConcave(mClipsQsScrim);
+        }
+    }
+
+    @VisibleForTesting
+    public boolean getClipQsScrim() {
+        return mClipsQsScrim;
     }
 
     private void setOrAdaptCurrentAnimation(@Nullable View scrim) {
@@ -541,7 +567,8 @@
         }
 
         float alpha = getCurrentScrimAlpha(scrim);
-        if (isAnimating(scrim)) {
+        boolean qsScrimPullingDown = scrim == mScrimBehind && mQsBottomVisible;
+        if (isAnimating(scrim) && !qsScrimPullingDown) {
             // Adapt current animation.
             ValueAnimator previousAnimator = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM);
             float previousEndValue = (Float) scrim.getTag(TAG_END_ALPHA);
@@ -562,7 +589,19 @@
             return;
         }
 
-        if (mState == ScrimState.UNLOCKED || mState == ScrimState.BUBBLE_EXPANDED) {
+        if (mState == ScrimState.UNLOCKED) {
+            // Darken scrim as you pull down the shade when unlocked
+            float behindFraction = getInterpolatedFraction();
+            behindFraction = (float) Math.pow(behindFraction, 0.8f);
+            if (mClipsQsScrim) {
+                mBehindAlpha = 1;
+                mNotificationsAlpha = behindFraction * mDefaultScrimAlpha;
+            } else {
+                mBehindAlpha = behindFraction * mDefaultScrimAlpha;
+                mNotificationsAlpha = mBehindAlpha;
+            }
+            mInFrontAlpha = 0;
+        } else if (mState == ScrimState.BUBBLE_EXPANDED) {
             // Darken scrim as you pull down the shade when unlocked
             float behindFraction = getInterpolatedFraction();
             behindFraction = (float) Math.pow(behindFraction, 0.8f);
@@ -573,27 +612,45 @@
             // Either darken of make the scrim transparent when you
             // pull down the shade
             float interpolatedFract = getInterpolatedFraction();
-            float alphaBehind = mState.getBehindAlpha();
+            float stateBehind = mClipsQsScrim ? mState.getNotifAlpha() : mState.getBehindAlpha();
+            float backAlpha;
             if (mDarkenWhileDragging) {
-                mBehindAlpha = MathUtils.lerp(mDefaultScrimAlpha, alphaBehind,
+                backAlpha = MathUtils.lerp(mDefaultScrimAlpha, stateBehind,
                         interpolatedFract);
-                mInFrontAlpha = mState.getFrontAlpha();
             } else {
-                mBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind,
+                backAlpha = MathUtils.lerp(0 /* start */, stateBehind,
                         interpolatedFract);
-                mInFrontAlpha = mState.getFrontAlpha();
             }
-            mBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(),
-                    mState.getBehindTint(), interpolatedFract);
+            mInFrontAlpha = mState.getFrontAlpha();
+            int backTint;
+            if (mClipsQsScrim) {
+                backTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getNotifTint(),
+                        mState.getNotifTint(), interpolatedFract);
+            } else {
+                backTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(),
+                        mState.getBehindTint(), interpolatedFract);
+            }
             if (mQsExpansion > 0) {
-                mBehindAlpha = MathUtils.lerp(mBehindAlpha, mDefaultScrimAlpha, mQsExpansion);
-                mBehindTint = ColorUtils.blendARGB(mBehindTint,
-                        ScrimState.SHADE_LOCKED.getBehindTint(), mQsExpansion);
+                backAlpha = MathUtils.lerp(backAlpha, mDefaultScrimAlpha, mQsExpansion);
+                int stateTint = mClipsQsScrim ? ScrimState.SHADE_LOCKED.getNotifTint()
+                        : ScrimState.SHADE_LOCKED.getBehindTint();
+                backTint = ColorUtils.blendARGB(backTint, stateTint, mQsExpansion);
+            }
+            if (mClipsQsScrim) {
+                mNotificationsAlpha = backAlpha;
+                mNotificationsTint = backTint;
+                mBehindAlpha = 1;
+                mBehindTint = Color.BLACK;
+            } else {
+                mBehindAlpha = backAlpha;
+                mNotificationsAlpha = Math.max(1.0f - getInterpolatedFraction(), mQsExpansion);
+                mBehindTint = backTint;
             }
         }
-        if (isNaN(mBehindAlpha) || isNaN(mInFrontAlpha)) {
+        if (isNaN(mBehindAlpha) || isNaN(mInFrontAlpha) || isNaN(mNotificationsAlpha)) {
             throw new IllegalStateException("Scrim opacity is NaN for state: " + mState
-                    + ", front: " + mInFrontAlpha + ", back: " + mBehindAlpha);
+                    + ", front: " + mInFrontAlpha + ", back: " + mBehindAlpha + ", notif: "
+                    + mNotificationsAlpha);
         }
     }
 
@@ -606,7 +663,7 @@
         setOrAdaptCurrentAnimation(mNotificationsScrim);
         setOrAdaptCurrentAnimation(mScrimInFront);
         setOrAdaptCurrentAnimation(mScrimForBubble);
-        dispatchScrimState(mScrimBehind.getViewAlpha());
+        dispatchBackScrimState(mScrimBehind.getViewAlpha());
 
         // Reset wallpaper timeout if it's already timeout like expanding panel while PULSING
         // and docking.
@@ -693,10 +750,10 @@
                     && !mBlankScreen;
 
             mScrimInFront.setColors(mColors, animateScrimInFront);
-            mScrimBehind.setColors(mColors, animateScrimNotifications);
+            mScrimBehind.setColors(mColors, animateBehindScrim);
             mNotificationsScrim.setColors(mColors, animateScrimNotifications);
 
-            dispatchScrimState(mScrimBehind.getViewAlpha());
+            dispatchBackScrimState(mScrimBehind.getViewAlpha());
         }
 
         // We want to override the back scrim opacity for the AOD state
@@ -723,15 +780,21 @@
         dispatchScrimsVisible();
     }
 
-    private void dispatchScrimState(float alpha) {
+    private void dispatchBackScrimState(float alpha) {
+        // When clipping QS, the notification scrim is the one that feels behind.
+        // mScrimBehind will be drawing black and its opacity will always be 1.
+        if (mClipsQsScrim && mQsBottomVisible) {
+            alpha = mNotificationsAlpha;
+        }
         mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors());
     }
 
     private void dispatchScrimsVisible() {
+        final ScrimView backScrim = mClipsQsScrim ? mNotificationsScrim : mScrimBehind;
         final int currentScrimVisibility;
-        if (mScrimInFront.getViewAlpha() == 1 || mScrimBehind.getViewAlpha() == 1) {
+        if (mScrimInFront.getViewAlpha() == 1 || backScrim.getViewAlpha() == 1) {
             currentScrimVisibility = OPAQUE;
-        } else if (mScrimInFront.getViewAlpha() == 0 && mScrimBehind.getViewAlpha() == 0) {
+        } else if (mScrimInFront.getViewAlpha() == 0 && backScrim.getViewAlpha() == 0) {
             currentScrimVisibility = TRANSPARENT;
         } else {
             currentScrimVisibility = SEMI_TRANSPARENT;
@@ -859,7 +922,7 @@
         } else if (scrim == mScrimBehind) {
             return mBehindTint;
         } else if (scrim == mNotificationsScrim) {
-            return Color.TRANSPARENT;
+            return mNotificationsTint;
         } else if (scrim == mScrimForBubble) {
             return mBubbleTint;
         } else {
@@ -917,9 +980,11 @@
         if (mState == ScrimState.UNLOCKED) {
             mInFrontTint = Color.TRANSPARENT;
             mBehindTint = mState.getBehindTint();
+            mNotificationsTint = mState.getNotifTint();
             mBubbleTint = Color.TRANSPARENT;
             updateScrimColor(mScrimInFront, mInFrontAlpha, mInFrontTint);
             updateScrimColor(mScrimBehind, mBehindAlpha, mBehindTint);
+            updateScrimColor(mNotificationsScrim, mNotificationsAlpha, mNotificationsTint);
             if (mScrimForBubble != null) {
                 updateScrimColor(mScrimForBubble, mBubbleAlpha, mBubbleTint);
             }
@@ -964,7 +1029,7 @@
         }
 
         if (scrim == mScrimBehind) {
-            dispatchScrimState(alpha);
+            dispatchBackScrimState(alpha);
         }
 
         final boolean wantsAlphaUpdate = alpha != currentAlpha;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index a9774d8..1469cda 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -22,7 +22,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.systemui.dock.DockManager;
-import com.android.systemui.statusbar.ScrimView;
+import com.android.systemui.scrim.ScrimView;
 import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
 
 /**
@@ -80,11 +80,16 @@
             }
             mFrontTint = Color.BLACK;
             mBehindTint = Color.BLACK;
+            mNotifTint = mClipQsScrim ? Color.BLACK : Color.TRANSPARENT;
             mBubbleTint = Color.TRANSPARENT;
 
             mFrontAlpha = 0;
-            mBehindAlpha = mScrimBehindAlphaKeyguard;
+            mBehindAlpha = mClipQsScrim ? 1 : mScrimBehindAlphaKeyguard;
+            mNotifAlpha = mClipQsScrim ? mScrimBehindAlphaKeyguard : 0;
             mBubbleAlpha = 0;
+            if (mClipQsScrim) {
+                updateScrimColor(mScrimBehind, 1f /* alpha */, Color.BLACK);
+            }
         }
     },
 
@@ -105,7 +110,10 @@
     BOUNCER {
         @Override
         public void prepare(ScrimState previousState) {
-            mBehindAlpha = mDefaultScrimAlpha;
+            mBehindAlpha = mClipQsScrim ? 1 : mDefaultScrimAlpha;
+            mBehindTint = mClipQsScrim ? Color.BLACK : Color.TRANSPARENT;
+            mNotifAlpha = mClipQsScrim ? mDefaultScrimAlpha : 0;
+            mNotifTint = Color.TRANSPARENT;
             mFrontAlpha = 0f;
             mBubbleAlpha = 0f;
         }
@@ -126,10 +134,15 @@
     SHADE_LOCKED {
         @Override
         public void prepare(ScrimState previousState) {
-            mBehindAlpha = mDefaultScrimAlpha;
+            mBehindAlpha = mClipQsScrim ? 1 : mDefaultScrimAlpha;
+            mNotifAlpha = 1f;
             mBubbleAlpha = 0f;
             mFrontAlpha = 0f;
             mBehindTint = Color.BLACK;
+
+            if (mClipQsScrim) {
+                updateScrimColor(mScrimBehind, 1f /* alpha */, Color.BLACK);
+            }
         }
 
         // to make sure correct color is returned before "prepare" is called
@@ -224,7 +237,8 @@
         @Override
         public void prepare(ScrimState previousState) {
             // State that UI will sync to.
-            mBehindAlpha = 0;
+            mBehindAlpha = mClipQsScrim ? 1 : 0;
+            mNotifAlpha = 0;
             mFrontAlpha = 0;
             mBubbleAlpha = 0;
 
@@ -253,6 +267,10 @@
                 mBubbleTint = Color.BLACK;
                 mBlankScreen = true;
             }
+
+            if (mClipQsScrim) {
+                updateScrimColor(mScrimBehind, 1f /* alpha */, Color.BLACK);
+            }
         }
     },
 
@@ -264,7 +282,7 @@
         public void prepare(ScrimState previousState) {
             mFrontTint = Color.TRANSPARENT;
             mBehindTint = Color.TRANSPARENT;
-            mBubbleTint = Color.TRANSPARENT;
+            mBubbleTint = Color.BLACK;
 
             mFrontAlpha = 0f;
             mBehindAlpha = mDefaultScrimAlpha;
@@ -279,12 +297,14 @@
     int mFrontTint = Color.TRANSPARENT;
     int mBehindTint = Color.TRANSPARENT;
     int mBubbleTint = Color.TRANSPARENT;
+    int mNotifTint = Color.TRANSPARENT;
 
     boolean mAnimateChange = true;
     float mAodFrontScrimAlpha;
     float mFrontAlpha;
     float mBehindAlpha;
     float mBubbleAlpha;
+    float mNotifAlpha;
 
     float mScrimBehindAlphaKeyguard;
     float mDefaultScrimAlpha;
@@ -301,6 +321,7 @@
     boolean mWakeLockScreenSensorActive;
     boolean mKeyguardFadingAway;
     long mKeyguardFadingAwayDuration;
+    boolean mClipQsScrim;
 
     public void init(ScrimView scrimInFront, ScrimView scrimBehind, ScrimView scrimForBubble,
             DozeParameters dozeParameters, DockManager dockManager) {
@@ -325,6 +346,10 @@
         return mBehindAlpha;
     }
 
+    public float getNotifAlpha() {
+        return mNotifAlpha;
+    }
+
     public float getBubbleAlpha() {
         return mBubbleAlpha;
     }
@@ -337,6 +362,10 @@
         return mBehindTint;
     }
 
+    public int getNotifTint() {
+        return mNotifTint;
+    }
+
     public int getBubbleTint() {
         return mBubbleTint;
     }
@@ -406,4 +435,8 @@
         mKeyguardFadingAway = fadingAway;
         mKeyguardFadingAwayDuration = duration;
     }
+
+    public void setClipQsScrim(boolean clipsQsScrim) {
+        mClipQsScrim = clipsQsScrim;
+    }
 }
\ No newline at end of file
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 0e99d3a..dd9ebfc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -21,7 +21,6 @@
 import static android.app.StatusBarManager.WindowType;
 import static android.app.StatusBarManager.WindowVisibleState;
 import static android.app.StatusBarManager.windowStateToString;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
 import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT;
 import static android.view.InsetsState.ITYPE_STATUS_BAR;
 import static android.view.InsetsState.containsType;
@@ -163,6 +162,7 @@
 import com.android.systemui.fragments.ExtensionFragmentListener;
 import com.android.systemui.fragments.FragmentHostManager;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.keyguard.ScreenLifecycle;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
@@ -180,6 +180,7 @@
 import com.android.systemui.qs.QSFragment;
 import com.android.systemui.qs.QSPanelController;
 import com.android.systemui.recents.ScreenPinningRequest;
+import com.android.systemui.scrim.ScrimView;
 import com.android.systemui.settings.brightness.BrightnessSlider;
 import com.android.systemui.shared.plugins.PluginManager;
 import com.android.systemui.statusbar.AutoHideUiElement;
@@ -202,7 +203,6 @@
 import com.android.systemui.statusbar.NotificationViewHierarchyManager;
 import com.android.systemui.statusbar.PowerButtonReveal;
 import com.android.systemui.statusbar.PulseExpansionHandler;
-import com.android.systemui.statusbar.ScrimView;
 import com.android.systemui.statusbar.StatusBarState;
 import com.android.systemui.statusbar.SuperStatusBarViewFactory;
 import com.android.systemui.statusbar.SysuiStatusBarStateController;
@@ -801,7 +801,8 @@
             SystemStatusAnimationScheduler animationScheduler,
             PrivacyDotViewController dotViewController,
             TunerService tunerService,
-            FeatureFlags featureFlags) {
+            FeatureFlags featureFlags,
+            KeyguardUnlockAnimationController keyguardUnlockAnimationController) {
         super(context);
         mNotificationsController = notificationsController;
         mLightBarController = lightBarController;
@@ -1123,6 +1124,8 @@
         inflateShelf();
         mNotificationIconAreaController.setupShelf(mNotificationShelfController);
         mNotificationPanelViewController.addExpansionListener(mWakeUpCoordinator);
+        mNotificationPanelViewController.addExpansionListener(
+                this::dispatchPanelExpansionForKeyguardDismiss);
 
         // Allow plugins to reference DarkIconDispatcher and StatusBarStateController
         mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class);
@@ -1139,7 +1142,6 @@
                     mStatusBarView.setScrimController(mScrimController);
                     mStatusBarView.setExpansionChangedListeners(mExpansionChangedListeners);
 
-                    statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);
                     // CollapsedStatusBarFragment re-inflated PhoneStatusBarView and both of
                     // mStatusBarView.mExpanded and mStatusBarView.mBouncerShowing are false.
                     // PhoneStatusBarView's new instance will set to be gone in
@@ -1182,7 +1184,8 @@
                         new CollapsedStatusBarFragment(
                                 mOngoingCallController,
                                 mAnimationScheduler,
-                                mDotViewController),
+                                mDotViewController,
+                                mNotificationIconAreaController),
                         CollapsedStatusBarFragment.TAG)
                 .commit();
 
@@ -1349,6 +1352,38 @@
         ThreadedRenderer.overrideProperty("ambientRatio", String.valueOf(1.5f));
     }
 
+
+    /**
+     * When swiping up to dismiss the lock screen, the panel expansion goes from 1f to 0f. This
+     * results in the clock/notifications/other content disappearing off the top of the screen.
+     *
+     * We also use the expansion amount to animate in the app/launcher surface from the bottom of
+     * the screen, 'pushing' off the notifications and other content. To do this, we dispatch the
+     * expansion amount to the KeyguardViewMediator if we're in the process of dismissing the
+     * keyguard.
+     */
+    private void dispatchPanelExpansionForKeyguardDismiss(float expansion, boolean trackingTouch) {
+        // Things that mean we're not dismissing the keyguard, and should ignore this expansion:
+        // - Keyguard isn't even visible.
+        // - Keyguard is visible, but can't be dismissed (swiping up will show PIN/password prompt).
+        // - QS is expanded and we're swiping - swiping up now will hide QS, not dismiss the
+        //   keyguard.
+        if (!isKeyguardShowing()
+                || !mKeyguardStateController.canDismissLockScreen()
+                || (mNotificationPanelViewController.isQsExpanded() && trackingTouch)) {
+            return;
+        }
+
+        // Otherwise, we should let the keyguard know about this if we're tracking touch, or if we
+        // are already animating the keyguard dismiss (since we will need to either finish or cancel
+        // the animation).
+        if (trackingTouch
+                || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe()) {
+            mKeyguardStateController.notifyKeyguardDismissAmountChanged(
+                    1f - expansion, trackingTouch);
+        }
+    }
+
     @NonNull
     @Override
     public Lifecycle getLifecycle() {
@@ -1386,7 +1421,6 @@
         mActivityLaunchAnimator = new ActivityLaunchAnimator(mContext);
         mNotificationAnimationProvider = new NotificationLaunchAnimatorControllerProvider(
                 mNotificationShadeWindowViewController,
-                mNotificationPanelViewController,
                 mStackScrollerController.getNotificationListContainer(),
                 mNotificationShadeDepthControllerLazy.get()
         );
@@ -1600,6 +1634,10 @@
         return mNotificationShadeWindowViewController;
     }
 
+    public NotificationPanelViewController getNotificationPanelViewController() {
+        return mNotificationPanelViewController;
+    }
+
     protected ViewGroup getBouncerContainer() {
         return mNotificationShadeWindowView;
     }
@@ -2013,9 +2051,12 @@
 
     /** A launch animation was cancelled. */
     //TODO: These can / should probably be moved to NotificationPresenter or ShadeController
-    public void onLaunchAnimationCancelled() {
-        if (!mPresenter.isCollapsing()) {
+    public void onLaunchAnimationCancelled(boolean isLaunchForActivity) {
+        if (mPresenter.isPresenterFullyCollapsed() && !mPresenter.isCollapsing()
+                && isLaunchForActivity) {
             onClosingFinished();
+        } else {
+            mShadeController.collapsePanel(true /* animate */);
         }
     }
 
@@ -2029,16 +2070,6 @@
         }
     }
 
-    /** A launch animation timed out. */
-    public void onLaunchAnimationTimedOut(boolean isLaunchForActivity) {
-        if (mPresenter.isPresenterFullyCollapsed() && !mPresenter.isCollapsing()
-                && isLaunchForActivity) {
-            onClosingFinished();
-        } else {
-            mShadeController.collapsePanel(true /* animate */);
-        }
-    }
-
     /** Whether we should animate an activity launch. */
     public boolean areLaunchAnimationsEnabled() {
         // TODO(b/184121838): Support lock screen launch animations.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index 89e7016..93b83d3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -74,6 +74,10 @@
     /**
      * Display the no calling & SMS icons.
      */
+    void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states);
+    /**
+     * Display the no calling & SMS icons.
+     */
     void setNoCallingIcons(String slot, List<CallIndicatorIconState> states);
     public void setIconVisibility(String slot, boolean b);
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index 068ded3..75900a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -224,6 +224,33 @@
     }
 
     /**
+     * Accept a list of CallIndicatorIconStates, and show the call strength icons.
+     * @param slot StatusBar slot for the call strength icons
+     * @param states All of the no Calling & SMS icon states
+     */
+    @Override
+    public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) {
+        Slot callStrengthSlot = getSlot(slot);
+        int callStrengthSlotIndex = getSlotIndex(slot);
+        Collections.reverse(states);
+        for (CallIndicatorIconState state : states) {
+            if (!state.isNoCalling) {
+                StatusBarIconHolder holder = callStrengthSlot.getHolderForTag(state.subId);
+                if (holder == null) {
+                    holder = StatusBarIconHolder.fromCallIndicatorState(mContext, state);
+                    setIcon(callStrengthSlotIndex, holder);
+                } else {
+                    holder.setIcon(new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(),
+                            Icon.createWithResource(mContext, state.callStrengthResId), 0, 0,
+                            state.callStrengthDescription));
+                    setIcon(callStrengthSlotIndex, holder);
+                }
+            }
+            setIconVisibility(slot, !state.isNoCalling, state.subId);
+        }
+    }
+
+    /**
      * Accept a list of CallIndicatorIconStates, and show the no calling icons.
      * @param slot StatusBar slot for the no calling icons
      * @param states All of the no Calling & SMS icon states
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
index 4ca71f0..af342dd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java
@@ -86,9 +86,11 @@
             Context context,
             CallIndicatorIconState state) {
         StatusBarIconHolder holder = new StatusBarIconHolder();
+        int resId = state.isNoCalling ? state.noCallingResId : state.callStrengthResId;
+        String contentDescription = state.isNoCalling
+                ? state.noCallingDescription : state.callStrengthDescription;
         holder.mIcon = new StatusBarIcon(UserHandle.SYSTEM, context.getPackageName(),
-                Icon.createWithResource(context, state.noCallingResId),
-                0, 0, state.noCallingDescription);
+                Icon.createWithResource(context, resId), 0, 0, contentDescription);
         holder.mTag = state.subId;
         return holder;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 18644a2..14aeca1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -29,6 +29,7 @@
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.view.KeyEvent;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewRootImpl;
@@ -119,6 +120,13 @@
 
         @Override
         public void onFullyHidden() {
+        }
+
+        @Override
+        public void onExpansionChanged(float expansion) {
+            if (mAlternateAuthInterceptor != null) {
+                mAlternateAuthInterceptor.setBouncerExpansionChanged(expansion);
+            }
             updateStates();
         }
     };
@@ -251,7 +259,9 @@
     }
 
     public void setAlternateAuthInterceptor(@Nullable AlternateAuthInterceptor authInterceptor) {
+        final boolean newlyNull = authInterceptor == null && mAlternateAuthInterceptor != null;
         mAlternateAuthInterceptor = authInterceptor;
+        resetAlternateAuth(newlyNull);
     }
 
     private void registerListeners() {
@@ -432,7 +442,7 @@
             } else {
                 showBouncerOrKeyguard(hideBouncerWhenShowing);
             }
-            resetAlternateAuth();
+            resetAlternateAuth(false);
             mKeyguardUpdateManager.sendKeyguardReset();
             updateStates();
         }
@@ -441,9 +451,10 @@
     /**
      * Stop showing any alternate auth methods
      */
-    public void resetAlternateAuth() {
-        if (mAlternateAuthInterceptor != null
-                && mAlternateAuthInterceptor.hideAlternateAuthBouncer()) {
+    public void resetAlternateAuth(boolean forceUpdateScrim) {
+        if ((mAlternateAuthInterceptor != null
+                && mAlternateAuthInterceptor.hideAlternateAuthBouncer())
+                || forceUpdateScrim) {
             mStatusBar.updateScrimController();
         }
     }
@@ -561,6 +572,11 @@
     }
 
     @Override
+    public void blockPanelExpansionFromCurrentTouch() {
+        mNotificationPanelViewController.blockExpansionForCurrentTouch();
+    }
+
+    @Override
     public void hide(long startTime, long fadeoutDuration) {
         mShowing = false;
         mKeyguardStateController.notifyKeyguardState(mShowing,
@@ -573,7 +589,8 @@
         long uptimeMillis = SystemClock.uptimeMillis();
         long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
 
-        if (mStatusBar.isInLaunchTransition() ) {
+        if (mStatusBar.isInLaunchTransition()
+                || mKeyguardStateController.isFlingingToDismissKeyguard()) {
             mStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
                 @Override
                 public void run() {
@@ -957,6 +974,12 @@
      */
     public void notifyKeyguardAuthenticated(boolean strongAuth) {
         mBouncer.notifyKeyguardAuthenticated(strongAuth);
+
+        if (mAlternateAuthInterceptor != null && isShowingAlternateAuthOrAnimating()) {
+            resetAlternateAuth(false);
+            executeAfterKeyguardGoneAction();
+        }
+
     }
 
     public void showBouncerMessage(String message, ColorStateList colorState) {
@@ -1063,6 +1086,17 @@
                 || mAlternateAuthInterceptor.isAnimating());
     }
 
+    /**
+     * Forward touches to any alternate authentication affordances.
+     */
+    public boolean onTouch(MotionEvent event) {
+        if (mAlternateAuthInterceptor == null) {
+            return false;
+        }
+
+        return mAlternateAuthInterceptor.onTouch(event);
+    }
+
     /** Update keyguard position based on a tapped X coordinate. */
     public void updateKeyguardPosition(float x) {
         if (mBouncer != null) {
@@ -1121,5 +1155,18 @@
          * Set whether qs is currently expanded.
          */
         void setQsExpanded(boolean expanded);
+
+        /**
+         * Forward potential touches to authentication interceptor
+         * @return true if event was handled
+         */
+        boolean onTouch(MotionEvent event);
+
+        /**
+         * Update pin/pattern/password bouncer expansion amount where 0 is visible and 1 is fully
+         * hidden
+         */
+        void setBouncerExpansionChanged(float expansion);
+
     }
-}
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
index 2f52158..b2ab307 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
@@ -20,6 +20,7 @@
 
     override fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) {
         delegate.onLaunchAnimationStart(isExpandingFullyAbove)
+        statusBar.notificationPanelViewController.setIsLaunchAnimationRunning(true)
         if (!isExpandingFullyAbove) {
             statusBar.collapsePanelWithDuration(ActivityLaunchAnimator.ANIMATION_DURATION.toInt())
         }
@@ -28,20 +29,20 @@
     override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {
         delegate.onLaunchAnimationEnd(isExpandingFullyAbove)
         statusBar.onLaunchAnimationEnd(isExpandingFullyAbove)
+        statusBar.notificationPanelViewController.setIsLaunchAnimationRunning(false)
+    }
+
+    override fun onLaunchAnimationProgress(
+        state: ActivityLaunchAnimator.State,
+        progress: Float,
+        linearProgress: Float
+    ) {
+        delegate.onLaunchAnimationProgress(state, progress, linearProgress)
+        statusBar.notificationPanelViewController.applyLaunchAnimationProgress(linearProgress)
     }
 
     override fun onLaunchAnimationCancelled() {
         delegate.onLaunchAnimationCancelled()
-        statusBar.onLaunchAnimationCancelled()
-    }
-
-    override fun onLaunchAnimationTimedOut() {
-        delegate.onLaunchAnimationTimedOut()
-        statusBar.onLaunchAnimationTimedOut(isLaunchForActivity)
-    }
-
-    override fun onLaunchAnimationAborted() {
-        delegate.onLaunchAnimationAborted()
-        statusBar.collapsePanelOnMainThread()
+        statusBar.onLaunchAnimationCancelled(isLaunchForActivity)
     }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index 088f947..2b5caf9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -364,7 +364,6 @@
                 MetricsEvent.ACTION_LS_NOTE,
                 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
         mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_NOTIFICATION_FALSE_TOUCH);
-        mNotificationPanel.showTransientIndication(R.string.notification_tap_again);
         ActivatableNotificationView previousView = mNotificationPanel.getActivatedChild();
         if (previousView != null) {
             previousView.makeInactive(true /* animate */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
index b57d876..3445826 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
@@ -22,6 +22,7 @@
 import android.util.ArraySet;
 import android.util.Log;
 
+import com.android.settingslib.mobile.TelephonyIcons;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.policy.NetworkController;
@@ -49,6 +50,7 @@
     private final String mSlotEthernet;
     private final String mSlotVpn;
     private final String mSlotNoCalling;
+    private final String mSlotCallStrength;
 
     private final Context mContext;
     private final StatusBarIconController mIconController;
@@ -82,6 +84,8 @@
         mSlotEthernet = mContext.getString(com.android.internal.R.string.status_bar_ethernet);
         mSlotVpn      = mContext.getString(com.android.internal.R.string.status_bar_vpn);
         mSlotNoCalling = mContext.getString(com.android.internal.R.string.status_bar_no_calling);
+        mSlotCallStrength =
+                mContext.getString(com.android.internal.R.string.status_bar_call_strength);
         mActivityEnabled = mContext.getResources().getBoolean(R.bool.config_showActivity);
 
         mIconController = iconController;
@@ -207,9 +211,14 @@
         if (statusIcon.icon == R.drawable.ic_qs_no_calling_sms) {
             state.isNoCalling = statusIcon.visible;
             state.noCallingDescription = statusIcon.contentDescription;
-            mIconController.setNoCallingIcons(mSlotNoCalling,
-                    CallIndicatorIconState.copyStates(mCallIndicatorStates));
+        } else {
+            state.callStrengthResId = statusIcon.icon;
+            state.callStrengthDescription = statusIcon.contentDescription;
         }
+        mIconController.setCallStrengthIcons(mSlotCallStrength,
+                CallIndicatorIconState.copyStates(mCallIndicatorStates));
+        mIconController.setNoCallingIcons(mSlotNoCalling,
+                CallIndicatorIconState.copyStates(mCallIndicatorStates));
     }
 
     @Override
@@ -296,6 +305,7 @@
 
         mIconController.removeAllIconsForSlot(mSlotMobile);
         mIconController.removeAllIconsForSlot(mSlotNoCalling);
+        mIconController.removeAllIconsForSlot(mSlotCallStrength);
         mMobileStates.clear();
         List<CallIndicatorIconState> noCallingStates = new ArrayList<CallIndicatorIconState>();
         noCallingStates.addAll(mCallIndicatorStates);
@@ -410,12 +420,15 @@
     public static class CallIndicatorIconState {
         public boolean isNoCalling;
         public int noCallingResId;
+        public int callStrengthResId;
         public int subId;
         public String noCallingDescription;
+        public String callStrengthDescription;
 
         private CallIndicatorIconState(int subId) {
             this.subId = subId;
             this.noCallingResId = R.drawable.ic_qs_no_calling_sms;
+            this.callStrengthResId = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0];
         }
 
         @Override
@@ -427,21 +440,26 @@
             CallIndicatorIconState that = (CallIndicatorIconState) o;
             return  isNoCalling == that.isNoCalling
                     && noCallingResId == that.noCallingResId
+                    && callStrengthResId == that.callStrengthResId
                     && subId == that.subId
-                    && noCallingDescription == that.noCallingDescription;
+                    && noCallingDescription == that.noCallingDescription
+                    && callStrengthDescription == that.callStrengthDescription;
 
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(isNoCalling, noCallingResId, subId, noCallingDescription);
+            return Objects.hash(isNoCalling, noCallingResId,
+                    callStrengthResId, subId, noCallingDescription, callStrengthDescription);
         }
 
         private void copyTo(CallIndicatorIconState other) {
             other.isNoCalling = isNoCalling;
             other.noCallingResId = noCallingResId;
+            other.callStrengthResId = callStrengthResId;
             other.subId = subId;
             other.noCallingDescription = noCallingDescription;
+            other.callStrengthDescription = callStrengthDescription;
         }
 
         private static List<CallIndicatorIconState> copyStates(
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 24e6db8..4795e8a 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
@@ -38,6 +38,7 @@
 import com.android.systemui.dagger.qualifiers.UiBackground;
 import com.android.systemui.demomode.DemoModeController;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.keyguard.ScreenLifecycle;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
@@ -214,7 +215,8 @@
             SystemStatusAnimationScheduler animationScheduler,
             PrivacyDotViewController dotViewController,
             TunerService tunerService,
-            FeatureFlags featureFlags) {
+            FeatureFlags featureFlags,
+            KeyguardUnlockAnimationController keyguardUnlockAnimationController) {
         return new StatusBar(
                 context,
                 notificationsController,
@@ -300,6 +302,7 @@
                 animationScheduler,
                 dotViewController,
                 tunerService,
-                featureFlags);
+                featureFlags,
+                keyguardUnlockAnimationController);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
index 96473c2..51bb643 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
@@ -52,6 +52,18 @@
     private val mListeners: MutableList<OngoingCallListener> = mutableListOf()
 
     private val notifListener = object : NotifCollectionListener {
+        // Temporary workaround for b/178406514 for testing purposes.
+        //
+        // b/178406514 means that posting an incoming call notif then updating it to an ongoing call
+        // notif does not work (SysUI never receives the update). This workaround allows us to
+        // trigger the ongoing call chip when an ongoing call notif is *added* rather than
+        // *updated*, allowing us to test the chip.
+        //
+        // TODO(b/183229367): Remove this function override when b/178406514 is fixed.
+        override fun onEntryAdded(entry: NotificationEntry) {
+            onEntryUpdated(entry)
+        }
+
         override fun onEntryUpdated(entry: NotificationEntry) {
             if (isOngoingCallNotification(entry)) {
                 ongoingCallInfo = OngoingCallInfo(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
index 07d3f01..399c850 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
@@ -19,7 +19,6 @@
 import android.annotation.NonNull;
 import android.content.Context;
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
 import android.util.ArraySet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -51,6 +50,8 @@
     private BrightnessSlider mToggleSliderController;
     private final int[] mInt2Cache = new int[2];
     private FrameLayout mBrightnessMirror;
+    private int mBrightnessMirrorBackgroundPadding;
+    private int mLastBrightnessSliderWidth = -1;
 
     public BrightnessMirrorController(NotificationShadeWindowView statusBarWindow,
             NotificationPanelViewController notificationPanelViewController,
@@ -59,7 +60,7 @@
             @NonNull Consumer<Boolean> visibilityCallback) {
         mStatusBarWindow = statusBarWindow;
         mToggleSliderFactory = factory;
-        mBrightnessMirror = statusBarWindow.findViewById(R.id.brightness_mirror);
+        mBrightnessMirror = statusBarWindow.findViewById(R.id.brightness_mirror_container);
         mToggleSliderController = setMirrorLayout();
         mNotificationPanel = notificationPanelViewController;
         mDepthController = notificationShadeDepthController;
@@ -73,29 +74,39 @@
         mBrightnessMirror.setVisibility(View.VISIBLE);
         mVisibilityCallback.accept(true);
         mNotificationPanel.setPanelAlpha(0, true /* animate */);
-        mDepthController.setBrightnessMirrorVisible(true);
     }
 
     public void hideMirror() {
         mVisibilityCallback.accept(false);
         mNotificationPanel.setPanelAlpha(255, true /* animate */);
-        mDepthController.setBrightnessMirrorVisible(false);
     }
 
-    public void setLocation(View original) {
+    /**
+     * Set the location and size of the mirror container to match that of the slider in QS
+     * @param original the original view in QS
+     */
+    public void setLocationAndSize(View original) {
         original.getLocationInWindow(mInt2Cache);
 
         // Original is slightly larger than the mirror, so make sure to use the center for the
         // positioning.
-        int originalX = mInt2Cache[0] + original.getWidth() / 2;
-        int originalY = mInt2Cache[1] + original.getHeight() / 2;
+        int originalX = mInt2Cache[0] - mBrightnessMirrorBackgroundPadding;
+        int originalY = mInt2Cache[1] - mBrightnessMirrorBackgroundPadding;
         mBrightnessMirror.setTranslationX(0);
         mBrightnessMirror.setTranslationY(0);
         mBrightnessMirror.getLocationInWindow(mInt2Cache);
-        int mirrorX = mInt2Cache[0] + mBrightnessMirror.getWidth() / 2;
-        int mirrorY = mInt2Cache[1] + mBrightnessMirror.getHeight() / 2;
+        int mirrorX = mInt2Cache[0];
+        int mirrorY = mInt2Cache[1];
         mBrightnessMirror.setTranslationX(originalX - mirrorX);
         mBrightnessMirror.setTranslationY(originalY - mirrorY);
+
+        // Set the brightness mirror container to be the width of the mirror + 2 times the padding
+        int newWidth = original.getMeasuredWidth() + 2 * mBrightnessMirrorBackgroundPadding;
+        if (newWidth != mLastBrightnessSliderWidth) {
+            ViewGroup.LayoutParams lp = mBrightnessMirror.getLayoutParams();
+            lp.width = newWidth;
+            mBrightnessMirror.setLayoutParams(lp);
+        }
     }
 
     public ToggleSlider getToggleSlider() {
@@ -103,13 +114,15 @@
     }
 
     public void updateResources() {
-        FrameLayout.LayoutParams lp =
-                (FrameLayout.LayoutParams) mBrightnessMirror.getLayoutParams();
         Resources r = mBrightnessMirror.getResources();
-        lp.width = r.getDimensionPixelSize(R.dimen.qs_panel_width);
-        lp.height = r.getDimensionPixelSize(R.dimen.brightness_mirror_height);
-        lp.gravity = r.getInteger(R.integer.notification_panel_layout_gravity);
-        mBrightnessMirror.setLayoutParams(lp);
+        mBrightnessMirrorBackgroundPadding = r
+                .getDimensionPixelSize(R.dimen.rounded_slider_background_padding);
+        mBrightnessMirror.setPadding(
+                mBrightnessMirrorBackgroundPadding,
+                mBrightnessMirrorBackgroundPadding,
+                mBrightnessMirrorBackgroundPadding,
+                mBrightnessMirrorBackgroundPadding
+        );
     }
 
     public void onOverlayChanged() {
@@ -124,19 +137,9 @@
         Context context = mBrightnessMirror.getContext();
         BrightnessSlider controller = mToggleSliderFactory.create(context, mBrightnessMirror);
         controller.init();
-        Drawable mirrorBackground = context.getDrawable(R.drawable.brightness_mirror_background);
 
-        View rootView = controller.getRootView();
-        rootView.setBackground(mirrorBackground);
-
-        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) rootView.getLayoutParams();
-        lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
-        lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
-        int margin = context.getResources()
-                .getDimensionPixelSize(R.dimen.notification_side_paddings);
-        lp.leftMargin = margin;
-        lp.rightMargin = margin;
-        mBrightnessMirror.addView(rootView, lp);
+        mBrightnessMirror.addView(controller.getRootView(), ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
 
         return controller;
     }
@@ -145,7 +148,7 @@
         int index = mStatusBarWindow.indexOfChild(mBrightnessMirror);
         mStatusBarWindow.removeView(mBrightnessMirror);
         mBrightnessMirror = (FrameLayout) LayoutInflater.from(mBrightnessMirror.getContext())
-                .inflate(R.layout.brightness_mirror, mStatusBarWindow, false);
+                .inflate(R.layout.brightness_mirror_container, mStatusBarWindow, false);
         mToggleSliderController = setMirrorLayout();
         mStatusBarWindow.addView(mBrightnessMirror, index);
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt
index b211898..e2bebbe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt
@@ -24,7 +24,7 @@
         /**
          * If controls become available, initiate this callback with the desired position
          */
-        fun onControlsAvailable(position: Int)
+        fun onControlsUpdate(position: Int?)
     }
 
     /** Add callback, supporting only a single callback at once */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
index a4fd647..7563b30 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.SharedPreferences
+import android.provider.Settings
 import android.util.Log
 
 import com.android.systemui.R
@@ -29,6 +30,7 @@
 import com.android.systemui.qs.QSTileHost.POSITION_AT_END
 import com.android.systemui.settings.UserContextProvider
 import com.android.systemui.statusbar.policy.DeviceControlsController.Callback
+import com.android.systemui.util.settings.SecureSettings
 
 import javax.inject.Inject
 
@@ -45,7 +47,8 @@
 public class DeviceControlsControllerImpl @Inject constructor(
     private val context: Context,
     private val controlsComponent: ControlsComponent,
-    private val userContextProvider: UserContextProvider
+    private val userContextProvider: UserContextProvider,
+    private val secureSettings: SecureSettings
 ) : DeviceControlsController {
 
     private var callback: Callback? = null
@@ -73,6 +76,7 @@
         controlsComponent.getControlsController().ifPresent {
             if (!it.getFavorites().isEmpty()) {
                 position = QS_PRIORITY_POSITION
+                fireControlsUpdate()
             }
         }
     }
@@ -80,20 +84,22 @@
     /**
      * This migration logic assumes that something like [AutoTileManager] is tracking state
      * externally, and won't call this method after receiving a response via
-     * [Callback#onControlsAvailable], once per user. Otherwise the calculated position may be
+     * [Callback#onControlsUpdate], once per user. Otherwise the calculated position may be
      * incorrect.
      */
     override fun setCallback(callback: Callback) {
         // Treat any additional call as a reset before recalculating
         removeCallback()
-
-        checkMigrationToQs()
-        controlsComponent.getControlsListingController().ifPresent {
-            it.addCallback(listingCallback)
-        }
-
         this.callback = callback
-        fireControlsAvailable()
+
+        if (secureSettings.getInt(Settings.Secure.CONTROLS_ENABLED, 1) == 0) {
+            fireControlsUpdate()
+        } else {
+            checkMigrationToQs()
+            controlsComponent.getControlsListingController().ifPresent {
+                it.addCallback(listingCallback)
+            }
+        }
     }
 
     override fun removeCallback() {
@@ -104,11 +110,9 @@
         }
     }
 
-    private fun fireControlsAvailable() {
-        position?.let {
-            Log.i(TAG, "Setting DeviceControlsTile position: $it")
-            callback?.onControlsAvailable(it)
-        }
+    private fun fireControlsUpdate() {
+        Log.i(TAG, "Setting DeviceControlsTile position: $position")
+        callback?.onControlsUpdate(position)
     }
 
     /**
@@ -155,7 +159,7 @@
                         if (position == null) {
                             position = QS_DEFAULT_POSITION
                         }
-                        fireControlsAvailable()
+                        fireControlsUpdate()
 
                         controlsComponent.getControlsListingController().ifPresent {
                             it.removeCallback(listingCallback)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java
index 4e6db40..d7d1e73 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java
@@ -22,6 +22,8 @@
         CallbackController<IndividualSensorPrivacyController.Callback> {
     void init();
 
+    boolean supportsSensorToggle(@Sensor int sensor);
+
     boolean isSensorBlocked(@Sensor int sensor);
 
     void setSensorBlocked(@Sensor int sensor, boolean blocked);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java
index beb4b44..f58a7c0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java
@@ -45,13 +45,18 @@
     public void init() {
         for (int sensor : SENSORS) {
             mSensorPrivacyManager.addSensorPrivacyListener(sensor,
-                    (enabled) -> onSensorPrivacyChanged(sensor, enabled));
+                    (s, enabled) -> onSensorPrivacyChanged(sensor, enabled));
 
             mState.put(sensor, mSensorPrivacyManager.isSensorPrivacyEnabled(sensor));
         }
     }
 
     @Override
+    public boolean supportsSensorToggle(int sensor) {
+        return mSensorPrivacyManager.supportsSensorToggle(sensor);
+    }
+
+    @Override
     public boolean isSensorBlocked(@Sensor int sensor) {
         return mState.get(sensor, false);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
index d52ea89..9d667805f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
@@ -28,7 +28,6 @@
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityNodeInfo;
 
-import com.android.internal.logging.UiEventLogger;
 import com.android.keyguard.KeyguardConstants;
 import com.android.keyguard.KeyguardVisibilityHelper;
 import com.android.keyguard.dagger.KeyguardUserSwitcherScope;
@@ -36,7 +35,9 @@
 import com.android.systemui.R;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.keyguard.ScreenLifecycle;
+import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.qs.tiles.UserDetailView;
 import com.android.systemui.statusbar.SysuiStatusBarStateController;
 import com.android.systemui.statusbar.notification.AnimatableProperty;
 import com.android.systemui.statusbar.notification.PropertyAnimator;
@@ -48,6 +49,7 @@
 import com.android.systemui.util.ViewController;
 
 import javax.inject.Inject;
+import javax.inject.Provider;
 
 /**
  * Manages the user switch on the Keyguard that is used for opening the QS user panel.
@@ -67,7 +69,9 @@
     private final ScreenLifecycle mScreenLifecycle;
     private UserSwitcherController.BaseUserAdapter mAdapter;
     private final KeyguardStateController mKeyguardStateController;
+    private final FalsingManager mFalsingManager;
     protected final SysuiStatusBarStateController mStatusBarStateController;
+    private final ConfigurationController mConfigurationController;
     private final KeyguardVisibilityHelper mKeyguardVisibilityHelper;
     private final KeyguardUserDetailAdapter mUserDetailAdapter;
     private NotificationPanelViewController mNotificationPanelViewController;
@@ -76,7 +80,6 @@
 
     // State info for the user switch and keyguard
     private int mBarState;
-    private float mDarkAmount;
 
     private final StatusBarStateController.StateListener mStatusBarStateListener =
             new StatusBarStateController.StateListener() {
@@ -97,6 +100,15 @@
                 }
             };
 
+    private ConfigurationController.ConfigurationListener
+            mConfigurationListener = new ConfigurationController.ConfigurationListener() {
+
+                @Override
+                public void onUiModeChanged() {
+                    updateView(true);
+                }
+            };
+
     @Inject
     public KeyguardQsUserSwitchController(
             UserAvatarView view,
@@ -106,9 +118,11 @@
             ScreenLifecycle screenLifecycle,
             UserSwitcherController userSwitcherController,
             KeyguardStateController keyguardStateController,
+            FalsingManager falsingManager,
+            ConfigurationController configurationController,
             SysuiStatusBarStateController statusBarStateController,
             DozeParameters dozeParameters,
-            UiEventLogger uiEventLogger) {
+            Provider<UserDetailView.Adapter> userDetailViewAdapterProvider) {
         super(view);
         if (DEBUG) Log.d(TAG, "New KeyguardQsUserSwitchController");
         mContext = context;
@@ -117,11 +131,12 @@
         mScreenLifecycle = screenLifecycle;
         mUserSwitcherController = userSwitcherController;
         mKeyguardStateController = keyguardStateController;
+        mFalsingManager = falsingManager;
+        mConfigurationController = configurationController;
         mStatusBarStateController = statusBarStateController;
         mKeyguardVisibilityHelper = new KeyguardVisibilityHelper(mView,
                 keyguardStateController, dozeParameters);
-        mUserDetailAdapter = new KeyguardUserDetailAdapter(mUserSwitcherController, mContext,
-                uiEventLogger);
+        mUserDetailAdapter = new KeyguardUserDetailAdapter(context, userDetailViewAdapterProvider);
     }
 
     @Override
@@ -136,6 +151,10 @@
         };
 
         mView.setOnClickListener(v -> {
+            if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
+                return;
+            }
+
             if (isListAnimating()) {
                 return;
             }
@@ -153,8 +172,6 @@
                                 R.string.accessibility_quick_settings_choose_user_action)));
             }
         });
-
-        updateView(true /* forceUpdate */);
     }
 
     @Override
@@ -163,6 +180,8 @@
         mAdapter.registerDataSetObserver(mDataSetObserver);
         mDataSetObserver.onChanged();
         mStatusBarStateController.addCallback(mStatusBarStateListener);
+        mConfigurationController.addCallback(mConfigurationListener);
+        updateView(true /* forceUpdate */);
     }
 
     @Override
@@ -171,6 +190,7 @@
 
         mAdapter.unregisterDataSetObserver(mDataSetObserver);
         mStatusBarStateController.removeCallback(mStatusBarStateListener);
+        mConfigurationController.removeCallback(mConfigurationListener);
     }
 
     public final DataSetObserver mDataSetObserver = new DataSetObserver() {
@@ -304,9 +324,9 @@
     }
 
     class KeyguardUserDetailAdapter extends UserSwitcherController.UserDetailAdapter {
-        KeyguardUserDetailAdapter(UserSwitcherController userSwitcherController, Context context,
-                UiEventLogger uiEventLogger) {
-            super(userSwitcherController, context, uiEventLogger);
+        KeyguardUserDetailAdapter(Context context,
+                Provider<UserDetailView.Adapter> userDetailViewAdapterProvider) {
+            super(context, userDetailViewAdapterProvider);
         }
 
         @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java
index 692c34c..e7201f8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java
@@ -139,6 +139,38 @@
      */
     long calculateGoingToFullShadeDelay();
 
+    /**
+     * How much (from 0f to 1f) the keyguard is dismissed, either via a swipe gesture or an
+     * animation.
+     */
+    float getDismissAmount();
+
+    /**
+     * Whether the keyguard is being dismissed due to direct user input, rather than a canned
+     * animation.
+     */
+    boolean isDismissingFromSwipe();
+
+    /**
+     * Whether a fling animation is currently playing on the keyguard, either to dismiss it or to
+     * cancel dismissing it.
+     */
+    boolean isFlingingToDismissKeyguard();
+
+    /**
+     * Whether a fling animation is currently playing on the keyguard, either to dismiss it or to
+     * cancel dismissing it, and that animation started during a swipe gesture. Fling animations
+     * can also be started without a swipe (e.g. activity launch from lock screen notification), so
+     * this is a way to tell them apart for animation purposes.
+     */
+    boolean isFlingingToDismissKeyguardDuringSwipeGesture();
+
+    /**
+     * Whether a fling animation is currently playing on the keyguard to cancel dismissing it, after
+     * the user released their finger during a swipe gesture.
+     */
+    boolean isSnappingKeyguardBackAfterSwipe();
+
     /** **/
     default void setLaunchTransitionFadingAway(boolean b) {}
     /** **/
@@ -149,6 +181,28 @@
     default void notifyKeyguardState(boolean showing, boolean occluded) {}
 
     /**
+     * Updates the keyguard state to reflect that it's in the process of being dismissed, either by
+     * a swipe gesture on the lock screen or by a canned animation.
+     *
+     * @param dismissAmount 0f means we're not dismissed at all, 1f means we have been completely
+     *                      swiped away.
+     * @param dismissingFromTouch True if this change was caused by direct user interaction, false
+     *                            if it's due to an animation.
+     */
+    default void notifyKeyguardDismissAmountChanged(
+            float dismissAmount, boolean dismissingFromTouch) {}
+
+    /**
+     * Updates the keyguard state to reflect that a dismiss fling gesture has started.
+     *
+     * @param dismiss Whether we're flinging to dismiss (upward) or to cancel a dismiss gesture.
+     */
+    void notifyPanelFlingStart(boolean dismiss);
+
+    /** Updates the keyguard state to reflect that a dismiss fling gesture has ended. */
+    void notifyPanelFlingEnd();
+
+    /**
      * Callback for authentication events.
      */
     interface Callback {
@@ -173,5 +227,11 @@
          * Triggered when the device was just unlocked and the lock screen is being dismissed.
          */
         default void onKeyguardFadingAwayChanged() {}
+
+        /**
+         * Triggered when the keyguard dismiss amount has changed, via either a swipe gesture or an
+         * animation.
+         */
+        default void onKeyguardDismissAmountChanged() {}
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java
index 7f4eec7..e69c1f2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java
@@ -70,6 +70,28 @@
     private boolean mDebugUnlocked = false;
     private boolean mFaceAuthEnabled;
 
+    private float mDismissAmount = 0f;
+    private boolean mDismissingFromTouch = false;
+
+    /**
+     * Whether the panel is currently flinging to a collapsed state, which means we're dismissing
+     * the keyguard.
+     */
+    private boolean mFlingingToDismissKeyguard = false;
+
+    /**
+     * Whether the panel is currently flinging to a collapsed state, which means we're dismissing
+     * the keyguard, and the fling started during a swipe gesture. This means that we need to take
+     * over the gesture and animate the rest of the way dismissed.
+     */
+    private boolean mFlingingToDismissKeyguardDuringSwipeGesture = false;
+
+    /**
+     * Whether the panel is currently flinging to an expanded state, which means we cancelled the
+     * dismiss gesture and are snapping back to the keyguard state.
+     */
+    private boolean mSnappingKeyguardBackAfterSwipe = false;
+
     /**
      */
     @Inject
@@ -241,11 +263,59 @@
     }
 
     @Override
+    public boolean isFlingingToDismissKeyguard() {
+        return mFlingingToDismissKeyguard;
+    }
+
+    @Override
+    public boolean isFlingingToDismissKeyguardDuringSwipeGesture() {
+        return mFlingingToDismissKeyguardDuringSwipeGesture;
+    }
+
+    @Override
+    public boolean isSnappingKeyguardBackAfterSwipe() {
+        return mSnappingKeyguardBackAfterSwipe;
+    }
+
+    @Override
+    public float getDismissAmount() {
+        return mDismissAmount;
+    }
+
+    @Override
+    public boolean isDismissingFromSwipe() {
+        return mDismissingFromTouch;
+    }
+
+    @Override
     public void notifyKeyguardGoingAway(boolean keyguardGoingAway) {
         mKeyguardGoingAway = keyguardGoingAway;
     }
 
     @Override
+    public void notifyPanelFlingEnd() {
+        mFlingingToDismissKeyguard = false;
+        mFlingingToDismissKeyguardDuringSwipeGesture = false;
+        mSnappingKeyguardBackAfterSwipe = false;
+    }
+
+    @Override
+    public void notifyPanelFlingStart(boolean flingToDismiss) {
+        mFlingingToDismissKeyguard = flingToDismiss;
+        mFlingingToDismissKeyguardDuringSwipeGesture =
+                flingToDismiss && mDismissingFromTouch;
+        mSnappingKeyguardBackAfterSwipe = !flingToDismiss;
+    }
+
+    @Override
+    public void notifyKeyguardDismissAmountChanged(float dismissAmount,
+            boolean dismissingFromTouch) {
+        mDismissAmount = dismissAmount;
+        mDismissingFromTouch = dismissingFromTouch;
+        new ArrayList<>(mCallbacks).forEach(Callback::onKeyguardDismissAmountChanged);
+    }
+
+    @Override
     public void setLaunchTransitionFadingAway(boolean fadingAway) {
         mLaunchTransitionFadingAway = fadingAway;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index f2a0e37..d86ef32 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -25,21 +25,18 @@
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.app.RemoteInput;
-import android.content.ClipData;
-import android.content.ClipDescription;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutManager;
 import android.content.res.ColorStateList;
 import android.content.res.TypedArray;
+import android.graphics.BlendMode;
 import android.graphics.Color;
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.LayerDrawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.ServiceManager;
@@ -47,7 +44,9 @@
 import android.os.UserHandle;
 import android.text.Editable;
 import android.text.SpannedString;
+import android.text.TextUtils;
 import android.text.TextWatcher;
+import android.util.ArraySet;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Pair;
@@ -68,6 +67,7 @@
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 import android.widget.ImageButton;
+import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.TextView;
@@ -81,7 +81,6 @@
 import com.android.internal.util.ContrastColorUtil;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
-import com.android.systemui.animation.Interpolators;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
 import com.android.systemui.statusbar.RemoteInputController;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -89,6 +88,7 @@
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
 import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
 import com.android.systemui.statusbar.phone.LightBarController;
+import com.android.wm.shell.animation.Interpolators;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -112,8 +112,10 @@
     private final TextView.OnEditorActionListener mEditorActionHandler;
     private final NotificationRemoteInputManager mRemoteInputManager;
     private final List<OnFocusChangeListener> mEditTextFocusChangeListeners = new ArrayList<>();
+    private final List<OnSendRemoteInputListener> mOnSendListeners = new ArrayList<>();
     private RemoteEditText mEditText;
     private ImageButton mSendButton;
+    private GradientDrawable mContentBackground;
     private ProgressBar mProgressBar;
     private PendingIntent mPendingIntent;
     private RemoteInput[] mRemoteInputs;
@@ -130,6 +132,7 @@
     private int mRevealCx;
     private int mRevealCy;
     private int mRevealR;
+    private ContentInfo mAttachment;
 
     private boolean mColorized;
     private int mTint;
@@ -138,6 +141,9 @@
     private NotificationViewWrapper mWrapper;
     private Consumer<Boolean> mOnVisibilityChangedListener;
     private NotificationRemoteInputManager.BouncerChecker mBouncerChecker;
+    private LinearLayout mContentView;
+    private ImageView mDelete;
+    private ImageView mDeleteBg;
 
     public RemoteInputView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -149,7 +155,7 @@
                 ServiceManager.getService(Context.STATUS_BAR_SERVICE));
         TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{
                 com.android.internal.R.attr.colorAccent,
-                com.android.internal.R.attr.colorBackgroundFloating,
+                com.android.internal.R.attr.colorSurface,
         });
         mTint = ta.getColor(0, 0);
         ta.recycle();
@@ -165,14 +171,20 @@
         mColorized = colorized;
         mTint = backgroundColor;
         final int editBgColor;
+        final int alternateBgColor;
+        final int alternateTextColor;
         final int accentColor;
         final int textColor;
         final int hintTextColor;
+        final int stroke = mContext.getResources().getDimensionPixelSize(
+                R.dimen.remote_input_view_text_stroke);
         if (colorized) {
             final boolean dark = !ContrastColorUtil.isColorLight(backgroundColor);
             final int foregroundColor = dark ? Color.WHITE : Color.BLACK;
             editBgColor = backgroundColor;
             accentColor = foregroundColor;
+            alternateBgColor = foregroundColor;
+            alternateTextColor = backgroundColor;
             textColor = foregroundColor;
             hintTextColor = ColorUtils.setAlphaComponent(foregroundColor, 0x99);
         } else {
@@ -180,10 +192,14 @@
             hintTextColor = mContext.getColor(R.color.remote_input_hint);
             try (TypedArray ta = getContext().getTheme().obtainStyledAttributes(new int[]{
                     com.android.internal.R.attr.colorAccent,
-                    com.android.internal.R.attr.colorBackgroundFloating,
+                    com.android.internal.R.attr.colorSurface,
+                    com.android.internal.R.attr.colorSurfaceVariant,
+                    com.android.internal.R.attr.textColorPrimary
             })) {
                 accentColor = ta.getColor(0, textColor);
                 editBgColor = ta.getColor(1, backgroundColor);
+                alternateBgColor = ta.getColor(2, textColor);
+                alternateTextColor = ta.getColor(3, backgroundColor);
             }
         }
         mEditText.setAllColors(backgroundColor, editBgColor,
@@ -195,11 +211,15 @@
                 accentColor,
                 accentColor & 0x4DFFFFFF // %30 opacity
         });
+        mContentBackground.setColor(editBgColor);
+        mContentBackground.setStroke(stroke, accentTint);
+        mDelete.setImageTintList(ColorStateList.valueOf(alternateTextColor));
+        mDeleteBg.setImageTintList(ColorStateList.valueOf(alternateBgColor));
         mSendButton.setImageTintList(accentTint);
         mProgressBar.setProgressTintList(accentTint);
         mProgressBar.setIndeterminateTintList(accentTint);
         mProgressBar.setSecondaryProgressTintList(accentTint);
-        setBackgroundColor(backgroundColor);
+        setBackgroundColor(editBgColor);
     }
 
     @Override
@@ -209,8 +229,16 @@
         mProgressBar = findViewById(R.id.remote_input_progress);
         mSendButton = findViewById(R.id.remote_input_send);
         mSendButton.setOnClickListener(this);
-
-        mEditText = (RemoteEditText) getChildAt(0);
+        mContentBackground = (GradientDrawable)
+                mContext.getDrawable(R.drawable.remote_input_view_text_bg).mutate();
+        mDelete = findViewById(R.id.remote_input_delete);
+        mDeleteBg = findViewById(R.id.remote_input_delete_bg);
+        mDeleteBg.setImageTintBlendMode(BlendMode.SRC_IN);
+        mDelete.setImageTintBlendMode(BlendMode.SRC_IN);
+        mDelete.setOnClickListener(v -> setAttachment(null));
+        mContentView = findViewById(R.id.remote_input_content);
+        mContentView.setBackground(mContentBackground);
+        mEditText = findViewById(R.id.remote_input_text);
         mEditText.setInnerFocusable(false);
         mEditText.setWindowInsetsAnimationCallback(
                 new WindowInsetsAnimation.Callback(DISPATCH_MODE_STOP) {
@@ -220,7 +248,6 @@
                     @NonNull List<WindowInsetsAnimation> runningAnimations) {
                 return insets;
             }
-
             @Override
             public void onEnd(@NonNull WindowInsetsAnimation animation) {
                 super.onEnd(animation);
@@ -235,7 +262,43 @@
         });
     }
 
-    protected Intent prepareRemoteInputFromText() {
+    private void setAttachment(ContentInfo item) {
+        if (mAttachment != null) {
+            // We need to release permissions when sending the attachment to the target
+            // app or if it is deleted by the user. When sending to the target app, we
+            // can safely release permissions as soon as the call to
+            // `mController.grantInlineReplyUriPermission` is made (ie, after the grant
+            // to the target app has been created).
+            mAttachment.releasePermissions();
+        }
+        mAttachment = item;
+        View attachment = findViewById(R.id.remote_input_content_container);
+        ImageView iconView = findViewById(R.id.remote_input_attachment_image);
+        iconView.setImageDrawable(null);
+        if (item == null) {
+            attachment.setVisibility(GONE);
+            return;
+        }
+        iconView.setImageURI(item.getClip().getItemAt(0).getUri());
+        if (iconView.getDrawable() == null) {
+            attachment.setVisibility(GONE);
+        } else {
+            attachment.setVisibility(VISIBLE);
+        }
+    }
+
+    /**
+     * Reply intent
+     * @return returns intent with granted URI permissions that should be used immediately
+     */
+    private Intent prepareRemoteInput() {
+        if (mAttachment == null) return prepareRemoteInputFromText();
+        return prepareRemoteInputFromData(
+                mAttachment.getClip().getDescription().getMimeType(0),
+                mAttachment.getClip().getItemAt(0).getUri());
+    }
+
+    private Intent prepareRemoteInputFromText() {
         Bundle results = new Bundle();
         results.putString(mRemoteInput.getResultKey(), mEditText.getText().toString());
         Intent fillInIntent = new Intent().addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
@@ -255,23 +318,49 @@
         return fillInIntent;
     }
 
-    protected Intent prepareRemoteInputFromData(String contentType, Uri data) {
+    private Intent prepareRemoteInputFromData(String contentType, Uri data) {
         HashMap<String, Uri> results = new HashMap<>();
         results.put(contentType, data);
+        // grant for the target app.
         mController.grantInlineReplyUriPermission(mEntry.getSbn(), data);
         Intent fillInIntent = new Intent().addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
         RemoteInput.addDataResultToIntent(mRemoteInput, fillInIntent, results);
 
-        mEntry.remoteInputText = mContext.getString(R.string.remote_input_image_insertion_text);
+        Bundle bundle = new Bundle();
+        bundle.putString(mRemoteInput.getResultKey(), mEditText.getText().toString());
+        RemoteInput.addResultsToIntent(mRemoteInputs, fillInIntent,
+                bundle);
+
+        CharSequence attachmentText = mAttachment.getClip().getDescription().getLabel();
+
+        CharSequence attachmentLabel = TextUtils.isEmpty(attachmentText)
+                ? mContext.getString(R.string.remote_input_image_insertion_text)
+                : attachmentText;
+        // add content description to reply text for context
+        CharSequence fullText = TextUtils.isEmpty(mEditText.getText())
+                ? attachmentLabel
+                : "\"" + attachmentLabel + "\" " + mEditText.getText();
+
+        mEntry.remoteInputText = fullText;
         mEntry.remoteInputMimeType = contentType;
         mEntry.remoteInputUri = data;
 
+        // mirror prepareRemoteInputFromText for text input
+        if (mEntry.editedSuggestionInfo == null) {
+            RemoteInput.setResultsSource(fillInIntent, RemoteInput.SOURCE_FREE_FORM_INPUT);
+        } else if (mAttachment == null) {
+            RemoteInput.setResultsSource(fillInIntent, RemoteInput.SOURCE_CHOICE);
+        }
+
         return fillInIntent;
     }
 
     private void sendRemoteInput(Intent intent) {
         if (mBouncerChecker != null && mBouncerChecker.showBouncerIfNecessary()) {
             mEditText.hideIme();
+            for (OnSendRemoteInputListener listener : mOnSendListeners) {
+                listener.onSendRequestBounced();
+            }
             return;
         }
 
@@ -285,6 +374,10 @@
         mController.remoteInputSent(mEntry);
         mEntry.setHasSentReply();
 
+        for (OnSendRemoteInputListener listener : mOnSendListeners) {
+            listener.onSendRemoteInput();
+        }
+
         // Tell ShortcutManager that this package has been "activated".  ShortcutManager
         // will reset the throttling for this package.
         // Strictly speaking, the intent receiver may be different from the notification publisher,
@@ -303,6 +396,7 @@
             MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_REMOTE_INPUT_FAIL,
                     mEntry.getSbn().getPackageName());
         }
+        setAttachment(null);
     }
 
     public CharSequence getText() {
@@ -327,7 +421,7 @@
     @Override
     public void onClick(View v) {
         if (v == mSendButton) {
-            sendRemoteInput(prepareRemoteInputFromText());
+            sendRemoteInput(prepareRemoteInput());
         }
     }
 
@@ -668,6 +762,27 @@
         }
     }
 
+    /** Registers a listener for send events on this RemoteInputView */
+    public void addOnSendRemoteInputListener(OnSendRemoteInputListener listener) {
+        mOnSendListeners.add(listener);
+    }
+
+    /** Removes a previously-added listener for send events on this RemoteInputView */
+    public void removeOnSendRemoteInputListener(OnSendRemoteInputListener listener) {
+        mOnSendListeners.remove(listener);
+    }
+
+    /** Listener for send events */
+    public interface OnSendRemoteInputListener {
+        /** Invoked when the remote input has been sent successfully. */
+        void onSendRemoteInput();
+        /**
+         * Invoked when the user had requested to send the remote input, but authentication was
+         * required and the bouncer was shown instead.
+         */
+        void onSendRequestBounced();
+    }
+
     /** Handler for button click on send action in IME. */
     private class EditorActionHandler implements TextView.OnEditorActionListener {
 
@@ -682,8 +797,8 @@
                     && event.getAction() == KeyEvent.ACTION_DOWN;
 
             if (isSoftImeEvent || isKeyboardEnterKey) {
-                if (mEditText.length() > 0) {
-                    sendRemoteInput(prepareRemoteInputFromText());
+                if (mEditText.length() > 0 || mAttachment != null) {
+                    sendRemoteInput(prepareRemoteInput());
                 }
                 // Consume action to prevent IME from closing.
                 return true;
@@ -716,21 +831,18 @@
         private final OnReceiveContentListener mOnReceiveContentListener = this::onReceiveContent;
 
         private RemoteInputView mRemoteInputView;
-        private GradientDrawable mTextBackground;
-        private ColorDrawable mBackgroundColor;
-        private LayerDrawable mBackground;
+        private ColorDrawable mBackground;
         boolean mShowImeOnInputConnection;
         private LightBarController mLightBarController;
         private InputMethodManager mInputMethodManager;
+        private ArraySet<String> mSupportedMimes = new ArraySet<>();
         UserHandle mUser;
 
         public RemoteEditText(Context context, AttributeSet attrs) {
             super(context, attrs);
             mLightBarController = Dependency.get(LightBarController.class);
-            mTextBackground = (GradientDrawable)
-                    context.getDrawable(R.drawable.remote_input_view_text_bg).mutate();
-            mBackgroundColor = new ColorDrawable();
-            mBackground = new LayerDrawable(new Drawable[] {mBackgroundColor, mTextBackground});
+
+            mBackground = new ColorDrawable();
         }
 
         void setSupportedMimeTypes(@Nullable Collection<String> mimeTypes) {
@@ -741,6 +853,8 @@
                 listener = mOnReceiveContentListener;
             }
             setOnReceiveContentListener(types, listener);
+            mSupportedMimes.clear();
+            mSupportedMimes.addAll(mimeTypes);
         }
 
         private void hideIme() {
@@ -899,36 +1013,15 @@
             ContentInfo uriItems = split.first;
             ContentInfo remainingItems = split.second;
             if (uriItems != null) {
-                ClipData clip = uriItems.getClip();
-                ClipDescription description = clip.getDescription();
-                if (clip.getItemCount() > 1
-                        || description.getMimeTypeCount() < 1
-                        || remainingItems != null) {
-                    // Direct-reply in notifications currently only supports only one uri item
-                    // at a time and requires the MIME type to be set.
-                    Log.w(TAG, "Invalid payload: " + payload);
-                    return payload;
-                }
-                Uri contentUri = clip.getItemAt(0).getUri();
-                String mimeType = description.getMimeType(0);
-                Intent dataIntent =
-                        mRemoteInputView.prepareRemoteInputFromData(mimeType, contentUri);
-                // We can release the uri permissions granted to us as soon as we've created the
-                // grant for the target app in the call above.
-                payload.releasePermissions();
-                mRemoteInputView.sendRemoteInput(dataIntent);
+                mRemoteInputView.setAttachment(uriItems);
             }
             return remainingItems;
         }
 
         protected void setAllColors(int backgroundColor, int editBackgroundColor,
                 int accentColor, int textColor, int hintTextColor) {
-            setBackgroundColor(backgroundColor);
-            mBackgroundColor.setColor(backgroundColor);
-            mTextBackground.setColor(editBackgroundColor);
-            int stroke = getContext().getResources()
-                    .getDimensionPixelSize(R.dimen.remote_input_view_text_stroke);
-            mTextBackground.setStroke(stroke, accentColor);
+            setBackgroundColor(editBackgroundColor);
+            mBackground.setColor(editBackgroundColor);
             setTextColor(textColor);
             setHintTextColor(hintTextColor);
             getTextCursorDrawable().setColorFilter(accentColor, PorterDuff.Mode.SRC_IN);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensorPrivacyControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensorPrivacyControllerImpl.java
index a2334f3..6f659c1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensorPrivacyControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensorPrivacyControllerImpl.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.statusbar.policy;
 
-import android.content.Context;
 import android.hardware.SensorPrivacyManager;
 
 import androidx.annotation.NonNull;
@@ -26,14 +25,12 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.inject.Inject;
-
 /**
  * Controls sensor privacy state and notification.
  */
 @SysUISingleton
 public class SensorPrivacyControllerImpl implements SensorPrivacyController,
-        SensorPrivacyManager.OnSensorPrivacyChangedListener {
+        SensorPrivacyManager.OnAllSensorPrivacyChangedListener {
     private SensorPrivacyManager mSensorPrivacyManager;
     private final List<OnSensorPrivacyChangedListener> mListeners = new ArrayList<>(1);
     private Object mLock = new Object();
@@ -48,8 +45,8 @@
 
     @Override
     public void init() {
-        mSensorPrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled();
-        mSensorPrivacyManager.addSensorPrivacyListener(this);
+        mSensorPrivacyEnabled = mSensorPrivacyManager.isAllSensorPrivacyEnabled();
+        mSensorPrivacyManager.addAllSensorPrivacyListener(this);
     }
 
     /**
@@ -83,7 +80,7 @@
     /**
      * Callback invoked by the SensorPrivacyService when sensor privacy state changes.
      */
-    public void onSensorPrivacyChanged(boolean enabled) {
+    public void onAllSensorPrivacyChanged(boolean enabled) {
         synchronized (mLock) {
             mSensorPrivacyEnabled = enabled;
             for (OnSensorPrivacyChangedListener listener : mListeners) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 83558cb..5c44017 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -78,6 +78,7 @@
 import java.util.List;
 
 import javax.inject.Inject;
+import javax.inject.Provider;
 
 /**
  * Keeps a list of all users on the device for user switching.
@@ -128,14 +129,14 @@
             @Main Handler handler, ActivityStarter activityStarter,
             BroadcastDispatcher broadcastDispatcher, UiEventLogger uiEventLogger,
             TelephonyListenerManager telephonyListenerManager,
-            IActivityTaskManager activityTaskManager) {
+            IActivityTaskManager activityTaskManager, UserDetailAdapter userDetailAdapter) {
         mContext = context;
         mBroadcastDispatcher = broadcastDispatcher;
         mTelephonyListenerManager = telephonyListenerManager;
         mActivityTaskManager = activityTaskManager;
         mUiEventLogger = uiEventLogger;
         mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(mUiEventLogger);
-        mUserDetailAdapter = new UserDetailAdapter(this, mContext, mUiEventLogger);
+        mUserDetailAdapter = userDetailAdapter;
         if (!UserManager.isGuestUserEphemeral()) {
             mGuestResumeSessionReceiver.register(mBroadcastDispatcher);
         }
@@ -577,11 +578,13 @@
         pw.println("mSimpleUserSwitcher=" + mSimpleUserSwitcher);
     }
 
-    public String getCurrentUserName(Context context) {
+    /** Returns the name of the current user of the phone. */
+    public String getCurrentUserName() {
         if (mUsers.isEmpty()) return null;
         UserRecord item = mUsers.get(0);
         if (item == null || item.info == null) return null;
-        if (item.isGuest) return context.getString(com.android.settingslib.R.string.guest_nickname);
+        if (item.isGuest) return mContext.getString(
+                com.android.settingslib.R.string.guest_nickname);
         return item.info.name;
     }
 
@@ -787,15 +790,14 @@
     public static class UserDetailAdapter implements DetailAdapter {
         private final Intent USER_SETTINGS_INTENT = new Intent(Settings.ACTION_USER_SETTINGS);
 
-        private final UserSwitcherController mUserSwitcherController;
         private final Context mContext;
-        private final UiEventLogger mUiEventLogger;
+        private final Provider<UserDetailView.Adapter> mUserDetailViewAdapterProvider;
 
-        UserDetailAdapter(UserSwitcherController userSwitcherController, Context context,
-                UiEventLogger uiEventLogger) {
-            mUserSwitcherController = userSwitcherController;
+        @Inject
+        UserDetailAdapter(Context context,
+                Provider<UserDetailView.Adapter> userDetailViewAdapterProvider) {
             mContext = context;
-            mUiEventLogger = uiEventLogger;
+            mUserDetailViewAdapterProvider = userDetailViewAdapterProvider;
         }
 
         @Override
@@ -808,7 +810,7 @@
             UserDetailView v;
             if (!(convertView instanceof UserDetailView)) {
                 v = UserDetailView.inflate(context, parent, false);
-                v.createAndSetAdapter(mUserSwitcherController, mUiEventLogger);
+                v.setAdapter(mUserDetailViewAdapterProvider.get());
             } else {
                 v = (UserDetailView) convertView;
             }
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index fdd929c..9bdd8c0 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -151,6 +151,10 @@
                         + wallpaperColors);
                 mDeferredThemeEvaluation = true;
                 return;
+            } else if (mDeferredThemeEvaluation) {
+                Log.i(TAG, "Wallpaper color event received, but we already were deferring eval: "
+                        + wallpaperColors);
+                return;
             } else {
                 if (DEBUG) {
                     Log.i(TAG, "During user setup, but allowing first color event: had? "
@@ -166,6 +170,11 @@
         public void onReceive(Context context, Intent intent) {
             if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())
                     || Intent.ACTION_MANAGED_PROFILE_ADDED.equals(intent.getAction())) {
+                if (!mDeviceProvisionedController.isCurrentUserSetup()) {
+                    Log.i(TAG, "User setup not finished when " + intent.getAction()
+                            + " was received. Deferring...");
+                    return;
+                }
                 if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added.");
                 reevaluateSystemTheme(true /* forceReload */);
             } else if (Intent.ACTION_WALLPAPER_CHANGED.equals(intent.getAction())) {
diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
index 5702028..755372b 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
@@ -299,7 +299,7 @@
         // but cause crash when call notifyAsUser(). Here we return directly for USER_NULL, and
         // leave all notifications belong to removed user to NotificationManagerService, the latter
         // will remove all notifications of the removed user when handles user stopped broadcast.
-        if (isAutomotive() && vol.getMountUserId() == UserHandle.USER_NULL) {
+        if (vol.getMountUserId() == UserHandle.USER_NULL) {
             Log.d(TAG, "Ignore public volume state change event of removed user");
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt b/packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt
new file mode 100644
index 0000000..0e04871
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.util
+
+import android.content.Context
+import android.content.res.Configuration
+import android.util.AttributeSet
+import android.util.DisplayMetrics
+import android.util.TypedValue
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.android.systemui.R
+
+/**
+ * Horizontal [LinearLayout] to contain some text.
+ *
+ * The height of this container can alternate between two different heights, depending on whether
+ * the text takes one line or more.
+ *
+ * When the text takes multiple lines, it will use the values in the regular attributes (`padding`,
+ * `layout_height`). The single line behavior must be set in XML.
+ *
+ * XML attributes for single line behavior:
+ * * `systemui:textViewId`: set the id for the [TextView] that determines the height of the
+ *   container
+ * * `systemui:singleLineHeight`: sets the height of the view when the text takes up only one line.
+ *   By default, it will use [getMinimumHeight].
+ * * `systemui:singleLineVerticalPadding`: sets the padding (top and bottom) when then text takes up
+ * only one line. By default, it is 0.
+ *
+ * All dimensions are updated when configuration changes.
+ */
+class DualHeightHorizontalLinearLayout @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttrs: Int = 0,
+    defStyleRes: Int = 0
+) : LinearLayout(context, attrs, defStyleAttrs, defStyleRes) {
+
+    private val singleLineHeightValue: TypedValue?
+    private var singleLineHeightPx = 0
+
+    private val singleLineVerticalPaddingValue: TypedValue?
+    private var singleLineVerticalPaddingPx = 0
+
+    private val textViewId: Int
+    private var textView: TextView? = null
+
+    private val displayMetrics: DisplayMetrics
+        get() = context.resources.displayMetrics
+
+    private var initialPadding = mPaddingTop // All vertical padding is the same
+
+    init {
+        if (orientation != HORIZONTAL) {
+            throw IllegalStateException("This view should always have horizontal orientation")
+        }
+
+        val ta = context.obtainStyledAttributes(
+                attrs,
+                R.styleable.DualHeightHorizontalLinearLayout, defStyleAttrs, defStyleRes
+        )
+
+        val tempHeight = TypedValue()
+        singleLineHeightValue = if (
+                ta.hasValue(R.styleable.DualHeightHorizontalLinearLayout_singleLineHeight)
+        ) {
+            ta.getValue(R.styleable.DualHeightHorizontalLinearLayout_singleLineHeight, tempHeight)
+            tempHeight
+        } else {
+            null
+        }
+
+        val tempPadding = TypedValue()
+        singleLineVerticalPaddingValue = if (
+                ta.hasValue(R.styleable.DualHeightHorizontalLinearLayout_singleLineVerticalPadding)
+        ) {
+            ta.getValue(
+                    R.styleable.DualHeightHorizontalLinearLayout_singleLineVerticalPadding,
+                    tempPadding
+            )
+            tempPadding
+        } else {
+            null
+        }
+
+        textViewId = ta.getResourceId(R.styleable.DualHeightHorizontalLinearLayout_textViewId, 0)
+
+        ta.recycle()
+    }
+
+    init {
+        updateResources()
+    }
+
+    override fun setPadding(left: Int, top: Int, right: Int, bottom: Int) {
+        super.setPadding(left, top, right, bottom)
+        initialPadding = top
+    }
+
+    override fun setPaddingRelative(start: Int, top: Int, end: Int, bottom: Int) {
+        super.setPaddingRelative(start, top, end, bottom)
+        initialPadding = top
+    }
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
+        textView?.let { tv ->
+            if (tv.lineCount < 2) {
+                setMeasuredDimension(measuredWidth, singleLineHeightPx)
+                mPaddingBottom = 0
+                mPaddingTop = 0
+            } else {
+                mPaddingBottom = initialPadding
+                mPaddingTop = initialPadding
+            }
+        }
+    }
+
+    override fun onFinishInflate() {
+        super.onFinishInflate()
+        textView = findViewById(textViewId)
+    }
+
+    override fun onConfigurationChanged(newConfig: Configuration?) {
+        super.onConfigurationChanged(newConfig)
+        updateResources()
+    }
+
+    override fun setOrientation(orientation: Int) {
+        if (orientation == VERTICAL) {
+            throw IllegalStateException("This view should always have horizontal orientation")
+        }
+        super.setOrientation(orientation)
+    }
+
+    private fun updateResources() {
+        updateDimensionValue(singleLineHeightValue, minimumHeight, ::singleLineHeightPx::set)
+        updateDimensionValue(singleLineVerticalPaddingValue, 0, ::singleLineVerticalPaddingPx::set)
+    }
+
+    private inline fun updateDimensionValue(
+        tv: TypedValue?,
+        defaultValue: Int,
+        propertySetter: (Int) -> Unit
+    ) {
+        val value = tv?.let {
+            if (it.resourceId != 0) {
+                context.resources.getDimensionPixelSize(it.resourceId)
+            } else {
+                it.getDimension(displayMetrics).toInt()
+            }
+        } ?: defaultValue
+        propertySetter(value)
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
index 5cd3e57..08cdebd 100644
--- a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
@@ -43,6 +43,7 @@
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.util.LongSparseArray;
+import android.view.View;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.systemui.Dumpable;
@@ -432,7 +433,7 @@
         }
 
         @Override
-        protected void handleClick() {
+        protected void handleClick(@Nullable View view) {
             if (dumpInProgress) return;
 
             dumpInProgress = true;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 8459b7b..6953039 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -53,6 +53,7 @@
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
+import android.graphics.Rect;
 import android.graphics.Region;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
@@ -96,6 +97,8 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.graphics.drawable.BackgroundBlurDrawable;
 import com.android.settingslib.Utils;
 import com.android.systemui.Dependency;
@@ -162,6 +165,9 @@
     private ViewGroup mDialogRowsView;
     private ViewGroup mRinger;
 
+    @Nullable private View mRingerAndRowsContainer;
+    @Nullable private Drawable mRingerAndRowsContainerBackground;
+
     private ViewGroup mSelectedRingerContainer;
     private ImageView mSelectedRingerIcon;
 
@@ -183,6 +189,12 @@
     private ImageView mRingerDrawerIconAnimatingSelected;
     private ImageView mRingerDrawerIconAnimatingDeselected;
 
+    /**
+     * Animates the volume dialog's background drawable bounds upwards, to match the height of the
+     * expanded ringer drawer.
+     */
+    private final ValueAnimator mAnimateUpBackgroundToMatchDrawer = ValueAnimator.ofFloat(1f, 0f);
+
     private boolean mIsRingerDrawerOpen = false;
 
     private ImageButton mRingerIcon;
@@ -586,20 +598,26 @@
 
         row.anim = null;
 
+        mRingerAndRowsContainer = mDialogView.findViewById(
+                R.id.volume_dialog_ringer_and_rows_container);
+
+        if (mRingerAndRowsContainer != null) {
+            // Wait for layout so the background bounds are set, then set the background top to the
+            // ringer drawer closed position.
+            mRingerAndRowsContainer.post(() -> {
+                final LayerDrawable bgWrapper =
+                        ((LayerDrawable) mRingerAndRowsContainer.getBackground());
+
+                if (bgWrapper != null) {
+                    mRingerAndRowsContainerBackground = bgWrapper.getDrawable(0);
+                    setRingerAndRowsBackgroundTop(1f /* closedAmount */);
+                }
+            });
+        }
+
         final LayerDrawable seekbarDrawable =
                 (LayerDrawable) mContext.getDrawable(R.drawable.volume_row_seekbar);
 
-        final LayerDrawable seekbarBgDrawable =
-                (LayerDrawable) seekbarDrawable.findDrawableByLayerId(android.R.id.background);
-
-        row.sliderBgSolid = seekbarBgDrawable.findDrawableByLayerId(
-                R.id.volume_seekbar_background_solid);
-
-        final Drawable sliderBgIcon = seekbarBgDrawable.findDrawableByLayerId(
-                        R.id.volume_seekbar_background_icon);
-        row.sliderBgIcon =  sliderBgIcon != null ? (AlphaTintDrawableWrapper)
-                ((RotateDrawable) sliderBgIcon).getDrawable() : null;
-
         final LayerDrawable seekbarProgressDrawable = (LayerDrawable)
                 ((RoundedCornerProgressDrawable) seekbarDrawable.findDrawableByLayerId(
                         android.R.id.progress)).getDrawable();
@@ -679,10 +697,10 @@
                     mDialogView.getPaddingLeft(),
                     mDialogView.getPaddingTop(),
                     mDialogView.getPaddingRight(),
-                    mDialogView.getPaddingBottom() + (mRingerCount - 1) * mRingerDrawerItemSize);
+                    mDialogView.getPaddingBottom() + getRingerDrawerOpenExtraHeight());
         } else {
             mDialogView.setPadding(
-                    mDialogView.getPaddingLeft() + (mRingerCount - 1) * mRingerDrawerItemSize,
+                    mDialogView.getPaddingLeft() + getRingerDrawerOpenExtraHeight(),
                     mDialogView.getPaddingTop(),
                     mDialogView.getPaddingRight(),
                     mDialogView.getPaddingBottom());
@@ -731,6 +749,9 @@
             }
         });
         mRingerDrawerIconColorAnimator.setDuration(DRAWER_ANIMATION_DURATION_SHORT);
+
+        mAnimateUpBackgroundToMatchDrawer.addUpdateListener(valueAnimator ->
+                setRingerAndRowsBackgroundTop((float) valueAnimator.getAnimatedValue()));
     }
 
     private ImageView getDrawerIconViewForMode(int mode) {
@@ -789,14 +810,16 @@
         mRingerDrawerContainer.setAlpha(0f);
         mRingerDrawerContainer.setVisibility(VISIBLE);
 
+        final int ringerDrawerAnimationDuration = mState.ringerModeInternal == RINGER_MODE_VIBRATE
+                ? DRAWER_ANIMATION_DURATION_SHORT
+                : DRAWER_ANIMATION_DURATION;
+
         // Animate the drawer up and visible.
         mRingerDrawerContainer.animate()
                 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
                 // Vibrate is way farther up, so give the selected ringer icon a head start if
                 // vibrate is selected.
-                .setDuration(mState.ringerModeInternal == RINGER_MODE_VIBRATE
-                        ? DRAWER_ANIMATION_DURATION_SHORT
-                        : DRAWER_ANIMATION_DURATION)
+                .setDuration(ringerDrawerAnimationDuration)
                 .setStartDelay(mState.ringerModeInternal == RINGER_MODE_VIBRATE
                         ? DRAWER_ANIMATION_DURATION - DRAWER_ANIMATION_DURATION_SHORT
                         : 0)
@@ -812,6 +835,10 @@
                 .withEndAction(() ->
                         getDrawerIconViewForMode(mState.ringerModeInternal).setVisibility(VISIBLE));
 
+        mAnimateUpBackgroundToMatchDrawer.setDuration(ringerDrawerAnimationDuration);
+        mAnimateUpBackgroundToMatchDrawer.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+        mAnimateUpBackgroundToMatchDrawer.start();
+
         if (!isLandscape()) {
             mSelectedRingerContainer.animate()
                     .translationY(getTranslationInDrawerForRingerMode(mState.ringerModeInternal))
@@ -853,6 +880,10 @@
                     .start();
         }
 
+        mAnimateUpBackgroundToMatchDrawer.setDuration(DRAWER_ANIMATION_DURATION);
+        mAnimateUpBackgroundToMatchDrawer.setInterpolator(Interpolators.FAST_OUT_SLOW_IN_REVERSE);
+        mAnimateUpBackgroundToMatchDrawer.reverse();
+
         mSelectedRingerContainer.animate()
                 .translationX(0f)
                 .translationY(0f)
@@ -1524,7 +1555,7 @@
         }
         final ColorStateList colorTint = useActiveColoring
                 ? Utils.getColorAccent(mContext)
-                : Utils.getColorAttr(mContext, android.R.attr.colorForeground);
+                : Utils.getColorAttr(mContext, com.android.internal.R.attr.colorAccentSecondary);
         final int alpha = useActiveColoring
                 ? Color.alpha(colorTint.getDefaultColor())
                 : getAlphaAttr(android.R.attr.secondaryContentAlpha);
@@ -1532,18 +1563,24 @@
         final ColorStateList bgTint = Utils.getColorAttr(
                 mContext, android.R.attr.colorBackgroundFloating);
 
+        final ColorStateList inverseTextTint = Utils.getColorAttr(
+                mContext, com.android.internal.R.attr.textColorPrimaryInverse);
+
         row.sliderProgressSolid.setTintList(colorTint);
         if (row.sliderBgIcon != null) {
             row.sliderBgIcon.setTintList(colorTint);
         }
 
-        row.sliderBgSolid.setTintList(bgTint);
+        if (row.sliderBgSolid != null) {
+            row.sliderBgSolid.setTintList(bgTint);
+        }
+
         if (row.sliderProgressIcon != null) {
             row.sliderProgressIcon.setTintList(bgTint);
         }
 
         if (row.icon != null) {
-            row.icon.setImageTintList(colorTint);
+            row.icon.setImageTintList(inverseTextTint);
             row.icon.setImageAlpha(alpha);
         }
 
@@ -1682,6 +1719,28 @@
         };
     }
 
+    /**
+     * Return the height of the 1-2 extra ringer options that are made visible when the ringer
+     * drawer is opened.
+     */
+    private int getRingerDrawerOpenExtraHeight() {
+        return (mRingerCount - 1) * mRingerDrawerItemSize;
+    }
+
+    /**
+     * Sets the top of the background drawable behind the container view for the ringer icon and the
+     * volume rows, depending on whether the ringer drawer is open or closed.
+     */
+    private void setRingerAndRowsBackgroundTop(float drawerClosedAmount) {
+        if (mRingerAndRowsContainerBackground == null) {
+            return;
+        }
+
+        final Rect bounds = mRingerAndRowsContainerBackground.copyBounds();
+        bounds.top = (int) (drawerClosedAmount * getRingerDrawerOpenExtraHeight());
+        mRingerAndRowsContainerBackground.setBounds(bounds);
+    }
+
     private final VolumeDialogController.Callbacks mControllerCallbackH
             = new VolumeDialogController.Callbacks() {
         @Override
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
index db77366..b955455 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
@@ -18,6 +18,7 @@
 
 import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
 import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
+import static android.provider.Settings.Secure.NOTIFICATION_BUBBLES;
 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;
@@ -37,14 +38,18 @@
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.content.Context;
+import android.content.pm.UserInfo;
 import android.content.res.Configuration;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.provider.Settings;
 import android.service.notification.NotificationListenerService.RankingMap;
 import android.service.notification.ZenModeConfig;
 import android.util.ArraySet;
 import android.util.Log;
 import android.util.Pair;
+import android.util.SparseArray;
 import android.view.View;
 
 import androidx.annotation.NonNull;
@@ -58,11 +63,11 @@
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.scrim.ScrimView;
 import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.statusbar.FeatureFlags;
 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
 import com.android.systemui.statusbar.NotificationShadeWindowController;
-import com.android.systemui.statusbar.ScrimView;
 import com.android.systemui.statusbar.notification.NotificationChannelHelper;
 import com.android.systemui.statusbar.notification.NotificationEntryListener;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -244,6 +249,12 @@
                     public void onUserChanged(int userId) {
                         mBubbles.onUserChanged(userId);
                     }
+
+                    @Override
+                    public void onCurrentProfilesChanged(SparseArray<UserInfo> currentProfiles) {
+                        mBubbles.onCurrentProfilesChanged(currentProfiles);
+                    }
+
                 });
 
         mSysuiProxy = new Bubbles.SysuiProxy() {
@@ -727,6 +738,17 @@
         mBubbles.dump(fd, pw, args);
     }
 
+    /** Checks whether bubbles are enabled for this user, handles negative userIds. */
+    public static boolean areBubblesEnabled(@NonNull Context context, @NonNull UserHandle user) {
+        if (user.getIdentifier() < 0) {
+            return Settings.Secure.getInt(context.getContentResolver(),
+                    NOTIFICATION_BUBBLES, 0) == 1;
+        } else {
+            return Settings.Secure.getIntForUser(context.getContentResolver(),
+                    NOTIFICATION_BUBBLES, 0, user.getIdentifier()) == 1;
+        }
+    }
+
     static BubbleEntry notifToBubbleEntry(NotificationEntry e) {
         return new BubbleEntry(e.getSbn(), e.getRanking(), e.isClearable(),
                 e.shouldSuppressNotificationDot(), e.shouldSuppressNotificationList(),
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java
index 141b9f7..39a8bd9 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java
@@ -32,8 +32,9 @@
 import com.android.wm.shell.common.TransactionPool;
 import com.android.wm.shell.common.annotations.ChoreographerSfVsync;
 import com.android.wm.shell.common.annotations.ShellMainThread;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
 import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
+import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
+import com.android.wm.shell.startingsurface.tv.TvStartingWindowTypeAlgorithm;
 import com.android.wm.shell.transition.Transitions;
 
 import dagger.Module;
@@ -80,4 +81,14 @@
                 displayImeController, transactionPool, shellTaskOrganizer, syncQueue,
                 taskStackListener, transitions, mainExecutor, sfVsyncAnimationHandler);
     }
+
+    //
+    // Starting Windows (Splash Screen)
+    //
+
+    @WMSingleton
+    @Provides
+    static StartingWindowTypeAlgorithm provideStartingWindowTypeAlgorithm() {
+        return new TvStartingWindowTypeAlgorithm();
+    };
 }
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
index 81bb819..74077a2 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
@@ -236,6 +236,14 @@
 
         oneHanded.registerTransitionCallback(new OneHandedTransitionCallback() {
             @Override
+            public void onStartTransition(boolean isEntering) {
+                mSysUiMainExecutor.execute(() -> {
+                    mSysUiState.setFlag(SYSUI_STATE_ONE_HANDED_ACTIVE,
+                            true).commitUpdate(DEFAULT_DISPLAY);
+                });
+            }
+
+            @Override
             public void onStartFinished(Rect bounds) {
                 mSysUiMainExecutor.execute(() -> {
                     mSysUiState.setFlag(SYSUI_STATE_ONE_HANDED_ACTIVE,
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
index f96d344..26b68af 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java
@@ -72,6 +72,7 @@
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.startingsurface.StartingSurface;
 import com.android.wm.shell.startingsurface.StartingWindowController;
+import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
 import com.android.wm.shell.transition.ShellTransitions;
 import com.android.wm.shell.transition.Transitions;
 
@@ -189,12 +190,13 @@
             TaskStackListenerImpl taskStackListener,
             UiEventLogger uiEventLogger,
             ShellTaskOrganizer organizer,
+            DisplayController displayController,
             @ShellMainThread ShellExecutor mainExecutor,
             @ShellMainThread Handler mainHandler) {
         return Optional.of(BubbleController.create(context, null /* synchronizer */,
                 floatingContentCoordinator, statusBarService, windowManager,
                 windowManagerShellWrapper, launcherApps, taskStackListener,
-                uiEventLogger, organizer, mainExecutor, mainHandler));
+                uiEventLogger, organizer, displayController, mainExecutor, mainHandler));
     }
 
     //
@@ -381,8 +383,10 @@
     @WMSingleton
     @Provides
     static StartingWindowController provideStartingWindowController(Context context,
-            @ShellSplashscreenThread ShellExecutor splashScreenExecutor, TransactionPool pool) {
-        return new StartingWindowController(context, splashScreenExecutor, pool);
+            @ShellSplashscreenThread ShellExecutor splashScreenExecutor,
+            StartingWindowTypeAlgorithm startingWindowTypeAlgorithm, TransactionPool pool) {
+        return new StartingWindowController(context, splashScreenExecutor,
+                startingWindowTypeAlgorithm, pool);
     }
 
     //
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
index 743dd46..36fd9be 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
@@ -54,6 +54,8 @@
 import com.android.wm.shell.pip.phone.PipController;
 import com.android.wm.shell.pip.phone.PipMotionHelper;
 import com.android.wm.shell.pip.phone.PipTouchHandler;
+import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
+import com.android.wm.shell.startingsurface.phone.PhoneStartingWindowTypeAlgorithm;
 import com.android.wm.shell.transition.Transitions;
 
 import java.util.Optional;
@@ -229,4 +231,14 @@
                 menuController, pipSnapAlgorithm, pipTransitionController,
                 floatingContentCoordinator);
     }
+
+    //
+    // Starting Windows (Splash Screen)
+    //
+
+    @WMSingleton
+    @Provides
+    static StartingWindowTypeAlgorithm provideStartingWindowTypeAlgorithm() {
+        return new PhoneStartingWindowTypeAlgorithm();
+    }
 }
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index 38da21e..ff5165d 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -22,6 +22,9 @@
 LOCAL_DX_FLAGS := --multi-dex
 
 LOCAL_PACKAGE_NAME := SystemUITests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../NOTICE
 LOCAL_PRIVATE_PLATFORM_APIS := true
 LOCAL_COMPATIBILITY_SUITE := device-tests
 
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
index 4d4acd9..39ebe68 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
@@ -41,8 +41,11 @@
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.BcSmartspaceDataPlugin;
+import com.android.systemui.plugins.BcSmartspaceDataPlugin.IntentStarter;
 import com.android.systemui.plugins.ClockPlugin;
+import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.FeatureFlags;
 import com.android.systemui.statusbar.StatusBarState;
@@ -107,6 +110,10 @@
     SmartspaceView mSmartspaceView;
     @Mock
     SystemUIFactory mSystemUIFactory;
+    @Mock
+    ActivityStarter mActivityStarter;
+    @Mock
+    FalsingManager mFalsingManager;
 
     private KeyguardClockSwitchController mController;
     private View mStatusArea;
@@ -143,7 +150,9 @@
                 mExecutor,
                 mBatteryController,
                 mConfigurationController,
-                mSystemUIFactory
+                mSystemUIFactory,
+                mActivityStarter,
+                mFalsingManager
         );
 
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
@@ -152,7 +161,6 @@
         mStatusArea = new View(getContext());
         when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea);
         when(mSmartspaceDataProvider.getView(any())).thenReturn(mSmartspaceView);
-
     }
 
     @Test
@@ -262,5 +270,11 @@
         public void registerDataProvider(BcSmartspaceDataPlugin plugin) { }
 
         public void setPrimaryTextColor(int color) { }
+
+        public void setDozeAmount(float amount) { }
+
+        public void setIntentStarter(IntentStarter intentStarter) { }
+
+        public void setFalsingManager(FalsingManager falsingManager) { }
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java
index 4d52650..42314bf 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewControllerTest.java
@@ -29,6 +29,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
+import android.testing.TestableResources;
 import android.view.Gravity;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
@@ -49,7 +50,6 @@
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
 public class KeyguardHostViewControllerTest extends SysuiTestCase {
-
     @Mock
     private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
 
@@ -68,14 +68,21 @@
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
 
+    private TestableResources mTestableResources;
     private KeyguardHostViewController mKeyguardHostViewController;
 
     @Before
     public void setup() {
-        mContext.ensureTestableResources();
+        mTestableResources = mContext.getOrCreateTestableResources();
 
         mKeyguardHostView = new KeyguardHostView(mContext);
 
+        // Explicitly disable one handed keyguard.
+        mTestableResources.addOverride(
+                R.bool.can_use_one_handed_bouncer, false);
+        mTestableResources.addOverride(
+                com.android.internal.R.bool.config_enableOneHandedKeyguard, false);
+
         when(mKeyguardSecurityContainerControllerFactory.create(any(
                 KeyguardSecurityContainer.SecurityCallback.class)))
                 .thenReturn(mKeyguardSecurityContainerController);
@@ -106,7 +113,7 @@
         mKeyguardHostView.setLayoutParams(lp);
 
         // Set initial gravity
-        mContext.getOrCreateTestableResources().addOverride(R.integer.keyguard_host_view_gravity,
+        mTestableResources.addOverride(R.integer.keyguard_host_view_gravity,
                 Gravity.CENTER);
 
         // Kick off the initial pass...
@@ -116,7 +123,7 @@
                 Gravity.CENTER);
 
         // Now simulate a config change
-        mContext.getOrCreateTestableResources().addOverride(R.integer.keyguard_host_view_gravity,
+        mTestableResources.addOverride(R.integer.keyguard_host_view_gravity,
                 Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
 
         mKeyguardHostViewController.updateResources();
@@ -126,6 +133,43 @@
     }
 
     @Test
+    public void testGravityUsesOneHandGravityWhenApplicable() {
+        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT);
+        mKeyguardHostView.setLayoutParams(lp);
+
+        mTestableResources.addOverride(
+                R.integer.keyguard_host_view_gravity,
+                Gravity.CENTER);
+        mTestableResources.addOverride(
+                R.integer.keyguard_host_view_one_handed_gravity,
+                Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
+
+        // Start disabled.
+        mTestableResources.addOverride(
+                R.bool.can_use_one_handed_bouncer, false);
+        mTestableResources.addOverride(
+                com.android.internal.R.bool.config_enableOneHandedKeyguard, false);
+
+        mKeyguardHostViewController.init();
+        assertEquals(
+                ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity,
+                Gravity.CENTER);
+
+        // And enable
+        mTestableResources.addOverride(
+                R.bool.can_use_one_handed_bouncer, true);
+        mTestableResources.addOverride(
+                com.android.internal.R.bool.config_enableOneHandedKeyguard, true);
+
+        mKeyguardHostViewController.updateResources();
+        assertEquals(
+                ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity,
+                Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
+    }
+
+    @Test
     public void testUpdateKeyguardPositionDelegatesToSecurityContainer() {
         mKeyguardHostViewController.updateKeyguardPosition(1.0f);
 
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 42cc1fa9..77582bd 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -850,7 +850,7 @@
         when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
 
         // THEN we should listen for udfps
-        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(true);
+        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(true);
     }
 
     @Test
@@ -865,22 +865,7 @@
         when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(false);
 
         // THEN we shouldn't listen for udfps
-        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
-    }
-
-    @Test
-    public void testStartUdfpsServiceOnBouncerNotVisible() {
-        // GIVEN
-        // - status bar state is on the keyguard
-        // - user has authenticated since boot
-        mStatusBarStateListener.onStateChanged(StatusBarState.KEYGUARD);
-        when(mStrongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(true);
-
-        // WHEN the bouncer is showing
-        setKeyguardBouncerVisibility(true /* isVisible */);
-
-        // THEN we shouldn't listen for udfps
-        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(false);
     }
 
     @Test
@@ -895,7 +880,7 @@
                 KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */);
 
         // THEN we shouldn't listen for udfps
-        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(false);
     }
 
     @Test
@@ -910,7 +895,7 @@
                 KeyguardUpdateMonitor.getCurrentUser(), false);
 
         // THEN we shouldn't listen for udfps
-        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(false);
     }
 
     @Test
@@ -925,7 +910,7 @@
                 KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN);
 
         // THEN we shouldn't listen for udfps
-        assertThat(mKeyguardUpdateMonitor.shouldListenForUdfps()).isEqualTo(false);
+        assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(false);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
index daa896c..e1ddaad 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
@@ -41,7 +41,6 @@
 import android.view.SurfaceHolder;
 
 import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
 
 import org.junit.Before;
 import org.junit.Ignore;
@@ -100,7 +99,7 @@
     }
 
     private ImageWallpaper createImageWallpaper() {
-        return new ImageWallpaper(mock(StatusBarStateController.class)) {
+        return new ImageWallpaper() {
             @Override
             public Engine onCreateEngine() {
                 return new GLEngine(mHandler) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
index d3a2d2e..7d617db 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
@@ -97,6 +97,9 @@
         doAnswer(invocation ->
                 wm.getMaximumWindowMetrics()
         ).when(mWindowManager).getMaximumWindowMetrics();
+        doAnswer(invocation ->
+                wm.getCurrentWindowMetrics()
+        ).when(mWindowManager).getCurrentWindowMetrics();
         mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager);
         doAnswer(invocation -> {
             mMirrorView = invocation.getArgument(0);
@@ -200,7 +203,6 @@
         mInstrumentation.runOnMainSync(() -> {
             mWindowMagnificationController.enableWindowMagnification(Float.NaN, Float.NaN,
                     Float.NaN);
-            Mockito.reset(mWindowManager);
         });
 
         mInstrumentation.runOnMainSync(() -> {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
index 28cc580..0de257a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuViewTest.java
@@ -16,6 +16,9 @@
 
 package com.android.systemui.accessibility.floatingmenu;
 
+import static android.view.View.OVER_SCROLL_ALWAYS;
+import static android.view.View.OVER_SCROLL_NEVER;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -437,6 +440,30 @@
                 action -> action.getId() == R.id.action_move_to_edge_and_hide)).isTrue();
     }
 
+    @Test
+    public void onTargetsChanged_exceedAvailableHeight_overScrollAlways() {
+        final RecyclerView listView = new RecyclerView(mContext);
+        final AccessibilityFloatingMenuView menuView =
+                spy(new AccessibilityFloatingMenuView(mContext, listView));
+        doReturn(true).when(menuView).hasExceededMaxLayoutHeight();
+
+        menuView.onTargetsChanged(mTargets);
+
+        assertThat(listView.getOverScrollMode()).isEqualTo(OVER_SCROLL_ALWAYS);
+    }
+
+    @Test
+    public void onTargetsChanged_notExceedAvailableHeight_overScrollNever() {
+        final RecyclerView listView = new RecyclerView(mContext);
+        final AccessibilityFloatingMenuView menuView =
+                spy(new AccessibilityFloatingMenuView(mContext, listView));
+        doReturn(false).when(menuView).hasExceededMaxLayoutHeight();
+
+        mMenuView.onTargetsChanged(mTargets);
+
+        assertThat(mListView.getOverScrollMode()).isEqualTo(OVER_SCROLL_NEVER);
+    }
+
     @After
     public void tearDown() {
         mInterceptMotionEvent = null;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
index 6420c4e..c023610 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
@@ -106,12 +106,12 @@
     }
 
     @Test
-    fun abortsIfNoOpeningWindowIsFound() {
+    fun cancelsIfNoOpeningWindowIsFound() {
         val runner = activityLaunchAnimator.createRunner(controller)
         runner.onAnimationStart(0, emptyArray(), emptyArray(), emptyArray(), iCallback)
 
         waitForIdleSync()
-        verify(controller).onLaunchAnimationAborted()
+        verify(controller).onLaunchAnimationCancelled()
         verify(controller, never()).onLaunchAnimationStart(anyBoolean())
     }
 
@@ -177,12 +177,4 @@
     override fun onLaunchAnimationCancelled() {
         assertOnMainThread()
     }
-
-    override fun onLaunchAnimationTimedOut() {
-        assertOnMainThread()
-    }
-
-    override fun onLaunchAnimationAborted() {
-        assertOnMainThread()
-    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 3fe8cee..1b464a9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -50,7 +50,9 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintSensorProperties;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
 import android.os.Bundle;
+import android.os.RemoteException;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableContext;
@@ -66,6 +68,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.AdditionalMatchers;
 import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -100,12 +103,13 @@
     private FaceManager mFaceManager;
     @Mock
     private UdfpsController mUdfpsController;
+    @Captor
+    ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback> mAuthenticatorsRegisteredCaptor;
 
     private TestableAuthController mAuthController;
 
-
     @Before
-    public void setup() {
+    public void setup() throws RemoteException {
         MockitoAnnotations.initMocks(this);
 
         TestableContext context = spy(mContext);
@@ -148,6 +152,9 @@
                 () -> mUdfpsController);
 
         mAuthController.start();
+        verify(mFingerprintManager).addAuthenticatorsRegisteredCallback(
+                mAuthenticatorsRegisteredCaptor.capture());
+        mAuthenticatorsRegisteredCaptor.getValue().onAllAuthenticatorsRegistered(props);
     }
 
     // Callback tests
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 0aa182f..40c4851 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -24,7 +24,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.biometrics.SensorProperties;
@@ -40,6 +39,7 @@
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
 
 import androidx.test.filters.SmallTest;
 
@@ -85,8 +85,6 @@
 
     // Dependencies
     @Mock
-    private Resources mResources;
-    @Mock
     private LayoutInflater mLayoutInflater;
     @Mock
     private FingerprintManager mFingerprintManager;
@@ -108,6 +106,10 @@
     private IUdfpsOverlayControllerCallback mUdfpsOverlayControllerCallback;
     @Mock
     private FalsingManager mFalsingManager;
+    @Mock
+    private PowerManager mPowerManager;
+    @Mock
+    private AccessibilityManager mAccessibilityManager;
 
     private FakeExecutor mFgExecutor;
 
@@ -149,7 +151,6 @@
         mFgExecutor = new FakeExecutor(new FakeSystemClock());
         mUdfpsController = new UdfpsController(
                 mContext,
-                mResources,
                 mLayoutInflater,
                 mFingerprintManager,
                 mWindowManager,
@@ -160,7 +161,9 @@
                 mDumpManager,
                 mKeyguardUpdateMonitor,
                 mKeyguardViewMediator,
-                mFalsingManager);
+                mFalsingManager,
+                mPowerManager,
+                mAccessibilityManager);
         verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
         mOverlayController = mOverlayCaptor.getValue();
 
@@ -171,16 +174,9 @@
         when(mBrightnessValues.length()).thenReturn(2);
         when(mBrightnessValues.getFloat(0, PowerManager.BRIGHTNESS_OFF_FLOAT)).thenReturn(1f);
         when(mBrightnessValues.getFloat(1, PowerManager.BRIGHTNESS_OFF_FLOAT)).thenReturn(2f);
-        when(mResources.obtainTypedArray(com.android.internal.R.array.config_screenBrightnessNits))
-                .thenReturn(mBrightnessValues);
         when(mBrightnessBacklight.length()).thenReturn(2);
         when(mBrightnessBacklight.getFloat(0, PowerManager.BRIGHTNESS_OFF_FLOAT)).thenReturn(1f);
         when(mBrightnessBacklight.getFloat(1, PowerManager.BRIGHTNESS_OFF_FLOAT)).thenReturn(2f);
-        when(mResources.obtainTypedArray(
-                com.android.internal.R.array.config_autoBrightnessDisplayValuesNits))
-                .thenReturn(mBrightnessBacklight);
-        when(mResources.getIntArray(com.android.internal.R.array.config_screenBrightnessBacklight))
-                .thenReturn(new int[]{1, 2});
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
index 2383c7b..3a657c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
@@ -28,6 +28,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.KeyguardViewMediator;
@@ -67,6 +68,8 @@
     private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     @Mock
     private KeyguardViewMediator mKeyguardViewMediator;
+    @Mock
+    private UdfpsController mUdfpsController;
 
     private UdfpsKeyguardViewController mController;
 
@@ -81,10 +84,14 @@
             mAltAuthInterceptorCaptor;
     private StatusBarKeyguardViewManager.AlternateAuthInterceptor mAltAuthInterceptor;
 
+    @Captor private ArgumentCaptor<KeyguardUpdateMonitorCallback> mUpdateMonitorCallbackCaptor;
+    private KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
+        when(mKeyguardUpdateMonitor.isKeyguardVisible()).thenReturn(true);
         mController = new UdfpsKeyguardViewController(
                 mView,
                 mStatusBarStateController,
@@ -93,7 +100,8 @@
                 mKeyguardUpdateMonitor,
                 mExecutor,
                 mDumpManager,
-                mKeyguardViewMediator);
+                mKeyguardViewMediator,
+                mUdfpsController);
     }
 
     @Test
@@ -148,6 +156,17 @@
     }
 
     @Test
+    public void testShouldPauseAuthBouncerShowing() {
+        mController.onViewAttached();
+        captureStatusBarStateListeners();
+        captureExpansionListener();
+
+        sendStatusBarStateChanged(StatusBarState.KEYGUARD);
+
+        assertFalse(mController.shouldPauseAuth());
+    }
+
+    @Test
     public void testShouldNotPauseAuthOnKeyguard() {
         mController.onViewAttached();
         captureStatusBarStateListeners();
@@ -159,6 +178,17 @@
     }
 
     @Test
+    public void testShouldPauseAuthKeyguardNotVisible() {
+        mController.onViewAttached();
+        captureKeyguardUpdateMonitorCallback();
+
+        // WHEN keyguard isn't visible
+        mKeyguardUpdateMonitorCallback.onKeyguardVisibilityChangedRaw(false);
+
+        assertTrue(mController.shouldPauseAuth());
+    }
+
+    @Test
     public void testShouldPauseAuthOnShadeLocked() {
         mController.onViewAttached();
         captureStatusBarStateListeners();
@@ -233,15 +263,12 @@
         // GIVEN view is attached, alt auth is force being shown
         mController.onViewAttached();
         captureStatusBarStateListeners();
-        captureAltAuthInterceptor();
-
-        mAltAuthInterceptor.showAlternateAuthBouncer(); // alt auth force show
 
         // WHEN view is detached
         mController.onViewDetached();
 
-        // THEN alt auth state reports not showing
-        assertFalse(mAltAuthInterceptor.isShowingAlternateAuthBouncer());
+        // THEN set alternate auth interceptor to null
+        verify(mStatusBarKeyguardViewManager).setAlternateAuthInterceptor(null);
     }
 
     private void sendStatusBarStateChanged(int statusBarState) {
@@ -263,4 +290,9 @@
                 mAltAuthInterceptorCaptor.capture());
         mAltAuthInterceptor = mAltAuthInterceptorCaptor.getValue();
     }
+
+    private void captureKeyguardUpdateMonitorCallback() {
+        verify(mKeyguardUpdateMonitor).registerCallback(mUpdateMonitorCallbackCaptor.capture());
+        mKeyguardUpdateMonitorCallback = mUpdateMonitorCallbackCaptor.getValue();
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
index f077190..bc24445 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
@@ -179,7 +179,23 @@
         mFalsingCollector.onTouchEvent(down);
         verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
 
-        // Up event would normally flush the up event.
+        // Up event would normally flush the up event, but doesn't.
+        mFalsingCollector.onTouchEvent(up);
+        verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
+    }
+
+    @Test
+    public void testAvoidDozing() {
+        MotionEvent down = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        MotionEvent up = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0);
+
+        when(mStatusBarStateController.isDozing()).thenReturn(true);
+
+        // Nothing passed initially
+        mFalsingCollector.onTouchEvent(down);
+        verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
+
+        // Up event would normally flush the up event, but doesn't.
         mFalsingCollector.onTouchEvent(up);
         verify(mFalsingDataProvider, never()).onMotionEvent(any(MotionEvent.class));
     }
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 f6c836a..a80fbbe 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
@@ -24,7 +24,6 @@
 import android.content.Intent
 import android.content.pm.ServiceInfo
 import android.os.UserHandle
-import android.provider.Settings
 import android.service.controls.Control
 import android.service.controls.DeviceTypes
 import android.service.controls.actions.ControlAction
@@ -141,11 +140,6 @@
     fun setUp() {
         MockitoAnnotations.initMocks(this)
 
-        Settings.Secure.putInt(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 1)
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 1, otherUser)
-
         `when`(userTracker.userHandle).thenReturn(UserHandle.of(user))
 
         delayableExecutor = FakeExecutor(FakeSystemClock())
@@ -172,7 +166,6 @@
         )
         controller.auxiliaryPersistenceWrapper = auxiliaryPersistenceWrapper
 
-        assertTrue(controller.available)
         verify(broadcastDispatcher).registerReceiver(
                 capture(broadcastReceiverCaptor), any(), any(), eq(UserHandle.ALL))
 
@@ -527,58 +520,6 @@
         verify(listingController).changeUser(UserHandle.of(otherUser))
         assertTrue(controller.getFavorites().isEmpty())
         assertEquals(otherUser, controller.currentUserId)
-        assertTrue(controller.available)
-    }
-
-    @Test
-    fun testDisableFeature_notAvailable() {
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, user)
-        controller.settingObserver.onChange(false, listOf(ControlsControllerImpl.URI), 0, 0)
-        assertFalse(controller.available)
-    }
-
-    @Test
-    fun testDisableFeature_clearFavorites() {
-        controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
-        delayableExecutor.runAllReady()
-
-        assertFalse(controller.getFavorites().isEmpty())
-
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, user)
-        controller.settingObserver.onChange(false, listOf(ControlsControllerImpl.URI), 0, user)
-        assertTrue(controller.getFavorites().isEmpty())
-    }
-
-    @Test
-    fun testDisableFeature_noChangeForNotCurrentUser() {
-        controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
-        delayableExecutor.runAllReady()
-
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, otherUser)
-        controller.settingObserver.onChange(false, listOf(ControlsControllerImpl.URI), 0, otherUser)
-
-        assertTrue(controller.available)
-        assertFalse(controller.getFavorites().isEmpty())
-    }
-
-    @Test
-    fun testCorrectUserSettingOnUserChange() {
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, otherUser)
-
-        val intent = Intent(Intent.ACTION_USER_SWITCHED).apply {
-            putExtra(Intent.EXTRA_USER_HANDLE, otherUser)
-        }
-        val pendingResult = mock(BroadcastReceiver.PendingResult::class.java)
-        `when`(pendingResult.sendingUserId).thenReturn(otherUser)
-        broadcastReceiverCaptor.value.pendingResult = pendingResult
-
-        broadcastReceiverCaptor.value.onReceive(mContext, intent)
-
-        assertFalse(controller.available)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
index b8f91b8..c678f46 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
@@ -103,7 +103,6 @@
 
     @Test
     fun testFeatureEnabledAfterBootVisibility() {
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_REQUIRED_AFTER_BOOT)
         val component = setupComponent(true)
@@ -113,7 +112,6 @@
 
     @Test
     fun testFeatureEnabledAndCannotShowOnLockScreenVisibility() {
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_NOT_REQUIRED)
         `when`(keyguardStateController.isUnlocked()).thenReturn(false)
@@ -126,7 +124,6 @@
 
     @Test
     fun testFeatureEnabledAndCanShowOnLockScreenVisibility() {
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_NOT_REQUIRED)
         `when`(keyguardStateController.isUnlocked()).thenReturn(false)
@@ -141,7 +138,6 @@
     fun testFeatureEnabledAndCanShowWhileUnlockedVisibility() {
         `when`(secureSettings.getInt(eq(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT), anyInt()))
             .thenReturn(0)
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_NOT_REQUIRED)
         `when`(keyguardStateController.isUnlocked()).thenReturn(true)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt
index 0122db6..a328d9e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt
@@ -110,7 +110,6 @@
         intent.putExtra(ControlsProviderService.EXTRA_CONTROL, control)
 
         `when`(controller.currentUserId).thenReturn(USER_ID)
-        `when`(controller.available).thenReturn(true)
         `when`(listingController.getAppLabel(CONTROL_COMPONENT)).thenReturn(LABEL)
         `when`(controller.getFavoritesForComponent(CONTROL_COMPONENT)).thenReturn(emptyList())
 
@@ -142,4 +141,4 @@
             assertEquals(control.deviceType, it.deviceType)
         }
     }
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
index fe2103c..724f8a3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
@@ -42,6 +42,7 @@
         when(params.getSelectivelyRegisterSensorsUsingProx()).thenReturn(false);
         when(params.singleTapUsesProx()).thenReturn(true);
         when(params.longPressUsesProx()).thenReturn(true);
+        when(params.getQuickPickupAodDuration()).thenReturn(500);
 
         doneHolder[0] = true;
         return params;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 8eb0e9c..4a9d66c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -35,10 +35,12 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.internal.logging.UiEventLogger;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.biometrics.AuthController;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.dock.DockManager;
+import com.android.systemui.doze.DozeTriggers.DozingUpdateUiEvent;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.util.concurrency.FakeExecutor;
 import com.android.systemui.util.concurrency.FakeThreadFactory;
@@ -76,6 +78,8 @@
     private ProximitySensor.ProximityCheck mProximityCheck;
     @Mock
     private AuthController mAuthController;
+    @Mock
+    private UiEventLogger mUiEventLogger;
 
     private DozeTriggers mTriggers;
     private FakeSensorManager mSensors;
@@ -107,7 +111,7 @@
         mTriggers = new DozeTriggers(mContext, mHost, config, dozeParameters,
                 asyncSensorManager, wakeLock, mDockManager, mProximitySensor,
                 mProximityCheck, mock(DozeLog.class), mBroadcastDispatcher, new FakeSettings(),
-                mAuthController, mExecutor);
+                mAuthController, mExecutor, mUiEventLogger);
         mTriggers.setDozeMachine(mMachine);
         waitForSensorManager();
     }
@@ -195,6 +199,40 @@
     }
 
     @Test
+    public void testQuickPickup() {
+        // GIVEN device is in doze (screen blank, but running doze sensors)
+        when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
+
+        // WHEN quick pick up is triggered
+        mTriggers.onSensor(DozeLog.REASON_SENSOR_QUICK_PICKUP, 100, 100, null);
+
+        // THEN device goes into aod (shows clock with black background)
+        verify(mMachine).requestState(DozeMachine.State.DOZE_AOD);
+
+        // THEN a log is taken that quick pick up was triggered
+        verify(mUiEventLogger).log(DozingUpdateUiEvent.DOZING_UPDATE_QUICK_PICKUP);
+    }
+
+    @Test
+    public void testQuickPickupTimeOutAfterExecutables() {
+        // GIVEN quick pickup is triggered when device is in DOZE
+        when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE);
+        mTriggers.onSensor(DozeLog.REASON_SENSOR_QUICK_PICKUP, 100, 100, null);
+        verify(mMachine).requestState(DozeMachine.State.DOZE_AOD);
+        verify(mMachine, never()).requestState(DozeMachine.State.DOZE);
+
+        // WHEN next executable is run
+        mExecutor.advanceClockToLast();
+        mExecutor.runAllReady();
+
+        // THEN device goes back into DOZE
+        verify(mMachine).requestState(DozeMachine.State.DOZE);
+
+        // THEN a log is taken that wake up timeout expired
+        verify(mUiEventLogger).log(DozingUpdateUiEvent.DOZING_UPDATE_WAKE_TIMEOUT);
+    }
+
+    @Test
     public void testOnSensor_Fingerprint() {
         final int screenX = 100;
         final int screenY = 100;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index b8c37fd..5c87741 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -29,17 +29,13 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.ActivityManager;
-import android.app.ActivityTaskManager;
 import android.app.admin.DevicePolicyManager;
 import android.app.trust.TrustManager;
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper.RunWithLooper;
-import android.view.View;
 
-import com.android.systemui.R;
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.widget.LockPatternUtils;
@@ -51,9 +47,9 @@
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.navigationbar.NavigationModeController;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.LightRevealScrim;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.DeviceConfigProxy;
 import com.android.systemui.util.DeviceConfigProxyFake;
 import com.android.systemui.util.concurrency.FakeExecutor;
@@ -84,6 +80,8 @@
     private @Mock KeyguardDisplayManager mKeyguardDisplayManager;
     private @Mock DozeParameters mDozeParameters;
     private @Mock StatusBarStateController mStatusBarStateController;
+    private @Mock KeyguardStateController mKeyguardStateController;
+    private @Mock KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
     private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake();
     private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
 
@@ -102,7 +100,8 @@
                 () -> mStatusBarKeyguardViewManager,
                 mDismissCallbackRegistry, mUpdateMonitor, mDumpManager, mUiBgExecutor,
                 mPowerManager, mTrustManager, mDeviceConfig, mNavigationModeController,
-                mKeyguardDisplayManager, mDozeParameters, mStatusBarStateController);
+                mKeyguardDisplayManager, mDozeParameters, mStatusBarStateController,
+                mKeyguardStateController, () -> mKeyguardUnlockAnimationController);
         mViewMediator.start();
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt
index 730c941..0d67d66 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt
@@ -19,26 +19,23 @@
 import android.testing.AndroidTestingRunner
 import android.view.View.GONE
 import android.view.View.VISIBLE
+import android.widget.FrameLayout
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.controls.controller.ControlsControllerImplTest.Companion.eq
 import com.android.systemui.statusbar.NotificationLockscreenUserManager
 import com.android.systemui.statusbar.StatusBarState
 import com.android.systemui.statusbar.SysuiStatusBarStateController
 import com.android.systemui.statusbar.notification.stack.MediaHeaderView
 import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.animation.UniqueObjectHostView
+import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.ArgumentCaptor
-import org.mockito.Captor
 import org.mockito.Mock
-import org.mockito.Mockito.`when`
-import org.mockito.Mockito.atLeastOnce
-import org.mockito.Mockito.verify
 import org.mockito.junit.MockitoJUnit
+import org.mockito.Mockito.`when` as whenever
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
@@ -52,51 +49,81 @@
     private lateinit var statusBarStateController: SysuiStatusBarStateController
     @Mock
     private lateinit var notificationLockscreenUserManager: NotificationLockscreenUserManager
-    @Mock
-    private lateinit var mediaHeaderView: MediaHeaderView
-    @Captor
-    private lateinit var visibilityListener: ArgumentCaptor<((Boolean) -> Unit)>
     @JvmField @Rule
     val mockito = MockitoJUnit.rule()
+
+    private val mediaHeaderView: MediaHeaderView = MediaHeaderView(context, null)
     private lateinit var keyguardMediaController: KeyguardMediaController
 
     @Before
     fun setup() {
+        // default state is positive, media should show up
+        whenever(mediaHost.visible).thenReturn(true)
+        whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
+        whenever(notificationLockscreenUserManager.shouldShowLockscreenNotifications())
+                .thenReturn(true)
+        whenever(mediaHost.hostView).thenReturn(UniqueObjectHostView(context))
+
         keyguardMediaController = KeyguardMediaController(mediaHost, bypassController,
                 statusBarStateController, notificationLockscreenUserManager)
+        keyguardMediaController.attachSinglePaneContainer(mediaHeaderView)
     }
 
     @Test
-    fun testAttach_hiddenWhenHostIsHidden() {
-        `when`(mediaHost.visible).thenReturn(false)
-        triggerVisibilityListener()
+    fun testHiddenWhenHostIsHidden() {
+        whenever(mediaHost.visible).thenReturn(false)
 
-        verify(mediaHeaderView, atLeastOnce()).visibility = eq(GONE)
-    }
-    @Test
-    fun testAttach_visibleOnKeyguard() {
-        `when`(mediaHost.visible).thenReturn(true)
-        `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
-        `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications())
-                .thenReturn(true)
-        triggerVisibilityListener()
+        keyguardMediaController.refreshMediaPosition()
 
-        verify(mediaHeaderView, atLeastOnce()).visibility = eq(VISIBLE)
+        assertThat(mediaHeaderView.visibility).isEqualTo(GONE)
     }
+
     @Test
-    fun testAttach_hiddenOnKeyguard_whenNotificationsAreHidden() {
-        `when`(mediaHost.visible).thenReturn(true)
-        `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD)
-        `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications())
+    fun testVisibleOnKeyguardOrFullScreenUserSwitcher() {
+        testStateVisibility(StatusBarState.SHADE, GONE)
+        testStateVisibility(StatusBarState.SHADE_LOCKED, GONE)
+        testStateVisibility(StatusBarState.FULLSCREEN_USER_SWITCHER, VISIBLE)
+        testStateVisibility(StatusBarState.KEYGUARD, VISIBLE)
+    }
+
+    private fun testStateVisibility(state: Int, visibility: Int) {
+        whenever(statusBarStateController.state).thenReturn(state)
+        keyguardMediaController.refreshMediaPosition()
+        assertThat(mediaHeaderView.visibility).isEqualTo(visibility)
+    }
+
+    @Test
+    fun testHiddenOnKeyguard_whenNotificationsAreHidden() {
+        whenever(notificationLockscreenUserManager.shouldShowLockscreenNotifications())
                 .thenReturn(false)
-        triggerVisibilityListener()
 
-        verify(mediaHeaderView, atLeastOnce()).visibility = eq(GONE)
+        keyguardMediaController.refreshMediaPosition()
+
+        assertThat(mediaHeaderView.visibility).isEqualTo(GONE)
     }
 
-    private fun triggerVisibilityListener() {
-        keyguardMediaController.attach(mediaHeaderView)
-        verify(mediaHost).addVisibilityChangeListener(capture(visibilityListener))
-        visibilityListener.value.invoke(true)
+    @Test
+    fun testActivatesSplitShadeContainerInSplitShadeMode() {
+        val splitShadeContainer = FrameLayout(context)
+        keyguardMediaController.attachSplitShadeContainer(
+                splitShadeContainer,
+                useContainer = { true })
+
+        keyguardMediaController.refreshMediaPosition()
+
+        assertThat(splitShadeContainer.visibility).isEqualTo(VISIBLE)
     }
-}
\ No newline at end of file
+
+    @Test
+    fun testActivatesSinglePaneContainerInSinglePaneMode() {
+        val splitShadeContainer = FrameLayout(context)
+        keyguardMediaController.attachSplitShadeContainer(
+                splitShadeContainer,
+                useContainer = { false })
+
+        keyguardMediaController.refreshMediaPosition()
+
+        assertThat(splitShadeContainer.visibility).isEqualTo(GONE)
+        assertThat(mediaHeaderView.visibility).isEqualTo(VISIBLE)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index 73b0a6b..94252d2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -95,7 +95,6 @@
     @Mock private lateinit var collapsedSet: ConstraintSet
     @Mock private lateinit var mediaOutputDialogFactory: MediaOutputDialogFactory
     private lateinit var appIcon: ImageView
-    private lateinit var appName: TextView
     private lateinit var albumView: ImageView
     private lateinit var titleText: TextView
     private lateinit var artistText: TextView
@@ -138,8 +137,6 @@
         whenever(holder.player).thenReturn(view)
         appIcon = ImageView(context)
         whenever(holder.appIcon).thenReturn(appIcon)
-        appName = TextView(context)
-        whenever(holder.appName).thenReturn(appName)
         albumView = ImageView(context)
         whenever(holder.albumView).thenReturn(albumView)
         titleText = TextView(context)
@@ -220,7 +217,6 @@
         val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
                 emptyList(), PACKAGE, session.getSessionToken(), null, device, true, null)
         player.bindPlayer(state, PACKAGE)
-        assertThat(appName.getText()).isEqualTo(APP)
         assertThat(titleText.getText()).isEqualTo(TITLE)
         assertThat(artistText.getText()).isEqualTo(ARTIST)
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java
index 609b847..4a487be 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java
@@ -74,7 +74,7 @@
 
         mMediaData = new MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null,
                 new ArrayList<>(), new ArrayList<>(), PACKAGE, null, null, null, true, null, true,
-                false, KEY, false, false, false);
+                false, KEY, false, false, false, 0L);
         mDeviceData = new MediaDeviceData(true, null, DEVICE_NAME);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt
index 36b6527..ac24cde 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt
@@ -16,6 +16,8 @@
 
 package com.android.systemui.media
 
+import android.app.smartspace.SmartspaceAction
+import android.app.smartspace.SmartspaceTarget
 import android.graphics.Color
 import androidx.test.filters.SmallTest
 import android.testing.AndroidTestingRunner
@@ -47,6 +49,7 @@
 private const val ARTIST = "ARTIST"
 private const val TITLE = "TITLE"
 private const val DEVICE_NAME = "DEVICE_NAME"
+private const val SMARTSPACE_KEY = "SMARTSPACE_KEY"
 
 private fun <T> eq(value: T): T = Mockito.eq(value) ?: value
 private fun <T> any(): T = Mockito.any()
@@ -68,6 +71,10 @@
     private lateinit var lockscreenUserManager: NotificationLockscreenUserManager
     @Mock
     private lateinit var executor: Executor
+    @Mock
+    private lateinit var smartspaceData: SmartspaceTarget
+    @Mock
+    private lateinit var smartspaceMediaRecommendationItem: SmartspaceAction
 
     private lateinit var mediaDataFilter: MediaDataFilter
     private lateinit var dataMain: MediaData
@@ -91,6 +98,9 @@
 
         dataGuest = MediaData(USER_GUEST, true, BG_COLOR, APP, null, ARTIST, TITLE, null,
             emptyList(), emptyList(), PACKAGE, null, null, device, true, null)
+
+        `when`(smartspaceData.smartspaceTargetId).thenReturn(SMARTSPACE_KEY)
+        `when`(smartspaceData.iconGrid).thenReturn(listOf(smartspaceMediaRecommendationItem))
     }
 
     private fun setUser(id: Int) {
@@ -212,6 +222,85 @@
         mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
         mediaDataFilter.onSwipeToDismiss()
 
-        verify(mediaDataManager).setTimedOut(eq(KEY), eq(true))
+        verify(mediaDataManager).setTimedOut(eq(KEY), eq(true), eq(true))
+    }
+
+    @Test
+    fun testOnSmartspaceMediaDataLoaded_noMedia_nonEmptyRecommendation_usesSmartspace() {
+        mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
+
+        verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData))
+        assertThat(mediaDataFilter.hasActiveMedia()).isTrue()
+    }
+
+    @Test
+    fun testOnSmartspaceMediaDataLoaded_noMedia_emptyRecommendation_showsNothing() {
+        `when`(smartspaceData.iconGrid).thenReturn(listOf())
+
+        mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
+
+        verify(listener, never())
+            .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData))
+        assertThat(mediaDataFilter.hasActiveMedia()).isTrue()
+    }
+
+    @Test
+    fun testOnSmartspaceMediaDataLoaded_noRecentMedia_nonEmptyRecommendation_usesSmartspace() {
+        val dataOld = dataMain.copy(active = false, lastActive = 0L)
+        mediaDataFilter.onMediaDataLoaded(KEY, null, dataOld)
+        mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
+
+        verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData))
+        assertThat(mediaDataFilter.hasActiveMedia()).isTrue()
+    }
+
+    @Test
+    fun testOnSmartspaceMediaDataLoaded_noRecentMedia_emptyRecommendation_showsNothing() {
+        `when`(smartspaceData.iconGrid).thenReturn(listOf())
+
+        val dataOld = dataMain.copy(active = false, lastActive = 0L)
+        mediaDataFilter.onMediaDataLoaded(KEY, null, dataOld)
+        mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
+
+        verify(listener, never())
+            .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData))
+        assertThat(mediaDataFilter.hasActiveMedia()).isTrue()
+    }
+
+    @Test
+    fun testOnSmartspaceMediaDataLoaded_hasRecentMedia_usesMedia() {
+        // WHEN we have media that was recently played, but not currently active
+        val dataCurrent = dataMain.copy(active = false, lastActive = System.currentTimeMillis())
+        mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent))
+
+        // AND we get a smartspace signal
+        mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
+
+        // THEN we should tell listeners to treat the media as active instead
+        val dataCurrentAndActive = dataCurrent.copy(active = true)
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY), eq(dataCurrentAndActive))
+        assertThat(mediaDataFilter.hasActiveMedia()).isTrue()
+    }
+
+    @Test
+    fun testOnSmartspaceMediaDataRemoved_usedSmartspace_clearsMedia() {
+        mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
+        mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
+
+        verify(listener).onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
+        assertThat(mediaDataFilter.hasActiveMedia()).isFalse()
+    }
+
+    @Test
+    fun testOnSmartspaceMediaDataRemoved_usedMedia_clearsMedia() {
+        val dataCurrent = dataMain.copy(active = false, lastActive = System.currentTimeMillis())
+        mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
+        mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
+
+        mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
+
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY), eq(dataCurrent))
+        assertThat(mediaDataFilter.hasActiveMedia()).isFalse()
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
index 96eb4b0..daa8b4b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt
@@ -60,6 +60,7 @@
     @JvmField @Rule val mockito = MockitoJUnit.rule()
     @Mock lateinit var mediaControllerFactory: MediaControllerFactory
     @Mock lateinit var controller: MediaController
+    @Mock lateinit var playbackInfo: MediaController.PlaybackInfo
     lateinit var session: MediaSession
     lateinit var metadataBuilder: MediaMetadata.Builder
     lateinit var backgroundExecutor: FakeExecutor
@@ -118,6 +119,9 @@
             putString(MediaMetadata.METADATA_KEY_TITLE, SESSION_TITLE)
         }
         whenever(mediaControllerFactory.create(eq(session.sessionToken))).thenReturn(controller)
+        whenever(controller.playbackInfo).thenReturn(playbackInfo)
+        whenever(playbackInfo.playbackType).thenReturn(
+                MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL)
 
         // This is an ugly hack for now. The mediaSessionBasedFilter is one of the internal
         // listeners in the internal processing pipeline. It receives events, but ince it is a
@@ -230,6 +234,27 @@
     }
 
     @Test
+    fun testOnNotificationRemoved_withResumption_butNotLocal() {
+        // GIVEN that the manager has a notification with a resume action, but is not local
+        whenever(controller.metadata).thenReturn(metadataBuilder.build())
+        whenever(playbackInfo.playbackType).thenReturn(
+                MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE)
+        mediaDataManager.onNotificationAdded(KEY, mediaNotification)
+        assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
+        assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor))
+        val data = mediaDataCaptor.value
+        val dataRemoteWithResume = data.copy(resumeAction = Runnable {}, isLocalSession = false)
+        mediaDataManager.onMediaDataLoaded(KEY, null, dataRemoteWithResume)
+
+        // WHEN the notification is removed
+        mediaDataManager.onNotificationRemoved(KEY)
+
+        // THEN the media data is removed
+        verify(listener).onMediaDataRemoved(eq(KEY))
+    }
+
+    @Test
     fun testAppBlockedFromResumption() {
         // GIVEN that the manager has a notification with a resume action
         whenever(controller.metadata).thenReturn(metadataBuilder.build())
@@ -280,11 +305,12 @@
 
     @Test
     fun testAddResumptionControls() {
-        // WHEN resumption controls are added`
+        // WHEN resumption controls are added
         val desc = MediaDescription.Builder().run {
             setTitle(SESSION_TITLE)
             build()
         }
+        val currentTimeMillis = System.currentTimeMillis()
         mediaDataManager.addResumptionControls(USER_ID, desc, Runnable {}, session.sessionToken,
                 APP_NAME, pendingIntent, PACKAGE_NAME)
         assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
@@ -296,6 +322,7 @@
         assertThat(data.song).isEqualTo(SESSION_TITLE)
         assertThat(data.app).isEqualTo(APP_NAME)
         assertThat(data.actions).hasSize(1)
+        assertThat(data.lastActive).isAtLeast(currentTimeMillis)
     }
 
     @Test
@@ -350,4 +377,78 @@
         smartspaceMediaDataProvider.onTargetsAvailable(listOf())
         verify(listener).onSmartspaceMediaDataRemoved(KEY_MEDIA_SMARTSPACE)
     }
+
+    @Test
+    fun testOnMediaDataChanged_updatesLastActiveTime() {
+        val currentTimeMillis = System.currentTimeMillis()
+        mediaDataManager.onNotificationAdded(KEY, mediaNotification)
+        assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
+        assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor))
+        assertThat(mediaDataCaptor.value!!.lastActive).isAtLeast(currentTimeMillis)
+    }
+
+    @Test
+    fun testOnMediaDataTimedOut_doesNotUpdateLastActiveTime() {
+        // GIVEN that the manager has a notification
+        mediaDataManager.onNotificationAdded(KEY, mediaNotification)
+        assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
+        assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)
+
+        // WHEN the notification times out
+        val currentTimeMillis = System.currentTimeMillis()
+        mediaDataManager.setTimedOut(KEY, true, true)
+
+        // THEN the last active time is not changed
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY), capture(mediaDataCaptor))
+        assertThat(mediaDataCaptor.value.lastActive).isLessThan(currentTimeMillis)
+    }
+
+    @Test
+    fun testOnActiveMediaConverted_doesNotUpdateLastActiveTime() {
+        // GIVEN that the manager has a notification with a resume action
+        whenever(controller.metadata).thenReturn(metadataBuilder.build())
+        mediaDataManager.onNotificationAdded(KEY, mediaNotification)
+        assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
+        assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor))
+        val data = mediaDataCaptor.value
+        assertThat(data.resumption).isFalse()
+        mediaDataManager.onMediaDataLoaded(KEY, null, data.copy(resumeAction = Runnable {}))
+
+        // WHEN the notification is removed
+        val currentTimeMillis = System.currentTimeMillis()
+        mediaDataManager.onNotificationRemoved(KEY)
+
+        // THEN the last active time is not changed
+        verify(listener).onMediaDataLoaded(eq(PACKAGE_NAME), eq(KEY), capture(mediaDataCaptor))
+        assertThat(mediaDataCaptor.value.resumption).isTrue()
+        assertThat(mediaDataCaptor.value.lastActive).isLessThan(currentTimeMillis)
+    }
+
+    @Test
+    fun testTooManyCompactActions_isTruncated() {
+        // GIVEN a notification where too many compact actions were specified
+        val notif = SbnBuilder().run {
+            setPkg(PACKAGE_NAME)
+            modifyNotification(context).also {
+                it.setSmallIcon(android.R.drawable.ic_media_pause)
+                it.setStyle(MediaStyle().apply {
+                    setMediaSession(session.sessionToken)
+                    setShowActionsInCompactView(0, 1, 2, 3, 4)
+                })
+            }
+            build()
+        }
+
+        // WHEN the notification is loaded
+        mediaDataManager.onNotificationAdded(KEY, notif)
+        assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
+        assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)
+
+        // THEN only the first MAX_COMPACT_ACTIONS are actually set
+        verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor))
+        assertThat(mediaDataCaptor.value.actionsToShowInCompact.size).isEqualTo(
+                MediaDataManager.MAX_COMPACT_ACTIONS)
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
index 59c2b17..96d1d94 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
@@ -182,6 +182,16 @@
     }
 
     @Test
+    fun testOnLoad_remotePlayback_doesNotCheck() {
+        // When media data is loaded that has not been checked yet, and is not local
+        val dataRemote = data.copy(isLocalSession = false)
+        resumeListener.onMediaDataLoaded(KEY, null, dataRemote)
+
+        // Then we do not take action
+        verify(mediaDataManager, never()).setResumeAction(any(), any())
+    }
+
+    @Test
     fun testOnLoad_checksForResume_hasService() {
         // Set up mocks to successfully find a MBS that returns valid media
         val pm = mock(PackageManager::class.java)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt
index f397959..0a573cd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaTimeoutListenerTest.kt
@@ -227,4 +227,41 @@
         mediaTimeoutListener.onMediaDataLoaded(KEY, null, mediaData)
         assertThat(mediaTimeoutListener.isTimedOut(KEY)).isFalse()
     }
+
+    @Test
+    fun testOnSessionDestroyed_clearsTimeout() {
+        // GIVEN media that is paused
+        val mediaPaused = mediaData.copy(isPlaying = false)
+        mediaTimeoutListener.onMediaDataLoaded(KEY, null, mediaPaused)
+        verify(mediaController).registerCallback(capture(mediaCallbackCaptor))
+        assertThat(executor.numPending()).isEqualTo(1)
+
+        // WHEN the session is destroyed
+        mediaCallbackCaptor.value.onSessionDestroyed()
+
+        // THEN the controller is unregistered and timeout run
+        verify(mediaController).unregisterCallback(anyObject())
+        assertThat(executor.numPending()).isEqualTo(0)
+    }
+
+    @Test
+    fun testSessionDestroyed_thenRestarts_resetsTimeout() {
+        // Assuming we have previously destroyed the session
+        testOnSessionDestroyed_clearsTimeout()
+
+        // WHEN we get an update with media playing
+        val playingState = mock(android.media.session.PlaybackState::class.java)
+        `when`(playingState.state).thenReturn(PlaybackState.STATE_PLAYING)
+        `when`(mediaController.playbackState).thenReturn(playingState)
+        val mediaPlaying = mediaData.copy(isPlaying = true)
+        mediaTimeoutListener.onMediaDataLoaded(KEY, null, mediaPlaying)
+
+        // THEN the timeout runnable will update the state
+        assertThat(executor.numPending()).isEqualTo(1)
+        with(executor) {
+            advanceClockToNext()
+            runAllReady()
+        }
+        verify(timeoutCallback).invoke(eq(KEY), eq(false))
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java
index 37b7cbe..0eeb955 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarButtonTest.java
@@ -36,6 +36,7 @@
 import com.android.systemui.SysuiTestableContext;
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.navigationbar.NavigationBarView;
+import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 
@@ -67,6 +68,7 @@
         mDependency.injectMockDependency(OverviewProxyService.class);
         mDependency.injectMockDependency(KeyguardStateController.class);
         mDependency.injectMockDependency(NavigationBarController.class);
+        mDependency.injectMockDependency(EdgeBackGestureHandler.class);
         mNavBar = new NavigationBarView(context, null);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
index f0c48bd..4ec45b4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
@@ -72,6 +72,7 @@
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.model.SysUiState;
+import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.recents.Recents;
@@ -132,6 +133,7 @@
         mDependency.injectMockDependency(StatusBarStateController.class);
         mDependency.injectMockDependency(NavigationBarController.class);
         mOverviewProxyService = mDependency.injectMockDependency(OverviewProxyService.class);
+        mDependency.injectMockDependency(EdgeBackGestureHandler.class);
         TestableLooper.get(this).runWithLooper(() -> {
             mNavigationBar = createNavBar(mContext);
             mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java
index 7e0920c..e4d32f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java
@@ -32,9 +32,7 @@
 
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.assist.AssistManager;
-import com.android.systemui.navigationbar.NavigationBarTransitions;
-import com.android.systemui.navigationbar.NavigationBarView;
-import com.android.systemui.navigationbar.NavigationModeController;
+import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.statusbar.CommandQueue;
@@ -60,6 +58,7 @@
         mDependency.injectMockDependency(StatusBarStateController.class);
         mDependency.injectMockDependency(KeyguardStateController.class);
         mDependency.injectMockDependency(NavigationBarController.class);
+        mDependency.injectMockDependency(EdgeBackGestureHandler.class);
         doReturn(mContext)
                 .when(mDependency.injectMockDependency(NavigationModeController.class))
                 .getCurrentUserContext();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/NotificationHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/NotificationHelperTest.java
new file mode 100644
index 0000000..1b713dd
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/NotificationHelperTest.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.people;
+
+import static android.app.Notification.CATEGORY_MISSED_CALL;
+
+import static com.android.systemui.people.NotificationHelper.getHighestPriorityNotification;
+import static com.android.systemui.people.NotificationHelper.getMessagingStyleMessages;
+import static com.android.systemui.people.NotificationHelper.getSenderIfGroupConversation;
+import static com.android.systemui.people.NotificationHelper.isMissedCall;
+import static com.android.systemui.people.NotificationHelper.isMissedCallOrHasContent;
+import static com.android.systemui.people.PeopleSpaceUtils.PACKAGE_NAME;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Notification;
+import android.app.Person;
+import android.content.pm.ShortcutInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.testing.AndroidTestingRunner;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.SbnBuilder;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+import java.util.Set;
+
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class NotificationHelperTest extends SysuiTestCase {
+    private static final String SHORTCUT_ID_1 = "101";
+    private static final String SHORTCUT_ID_2 = "102";
+
+    private static final String NOTIFICATION_TEXT_1 = "notification_text_1";
+    private static final String NOTIFICATION_TEXT_2 = "notification_text_2";
+    private static final String NOTIFICATION_TEXT_3 = "notification_text_3";
+    private static final Uri URI = Uri.parse("fake_uri");
+    private static final Person PERSON = new Person.Builder()
+            .setName("name")
+            .setKey("abc")
+            .setUri(URI.toString())
+            .setBot(false)
+            .build();
+
+    private final Notification mNotification1 = new Notification.Builder(mContext, "test")
+            .setContentTitle("TEST_TITLE")
+            .setContentText("TEST_TEXT")
+            .setShortcutId(SHORTCUT_ID_1)
+            .setStyle(new Notification.MessagingStyle(PERSON)
+                    .addMessage(new Notification.MessagingStyle.Message(
+                            NOTIFICATION_TEXT_1, 0, PERSON))
+                    .addMessage(new Notification.MessagingStyle.Message(
+                            NOTIFICATION_TEXT_2, 20, PERSON))
+                    .addMessage(new Notification.MessagingStyle.Message(
+                            NOTIFICATION_TEXT_3, 10, PERSON))
+            )
+            .build();
+
+    private final Notification mNotification2 = new Notification.Builder(mContext, "test")
+            .setContentTitle("TEST_TITLE")
+            .setContentText("TEST_TEXT")
+            .setShortcutId(SHORTCUT_ID_1)
+            .setStyle(new Notification.MessagingStyle(PERSON)
+                    .addMessage(new Notification.MessagingStyle.Message(
+                            NOTIFICATION_TEXT_1, 0, PERSON))
+            )
+            .build();
+
+    private final Notification mNoContentNotification = new Notification.Builder(mContext, "test")
+            .setContentTitle("TEST_TITLE")
+            .setContentText("TEST_TEXT")
+            .setShortcutId(SHORTCUT_ID_1)
+            .setStyle(new Notification.MessagingStyle(PERSON))
+            .build();
+
+    private final Notification mMissedCallNotification = new Notification.Builder(mContext, "test")
+            .setContentTitle("TEST_TITLE")
+            .setContentText("TEST_TEXT")
+            .setShortcutId(SHORTCUT_ID_2)
+            .setCategory(CATEGORY_MISSED_CALL)
+            .setStyle(new Notification.MessagingStyle(PERSON))
+            .build();
+
+    private final NotificationEntry mNotificationEntry1 = new NotificationEntryBuilder()
+            .setNotification(mNotification1)
+            .setShortcutInfo(new ShortcutInfo.Builder(mContext, SHORTCUT_ID_1).build())
+            .setUser(UserHandle.of(0))
+            .setPkg(PACKAGE_NAME)
+            .build();
+
+    private final NotificationEntry mNotificationEntry2 = new NotificationEntryBuilder()
+            .setNotification(mNotification2)
+            .setShortcutInfo(new ShortcutInfo.Builder(mContext, SHORTCUT_ID_1).build())
+            .setUser(UserHandle.of(0))
+            .setPkg(PACKAGE_NAME)
+            .build();
+
+
+    private final NotificationEntry mMissedCallNotificationEntry = new NotificationEntryBuilder()
+            .setNotification(mMissedCallNotification)
+            .setShortcutInfo(new ShortcutInfo.Builder(mContext, SHORTCUT_ID_1).build())
+            .setUser(UserHandle.of(0))
+            .setPkg(PACKAGE_NAME)
+            .build();
+
+    private final NotificationEntry mNoContentNotificationEntry = new NotificationEntryBuilder()
+            .setNotification(mNoContentNotification)
+            .setShortcutInfo(new ShortcutInfo.Builder(mContext, SHORTCUT_ID_1).build())
+            .setUser(UserHandle.of(0))
+            .setPkg(PACKAGE_NAME)
+            .build();
+
+    @Test
+    public void testGetMessagingStyleMessagesNoMessage() {
+        Notification notification = new Notification.Builder(mContext, "test")
+                .setContentTitle("TEST_TITLE")
+                .setContentText("TEST_TEXT")
+                .setShortcutId(SHORTCUT_ID_1)
+                .build();
+        StatusBarNotification sbn = new SbnBuilder()
+                .setNotification(notification)
+                .build();
+
+        List<Notification.MessagingStyle.Message> messages =
+                getMessagingStyleMessages(sbn.getNotification());
+
+        assertThat(ArrayUtils.isEmpty(messages)).isTrue();
+    }
+
+    @Test
+    public void testGetMessagingStyleMessages() {
+        StatusBarNotification sbn = new SbnBuilder()
+                .setNotification(mNotification1)
+                .build();
+
+        List<Notification.MessagingStyle.Message> messages =
+                getMessagingStyleMessages(sbn.getNotification());
+
+        assertThat(messages.size()).isEqualTo(3);
+        assertThat(messages.get(0).getText().toString()).isEqualTo(NOTIFICATION_TEXT_2);
+    }
+
+    @Test
+    public void testIsMissedCall_notMissedCall() {
+        assertFalse(isMissedCall(mNotificationEntry1));
+    }
+
+    @Test
+    public void testIsMissedCall_missedCall() {
+        assertTrue(isMissedCall(mMissedCallNotificationEntry));
+    }
+
+    @Test
+    public void testisMissedCallOrHasContent_NoContent() {
+        assertFalse(isMissedCallOrHasContent(mNoContentNotificationEntry));
+    }
+
+    @Test
+    public void testisMissedCallOrHasContent_Hasontent() {
+        assertTrue(isMissedCallOrHasContent(mNotificationEntry1));
+    }
+
+    @Test
+    public void testGetHighestPriorityNotification_missedCallHigherPriority() {
+        Set<NotificationEntry> notifications = Set.of(
+                mNotificationEntry1, mMissedCallNotificationEntry);
+
+        assertThat(getHighestPriorityNotification(notifications))
+                .isEqualTo(mMissedCallNotificationEntry);
+    }
+
+    @Test
+    public void testGetHighestPriorityNotification_moreRecentLastMessage() {
+        Set<NotificationEntry> notifications = Set.of(
+                mNotificationEntry1, mNotificationEntry2);
+
+        assertThat(getHighestPriorityNotification(notifications))
+                .isEqualTo(mNotificationEntry1);
+    }
+
+    @Test
+    public void testGetSenderIfGroupConversation_notGroup() {
+        Notification.MessagingStyle.Message message = new Notification.MessagingStyle.Message(
+                NOTIFICATION_TEXT_3, 10, PERSON);
+        Notification notification = new Notification.Builder(mContext, "test")
+                .setContentTitle("TEST_TITLE")
+                .setContentText("TEST_TEXT")
+                .setShortcutId(SHORTCUT_ID_1)
+                .setStyle(new Notification.MessagingStyle(PERSON).addMessage(message))
+                .build();
+        assertThat(getSenderIfGroupConversation(notification, message)).isNull();
+    }
+
+    @Test
+    public void testGetSenderIfGroupConversation_group() {
+        Bundle extras = new Bundle();
+        extras.putBoolean(Notification.EXTRA_IS_GROUP_CONVERSATION, true);
+        Notification.MessagingStyle.Message message = new Notification.MessagingStyle.Message(
+                NOTIFICATION_TEXT_3, 10, PERSON);
+
+        Notification notification = new Notification.Builder(mContext, "test")
+                .setContentTitle("TEST_TITLE")
+                .setContentText("TEST_TEXT")
+                .setShortcutId(SHORTCUT_ID_1)
+                .setStyle(new Notification.MessagingStyle(PERSON)
+                        .setGroupConversation(true)
+                        .addMessage(message))
+                .addExtras(extras)
+                .build();
+        assertThat(getSenderIfGroupConversation(notification, message)).isEqualTo("name");
+    }
+
+    @Test
+    public void testGetSenderIfGroupConversation_groupNoName() {
+        Bundle extras = new Bundle();
+        extras.putBoolean(Notification.EXTRA_IS_GROUP_CONVERSATION, true);
+        Notification.MessagingStyle.Message message = new Notification.MessagingStyle.Message(
+                NOTIFICATION_TEXT_3, 10, new Person.Builder().build());
+
+        Notification notification = new Notification.Builder(mContext, "test")
+                .setContentTitle("TEST_TITLE")
+                .setContentText("TEST_TEXT")
+                .setShortcutId(SHORTCUT_ID_1)
+                .setStyle(new Notification.MessagingStyle(PERSON).addMessage(message))
+                .setExtras(extras)
+                .build();
+        assertThat(getSenderIfGroupConversation(notification, message)).isNull();
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTest.java
index 24a63e7..50ab1c7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTest.java
@@ -18,12 +18,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
 import android.app.people.ConversationChannel;
-import android.app.people.IPeopleManager;
-import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
 import android.net.Uri;
@@ -36,8 +35,8 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
 import com.android.systemui.shared.system.PeopleProviderUtils;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
 
 import junit.framework.Assert;
 
@@ -69,13 +68,11 @@
     private Bundle mExtras = new Bundle();
 
     @Mock
-    private LauncherApps mLauncherApps;
-    @Mock
     private PackageManager mPackageManager;
     @Mock
-    private IPeopleManager mPeopleManager;
+    private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
     @Mock
-    private NotificationEntryManager mNotificationEntryManager;
+    private RemoteViews mRemoteViews;
 
     @Before
     public void setUp() throws Exception {
@@ -85,9 +82,7 @@
         PeopleProviderTestable provider = new PeopleProviderTestable();
         provider.initializeForTesting(
                 mContext, PeopleProviderUtils.PEOPLE_PROVIDER_AUTHORITY);
-        provider.setLauncherApps(mLauncherApps);
-        provider.setPeopleManager(mPeopleManager);
-        provider.setNotificationEntryManager(mNotificationEntryManager);
+        provider.setPeopleSpaceWidgetManager(mPeopleSpaceWidgetManager);
         mContext.getContentResolver().addProvider(
                 PeopleProviderUtils.PEOPLE_PROVIDER_AUTHORITY, provider);
 
@@ -95,9 +90,9 @@
                 PeopleProviderUtils.GET_PEOPLE_TILE_PREVIEW_PERMISSION,
                 PackageManager.PERMISSION_GRANTED);
 
-        when(mPeopleManager.getConversation(
-                eq(PACKAGE_NAME_A), eq(USER_HANDLE_A.getIdentifier()), eq(SHORTCUT_ID_A)))
-                .thenReturn(mConversationChannel);
+        when(mPeopleSpaceWidgetManager.getPreview(
+                eq(SHORTCUT_ID_A), eq(USER_HANDLE_A), eq(PACKAGE_NAME_A), any()))
+                .thenReturn(mRemoteViews);
 
         mExtras.putString(PeopleProviderUtils.EXTRAS_KEY_SHORTCUT_ID, SHORTCUT_ID_A);
         mExtras.putString(PeopleProviderUtils.EXTRAS_KEY_PACKAGE_NAME, PACKAGE_NAME_A);
@@ -146,8 +141,8 @@
 
     @Test
     public void testPermissionGrantedNoConversationForShortcutReturnsNull() throws RemoteException {
-        when(mPeopleManager.getConversation(
-                eq(PACKAGE_NAME_A), eq(USER_HANDLE_A.getIdentifier()), eq(SHORTCUT_ID_A)))
+        when(mPeopleSpaceWidgetManager.getPreview(
+                eq(SHORTCUT_ID_A), eq(USER_HANDLE_A), eq(PACKAGE_NAME_A), any()))
                 .thenReturn(null);
         try {
             Bundle result = mContext.getContentResolver().call(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTestable.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTestable.java
index 6834fa5..3e6d674 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTestable.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleProviderTestable.java
@@ -16,12 +16,10 @@
 
 package com.android.systemui.people;
 
-import android.app.people.IPeopleManager;
 import android.content.Context;
-import android.content.pm.LauncherApps;
 import android.content.pm.ProviderInfo;
 
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
 
 public class PeopleProviderTestable extends PeopleProvider {
 
@@ -32,15 +30,7 @@
         attachInfoForTesting(context, info);
     }
 
-    void setLauncherApps(LauncherApps launcherApps) {
-        mLauncherApps = launcherApps;
-    }
-
-    void setPeopleManager(IPeopleManager peopleManager) {
-        mPeopleManager = peopleManager;
-    }
-
-    void setNotificationEntryManager(NotificationEntryManager notificationEntryManager) {
-        mNotificationEntryManager = notificationEntryManager;
+    void setPeopleSpaceWidgetManager(PeopleSpaceWidgetManager peopleSpaceWidgetManager) {
+        mPeopleSpaceWidgetManager = peopleSpaceWidgetManager;
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
index 81ca4c8..cc32262 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
@@ -51,19 +51,16 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.provider.ContactsContract;
-import android.service.notification.StatusBarNotification;
 import android.testing.AndroidTestingRunner;
 import android.util.DisplayMetrics;
 
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.appwidget.IAppWidgetService;
-import com.android.internal.util.ArrayUtils;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.people.widget.PeopleTileKey;
 import com.android.systemui.statusbar.NotificationListener;
-import com.android.systemui.statusbar.SbnBuilder;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
@@ -98,6 +95,7 @@
     private static final Uri URI = Uri.parse("fake_uri");
     private static final Icon ICON = Icon.createWithResource("package", R.drawable.ic_android);
     private static final String NAME = "username";
+    private static final UserHandle USER = new UserHandle(0);
     private static final Person PERSON = new Person.Builder()
             .setName("name")
             .setKey("abc")
@@ -107,6 +105,7 @@
     private static final PeopleSpaceTile PERSON_TILE =
             new PeopleSpaceTile
                     .Builder(SHORTCUT_ID_1, NAME, ICON, new Intent())
+                    .setUserHandle(USER)
                     .setLastInteractionTimestamp(123L)
                     .setNotificationKey(NOTIFICATION_KEY)
                     .setNotificationContent(NOTIFICATION_CONTENT)
@@ -228,167 +227,76 @@
     }
 
     @Test
-    public void testGetMessagingStyleMessagesNoMessage() {
-        Notification notification = new Notification.Builder(mContext, "test")
-                .setContentTitle("TEST_TITLE")
-                .setContentText("TEST_TEXT")
-                .setShortcutId(SHORTCUT_ID_1)
-                .build();
-        StatusBarNotification sbn = new SbnBuilder()
-                .setNotification(notification)
-                .build();
-
-        List<Notification.MessagingStyle.Message> messages =
-                PeopleSpaceUtils.getMessagingStyleMessages(sbn.getNotification());
-
-        assertThat(ArrayUtils.isEmpty(messages)).isTrue();
-    }
-
-    @Test
-    public void testGetMessagingStyleMessages() {
-        StatusBarNotification sbn = new SbnBuilder()
-                .setNotification(mNotification1)
-                .build();
-
-        List<Notification.MessagingStyle.Message> messages =
-                PeopleSpaceUtils.getMessagingStyleMessages(sbn.getNotification());
-
-        assertThat(messages.size()).isEqualTo(3);
-        assertThat(messages.get(0).getText().toString()).isEqualTo(NOTIFICATION_TEXT_2);
-    }
-
-    @Test
     public void testAugmentTileFromNotification() {
-        StatusBarNotification sbn = new SbnBuilder()
-                .setNotification(mNotification1)
-                .build();
-
         PeopleSpaceTile tile =
                 new PeopleSpaceTile
                         .Builder(SHORTCUT_ID_1, "userName", ICON, new Intent())
                         .setPackageName(PACKAGE_NAME)
                         .setUserHandle(new UserHandle(0))
                         .build();
+        PeopleTileKey key = new PeopleTileKey(tile);
         PeopleSpaceTile actual = PeopleSpaceUtils
-                .augmentTileFromNotification(mContext, tile, sbn);
+                .augmentTileFromNotification(mContext, tile, key, mNotificationEntry1, 0);
 
         assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_2);
+        assertThat(actual.getNotificationSender()).isEqualTo(null);
+    }
+
+    @Test
+    public void testAugmentTileFromNotificationGroupWithSender() {
+        Bundle extras = new Bundle();
+        extras.putBoolean(Notification.EXTRA_IS_GROUP_CONVERSATION, true);
+        Notification notification = new Notification.Builder(mContext, "test")
+                .setContentTitle("TEST_TITLE")
+                .setContentText("TEST_TEXT")
+                .setShortcutId(SHORTCUT_ID_1)
+                .setStyle(new Notification.MessagingStyle(PERSON)
+                        .setGroupConversation(true)
+                        .addMessage(new Notification.MessagingStyle.Message(
+                                NOTIFICATION_TEXT_1, 0, PERSON))
+                        .addMessage(new Notification.MessagingStyle.Message(
+                                NOTIFICATION_TEXT_2, 20, PERSON))
+                        .addMessage(new Notification.MessagingStyle.Message(
+                                NOTIFICATION_TEXT_3, 10, PERSON))
+                )
+                .setExtras(extras)
+                .build();
+        NotificationEntry notificationEntry = new NotificationEntryBuilder()
+                .setNotification(notification)
+                .setShortcutInfo(new ShortcutInfo.Builder(mContext, SHORTCUT_ID_1).build())
+                .setUser(UserHandle.of(0))
+                .setPkg(PACKAGE_NAME)
+                .build();
+        PeopleSpaceTile tile =
+                new PeopleSpaceTile
+                        .Builder(SHORTCUT_ID_1, "userName", ICON, new Intent())
+                        .setPackageName(PACKAGE_NAME)
+                        .setUserHandle(new UserHandle(0))
+                        .build();
+        PeopleTileKey key = new PeopleTileKey(tile);
+        PeopleSpaceTile actual = PeopleSpaceUtils
+                .augmentTileFromNotification(mContext, tile, key, notificationEntry, 0);
+
+        assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_2);
+        assertThat(actual.getNotificationSender().toString()).isEqualTo("name");
     }
 
     @Test
     public void testAugmentTileFromNotificationNoContent() {
-        StatusBarNotification sbn = new SbnBuilder()
-                .setNotification(mNotification3)
-                .build();
-
         PeopleSpaceTile tile =
                 new PeopleSpaceTile
                         .Builder(SHORTCUT_ID_3, "userName", ICON, new Intent())
                         .setPackageName(PACKAGE_NAME)
                         .setUserHandle(new UserHandle(0))
                         .build();
+        PeopleTileKey key = new PeopleTileKey(tile);
         PeopleSpaceTile actual = PeopleSpaceUtils
-                .augmentTileFromNotification(mContext, tile, sbn);
+                .augmentTileFromNotification(mContext, tile, key, mNotificationEntry3, 0);
 
         assertThat(actual.getNotificationContent()).isEqualTo(null);
     }
 
     @Test
-    public void testAugmentTileFromVisibleNotifications() {
-        PeopleSpaceTile tile =
-                new PeopleSpaceTile
-                        .Builder(SHORTCUT_ID_1, "userName", ICON, new Intent())
-                        .setPackageName(PACKAGE_NAME)
-                        .setUserHandle(new UserHandle(0))
-                        .build();
-        PeopleSpaceTile actual = PeopleSpaceUtils
-                .augmentTileFromVisibleNotifications(mContext, tile,
-                        Map.of(new PeopleTileKey(mNotificationEntry1), mNotificationEntry1));
-
-        assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_TEXT_2);
-    }
-
-    @Test
-    public void testAugmentTileFromVisibleNotificationsDifferentShortcutId() {
-        PeopleSpaceTile tile =
-                new PeopleSpaceTile
-                        .Builder(SHORTCUT_ID_4, "userName", ICON, new Intent())
-                        .setPackageName(PACKAGE_NAME)
-                        .setUserHandle(new UserHandle(0))
-                        .build();
-        PeopleSpaceTile actual = PeopleSpaceUtils
-                .augmentTileFromVisibleNotifications(mContext, tile,
-                        Map.of(new PeopleTileKey(mNotificationEntry1), mNotificationEntry1));
-
-        assertThat(actual.getNotificationContent()).isEqualTo(null);
-    }
-
-    @Test
-    public void testAugmentTilesFromVisibleNotificationsSingleTile() {
-        PeopleSpaceTile tile =
-                new PeopleSpaceTile
-                        .Builder(SHORTCUT_ID_1, "userName", ICON, new Intent())
-                        .setPackageName(PACKAGE_NAME)
-                        .setUserHandle(new UserHandle(0))
-                        .build();
-        List<PeopleSpaceTile> actualList = PeopleSpaceUtils
-                .augmentTilesFromVisibleNotifications(
-                        mContext, List.of(tile), mNotificationEntryManager);
-
-        assertThat(actualList.size()).isEqualTo(1);
-        assertThat(actualList.get(0).getNotificationContent().toString())
-                .isEqualTo(NOTIFICATION_TEXT_2);
-
-        verify(mNotificationEntryManager, times(1)).getVisibleNotifications();
-    }
-
-    @Test
-    public void testAugmentTilesFromVisibleNotificationsMultipleTiles() {
-        PeopleSpaceTile tile1 =
-                new PeopleSpaceTile
-                        .Builder(SHORTCUT_ID_1, "userName", ICON, new Intent())
-                        .setPackageName(PACKAGE_NAME)
-                        .setUserHandle(new UserHandle(0))
-                        .build();
-        PeopleSpaceTile tile2 =
-                new PeopleSpaceTile
-                        .Builder(SHORTCUT_ID_2, "userName2", ICON, new Intent())
-                        .setPackageName(PACKAGE_NAME)
-                        .setUserHandle(new UserHandle(0))
-                        .build();
-        List<PeopleSpaceTile> actualList = PeopleSpaceUtils
-                .augmentTilesFromVisibleNotifications(mContext, List.of(tile1, tile2),
-                        mNotificationEntryManager);
-
-        assertThat(actualList.size()).isEqualTo(2);
-        assertThat(actualList.get(0).getNotificationContent().toString())
-                .isEqualTo(NOTIFICATION_TEXT_2);
-        assertThat(actualList.get(1).getNotificationContent().toString())
-                .isEqualTo(NOTIFICATION_TEXT_4);
-
-        verify(mNotificationEntryManager, times(1)).getVisibleNotifications();
-    }
-
-    @Test
-    public void testAugmentSingleTileFromVisibleNotificationsSingleTile() {
-        PeopleSpaceTile tile =
-                new PeopleSpaceTile
-                        .Builder(SHORTCUT_ID_1, "userName", ICON, new Intent())
-                        .setPackageName(PACKAGE_NAME)
-                        .setUserHandle(new UserHandle(0))
-                        .build();
-        PeopleSpaceTile augmentedTile = PeopleSpaceUtils
-                .augmentSingleTileFromVisibleNotifications(
-                        mContext, tile, mNotificationEntryManager);
-
-        assertThat(augmentedTile).isNotNull();
-        assertThat(augmentedTile.getNotificationContent().toString())
-                .isEqualTo(NOTIFICATION_TEXT_2);
-
-        verify(mNotificationEntryManager, times(1)).getVisibleNotifications();
-    }
-
-    @Test
     public void testDoNotUpdateSingleConversationAppWidgetWhenNotBirthday() {
         int[] widgetIdsArray = {WIDGET_ID_WITH_SHORTCUT};
         when(mMockCursor.moveToNext()).thenReturn(true, false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java
index 3cc55f2..d353d52 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java
@@ -42,6 +42,7 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.testing.AndroidTestingRunner;
 import android.util.DisplayMetrics;
 import android.view.View;
@@ -73,10 +74,13 @@
     private static final String GAME_DESCRIPTION = "Playing a game!";
     private static final CharSequence MISSED_CALL = "Custom missed call message";
     private static final String NAME = "username";
+    private static final UserHandle USER = new UserHandle(0);
+    private static final String SENDER = "sender";
     private static final PeopleSpaceTile PERSON_TILE_WITHOUT_NOTIFICATION =
             new PeopleSpaceTile
                     .Builder(SHORTCUT_ID_1, NAME, ICON, new Intent())
                     .setLastInteractionTimestamp(0L)
+                    .setUserHandle(USER)
                     .build();
     private static final PeopleSpaceTile PERSON_TILE =
             new PeopleSpaceTile
@@ -85,6 +89,16 @@
                     .setNotificationKey(NOTIFICATION_KEY)
                     .setNotificationContent(NOTIFICATION_CONTENT)
                     .setNotificationDataUri(URI)
+                    .setUserHandle(USER)
+                    .build();
+    private static final PeopleSpaceTile PERSON_TILE_WITH_SENDER =
+            new PeopleSpaceTile
+                    .Builder(SHORTCUT_ID_1, NAME, ICON, new Intent())
+                    .setLastInteractionTimestamp(123L)
+                    .setNotificationKey(NOTIFICATION_KEY)
+                    .setNotificationContent(NOTIFICATION_CONTENT)
+                    .setNotificationSender(SENDER)
+                    .setUserHandle(USER)
                     .build();
     private static final ConversationStatus GAME_STATUS =
             new ConversationStatus
@@ -534,6 +548,86 @@
     }
 
     @Test
+    public void testCreateRemoteViewsWithNotificationWithSenderTemplate() {
+        PeopleSpaceTile tileWithStatusAndNotification = PERSON_TILE_WITH_SENDER.toBuilder()
+                .setNotificationDataUri(null)
+                .setStatuses(Arrays.asList(GAME_STATUS,
+                        NEW_STORY_WITH_AVAILABILITY)).build();
+        RemoteViews views = new PeopleTileViewHelper(mContext,
+                tileWithStatusAndNotification, 0, mOptions).getViews();
+        View result = views.apply(mContext, null);
+
+        TextView name = (TextView) result.findViewById(R.id.name);
+        assertEquals(name.getText(), NAME);
+        TextView subtext = (TextView) result.findViewById(R.id.subtext);
+        assertEquals(View.VISIBLE, result.findViewById(R.id.subtext).getVisibility());
+        assertEquals(subtext.getText(), SENDER);
+        assertEquals(View.GONE, result.findViewById(R.id.predefined_icon).getVisibility());
+        // Has availability.
+        assertEquals(View.VISIBLE, result.findViewById(R.id.availability).getVisibility());
+        // Has person icon.
+        assertEquals(View.VISIBLE, result.findViewById(R.id.person_icon).getVisibility());
+        // Has notification content.
+        TextView statusContent = (TextView) result.findViewById(R.id.text_content);
+        assertEquals(View.VISIBLE, statusContent.getVisibility());
+        assertEquals(statusContent.getText(), NOTIFICATION_CONTENT);
+
+        // Subtract one from lines because sender is included.
+        assertThat(statusContent.getMaxLines()).isEqualTo(2);
+
+        // Has a single message, no count shown.
+        assertEquals(View.GONE, result.findViewById(R.id.messages_count).getVisibility());
+
+        mOptions.putInt(OPTION_APPWIDGET_MIN_WIDTH,
+                getSizeInDp(R.dimen.required_width_for_medium) - 1);
+        RemoteViews smallView = new PeopleTileViewHelper(mContext,
+                tileWithStatusAndNotification, 0, mOptions).getViews();
+        View smallResult = smallView.apply(mContext, null);
+
+        // Show icon instead of name.
+        assertEquals(View.GONE, smallResult.findViewById(R.id.name).getVisibility());
+        assertEquals(View.VISIBLE,
+                smallResult.findViewById(R.id.predefined_icon).getVisibility());
+        // Has person icon.
+        assertEquals(View.VISIBLE,
+                smallResult.findViewById(R.id.person_icon).getVisibility());
+
+        // Has a single message, no count shown.
+        assertEquals(View.GONE, smallResult.findViewById(R.id.messages_count).getVisibility());
+
+        mOptions.putInt(OPTION_APPWIDGET_MIN_WIDTH,
+                getSizeInDp(R.dimen.required_width_for_large));
+        mOptions.putInt(OPTION_APPWIDGET_MIN_WIDTH,
+                getSizeInDp(R.dimen.required_height_for_large));
+        RemoteViews largeView = new PeopleTileViewHelper(mContext,
+                tileWithStatusAndNotification, 0, mOptions).getViews();
+        View largeResult = largeView.apply(mContext, null);
+
+        name = (TextView) largeResult.findViewById(R.id.name);
+        assertEquals(name.getText(), NAME);
+        subtext = (TextView) largeResult.findViewById(R.id.subtext);
+        assertEquals(View.VISIBLE, largeResult.findViewById(R.id.subtext).getVisibility());
+        assertEquals(subtext.getText(), SENDER);
+        assertEquals(View.GONE, largeResult.findViewById(R.id.predefined_icon).getVisibility());
+        // Has availability.
+        assertEquals(View.VISIBLE, largeResult.findViewById(R.id.availability).getVisibility());
+        // Has person icon.
+        View personIcon = largeResult.findViewById(R.id.person_icon);
+        assertEquals(View.VISIBLE, personIcon.getVisibility());
+        // Has notification content.
+        statusContent = (TextView) largeResult.findViewById(R.id.text_content);
+        assertEquals(View.VISIBLE, statusContent.getVisibility());
+        assertEquals(statusContent.getText(), NOTIFICATION_CONTENT);
+
+        // Subtract one from lines because sender is included.
+        assertThat(statusContent.getMaxLines()).isEqualTo(2);
+
+        // Has a single message, no count shown.
+        assertEquals(View.GONE, largeResult.findViewById(R.id.messages_count).getVisibility());
+
+    }
+
+    @Test
     public void testCreateRemoteViewsWithNotificationTemplateTwoMessages() {
         PeopleSpaceTile tileWithStatusAndNotification = PERSON_TILE.toBuilder()
                 .setNotificationDataUri(null)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
index 1ab5d34..411fb02 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
@@ -68,6 +68,7 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.service.notification.ConversationChannelWrapper;
@@ -86,6 +87,7 @@
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
 import com.android.systemui.statusbar.notification.collection.NoManSimulator;
 import com.android.systemui.statusbar.notification.collection.NoManSimulator.NotifEvent;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
 import com.android.systemui.util.time.FakeSystemClock;
 
@@ -99,8 +101,10 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -124,7 +128,7 @@
     private static final String SHORTCUT_ID = "101";
     private static final String OTHER_SHORTCUT_ID = "102";
     private static final String NOTIFICATION_KEY = "0|com.android.systemui.tests|0|null|0";
-    private static final String NOTIFICATION_CONTENT = "message text";
+    private static final String NOTIFICATION_CONTENT_1 = "message text 1";
     private static final Uri URI = Uri.parse("fake_uri");
     private static final Icon ICON = Icon.createWithResource("package", R.drawable.ic_android);
     private static final PeopleTileKey KEY = new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A);
@@ -140,7 +144,7 @@
                     .setPackageName(TEST_PACKAGE_A)
                     .setUserHandle(new UserHandle(0))
                     .setNotificationKey(NOTIFICATION_KEY + "1")
-                    .setNotificationContent(NOTIFICATION_CONTENT)
+                    .setNotificationContent(NOTIFICATION_CONTENT_1)
                     .setNotificationDataUri(URI)
                     .setContactUri(URI)
                     .build();
@@ -154,8 +158,8 @@
                     // Same contact uri.
                     .setContactUri(URI)
                     .build();
-    private final ShortcutInfo mShortcutInfo = new ShortcutInfo.Builder(mContext,
-            SHORTCUT_ID).setLongLabel("name").build();
+    private ShortcutInfo mShortcutInfo;
+    private NotificationEntry mNotificationEntry;
 
     private PeopleSpaceWidgetManager mManager;
 
@@ -215,6 +219,17 @@
         when(mAppWidgetManager.getAppWidgetOptions(eq(WIDGET_ID_WITHOUT_SHORTCUT)))
                 .thenReturn(new Bundle());
         when(mUserManager.isQuietModeEnabled(any())).thenReturn(false);
+
+        when(mMockContext.getPackageName()).thenReturn(TEST_PACKAGE_A);
+        when(mMockContext.getUserId()).thenReturn(0);
+        mShortcutInfo = new ShortcutInfo.Builder(mMockContext,
+                SHORTCUT_ID).setLongLabel("name").build();
+        mNotificationEntry = new NotificationEntryBuilder()
+                .setSbn(createNotification(
+                        SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ false))
+                .setId(1)
+                .setShortcutInfo(mShortcutInfo)
+                .build();
     }
 
     @Test
@@ -490,7 +505,8 @@
                 ACTIVITY_GAME).setDescription("Playing a game!").build();
         ConversationStatus status2 = new ConversationStatus.Builder(OTHER_SHORTCUT_ID,
                 ACTIVITY_BIRTHDAY).build();
-        ConversationChannel conversationChannel = getConversationWithShortcutId(OTHER_SHORTCUT_ID,
+        ConversationChannel conversationChannel = getConversationWithShortcutId(
+                new PeopleTileKey(OTHER_SHORTCUT_ID, 0, TEST_PACKAGE_A),
                 Arrays.asList(status1, status2));
         mManager.updateWidgetsWithConversationChanged(conversationChannel);
         mClock.advanceTime(MIN_LINGER_DURATION);
@@ -508,7 +524,8 @@
 
         ConversationStatus status = new ConversationStatus.Builder(SHORTCUT_ID,
                 ACTIVITY_GAME).setDescription("Playing a game!").build();
-        ConversationChannel conversationChannel = getConversationWithShortcutId(SHORTCUT_ID,
+        ConversationChannel conversationChannel = getConversationWithShortcutId(
+                new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A),
                 Arrays.asList(status));
         mManager.updateWidgetsWithConversationChanged(conversationChannel);
         mClock.advanceTime(MIN_LINGER_DURATION);
@@ -529,8 +546,8 @@
 
         ConversationStatus status = new ConversationStatus.Builder(SHORTCUT_ID,
                 ACTIVITY_ANNIVERSARY).build();
-        ConversationChannel conversationChannel = getConversationWithShortcutId(SHORTCUT_ID,
-                Arrays.asList(status));
+        ConversationChannel conversationChannel = getConversationWithShortcutId(
+                new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A), Arrays.asList(status));
         mManager.updateWidgetsWithConversationChanged(conversationChannel);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
@@ -550,11 +567,15 @@
     public void testUpdateNotificationPostedIfExistingTile() throws Exception {
         int[] widgetIdsArray = {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(createNotification(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ false))
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -563,7 +584,7 @@
         Bundle bundle = mBundleArgumentCaptor.getValue();
         PeopleSpaceTile tile = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tile.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
-        assertThat(tile.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT);
+        assertThat(tile.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
                 any());
     }
@@ -620,11 +641,15 @@
             throws Exception {
         int[] widgetIdsArray = {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(createNotification(
                         SHORTCUT_ID, /* isMessagingStyle = */ false, /* isMissedCall = */ true))
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -645,11 +670,15 @@
             throws Exception {
         int[] widgetIdsArray = {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(createNotification(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ true))
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -659,7 +688,7 @@
 
         PeopleSpaceTile tile = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tile.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
-        assertThat(tile.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT);
+        assertThat(tile.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
                 any());
     }
@@ -670,11 +699,15 @@
         int[] widgetIdsArray =
                 {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT, WIDGET_ID_WITH_SAME_URI};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(createNotification(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ true))
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -684,7 +717,7 @@
         PeopleSpaceTile tileWithMissedCallOrigin = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tileWithMissedCallOrigin.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
         assertThat(tileWithMissedCallOrigin.getNotificationContent()).isEqualTo(
-                NOTIFICATION_CONTENT);
+                NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
                 any());
         verify(mAppWidgetManager, times(1))
@@ -693,7 +726,7 @@
         Bundle bundleForSameUriTile = requireNonNull(mBundleArgumentCaptor.getValue());
         PeopleSpaceTile tileWithSameUri = bundleForSameUriTile.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tileWithSameUri.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
-        assertThat(tileWithSameUri.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT);
+        assertThat(tileWithSameUri.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SAME_URI),
                 any());
     }
@@ -704,12 +737,19 @@
         int[] widgetIdsArray =
                 {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT, WIDGET_ID_WITH_SAME_URI};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(createNotification(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ true))
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
+
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of());
         NotifEvent notif1b = mNoMan.retractNotif(notif1.sbn.cloneLight(), 0);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
@@ -733,45 +773,11 @@
     }
 
     @Test
-    public void testDoNotRemoveMissedCallIfMatchingUriTileMissingReadContactsPermissionWhenPosted()
-            throws Exception {
-        when(mPackageManager.checkPermission(any(),
-                eq(PERSON_TILE_WITH_SAME_URI.getPackageName()))).thenReturn(
-                PERMISSION_HARD_DENIED);
-        int[] widgetIdsArray =
-                {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT, WIDGET_ID_WITH_SAME_URI};
-        when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
-                .setSbn(createNotification(
-                        SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ true))
-                .setId(1));
-        mClock.advanceTime(MIN_LINGER_DURATION);
-        // We should only try to remove the notification if the Missed Call was added when posted.
-        NotifEvent notif1b = mNoMan.retractNotif(notif1.sbn.cloneLight(), 0);
-        mClock.advanceTime(MIN_LINGER_DURATION);
-
-        verify(mAppWidgetManager, times(2)).updateAppWidgetOptions(eq(WIDGET_ID_WITH_SHORTCUT),
-                mBundleArgumentCaptor.capture());
-        Bundle bundle = mBundleArgumentCaptor.getValue();
-        PeopleSpaceTile tileWithMissedCallOrigin = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
-        assertThat(tileWithMissedCallOrigin.getNotificationKey()).isEqualTo(null);
-        assertThat(tileWithMissedCallOrigin.getNotificationContent()).isEqualTo(null);
-        verify(mAppWidgetManager, times(2)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
-                any());
-        verify(mAppWidgetManager, times(0))
-                .updateAppWidgetOptions(eq(WIDGET_ID_WITH_SAME_URI), any());
-        verify(mAppWidgetManager, times(0)).updateAppWidget(eq(WIDGET_ID_WITH_SAME_URI),
-                any());
-    }
-
-    @Test
     public void testUpdateMissedCallNotificationWithContentPostedIfMatchingUriTileFromSender()
             throws Exception {
         int[] widgetIdsArray =
                 {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT, WIDGET_ID_WITH_SAME_URI};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
         Notification notificationWithPersonOnlyInSender =
                 createMessagingStyleNotificationWithoutExtras(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */
@@ -782,9 +788,15 @@
                 .setUid(0)
                 .setUser(new UserHandle(0))
                 .build();
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
+                .setRank(1)
+                .setShortcutInfo(mShortcutInfo)
                 .setSbn(sbn)
-                .setId(1));
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -794,7 +806,7 @@
         PeopleSpaceTile tileWithMissedCallOrigin = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tileWithMissedCallOrigin.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
         assertThat(tileWithMissedCallOrigin.getNotificationContent()).isEqualTo(
-                NOTIFICATION_CONTENT);
+                NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
                 any());
         verify(mAppWidgetManager, times(1))
@@ -803,7 +815,7 @@
         Bundle bundleForSameUriTile = requireNonNull(mBundleArgumentCaptor.getValue());
         PeopleSpaceTile tileWithSameUri = bundleForSameUriTile.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tileWithSameUri.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
-        assertThat(tileWithSameUri.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT);
+        assertThat(tileWithSameUri.getNotificationContent()).isEqualTo(NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SAME_URI),
                 any());
     }
@@ -814,14 +826,13 @@
         int[] widgetIdsArray =
                 {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT, WIDGET_ID_WITH_SAME_URI};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
         // Notification posted without any Person attached.
         Notification notificationWithoutPersonObject =
                 createMessagingStyleNotificationWithoutExtras(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */
                         true).setStyle(new Notification.MessagingStyle("sender")
                         .addMessage(
-                                new Notification.MessagingStyle.Message(NOTIFICATION_CONTENT, 10,
+                                new Notification.MessagingStyle.Message(NOTIFICATION_CONTENT_1, 10,
                                         "sender"))
                 ).build();
         StatusBarNotification sbn = new SbnBuilder()
@@ -830,9 +841,15 @@
                 .setUid(0)
                 .setUser(new UserHandle(0))
                 .build();
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(sbn)
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
+
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -842,7 +859,7 @@
         PeopleSpaceTile tileWithMissedCallOrigin = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tileWithMissedCallOrigin.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
         assertThat(tileWithMissedCallOrigin.getNotificationContent()).isEqualTo(
-                NOTIFICATION_CONTENT);
+                NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
                 any());
         // Do not update since notification doesn't include a Person reference.
@@ -863,11 +880,15 @@
         int[] widgetIdsArray =
                 {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT, WIDGET_ID_WITH_DIFFERENT_URI};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(createNotification(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ true))
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -877,7 +898,7 @@
         PeopleSpaceTile tileWithMissedCallOrigin = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tileWithMissedCallOrigin.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
         assertThat(tileWithMissedCallOrigin.getNotificationContent()).isEqualTo(
-                NOTIFICATION_CONTENT);
+                NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
                 any());
         // Do not update since missing permission to read contacts.
@@ -897,11 +918,15 @@
         int[] widgetIdsArray =
                 {WIDGET_ID_WITH_SHORTCUT, WIDGET_ID_WITHOUT_SHORTCUT, WIDGET_ID_WITH_SAME_URI};
         when(mAppWidgetManager.getAppWidgetIds(any())).thenReturn(widgetIdsArray);
-
-        NotifEvent notif1 = mNoMan.postNotif(new NotificationEntryBuilder()
+        NotificationEntryBuilder builder = new NotificationEntryBuilder()
                 .setSbn(createNotification(
                         SHORTCUT_ID, /* isMessagingStyle = */ true, /* isMissedCall = */ true))
-                .setId(1));
+                .setShortcutInfo(mShortcutInfo)
+                .setId(1);
+        NotificationEntry entry = builder.build();
+        when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+
+        NotifEvent notif1 = mNoMan.postNotif(builder);
         mClock.advanceTime(MIN_LINGER_DURATION);
 
         verify(mAppWidgetManager, times(1))
@@ -911,14 +936,18 @@
         PeopleSpaceTile tileWithMissedCallOrigin = bundle.getParcelable(OPTIONS_PEOPLE_TILE);
         assertThat(tileWithMissedCallOrigin.getNotificationKey()).isEqualTo(NOTIFICATION_KEY);
         assertThat(tileWithMissedCallOrigin.getNotificationContent()).isEqualTo(
-                NOTIFICATION_CONTENT);
+                NOTIFICATION_CONTENT_1);
         verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
                 any());
         // Do not update since missing permission to read contacts.
-        verify(mAppWidgetManager, times(0))
+        verify(mAppWidgetManager, times(1))
                 .updateAppWidgetOptions(eq(WIDGET_ID_WITH_SAME_URI),
-                        any());
-        verify(mAppWidgetManager, times(0)).updateAppWidget(eq(WIDGET_ID_WITH_SAME_URI),
+                        mBundleArgumentCaptor.capture());
+        Bundle noNotificationBundle = requireNonNull(mBundleArgumentCaptor.getValue());
+        PeopleSpaceTile tileNoNotification =
+                noNotificationBundle.getParcelable(OPTIONS_PEOPLE_TILE);
+        assertThat(tileNoNotification.getNotificationKey()).isNull();
+        verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SAME_URI),
                 any());
     }
 
@@ -952,7 +981,7 @@
     public void testAddThenReconfigureWidgetsUpdatesStorageCacheAndListeners()
             throws Exception {
         clearStorage();
-        mManager.addNewWidget(WIDGET_ID_WITH_SHORTCUT, PERSON_TILE);
+        mManager.addNewWidget(WIDGET_ID_WITH_SHORTCUT, new PeopleTileKey(PERSON_TILE));
         // Check storage.
         SharedPreferences widgetSp = mContext.getSharedPreferences(
                 String.valueOf(WIDGET_ID_WITH_SHORTCUT),
@@ -971,7 +1000,8 @@
                 eq(LauncherApps.FLAG_CACHE_PEOPLE_TILE_SHORTCUTS));
 
         // Reconfigure WIDGET_ID_WITH_SHORTCUT from PERSON_TILE to PERSON_TILE_WITH_SAME_URI
-        mManager.addNewWidget(WIDGET_ID_WITH_SHORTCUT, PERSON_TILE_WITH_SAME_URI);
+        mManager.addNewWidget(
+                WIDGET_ID_WITH_SHORTCUT, new PeopleTileKey(PERSON_TILE_WITH_SAME_URI));
 
         // Check listener is removed and shortcut is uncached.
         verify(mPeopleManager).unregisterConversationListener(any());
@@ -1120,26 +1150,28 @@
     @Test
     public void testGetPeopleTileFromPersistentStorageExistingConversation()
             throws Exception {
-        when(mIPeopleManager.getConversation(PACKAGE_NAME, 0, SHORTCUT_ID)).thenReturn(
-                getConversationWithShortcutId(SHORTCUT_ID));
-        PeopleTileKey key = new PeopleTileKey(SHORTCUT_ID, 0, PACKAGE_NAME);
+        ConversationChannel channel = getConversationWithShortcutId(
+                new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A));
+        when(mIPeopleManager.getConversation(TEST_PACKAGE_A, 0, SHORTCUT_ID)).thenReturn(channel);
+        PeopleTileKey key = new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A);
         PeopleSpaceTile tile = mManager.getTileFromPersistentStorage(key);
         assertThat(tile.getId()).isEqualTo(key.getShortcutId());
     }
 
     @Test
-    public void testGetPeopleTileFromPersistentStorageNoConversation() {
-        PeopleTileKey key = new PeopleTileKey(SHORTCUT_ID, 0, PACKAGE_NAME);
+    public void testGetPeopleTileFromPersistentStorageNoConversation() throws RemoteException {
+        when(mIPeopleManager.getConversation(TEST_PACKAGE_A, 0, SHORTCUT_ID)).thenReturn(null);
+        PeopleTileKey key = new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A);
         PeopleSpaceTile tile = mManager.getTileFromPersistentStorage(key);
         assertThat(tile).isNull();
     }
 
     @Test
     public void testRequestPinAppWidgetExistingConversation() throws Exception {
-        when(mMockContext.getPackageName()).thenReturn(PACKAGE_NAME);
-        when(mMockContext.getUserId()).thenReturn(0);
-        when(mIPeopleManager.getConversation(PACKAGE_NAME, 0, SHORTCUT_ID))
-                .thenReturn(getConversationWithShortcutId(SHORTCUT_ID));
+        ConversationChannel channel = getConversationWithShortcutId(
+                new PeopleTileKey(SHORTCUT_ID, 0, TEST_PACKAGE_A));
+        when(mIPeopleManager.getConversation(TEST_PACKAGE_A, 0, SHORTCUT_ID))
+                .thenReturn(channel);
         when(mAppWidgetManager.requestPinAppWidget(any(), any(), any())).thenReturn(true);
 
         ShortcutInfo info = new ShortcutInfo.Builder(mMockContext, SHORTCUT_ID).build();
@@ -1152,9 +1184,7 @@
 
     @Test
     public void testRequestPinAppWidgetNoConversation() throws Exception {
-        when(mMockContext.getPackageName()).thenReturn(PACKAGE_NAME);
-        when(mMockContext.getUserId()).thenReturn(0);
-        when(mIPeopleManager.getConversation(PACKAGE_NAME, 0, SHORTCUT_ID)).thenReturn(null);
+        when(mIPeopleManager.getConversation(TEST_PACKAGE_A, 0, SHORTCUT_ID)).thenReturn(null);
 
         ShortcutInfo info = new ShortcutInfo.Builder(mMockContext, SHORTCUT_ID).build();
         boolean valid = mManager.requestPinAppWidget(info, new Bundle());
@@ -1163,6 +1193,59 @@
         verify(mAppWidgetManager, never()).requestPinAppWidget(any(), any(), any());
     }
 
+    @Test
+    public void testAugmentTileFromNotifications() {
+        PeopleSpaceTile tile =
+                new PeopleSpaceTile
+                        .Builder(SHORTCUT_ID, "userName", ICON, new Intent())
+                        .setPackageName(TEST_PACKAGE_A)
+                        .setUserHandle(new UserHandle(0))
+                        .build();
+        PeopleTileKey key = new PeopleTileKey(tile);
+        PeopleSpaceTile actual = mManager.augmentTileFromNotifications(tile, key, EMPTY_STRING,
+                        Map.of(new PeopleTileKey(mNotificationEntry),
+                                new HashSet<>(Collections.singleton(mNotificationEntry))));
+
+        assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_CONTENT_1);
+    }
+
+    @Test
+    public void testAugmentTileFromNotificationsDifferentShortcutId() {
+        PeopleSpaceTile tile =
+                new PeopleSpaceTile
+                        .Builder(OTHER_SHORTCUT_ID, "userName", ICON, new Intent())
+                        .setPackageName(TEST_PACKAGE_A)
+                        .setUserHandle(new UserHandle(0))
+                        .build();
+        PeopleTileKey key = new PeopleTileKey(tile);
+        PeopleSpaceTile actual = mManager
+                .augmentTileFromNotifications(tile, key, EMPTY_STRING,
+                        Map.of(new PeopleTileKey(mNotificationEntry),
+                                new HashSet<>(Collections.singleton(mNotificationEntry))));
+
+        assertThat(actual.getNotificationContent()).isEqualTo(null);
+    }
+
+    @Test
+    public void testAugmentTileFromNotificationEntryManager() {
+        PeopleSpaceTile tile =
+                new PeopleSpaceTile
+                        .Builder(SHORTCUT_ID, "userName", ICON, new Intent())
+                        .setPackageName(TEST_PACKAGE_A)
+                        .setUserHandle(new UserHandle(0))
+                        .build();
+        when(mNotificationEntryManager.getVisibleNotifications())
+                .thenReturn(List.of(mNotificationEntry));
+
+        PeopleSpaceTile actual =
+                mManager.augmentTileFromNotificationEntryManager(tile);
+
+        assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_CONTENT_1);
+
+        verify(mNotificationEntryManager, times(1))
+                .getVisibleNotifications();
+    }
+
     /**
      * Adds another widget for {@code PERSON_TILE} with widget ID: {@code
      * SECOND_WIDGET_ID_WITH_SHORTCUT}.
@@ -1179,10 +1262,11 @@
         setStorageForTile(tile.getId(), tile.getPackageName(), widgetId, tile.getContactUri());
         Bundle options = new Bundle();
         options.putParcelable(OPTIONS_PEOPLE_TILE, tile);
+        ConversationChannel channel = getConversationWithShortcutId(new PeopleTileKey(tile));
         when(mAppWidgetManager.getAppWidgetOptions(eq(widgetId)))
                 .thenReturn(options);
-        when(mIPeopleManager.getConversation(tile.getPackageName(), 0, tile.getId())).thenReturn(
-                getConversationWithShortcutId(tile.getId()));
+        when(mIPeopleManager.getConversation(tile.getPackageName(), 0, tile.getId()))
+                .thenReturn(channel);
         when(mPackageManager.checkPermission(any(), eq(tile.getPackageName()))).thenReturn(
                 PERMISSION_GRANTED);
     }
@@ -1190,17 +1274,19 @@
     /**
      * Returns a single conversation associated with {@code shortcutId}.
      */
-    private ConversationChannel getConversationWithShortcutId(String shortcutId) throws Exception {
-        return getConversationWithShortcutId(shortcutId, Arrays.asList());
+    private ConversationChannel getConversationWithShortcutId(PeopleTileKey key) throws Exception {
+        return getConversationWithShortcutId(key, Arrays.asList());
     }
 
     /**
      * Returns a single conversation associated with {@code shortcutId} and {@code statuses}.
      */
-    private ConversationChannel getConversationWithShortcutId(String shortcutId,
+    private ConversationChannel getConversationWithShortcutId(PeopleTileKey key,
             List<ConversationStatus> statuses) throws Exception {
-        ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext, shortcutId).setLongLabel(
-                "name").setPerson(PERSON).build();
+        when(mMockContext.getPackageName()).thenReturn(key.getPackageName());
+        when(mMockContext.getUserId()).thenReturn(key.getUserId());
+        ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mMockContext, key.getShortcutId())
+                .setLongLabel("name").setPerson(PERSON).build();
         ConversationChannel convo = new ConversationChannel(shortcutInfo, 0, null, null,
                 0L, false, false, statuses);
         return convo;
@@ -1220,7 +1306,7 @@
         if (isMessagingStyle) {
             builder.setStyle(new Notification.MessagingStyle(PERSON)
                     .addMessage(
-                            new Notification.MessagingStyle.Message(NOTIFICATION_CONTENT, 10,
+                            new Notification.MessagingStyle.Message(NOTIFICATION_CONTENT_1, 10,
                                     PERSON))
             );
         }
@@ -1239,7 +1325,7 @@
         if (isMessagingStyle) {
             builder.setStyle(new Notification.MessagingStyle(PERSON)
                     .addMessage(
-                            new Notification.MessagingStyle.Message(NOTIFICATION_CONTENT, 10,
+                            new Notification.MessagingStyle.Message(NOTIFICATION_CONTENT_1, 10,
                                     PERSON))
             );
         }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogControllerTest.kt
index 05a1e4f..03248f7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogControllerTest.kt
@@ -179,6 +179,9 @@
 
     @Test
     fun testShowDialogShowsDialog() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
+
         controller.showDialog(context)
         exhaustExecutors()
 
@@ -186,7 +189,17 @@
     }
 
     @Test
+    fun testDontShowEmptyDialog() {
+        controller.showDialog(context)
+        exhaustExecutors()
+
+        verify(dialog, never()).show()
+    }
+
+    @Test
     fun testHideDialogDismissesDialogIfShown() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
         controller.showDialog(context)
         exhaustExecutors()
 
@@ -202,6 +215,8 @@
 
     @Test
     fun testHideDialogNoopAfterDismissed() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
         controller.showDialog(context)
         exhaustExecutors()
 
@@ -214,6 +229,8 @@
 
     @Test
     fun testShowForAllUsers() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
         controller.showDialog(context)
 
         exhaustExecutors()
@@ -439,7 +456,7 @@
         controller.showDialog(context)
         exhaustExecutors()
 
-        assertThat(dialogProvider.list).isEmpty()
+        verify(dialog, never()).show()
     }
 
     @Test
@@ -467,11 +484,13 @@
         controller.showDialog(context)
         exhaustExecutors()
 
-        assertThat(dialogProvider.list).isEmpty()
+        verify(dialog, never()).show()
     }
 
     @Test
     fun testStartActivityCorrectIntent() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
         controller.showDialog(context)
         exhaustExecutors()
 
@@ -488,6 +507,8 @@
 
     @Test
     fun testStartActivityCorrectIntent_enterpriseUser() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
         controller.showDialog(context)
         exhaustExecutors()
 
@@ -501,6 +522,8 @@
 
     @Test
     fun testStartActivitySuccess() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
         controller.showDialog(context)
         exhaustExecutors()
 
@@ -514,6 +537,8 @@
 
     @Test
     fun testStartActivityFailure() {
+        val usage = createMockPermGroupUsage()
+        `when`(permissionManager.getIndicatorAppOpUsageData(anyBoolean())).thenReturn(listOf(usage))
         controller.showDialog(context)
         exhaustExecutors()
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
index 21fec91..d35597f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
@@ -42,7 +42,7 @@
 import com.android.systemui.globalactions.GlobalActionsDialogLite;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.MultiUserSwitch;
+import com.android.systemui.statusbar.phone.MultiUserSwitchController;
 import com.android.systemui.statusbar.phone.SettingsButton;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.UserInfoController;
@@ -90,7 +90,7 @@
     @Mock
     private View mEdit;
     @Mock
-    private MultiUserSwitch mMultiUserSwitch;
+    private MultiUserSwitchController mMultiUserSwitchController;
     @Mock
     private View mPowerMenuLiteView;
     @Mock
@@ -116,12 +116,11 @@
         when(mView.findViewById(R.id.settings_button)).thenReturn(mSettingsButton);
         when(mView.findViewById(R.id.build)).thenReturn(mBuildText);
         when(mView.findViewById(android.R.id.edit)).thenReturn(mEdit);
-        when(mView.findViewById(R.id.multi_user_switch)).thenReturn(mMultiUserSwitch);
         when(mView.findViewById(R.id.pm_lite)).thenReturn(mPowerMenuLiteView);
 
         mController = new QSFooterViewController(mView, mUserManager, mUserInfoController,
                 mActivityStarter, mDeviceProvisionedController, mUserTracker, mQSPanelController,
-                new QSDetailDisplayer(), mQuickQSPanelController, mFakeTunerService,
+                mMultiUserSwitchController, mQuickQSPanelController, mFakeTunerService,
                 mMetricsLogger, new FalsingManagerFake(), false, mGlobalActionsDialog);
 
         mController.init();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index 4ee639b..234dec2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -81,10 +81,10 @@
     private static final String PARENTAL_CONTROLS_LABEL = "Parental Control App";
     private static final ComponentName DEVICE_OWNER_COMPONENT =
             new ComponentName("TestDPC", "Test");
+    private static final int DEFAULT_ICON_ID = R.drawable.ic_info_outline;
 
     private ViewGroup mRootView;
     private TextView mFooterText;
-    private TestableImageView mFooterIcon;
     private TestableImageView mPrimaryFooterIcon;
     private QSSecurityFooter mFooter;
     @Mock
@@ -101,11 +101,10 @@
         when(mUserTracker.getUserInfo()).thenReturn(mock(UserInfo.class));
         mRootView = (ViewGroup) new LayoutInflaterBuilder(mContext)
                 .replace("ImageView", TestableImageView.class)
-                .build().inflate(R.layout.quick_settings_footer, null, false);
+                .build().inflate(R.layout.quick_settings_security_footer, null, false);
         mFooter = new QSSecurityFooter(mRootView, mUserTracker, new Handler(looper),
                 mActivityStarter, mSecurityController, looper);
         mFooterText = mRootView.findViewById(R.id.footer_text);
-        mFooterIcon = mRootView.findViewById(R.id.footer_icon);
         mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon);
         mFooter.setHostEnvironment(null);
 
@@ -135,10 +134,8 @@
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_management),
                      mFooterText.getText());
         assertEquals(View.VISIBLE, mRootView.getVisibility());
-        assertEquals(View.VISIBLE, mFooterIcon.getVisibility());
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
-        // -1 == never set.
-        assertEquals(-1, mFooterIcon.getLastImageResource());
+        assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(DEFAULT_ICON_ID, mPrimaryFooterIcon.getLastImageResource());
     }
 
     @Test
@@ -153,10 +150,8 @@
                                         MANAGING_ORGANIZATION),
                 mFooterText.getText());
         assertEquals(View.VISIBLE, mRootView.getVisibility());
-        assertEquals(View.VISIBLE, mFooterIcon.getVisibility());
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
-        // -1 == never set.
-        assertEquals(-1, mFooterIcon.getLastImageResource());
+        assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(DEFAULT_ICON_ID, mPrimaryFooterIcon.getLastImageResource());
     }
 
     @Test
@@ -174,10 +169,8 @@
                 R.string.quick_settings_financed_disclosure_named_management,
                 MANAGING_ORGANIZATION), mFooterText.getText());
         assertEquals(View.VISIBLE, mRootView.getVisibility());
-        assertEquals(View.VISIBLE, mFooterIcon.getVisibility());
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
-        // -1 == never set.
-        assertEquals(-1, mFooterIcon.getLastImageResource());
+        assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(DEFAULT_ICON_ID, mPrimaryFooterIcon.getLastImageResource());
     }
 
     @Test
@@ -204,10 +197,8 @@
         TestableLooper.get(this).processAllMessages();
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_monitoring),
                 mFooterText.getText());
-        assertEquals(View.VISIBLE, mFooterIcon.getVisibility());
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
-        // -1 == never set.
-        assertEquals(-1, mFooterIcon.getLastImageResource());
+        assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(DEFAULT_ICON_ID, mPrimaryFooterIcon.getLastImageResource());
 
         // Same situation, but with organization name set
         when(mSecurityController.getDeviceOwnerOrganizationName())
@@ -255,9 +246,8 @@
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_named_vpn,
                                         VPN_PACKAGE),
                      mFooterText.getText());
-        assertEquals(View.VISIBLE, mFooterIcon.getVisibility());
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
-        assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource());
+        assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(R.drawable.stat_sys_vpn_ic, mPrimaryFooterIcon.getLastImageResource());
 
         // Same situation, but with organization name set
         when(mSecurityController.getDeviceOwnerOrganizationName())
@@ -282,9 +272,8 @@
         TestableLooper.get(this).processAllMessages();
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_vpns),
                      mFooterText.getText());
-        assertEquals(View.VISIBLE, mFooterIcon.getVisibility());
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
-        assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource());
+        assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(R.drawable.stat_sys_vpn_ic, mPrimaryFooterIcon.getLastImageResource());
 
         // Same situation, but with organization name set
         when(mSecurityController.getDeviceOwnerOrganizationName())
@@ -306,9 +295,8 @@
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
-        assertEquals(View.VISIBLE, mFooterIcon.getVisibility());
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
-        assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource());
+        assertEquals(View.VISIBLE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(R.drawable.stat_sys_vpn_ic, mPrimaryFooterIcon.getLastImageResource());
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_management_monitoring),
                 mFooterText.getText());
     }
@@ -320,8 +308,7 @@
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
-        // -1 == never set.
-        assertEquals(-1, mFooterIcon.getLastImageResource());
+        assertEquals(DEFAULT_ICON_ID, mPrimaryFooterIcon.getLastImageResource());
         assertEquals(mContext.getString(
                              R.string.quick_settings_disclosure_managed_profile_monitoring),
                      mFooterText.getText());
@@ -345,8 +332,7 @@
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
-        // -1 == never set.
-        assertEquals(-1, mFooterIcon.getLastImageResource());
+        assertEquals(DEFAULT_ICON_ID, mPrimaryFooterIcon.getLastImageResource());
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_monitoring),
                      mFooterText.getText());
     }
@@ -359,7 +345,7 @@
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
-        assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource());
+        assertEquals(R.drawable.stat_sys_vpn_ic, mPrimaryFooterIcon.getLastImageResource());
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_vpns),
                      mFooterText.getText());
     }
@@ -371,7 +357,7 @@
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
-        assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource());
+        assertEquals(R.drawable.stat_sys_vpn_ic, mPrimaryFooterIcon.getLastImageResource());
         assertEquals(mContext.getString(
                              R.string.quick_settings_disclosure_managed_profile_named_vpn,
                              VPN_PACKAGE_2),
@@ -412,7 +398,7 @@
         mFooter.refreshState();
 
         TestableLooper.get(this).processAllMessages();
-        assertEquals(R.drawable.stat_sys_vpn_ic, mFooterIcon.getLastImageResource());
+        assertEquals(R.drawable.stat_sys_vpn_ic, mPrimaryFooterIcon.getLastImageResource());
         assertEquals(mContext.getString(R.string.quick_settings_disclosure_named_vpn,
                                         VPN_PACKAGE),
                      mFooterText.getText());
@@ -648,12 +634,12 @@
 
         assertEquals(testDrawable, mPrimaryFooterIcon.getDrawable());
 
-        // Ensure the primary icon is set to gone when parental controls is disabled.
+        // Ensure the primary icon is back to default after parental controls are gone
         when(mSecurityController.isParentalControlsEnabled()).thenReturn(false);
         mFooter.refreshState();
         TestableLooper.get(this).processAllMessages();
 
-        assertEquals(View.GONE, mPrimaryFooterIcon.getVisibility());
+        assertEquals(DEFAULT_ICON_ID, mPrimaryFooterIcon.getLastImageResource());
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
index 57e9d2b..7c73b4c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
@@ -40,7 +40,9 @@
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
 import android.util.FeatureFlagUtils;
+import android.view.View;
 
+import androidx.annotation.Nullable;
 import androidx.test.filters.SmallTest;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
@@ -430,7 +432,7 @@
         }
 
         @Override
-        protected void handleClick() {}
+        protected void handleClick(@Nullable View view) {}
 
         @Override
         protected void handleUpdateState(State state, Object arg) {}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java
index c35f8b6..f2f4f07 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java
@@ -34,7 +34,6 @@
 import static org.mockito.Mockito.when;
 
 import android.Manifest;
-import android.annotation.Nullable;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -49,6 +48,7 @@
 import android.util.FeatureFlagUtils;
 import android.view.View;
 
+import androidx.annotation.Nullable;
 import androidx.test.filters.SmallTest;
 
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
@@ -414,10 +414,10 @@
         }
 
         @Override
-        public void click() {}
+        public void click(@Nullable View view) {}
 
         @Override
-        public void secondaryClick() {}
+        public void secondaryClick(@Nullable View view) {}
 
         @Override
         public void longClick(@Nullable View view) {}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
index 2d6ed7c..80231a4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
@@ -49,7 +49,9 @@
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
+import android.view.View;
 
+import androidx.annotation.Nullable;
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.logging.InstanceId;
@@ -124,7 +126,7 @@
 
     @Test
     public void testClick_Metrics() {
-        mTile.click();
+        mTile.click(null /* view */);
         verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_CLICK)));
         assertEquals(1, mUiEventLoggerFake.numLogs());
         UiEventLoggerFake.FakeUiEvent event = mUiEventLoggerFake.get(0);
@@ -135,14 +137,14 @@
     public void testClick_log() {
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
 
-        mTile.click();
+        mTile.click(null /* view */);
         verify(mQsLogger).logTileClick(SPEC, StatusBarState.SHADE, Tile.STATE_ACTIVE);
     }
 
     @Test
     public void testClick_Metrics_Status_Bar_Status() {
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
-        mTile.click();
+        mTile.click(null /* view */);
         verify(mMetricsLogger).write(mLogCaptor.capture());
         assertEquals(StatusBarState.SHADE, mLogCaptor.getValue()
                 .getTaggedData(FIELD_STATUS_BAR_STATE));
@@ -151,19 +153,19 @@
     @Test
     public void testClick_falsing() {
         mFalsingManager.setFalseTap(true);
-        mTile.click();
+        mTile.click(null /* view */);
         mTestableLooper.processAllMessages();
         assertThat(mTile.mClicked).isFalse();
 
         mFalsingManager.setFalseTap(false);
-        mTile.click();
+        mTile.click(null /* view */);
         mTestableLooper.processAllMessages();
         assertThat(mTile.mClicked).isTrue();
     }
 
     @Test
     public void testSecondaryClick_Metrics() {
-        mTile.secondaryClick();
+        mTile.secondaryClick(null /* view */);
         verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_SECONDARY_CLICK)));
         assertEquals(1, mUiEventLoggerFake.numLogs());
         UiEventLoggerFake.FakeUiEvent event = mUiEventLoggerFake.get(0);
@@ -174,14 +176,14 @@
     public void testSecondaryClick_log() {
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
 
-        mTile.secondaryClick();
+        mTile.secondaryClick(null /* view */);
         verify(mQsLogger).logTileSecondaryClick(SPEC, StatusBarState.SHADE, Tile.STATE_ACTIVE);
     }
 
     @Test
     public void testSecondaryClick_Metrics_Status_Bar_Status() {
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
-        mTile.secondaryClick();
+        mTile.secondaryClick(null /* view */);
         verify(mMetricsLogger).write(mLogCaptor.capture());
         assertEquals(StatusBarState.KEYGUARD, mLogCaptor.getValue()
                 .getTaggedData(FIELD_STATUS_BAR_STATE));
@@ -208,7 +210,7 @@
     @Test
     public void testLongClick_Metrics_Status_Bar_Status() {
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE_LOCKED);
-        mTile.click();
+        mTile.click(null /* view */);
         verify(mMetricsLogger).write(mLogCaptor.capture());
         assertEquals(StatusBarState.SHADE_LOCKED, mLogCaptor.getValue()
                 .getTaggedData(FIELD_STATUS_BAR_STATE));
@@ -401,7 +403,7 @@
         }
 
         @Override
-        protected void handleClick() {
+        protected void handleClick(@Nullable View view) {
             mClicked = true;
         }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AlarmTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AlarmTileTest.kt
index 9674a60..a435768 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AlarmTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/AlarmTileTest.kt
@@ -122,10 +122,11 @@
     @Test
     fun testActivityStartedWhenNullNextAlarm() {
         callbackCaptor.value.onNextAlarmChanged(null)
-        tile.click()
+        tile.click(null /* view */)
 
         testableLooper.processAllMessages()
-        verify(activityStarter).postStartActivityDismissingKeyguard(tile.defaultIntent, 0)
+        verify(activityStarter).postStartActivityDismissingKeyguard(tile.defaultIntent, 0,
+                null /* animationController */)
     }
 
     @Test
@@ -141,9 +142,10 @@
     fun testActivityStartedWhenNextAlarm() {
         val alarmInfo = AlarmManager.AlarmClockInfo(1L, pendingIntent)
         callbackCaptor.value.onNextAlarmChanged(alarmInfo)
-        tile.click()
+        tile.click(null /* view */)
 
         testableLooper.processAllMessages()
-        verify(activityStarter).postStartActivityDismissingKeyguard(pendingIntent)
+        verify(activityStarter).postStartActivityDismissingKeyguard(pendingIntent,
+                null /* animationController */)
     }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
index 7d39361..7c1a5f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
@@ -240,7 +240,7 @@
         when(mController.getCastDevices()).thenReturn(devices);
 
         enableWifiAndProcessMessages();
-        mCastTile.handleClick();
+        mCastTile.handleClick(null /* view */);
         mTestableLooper.processAllMessages();
 
         verify(mActivityStarter, times(1)).postQSRunnableDismissingKeyguard(any());
@@ -256,7 +256,7 @@
         when(mController.getCastDevices()).thenReturn(devices);
 
         enableWifiAndProcessMessages();
-        mCastTile.handleClick();
+        mCastTile.handleClick(null /* view */);
         mTestableLooper.processAllMessages();
 
         verify(mController, times(1)).stopCasting(same(device));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
index a59f45d..6cf3434 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
@@ -28,6 +28,7 @@
 import com.android.internal.logging.MetricsLogger
 import com.android.internal.logging.UiEventLogger
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.ActivityLaunchAnimator
 import com.android.systemui.classifier.FalsingManagerFake
 import com.android.systemui.controls.ControlsServiceInfo
 import com.android.systemui.controls.controller.ControlsController
@@ -40,6 +41,7 @@
 import com.android.systemui.qs.logging.QSLogger
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.settings.FakeSettings
 import com.android.systemui.util.settings.SecureSettings
 import com.google.common.truth.Truth.assertThat
@@ -47,6 +49,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers.anyBoolean
 import org.mockito.Captor
 import org.mockito.Mock
 import org.mockito.Mockito.`when`
@@ -105,7 +108,6 @@
         doNothing().`when`(spiedContext).startActivity(any(Intent::class.java))
         `when`(qsHost.context).thenReturn(spiedContext)
         `when`(qsHost.uiEventLogger).thenReturn(uiEventLogger)
-        `when`(controlsController.available).thenReturn(true)
         `when`(controlsComponent.isEnabled()).thenReturn(true)
         secureSettings.putInt(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT, 1)
 
@@ -154,14 +156,6 @@
     }
 
     @Test
-    fun testAvailableControlsSettingOff() {
-        `when`(controlsController.available).thenReturn(false)
-
-        tile = createTile()
-        assertThat(tile.isAvailable).isTrue()
-    }
-
-    @Test
     fun testObservingCallback() {
         verify(controlsListingController).observe(
                 any(LifecycleOwner::class.java),
@@ -171,7 +165,12 @@
 
     @Test
     fun testLongClickIntent() {
-        assertThat(tile.longClickIntent.action).isEqualTo(Settings.ACTION_DEVICE_CONTROLS_SETTINGS)
+        assertThat(tile.longClickIntent).isNull()
+    }
+
+    @Test
+    fun testDoesNotHandleLongClick() {
+        assertThat(tile.state.handlesLongClick).isFalse()
     }
 
     @Test
@@ -253,10 +252,11 @@
 
     @Test
     fun testNoDialogWhenUnavailable() {
-        tile.click()
+        tile.click(null /* view */)
         testableLooper.processAllMessages()
 
-        verify(spiedContext, never()).startActivity(any(Intent::class.java))
+        verify(activityStarter, never()).startActivity(any(), anyBoolean(),
+                any<ActivityLaunchAnimator.Controller>())
     }
 
     @Test
@@ -270,10 +270,11 @@
         listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
         testableLooper.processAllMessages()
 
-        tile.click()
+        tile.click(null /* view */)
         testableLooper.processAllMessages()
 
-        verify(spiedContext).startActivity(any(Intent::class.java))
+        verify(activityStarter).startActivity(any(), eq(true) /* dismissShade */,
+                eq(null) as ActivityLaunchAnimator.Controller?)
     }
 
     @Test
@@ -288,10 +289,11 @@
         listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
         testableLooper.processAllMessages()
 
-        tile.click()
+        tile.click(null /* view */)
         testableLooper.processAllMessages()
 
-        verify(spiedContext, never()).startActivity(any(Intent::class.java))
+        verify(activityStarter, never()).startActivity(any(), anyBoolean(),
+                any<ActivityLaunchAnimator.Controller>())
     }
 
     private fun createTile(): DeviceControlsTile {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
index 4bba0d0..2f28b13 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -62,6 +62,7 @@
 import com.android.internal.logging.testing.UiEventLoggerFake;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.ActivityLaunchAnimator;
 import com.android.systemui.classifier.FalsingManagerFake;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.qs.QSTile;
@@ -186,11 +187,12 @@
         when(mQuickAccessWalletClient.createWalletIntent()).thenReturn(intent);
         setUpWalletCard(/* hasCard= */ false);
 
-        mTile.handleClick();
+        mTile.handleClick(null /* view */);
         mTestableLooper.processAllMessages();
 
         verify(mActivityStarter, times(1))
-                .postStartActivityDismissingKeyguard(eq(intent), anyInt());
+                .postStartActivityDismissingKeyguard(eq(intent), anyInt(),
+                        eq(null) /* animationController */);
     }
 
     @Test
@@ -198,7 +200,7 @@
         when(mQuickAccessWalletClient.createWalletIntent()).thenReturn(null);
         setUpWalletCard(/* hasCard= */ false);
 
-        mTile.handleClick();
+        mTile.handleClick(null /* view */);
         mTestableLooper.processAllMessages();
 
         verifyZeroInteractions(mActivityStarter);
@@ -208,10 +210,11 @@
     public void testHandleClick_hasCards_startWalletActivity() {
         setUpWalletCard(/* hasCard= */ true);
 
-        mTile.handleClick();
+        mTile.handleClick(null /* view */);
         mTestableLooper.processAllMessages();
 
-        verify(mSpiedContext).startActivity(mIntentCaptor.capture());
+        verify(mActivityStarter).startActivity(mIntentCaptor.capture(), eq(true) /* dismissShade */,
+                (ActivityLaunchAnimator.Controller) eq(null));
 
         Intent nextStartedIntent = mIntentCaptor.getValue();
         String walletClassName = "com.android.systemui.wallet.ui.WalletActivity";
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java
index 9799514..df4908d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java
@@ -121,7 +121,7 @@
         // Validity check
         assertEquals(Tile.STATE_INACTIVE, mTile.getState().state);
 
-        mTile.handleClick();
+        mTile.handleClick(null /* view */);
 
         verify(mReduceBrightColorsController, times(1))
                 .setReduceBrightColorsActivated(eq(true));
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 2215433..e4af21a 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
@@ -106,7 +106,7 @@
         assertTrue(mTile.getState().secondaryLabel.toString().equals(
                 mContext.getString(R.string.quick_settings_screen_record_start)));
 
-        mTile.handleClick();
+        mTile.handleClick(null /* view */);
         mTestableLooper.processAllMessages();
         verify(mController, times(1)).getPromptIntent();
     }
@@ -130,7 +130,7 @@
         when(mController.isStarting()).thenReturn(true);
         when(mController.isRecording()).thenReturn(false);
 
-        mTile.handleClick();
+        mTile.handleClick(null /* view */);
 
         verify(mController, times(1)).cancelCountdown();
     }
@@ -155,7 +155,7 @@
         when(mController.isStarting()).thenReturn(false);
         when(mController.isRecording()).thenReturn(true);
 
-        mTile.handleClick();
+        mTile.handleClick(null /* view */);
 
         verify(mController, times(1)).stopRecording();
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt
index f48b3fc..af75f2c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt
@@ -28,6 +28,7 @@
 import com.android.internal.util.UserIcons
 import com.android.systemui.R
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.classifier.FalsingManagerFake
 import com.android.systemui.qs.QSUserSwitcherEvent
 import com.android.systemui.statusbar.policy.UserSwitcherController
 import org.junit.Assert.assertEquals
@@ -53,6 +54,7 @@
     @Mock private lateinit var mInflatedUserDetailItemView: UserDetailItemView
     @Mock private lateinit var mUserInfo: UserInfo
     @Mock private lateinit var mLayoutInflater: LayoutInflater
+    private var falsingManagerFake: FalsingManagerFake = FalsingManagerFake()
     private lateinit var adapter: UserDetailView.Adapter
     private lateinit var uiEventLogger: UiEventLoggerFake
     private lateinit var mPicture: Bitmap
@@ -65,7 +67,8 @@
         mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE, mLayoutInflater)
         `when`(mLayoutInflater.inflate(anyInt(), any(ViewGroup::class.java), anyBoolean()))
                 .thenReturn(mInflatedUserDetailItemView)
-        adapter = UserDetailView.Adapter(mContext, mUserSwitcherController, uiEventLogger)
+        adapter = UserDetailView.Adapter(mContext, mUserSwitcherController, uiEventLogger,
+                falsingManagerFake)
         mPicture = UserIcons.convertToBitmap(mContext.getDrawable(R.drawable.ic_avatar_user))
     }
 
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 8c7d762..3d658ec 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,8 @@
 
 package com.android.systemui.screenshot;
 
+import static com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider.ScreenshotSmartActionType.REGULAR_SMART_ACTIONS;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -87,6 +89,7 @@
         CompletableFuture<List<Notification.Action>> smartActionsFuture =
                 mScreenshotSmartActions.getSmartActionsFuture(
                         "", Uri.parse("content://authority/data"), bitmap, smartActionsProvider,
+                        REGULAR_SMART_ACTIONS,
                         true, UserHandle.of(UserHandle.myUserId()));
         assertNotNull(smartActionsFuture);
         List<Notification.Action> smartActions = smartActionsFuture.get(5, TimeUnit.MILLISECONDS);
@@ -104,7 +107,7 @@
         when(smartActionsFuture.get(timeoutMs, TimeUnit.MILLISECONDS)).thenThrow(
                 RuntimeException.class);
         List<Notification.Action> actions = mScreenshotSmartActions.getSmartActions(
-                "", smartActionsFuture, timeoutMs, mSmartActionsProvider);
+                "", smartActionsFuture, timeoutMs, mSmartActionsProvider, REGULAR_SMART_ACTIONS);
         assertEquals(Collections.emptyList(), actions);
     }
 
@@ -127,6 +130,7 @@
         CompletableFuture<List<Notification.Action>> smartActionsFuture =
                 mScreenshotSmartActions.getSmartActionsFuture(
                         "", Uri.parse("content://autority/data"), bitmap, mSmartActionsProvider,
+                        REGULAR_SMART_ACTIONS,
                         true, UserHandle.of(UserHandle.myUserId()));
         verify(mSmartActionsProvider, never()).getActions(any(), any(), any(), any(), any(), any());
         assertNotNull(smartActionsFuture);
@@ -140,7 +144,8 @@
         Bitmap bitmap = mock(Bitmap.class);
         when(bitmap.getConfig()).thenReturn(Bitmap.Config.HARDWARE);
         mScreenshotSmartActions.getSmartActionsFuture(
-                "", Uri.parse("content://autority/data"), bitmap, mSmartActionsProvider, true,
+                "", Uri.parse("content://autority/data"), bitmap, mSmartActionsProvider,
+                REGULAR_SMART_ACTIONS, true,
                 UserHandle.of(UserHandle.myUserId()));
         verify(mSmartActionsProvider, times(1)).getActions(
                 any(), any(), any(), any(), any(), any());
@@ -157,7 +162,7 @@
                         mContext, null, mHandler);
         CompletableFuture<List<Notification.Action>> smartActionsFuture =
                 mScreenshotSmartActions.getSmartActionsFuture("", null, bitmap,
-                        actionsProvider,
+                        actionsProvider, REGULAR_SMART_ACTIONS,
                         true, UserHandle.of(UserHandle.myUserId()));
         assertNotNull(smartActionsFuture);
         List<Notification.Action> smartActions = smartActionsFuture.get(5, TimeUnit.MILLISECONDS);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/scrim/ScrimViewTest.java
similarity index 94%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/scrim/ScrimViewTest.java
index c2e58ef..a345f78 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/scrim/ScrimViewTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -11,10 +11,10 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
  */
 
-package com.android.systemui.statusbar;
+package com.android.systemui.scrim;
 
 import static junit.framework.Assert.assertEquals;
 
@@ -31,7 +31,6 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.colorextraction.ColorExtractor;
-import com.android.internal.colorextraction.drawable.ScrimDrawable;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.utils.leaks.LeakCheckedTest;
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt
index 3ed8ecf..e0187bd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt
@@ -18,8 +18,6 @@
 
 import android.testing.AndroidTestingRunner
 import android.view.MotionEvent
-import android.view.View
-import android.view.ViewGroup
 import android.widget.SeekBar
 import androidx.test.filters.SmallTest
 import com.android.settingslib.RestrictedLockUtils
@@ -39,7 +37,6 @@
 import org.mockito.Captor
 import org.mockito.Mock
 import org.mockito.Mockito.isNull
-import org.mockito.Mockito.mock
 import org.mockito.Mockito.never
 import org.mockito.Mockito.notNull
 import org.mockito.Mockito.verify
@@ -51,8 +48,6 @@
 class BrightnessSliderTest : SysuiTestCase() {
 
     @Mock
-    private lateinit var rootView: View
-    @Mock
     private lateinit var brightnessSliderView: BrightnessSliderView
     @Mock
     private lateinit var enforcedAdmin: RestrictedLockUtils.EnforcedAdmin
@@ -80,7 +75,7 @@
         whenever(mirrorController.toggleSlider).thenReturn(mirror)
         whenever(motionEvent.copy()).thenReturn(motionEvent)
 
-        mController = BrightnessSlider(rootView, brightnessSliderView, mFalsingManager)
+        mController = BrightnessSlider(brightnessSliderView, mFalsingManager)
         mController.init()
         mController.setOnChangedListener(listener)
     }
@@ -203,9 +198,7 @@
 
     @Test
     fun testSeekBarTrackingStarted() {
-        val parent = mock(ViewGroup::class.java)
         whenever(brightnessSliderView.value).thenReturn(42)
-        whenever(brightnessSliderView.parent).thenReturn(parent)
 
         mController.onViewAttached()
         mController.setMirrorControllerAndMirror(mirrorController)
@@ -215,7 +208,7 @@
 
         verify(listener).onChanged(eq(true), eq(42), eq(false))
         verify(mirrorController).showMirror()
-        verify(mirrorController).setLocation(parent)
+        verify(mirrorController).setLocationAndSize(brightnessSliderView)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
index 45a7d0a..a0c3ed9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
@@ -69,7 +69,6 @@
     @Mock private lateinit var shadeSpring: NotificationShadeDepthController.DepthAnimation
     @Mock private lateinit var shadeAnimation: NotificationShadeDepthController.DepthAnimation
     @Mock private lateinit var globalActionsSpring: NotificationShadeDepthController.DepthAnimation
-    @Mock private lateinit var brightnessSpring: NotificationShadeDepthController.DepthAnimation
     @Mock private lateinit var listener: NotificationShadeDepthController.DepthListener
     @Mock private lateinit var dozeParameters: DozeParameters
     @JvmField @Rule val mockitoRule = MockitoJUnit.rule()
@@ -97,7 +96,6 @@
                 notificationShadeWindowController, dozeParameters, dumpManager)
         notificationShadeDepthController.shadeSpring = shadeSpring
         notificationShadeDepthController.shadeAnimation = shadeAnimation
-        notificationShadeDepthController.brightnessMirrorSpring = brightnessSpring
         notificationShadeDepthController.globalActionsSpring = globalActionsSpring
         notificationShadeDepthController.root = root
 
@@ -245,31 +243,6 @@
     }
 
     @Test
-    fun brightnessMirrorVisible_whenVisible() {
-        notificationShadeDepthController.brightnessMirrorVisible = true
-        verify(brightnessSpring).animateTo(eq(maxBlur), any())
-    }
-
-    @Test
-    fun brightnessMirrorVisible_whenHidden() {
-        notificationShadeDepthController.brightnessMirrorVisible = false
-        verify(brightnessSpring).animateTo(eq(0), any())
-    }
-
-    @Test
-    fun brightnessMirror_hidesShadeBlur() {
-        // Brightness mirror is fully visible
-        `when`(brightnessSpring.ratio).thenReturn(1f)
-        // And shade is blurred
-        `when`(shadeSpring.radius).thenReturn(maxBlur)
-        `when`(shadeAnimation.radius).thenReturn(maxBlur)
-
-        notificationShadeDepthController.updateBlurCallback.doFrame(0)
-        verify(notificationShadeWindowController).setBackgroundBlurRadius(0)
-        verify(blurUtils).applyBlur(eq(viewRootImpl), eq(0))
-    }
-
-    @Test
     fun setNotificationLaunchAnimationParams_schedulesFrame() {
         val animProgress = ExpandAnimationParameters()
         animProgress.linearProgress = 0.5f
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt
index 5e783a5..4e404ae 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/charging/WiredChargingRippleControllerTest.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.statusbar.charging
 
-import android.content.Context
 import android.testing.AndroidTestingRunner
 import android.view.View
 import android.view.WindowManager
@@ -26,7 +25,7 @@
 import com.android.systemui.statusbar.commandline.CommandRegistry
 import com.android.systemui.statusbar.policy.BatteryController
 import com.android.systemui.statusbar.policy.ConfigurationController
-import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.time.FakeSystemClock
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -37,6 +36,7 @@
 import org.mockito.Mockito.any
 import org.mockito.Mockito.eq
 import org.mockito.Mockito.reset
+import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
@@ -50,6 +50,7 @@
     @Mock private lateinit var configurationController: ConfigurationController
     @Mock private lateinit var rippleView: ChargingRippleView
     @Mock private lateinit var windowManager: WindowManager
+    private val systemClock = FakeSystemClock()
 
     @Before
     fun setUp() {
@@ -57,9 +58,8 @@
         `when`(featureFlags.isChargingRippleEnabled).thenReturn(true)
         controller = WiredChargingRippleController(
                 commandRegistry, batteryController, configurationController,
-                featureFlags, context)
+                featureFlags, context, windowManager, systemClock)
         controller.rippleView = rippleView // Replace the real ripple view with a mock instance
-        context.addMockSystemService(Context.WINDOW_SERVICE, windowManager)
     }
 
     @Test
@@ -103,4 +103,37 @@
         captor.value.onUiModeChanged()
         verify(rippleView).setColor(ArgumentMatchers.anyInt())
     }
+
+    @Test
+    fun testDebounceRipple() {
+        var time: Long = 0
+        systemClock.setElapsedRealtime(time)
+
+        controller.startRippleWithDebounce()
+        verify(rippleView).addOnAttachStateChangeListener(ArgumentMatchers.any())
+
+        reset(rippleView)
+        // Wait a short while and trigger.
+        time += 100
+        systemClock.setElapsedRealtime(time)
+        controller.startRippleWithDebounce()
+
+        // Verify the ripple is debounced.
+        verify(rippleView, never()).addOnAttachStateChangeListener(ArgumentMatchers.any())
+
+        // Trigger many times.
+        for (i in 0..100) {
+            time += 100
+            systemClock.setElapsedRealtime(time)
+            controller.startRippleWithDebounce()
+        }
+        // Verify all attempts are debounced.
+        verify(rippleView, never()).addOnAttachStateChangeListener(ArgumentMatchers.any())
+
+        // Wait a long while and trigger.
+        systemClock.setElapsedRealtime(time + 500000)
+        controller.startRippleWithDebounce()
+        // Verify that ripple is triggered.
+        verify(rippleView).addOnAttachStateChangeListener(ArgumentMatchers.any())
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt
index c832fe4..bdd4a01 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt
@@ -21,6 +21,8 @@
 import android.app.NotificationManager.IMPORTANCE_DEFAULT
 import android.app.NotificationManager.IMPORTANCE_HIGH
 import android.app.NotificationManager.IMPORTANCE_LOW
+import android.app.PendingIntent
+import android.app.Person
 import android.os.SystemClock
 import android.service.notification.NotificationListenerService.RankingMap
 import android.testing.AndroidTestingRunner
@@ -408,6 +410,74 @@
         assertThat(b.bucket).isEqualTo(BUCKET_FOREGROUND_SERVICE)
     }
 
+    @Test
+    fun testSort_importantCall() {
+        whenever(sectionsManager.isFilteringEnabled()).thenReturn(true)
+
+        val a = NotificationEntryBuilder()
+                .setImportance(IMPORTANCE_HIGH)
+                .setPkg("pkg")
+                .setOpPkg("pkg")
+                .setTag("tag")
+                .setNotification(
+                        Notification.Builder(mContext, "test")
+                                .build())
+                .setChannel(NotificationChannel("test", "", IMPORTANCE_DEFAULT))
+                .setUser(mContext.getUser())
+                .setOverrideGroupKey("")
+                .build()
+
+        val b = NotificationEntryBuilder()
+                .setImportance(IMPORTANCE_DEFAULT) // high priority
+                .setPkg("pkg2")
+                .setOpPkg("pkg2")
+                .setTag("tag")
+                .setNotification(mock(Notification::class.java).also { notif ->
+                    whenever(notif.isForegroundService).thenReturn(true)
+                    whenever(notif.isColorized).thenReturn(true)
+                })
+                .setChannel(NotificationChannel("test", "", IMPORTANCE_DEFAULT))
+                .setUser(mContext.getUser())
+                .setOverrideGroupKey("")
+                .build()
+
+        val cN = Notification.Builder(mContext, "test")
+                .setStyle(Notification.MessagingStyle(""))
+                .build()
+        val c = NotificationEntryBuilder()
+                .setImportance(IMPORTANCE_HIGH)
+                .setPkg("pkg")
+                .setOpPkg("pkg")
+                .setTag("tag")
+                .setNotification(cN)
+                .setChannel(NotificationChannel("test", "", IMPORTANCE_DEFAULT))
+                .setUser(mContext.user)
+                .setOverrideGroupKey("")
+                .build()
+
+        val dN = Notification.Builder(mContext, "test")
+                .setStyle(Notification.CallStyle.forOngoingCall(
+                        Person.Builder().setName("caller").build(),
+                        mock(PendingIntent::class.java)))
+                .build()
+        val d = NotificationEntryBuilder()
+                .setImportance(IMPORTANCE_DEFAULT) // high priority
+                .setPkg("pkg2")
+                .setOpPkg("pkg2")
+                .setTag("tag")
+                .setNotification(dN)
+                .setChannel(NotificationChannel("test", "", IMPORTANCE_DEFAULT))
+                .setUser(mContext.user)
+                .setOverrideGroupKey("")
+                .build()
+        whenever(personNotificationIdentifier.getPeopleNotificationType(a))
+                .thenReturn(TYPE_IMPORTANT_PERSON)
+
+        assertThat(rankingManager.updateRanking(null, listOf(a, b, c, d), "test"))
+                .containsExactly(b, d, c, a)
+        assertThat(d.bucket).isEqualTo(BUCKET_FOREGROUND_SERVICE)
+    }
+
     internal class TestableNotificationRankingManager(
         mediaManager: Lazy<NotificationMediaManager>,
         groupManager: NotificationGroupManagerLegacy,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
index 4183508..94e273b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
@@ -16,8 +16,6 @@
 
 package com.android.systemui.statusbar.notification.row;
 
-import static org.mockito.ArgumentMatchers.anyFloat;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -57,7 +55,6 @@
         mView = new NotificationContentView(mContext, null);
         ExpandableNotificationRow row = new ExpandableNotificationRow(mContext, null);
         ExpandableNotificationRow mockRow = spy(row);
-        doNothing().when(mockRow).updateBackgroundAlpha(anyFloat());
         doReturn(10).when(mockRow).getIntrinsicHeight();
 
         mView.setContainingNotification(mockRow);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
index b4a3393..0bb66fc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
@@ -239,46 +239,12 @@
     /**
      * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
      */
-    public ExpandableNotificationRow createBubbleInGroup()
-            throws Exception {
-        return createBubble(makeBubbleMetadata(null), PKG, true);
-    }
-
-    /**
-     * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
-     */
     public ExpandableNotificationRow createBubble()
             throws Exception {
-        return createBubble(makeBubbleMetadata(null), PKG, false);
-    }
-
-    /**
-     * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
-     *
-     * @param deleteIntent the intent to assign to {@link BubbleMetadata#deleteIntent}
-     */
-    public ExpandableNotificationRow createBubble(@Nullable PendingIntent deleteIntent)
-            throws Exception {
-        return createBubble(makeBubbleMetadata(deleteIntent), PKG, false);
-    }
-
-    /**
-     * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
-     *
-     * @param bubbleMetadata the {@link BubbleMetadata} to use
-     */
-    public ExpandableNotificationRow createBubble(BubbleMetadata bubbleMetadata, String pkg)
-            throws Exception {
-        return createBubble(bubbleMetadata, pkg, false);
-    }
-
-    private ExpandableNotificationRow createBubble(BubbleMetadata bubbleMetadata, String pkg,
-            boolean inGroup)
-            throws Exception {
         Notification n = createNotification(false /* isGroupSummary */,
-                inGroup ? GROUP_KEY : null /* groupKey */, bubbleMetadata);
+                null /* groupKey */, makeBubbleMetadata(null));
         n.flags |= FLAG_BUBBLE;
-        ExpandableNotificationRow row = generateRow(n, pkg, UID, USER_HANDLE,
+        ExpandableNotificationRow row = generateRow(n, PKG, UID, USER_HANDLE,
                 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
         modifyRanking(row.getEntry())
                 .setCanBubble(true)
@@ -287,6 +253,76 @@
     }
 
     /**
+     * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble and is part
+     * of a group of notifications.
+     */
+    public ExpandableNotificationRow createBubbleInGroup()
+            throws Exception {
+        Notification n = createNotification(false /* isGroupSummary */,
+                GROUP_KEY /* groupKey */, makeBubbleMetadata(null));
+        n.flags |= FLAG_BUBBLE;
+        ExpandableNotificationRow row = generateRow(n, PKG, UID, USER_HANDLE,
+                0 /* extraInflationFlags */, IMPORTANCE_HIGH);
+        modifyRanking(row.getEntry())
+                .setCanBubble(true)
+                .build();
+        return row;
+    }
+
+    /**
+     * Returns an {@link NotificationEntry} that should be shown as a bubble.
+     *
+     * @param deleteIntent the intent to assign to {@link BubbleMetadata#deleteIntent}
+     */
+    public NotificationEntry createBubble(@Nullable PendingIntent deleteIntent) {
+        return createBubble(makeBubbleMetadata(deleteIntent), USER_HANDLE);
+    }
+
+    /**
+     * Returns an {@link NotificationEntry} that should be shown as a bubble.
+     *
+     * @param handle the user to associate with this bubble.
+     */
+    public NotificationEntry createBubble(UserHandle handle) {
+        return createBubble(makeBubbleMetadata(null), handle);
+    }
+
+    /**
+     * Returns an {@link NotificationEntry} that should be shown as a bubble.
+     *
+     * @param userHandle the user to associate with this notification.
+     */
+    private NotificationEntry createBubble(BubbleMetadata metadata, UserHandle userHandle) {
+        Notification n = createNotification(false /* isGroupSummary */, null /* groupKey */,
+                metadata);
+        n.flags |= FLAG_BUBBLE;
+
+        final NotificationChannel channel =
+                new NotificationChannel(
+                        n.getChannelId(),
+                        n.getChannelId(),
+                        IMPORTANCE_HIGH);
+        channel.setBlockable(true);
+
+        NotificationEntry entry = new NotificationEntryBuilder()
+                .setPkg(PKG)
+                .setOpPkg(PKG)
+                .setId(mId++)
+                .setUid(UID)
+                .setInitialPid(2000)
+                .setNotification(n)
+                .setUser(userHandle)
+                .setPostTime(System.currentTimeMillis())
+                .setChannel(channel)
+                .build();
+
+        modifyRanking(entry)
+                .setCanBubble(true)
+                .build();
+        return entry;
+    }
+
+    /**
      * Creates a notification row with the given details.
      *
      * @param pkg package used for creating a {@link StatusBarNotification}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index f1c8ece..a63d509 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -123,6 +123,7 @@
         verify(mStatusBarKeyguardViewManager).showBouncer(eq(false));
         verify(mShadeController).animateCollapsePanels(anyInt(), anyBoolean(), anyBoolean(),
                 anyFloat());
+        verify(mStatusBarKeyguardViewManager, never()).notifyKeyguardAuthenticated(anyBoolean());
         assertThat(mBiometricUnlockController.getMode())
                 .isEqualTo(BiometricUnlockController.MODE_SHOW_BOUNCER);
     }
@@ -170,6 +171,7 @@
         verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean());
         verify(mShadeController).animateCollapsePanels(anyInt(), anyBoolean(), anyBoolean(),
                 anyFloat());
+        verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));
         assertThat(mBiometricUnlockController.getMode())
                 .isEqualTo(BiometricUnlockController.MODE_UNLOCK_COLLAPSING);
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 0e3e0cc..a01e0b1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -31,6 +31,7 @@
 import android.testing.TestableLooper.RunWithLooper;
 import android.view.View;
 import android.view.ViewPropertyAnimator;
+import android.widget.FrameLayout;
 
 import androidx.test.filters.SmallTest;
 
@@ -40,24 +41,19 @@
 import com.android.systemui.statusbar.events.PrivacyDotViewController;
 import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
-import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallListener;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
-import java.util.Objects;
-
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper(setAsMainLooper = true)
 @SmallTest
 public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
 
-    private NotificationIconAreaController mMockNotificiationAreaController;
+    private NotificationIconAreaController mMockNotificationAreaController;
     private View mNotificationAreaInner;
-    private View mCenteredNotificationAreaView;
     private StatusBarStateController mStatusBarStateController;
     private OngoingCallController mOngoingCallController;
     private SystemStatusAnimationScheduler mAnimationScheduler;
@@ -74,26 +70,16 @@
         mStatusBarStateController = mDependency
                 .injectMockDependency(StatusBarStateController.class);
         injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
-        mMockNotificiationAreaController = mock(NotificationIconAreaController.class);
-        mNotificationAreaInner = mock(View.class);
-        mCenteredNotificationAreaView = mock(View.class);
         when(statusBar.getPanelController()).thenReturn(
                 mock(NotificationPanelViewController.class));
-        when(mNotificationAreaInner.animate()).thenReturn(mock(ViewPropertyAnimator.class));
-        when(mMockNotificiationAreaController.getNotificationInnerAreaView()).thenReturn(
-                mNotificationAreaInner);
-        when(mCenteredNotificationAreaView.animate()).thenReturn(mock(ViewPropertyAnimator.class));
-        when(mMockNotificiationAreaController.getCenteredNotificationAreaView()).thenReturn(
-                mCenteredNotificationAreaView);
     }
 
     @Test
     public void testDisableNone() throws Exception {
         mFragments.dispatchResume();
         processAllMessages();
-
         CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
-        fragment.initNotificationIconArea(mMockNotificiationAreaController);
+
         fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
 
         assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.system_icon_area)
@@ -106,9 +92,8 @@
     public void testDisableSystemInfo() throws Exception {
         mFragments.dispatchResume();
         processAllMessages();
-
         CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
-        fragment.initNotificationIconArea(mMockNotificiationAreaController);
+
         fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false);
 
         assertEquals(View.INVISIBLE, mFragment.getView().findViewById(R.id.system_icon_area)
@@ -124,12 +109,11 @@
     public void testDisableNotifications() throws Exception {
         mFragments.dispatchResume();
         processAllMessages();
-
         CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
-        fragment.initNotificationIconArea(mMockNotificiationAreaController);
+
         fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NOTIFICATION_ICONS, 0, false);
 
-        Mockito.verify(mNotificationAreaInner).setVisibility(eq(View.INVISIBLE));
+        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.INVISIBLE));
 
         fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
 
@@ -140,9 +124,8 @@
     public void testDisableClock() throws Exception {
         mFragments.dispatchResume();
         processAllMessages();
-
         CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
-        fragment.initNotificationIconArea(mMockNotificiationAreaController);
+
         fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_CLOCK, 0, false);
 
         assertEquals(View.GONE, mFragment.getView().findViewById(R.id.clock).getVisibility());
@@ -153,15 +136,81 @@
     }
 
     @Test
+    public void disable_noOngoingCall_chipHidden() {
+        mFragments.dispatchResume();
+        processAllMessages();
+        CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
+
+        when(mOngoingCallController.hasOngoingCall()).thenReturn(false);
+
+        fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
+
+        assertEquals(View.GONE,
+                mFragment.getView().findViewById(R.id.ongoing_call_chip).getVisibility());
+    }
+
+    @Test
+    public void disable_hasOngoingCall_chipDisplayedAndNotificationIconsHidden() {
+        mFragments.dispatchResume();
+        processAllMessages();
+        CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
+
+        when(mOngoingCallController.hasOngoingCall()).thenReturn(true);
+
+        fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
+
+        assertEquals(View.VISIBLE,
+                mFragment.getView().findViewById(R.id.ongoing_call_chip).getVisibility());
+        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.INVISIBLE));
+
+    }
+
+    @Test
+    public void disable_hasOngoingCallButNotificationIconsDisabled_chipHidden() {
+        mFragments.dispatchResume();
+        processAllMessages();
+        CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
+
+        when(mOngoingCallController.hasOngoingCall()).thenReturn(true);
+
+        fragment.disable(DEFAULT_DISPLAY,
+                StatusBarManager.DISABLE_NOTIFICATION_ICONS, 0, false);
+
+        assertEquals(View.GONE,
+                mFragment.getView().findViewById(R.id.ongoing_call_chip).getVisibility());
+    }
+
+    @Test
+    public void disable_ongoingCallEnded_chipHidden() {
+        mFragments.dispatchResume();
+        processAllMessages();
+        CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
+
+        when(mOngoingCallController.hasOngoingCall()).thenReturn(true);
+
+        // Ongoing call started
+        fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
+        assertEquals(View.VISIBLE,
+                mFragment.getView().findViewById(R.id.ongoing_call_chip).getVisibility());
+
+        // Ongoing call ended
+        when(mOngoingCallController.hasOngoingCall()).thenReturn(false);
+
+        fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
+
+        assertEquals(View.GONE,
+                mFragment.getView().findViewById(R.id.ongoing_call_chip).getVisibility());
+    }
+
+    @Test
     public void testOnDozingChanged() throws Exception {
         mFragments.dispatchResume();
         processAllMessages();
-
         CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
-        fragment.initNotificationIconArea(mMockNotificiationAreaController);
+
         fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NOTIFICATION_ICONS, 0, false);
 
-        Mockito.verify(mNotificationAreaInner).setVisibility(eq(View.INVISIBLE));
+        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.INVISIBLE));
 
         reset(mStatusBarStateController);
         when(mStatusBarStateController.isDozing()).thenReturn(true);
@@ -171,56 +220,35 @@
         Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
     }
 
-    @Test
-    public void onOngoingCallStarted_notificationsHiddenAndOngoingCallChipDisplayed() {
-        mFragments.dispatchResume();
-        processAllMessages();
-
-        CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
-        fragment.initNotificationIconArea(mMockNotificiationAreaController);
-
-        ArgumentCaptor<OngoingCallListener> ongoingCallListenerCaptor = ArgumentCaptor.forClass(
-                OngoingCallListener.class);
-        Mockito.verify(mOngoingCallController).addCallback(ongoingCallListenerCaptor.capture());
-        OngoingCallListener listener = Objects.requireNonNull(ongoingCallListenerCaptor.getValue());
-
-        when(mOngoingCallController.hasOngoingCall()).thenReturn(true);
-        listener.onOngoingCallStarted(/* animate= */ false);
-
-        assertEquals(View.VISIBLE,
-                mFragment.getView().findViewById(R.id.ongoing_call_chip).getVisibility());
-        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.INVISIBLE));
-    }
-
-    @Test
-    public void onOngoingCallEnded_notificationsDisplayedAndOngoingCallChipHidden() {
-        mFragments.dispatchResume();
-        processAllMessages();
-
-        CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
-        fragment.initNotificationIconArea(mMockNotificiationAreaController);
-
-        ArgumentCaptor<OngoingCallListener> ongoingCallListenerCaptor = ArgumentCaptor.forClass(
-                OngoingCallListener.class);
-        Mockito.verify(mOngoingCallController).addCallback(ongoingCallListenerCaptor.capture());
-        OngoingCallListener listener = Objects.requireNonNull(ongoingCallListenerCaptor.getValue());
-
-        when(mOngoingCallController.hasOngoingCall()).thenReturn(false);
-        listener.onOngoingCallEnded(/* animate= */ false);
-
-        assertEquals(View.GONE,
-                mFragment.getView().findViewById(R.id.ongoing_call_chip).getVisibility());
-        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
-    }
-
     @Override
     protected Fragment instantiate(Context context, String className, Bundle arguments) {
         mOngoingCallController = mock(OngoingCallController.class);
         mAnimationScheduler = mock(SystemStatusAnimationScheduler.class);
         mDotViewController = mock(PrivacyDotViewController.class);
+        setUpNotificationIconAreaController();
         return new CollapsedStatusBarFragment(
                 mOngoingCallController,
                 mAnimationScheduler,
-                mDotViewController);
+                mDotViewController,
+                mMockNotificationAreaController);
+    }
+
+    private void setUpNotificationIconAreaController() {
+        mMockNotificationAreaController = mock(NotificationIconAreaController.class);
+
+        mNotificationAreaInner = mock(View.class);
+        View centeredNotificationAreaView = mock(View.class);
+
+        when(mNotificationAreaInner.getLayoutParams()).thenReturn(
+                new FrameLayout.LayoutParams(100, 100));
+        when(centeredNotificationAreaView.getLayoutParams()).thenReturn(
+               new FrameLayout.LayoutParams(100, 100));
+        when(mNotificationAreaInner.animate()).thenReturn(mock(ViewPropertyAnimator.class));
+        when(centeredNotificationAreaView.animate()).thenReturn(mock(ViewPropertyAnimator.class));
+
+        when(mMockNotificationAreaController.getCenteredNotificationAreaView()).thenReturn(
+                centeredNotificationAreaView);
+        when(mMockNotificationAreaController.getNotificationInnerAreaView()).thenReturn(
+                mNotificationAreaInner);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
index 02e2e4c..152ba90 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
@@ -53,6 +53,7 @@
     private boolean mHasVisibleNotifs;
     private float mQsExpansion;
     private int mCutoutTopInset = 0; // in pixels
+    private boolean mIsSplitShade = false;
 
     @Before
     public void setUp() {
@@ -265,6 +266,19 @@
     }
 
     @Test
+    public void notifPositionAlignedWithClockInSplitShadeMode() {
+        // GIVEN on lock screen and split shade mode
+        givenLockScreen();
+        mIsSplitShade = true;
+        mPreferredClockY = 100;
+        mHasCustomClock = true;
+        // WHEN the position algorithm is run
+        positionClock();
+        // THEN the notif padding DOESN'T adjust for keyguard status height.
+        assertThat(mClockPosition.stackScrollerPadding).isEqualTo(mPreferredClockY);
+    }
+
+    @Test
     public void notifPositionWithLargeClockOnLockScreen() {
         // GIVEN on lock screen and clock has a nonzero height
         givenLockScreen();
@@ -397,7 +411,7 @@
                 0 /* userSwitchHeight */, mPreferredClockY, 0 /* userSwitchPreferredY */,
                 mHasCustomClock, mHasVisibleNotifs, mDark, ZERO_DRAG, false /* bypassEnabled */,
                 0 /* unlockedStackScrollerPadding */, mQsExpansion,
-                mCutoutTopInset);
+                mCutoutTopInset, mIsSplitShade);
         mClockPositionAlgorithm.run(mClockPosition);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
index cebf8be..4bac762 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -75,6 +75,7 @@
 import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.classifier.FalsingManagerFake;
 import com.android.systemui.doze.DozeLog;
+import com.android.systemui.media.KeyguardMediaController;
 import com.android.systemui.media.MediaDataManager;
 import com.android.systemui.media.MediaHierarchyManager;
 import com.android.systemui.qs.QSDetailDisplayer;
@@ -240,6 +241,8 @@
     private LockIconViewController mLockIconViewController;
     @Mock
     private QuickAccessWalletClient mQuickAccessWalletClient;
+    @Mock
+    private KeyguardMediaController mKeyguardMediaController;
 
     private SysuiStatusBarStateController mStatusBarStateController;
     private NotificationPanelViewController mNotificationPanelViewController;
@@ -282,6 +285,7 @@
         mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null);
         mNotificationContainerParent.addView(newViewWithId(R.id.qs_frame));
         mNotificationContainerParent.addView(newViewWithId(R.id.notification_stack_scroller));
+        mNotificationContainerParent.addView(newViewWithId(R.id.keyguard_status_view));
         when(mView.findViewById(R.id.notification_container_parent))
                 .thenReturn(mNotificationContainerParent);
         FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder(
@@ -346,6 +350,7 @@
                 mLockIconViewController,
                 mFeatureFlags,
                 mQuickAccessWalletClient,
+                mKeyguardMediaController,
                 new FakeExecutor(new FakeSystemClock()));
         mNotificationPanelViewController.initDependencies(
                 mStatusBar,
@@ -476,6 +481,20 @@
     }
 
     @Test
+    public void testKeyguardStatusView_isAlignedToGuidelineInSplitShadeMode() {
+        mNotificationPanelViewController.updateResources();
+
+        assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd)
+                .isEqualTo(ConstraintSet.PARENT_ID);
+
+        enableSplitShade();
+        mNotificationPanelViewController.updateResources();
+
+        assertThat(getConstraintSetLayout(R.id.keyguard_status_view).endToEnd)
+                .isEqualTo(R.id.qs_edge_guideline);
+    }
+
+    @Test
     public void testSplitShadeLayout_isAlignedToGuideline() {
         enableSplitShade();
 
@@ -553,6 +572,36 @@
         assertThat(mNotificationPanelViewController.canCollapsePanelOnTouch()).isFalse();
     }
 
+    @Test
+    public void testSwipeWhileLocked_notifiesKeyguardState() {
+        mStatusBarStateController.setState(KEYGUARD);
+
+        // Fling expanded (cancelling the keyguard exit swipe). We should notify keyguard state that
+        // the fling occurred and did not dismiss the keyguard.
+        mNotificationPanelViewController.flingToHeight(
+                0f, true /* expand */, 1000f, 1f, false);
+        verify(mKeyguardStateController).notifyPanelFlingStart(false /* dismissKeyguard */);
+
+        // Fling un-expanded, which is a keyguard exit fling when we're in KEYGUARD state.
+        mNotificationPanelViewController.flingToHeight(
+                0f, false /* expand */, 1000f, 1f, false);
+        verify(mKeyguardStateController).notifyPanelFlingStart(true /* dismissKeyguard */);
+    }
+
+    @Test
+    public void testCancelSwipeWhileLocked_notifiesKeyguardState() {
+        mStatusBarStateController.setState(KEYGUARD);
+
+        mNotificationPanelViewController.setOverExpansion(100f, true);
+
+        // Fling expanded (cancelling the keyguard exit swipe). We should notify keyguard state that
+        // the fling occurred and did not dismiss the keyguard.
+        mNotificationPanelViewController.flingToHeight(
+                0f, true /* expand */, 1000f, 1f, false);
+        mNotificationPanelViewController.cancelHeightAnimator();
+        verify(mKeyguardStateController).notifyPanelFlingEnd();
+    }
+
     private View newViewWithId(int id) {
         View view = new View(mContext);
         view.setId(id);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java
index 4b8eec4..3238430 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImplTest.java
@@ -134,6 +134,19 @@
     }
 
     @Test
+    public void attach_animatingKeyguardAndSurface_wallpaperVisible() {
+        clearInvocations(mWindowManager);
+        when(mKeyguardViewMediator.isShowingAndNotOccluded()).thenReturn(true);
+        when(mKeyguardViewMediator
+                .isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe())
+                .thenReturn(true);
+        mNotificationShadeWindowController.attach();
+
+        verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
+        assertThat((mLayoutParameters.getValue().flags & FLAG_SHOW_WALLPAPER) != 0).isTrue();
+    }
+
+    @Test
     public void setBackgroundBlurRadius_expandedWithBlurs() {
         mNotificationShadeWindowController.setBackgroundBlurRadius(10);
         verify(mNotificationShadeWindowView).setVisibility(eq(View.VISIBLE));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
index e0fa9bab..0a3eec4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
@@ -88,6 +88,7 @@
     @Mock private SuperStatusBarViewFactory mStatusBarViewFactory;
     @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
     @Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
+    @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
 
     @Before
     public void setUp() {
@@ -128,7 +129,8 @@
                 mView,
                 mNotificationPanelViewController,
                 mStatusBarViewFactory,
-                mNotificationStackScrollLayoutController);
+                mNotificationStackScrollLayoutController,
+                mStatusBarKeyguardViewManager);
         mController.setupExpandedStatusBar();
         mController.setService(mStatusBar, mNotificationShadeWindowController);
         mController.setDragDownHelper(mDragDownHelper);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 8633eb4..7dcfc6b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -49,8 +49,8 @@
 import com.android.systemui.DejankUtils;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.dock.DockManager;
+import com.android.systemui.scrim.ScrimView;
 import com.android.systemui.statusbar.FeatureFlags;
-import com.android.systemui.statusbar.ScrimView;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.util.concurrency.FakeExecutor;
@@ -69,6 +69,7 @@
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 
@@ -91,7 +92,7 @@
     @Mock
     private AlarmManager mAlarmManager;
     @Mock
-    private DozeParameters mDozeParamenters;
+    private DozeParameters mDozeParameters;
     @Mock
     LightBarController mLightBarController;
     @Mock
@@ -200,8 +201,8 @@
             return null;
         }).when(mScrimBehind).postOnAnimationDelayed(any(Runnable.class), anyLong());
 
-        when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
-        when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true);
+        when(mDozeParameters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
+        when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(true);
 
         doAnswer((Answer<Void>) invocation -> {
             mScrimState = invocation.getArgument(0);
@@ -220,7 +221,7 @@
         when(mDockManager.isDocked()).thenReturn(false);
 
         mScrimController = new ScrimController(mLightBarController,
-                mDozeParamenters, mAlarmManager, mKeyguardStateController, mDelayedWakeLockBuilder,
+                mDozeParameters, mAlarmManager, mKeyguardStateController, mDelayedWakeLockBuilder,
                 new FakeHandler(mLooper.getLooper()), mKeyguardUpdateMonitor,
                 mDockManager, mConfigurationController, mFeatureFlags,
                 new FakeExecutor(new FakeSystemClock()));
@@ -238,6 +239,10 @@
     @After
     public void tearDown() {
         finishAnimationsImmediately();
+        Arrays.stream(ScrimState.values()).forEach((scrim) -> {
+            scrim.setAodFrontScrimAlpha(0f);
+            scrim.setClipQsScrim(false);
+        });
         DejankUtils.setImmediate(false);
     }
 
@@ -259,9 +264,30 @@
     @Test
     public void transitionToShadeLocked() {
         mScrimController.transitionTo(ScrimState.SHADE_LOCKED);
+        mScrimController.setQsPosition(1f, 0);
         finishAnimationsImmediately();
 
         assertScrimAlpha(Map.of(
+                mNotificationsScrim, OPAQUE,
+                mScrimInFront, TRANSPARENT,
+                mScrimBehind, OPAQUE));
+
+        assertScrimTinted(Map.of(
+                mScrimInFront, false,
+                mScrimBehind, true,
+                mScrimForBubble, false
+        ));
+    }
+
+    @Test
+    public void transitionToShadeLocked_clippingQs() {
+        mScrimController.setClipsQsScrim(true);
+        mScrimController.transitionTo(ScrimState.SHADE_LOCKED);
+        mScrimController.setQsPosition(1f, 0);
+        finishAnimationsImmediately();
+
+        assertScrimAlpha(Map.of(
+                mNotificationsScrim, OPAQUE,
                 mScrimInFront, TRANSPARENT,
                 mScrimBehind, OPAQUE));
 
@@ -403,9 +429,6 @@
         mScrimController.setAodFrontScrimAlpha(0.3f);
         Assert.assertEquals(ScrimState.AOD.getFrontAlpha(), mScrimInFront.getViewAlpha(), 0.001f);
         Assert.assertNotEquals(0.3f, mScrimInFront.getViewAlpha(), 0.001f);
-
-        // Reset value since enums are static.
-        mScrimController.setAodFrontScrimAlpha(0f);
     }
 
     @Test
@@ -500,11 +523,34 @@
         // Back scrim should be visible without tint
         assertScrimAlpha(Map.of(
                 mScrimInFront, TRANSPARENT,
+                mNotificationsScrim, TRANSPARENT,
                 mScrimBehind, OPAQUE));
 
         assertScrimTinted(Map.of(
                 mScrimInFront, false,
                 mScrimBehind, false,
+                mNotificationsScrim, false,
+                mScrimForBubble, false
+        ));
+    }
+
+    @Test
+    public void transitionToKeyguardBouncer_clippingQs() {
+        mScrimController.setClipsQsScrim(true);
+        mScrimController.transitionTo(ScrimState.BOUNCER);
+        finishAnimationsImmediately();
+        // Front scrim should be transparent
+        // Back scrim should be clipping QS
+        // Notif scrim should be visible without tint
+        assertScrimAlpha(Map.of(
+                mScrimInFront, TRANSPARENT,
+                mNotificationsScrim, OPAQUE,
+                mScrimBehind, OPAQUE));
+
+        assertScrimTinted(Map.of(
+                mScrimInFront, false,
+                mScrimBehind, true,
+                mNotificationsScrim, false,
                 mScrimForBubble, false
         ));
     }
@@ -530,9 +576,11 @@
         finishAnimationsImmediately();
         assertScrimAlpha(Map.of(
                 mScrimInFront, TRANSPARENT,
+                mNotificationsScrim, TRANSPARENT,
                 mScrimBehind, TRANSPARENT));
 
         assertScrimTinted(Map.of(
+                mNotificationsScrim, false,
                 mScrimInFront, false,
                 mScrimBehind, true,
                 mScrimForBubble, false
@@ -542,6 +590,7 @@
         mScrimController.setPanelExpansion(0.5f);
         assertScrimAlpha(Map.of(
                 mScrimInFront, TRANSPARENT,
+                mNotificationsScrim, SEMI_TRANSPARENT,
                 mScrimBehind, SEMI_TRANSPARENT));
     }
 
@@ -553,7 +602,7 @@
         assertScrimTinted(Map.of(
                 mScrimInFront, false,
                 mScrimBehind, false,
-                mScrimForBubble, false
+                mScrimForBubble, true
         ));
 
         // Front scrim should be transparent
@@ -617,6 +666,32 @@
     }
 
     @Test
+    public void qsExpansion_clippingQs() {
+        reset(mScrimBehind);
+        mScrimController.setClipsQsScrim(true);
+        mScrimController.setQsPosition(1f, 999 /* value doesn't matter */);
+        finishAnimationsImmediately();
+
+        assertScrimAlpha(Map.of(
+                mScrimInFront, TRANSPARENT,
+                mScrimBehind, OPAQUE,
+                mNotificationsScrim, OPAQUE));
+    }
+
+    @Test
+    public void qsExpansion_half_clippingQs() {
+        reset(mScrimBehind);
+        mScrimController.setClipsQsScrim(true);
+        mScrimController.setQsPosition(0.5f, 999 /* value doesn't matter */);
+        finishAnimationsImmediately();
+
+        assertScrimAlpha(Map.of(
+                mScrimInFront, TRANSPARENT,
+                mScrimBehind, OPAQUE,
+                mNotificationsScrim, SEMI_TRANSPARENT));
+    }
+
+    @Test
     public void panelExpansionAffectsAlpha() {
         mScrimController.setPanelExpansion(0f);
         mScrimController.setPanelExpansion(0.5f);
@@ -919,13 +994,13 @@
 
     @Test
     public void testAnimatesTransitionToAod() {
-        when(mDozeParamenters.shouldControlScreenOff()).thenReturn(false);
+        when(mDozeParameters.shouldControlScreenOff()).thenReturn(false);
         ScrimState.AOD.prepare(ScrimState.KEYGUARD);
         Assert.assertFalse("No animation when ColorFade kicks in",
                 ScrimState.AOD.getAnimateChange());
 
-        reset(mDozeParamenters);
-        when(mDozeParamenters.shouldControlScreenOff()).thenReturn(true);
+        reset(mDozeParameters);
+        when(mDozeParameters.shouldControlScreenOff()).thenReturn(true);
         ScrimState.AOD.prepare(ScrimState.KEYGUARD);
         Assert.assertTrue("Animate scrims when ColorFade won't be triggered",
                 ScrimState.AOD.getAnimateChange());
@@ -977,6 +1052,7 @@
         mScrimController.setPanelExpansion(0.5f);
         // notifications scrim alpha change require calling setQsPosition
         mScrimController.setQsPosition(0, 300);
+        finishAnimationsImmediately();
 
         assertScrimAlpha(Map.of(
                 mScrimBehind, SEMI_TRANSPARENT,
@@ -985,6 +1061,21 @@
     }
 
     @Test
+    public void testScrimsVisible_whenShadeVisible_clippingQs() {
+        mScrimController.setClipsQsScrim(true);
+        mScrimController.transitionTo(ScrimState.UNLOCKED);
+        mScrimController.setPanelExpansion(0.5f);
+        // notifications scrim alpha change require calling setQsPosition
+        mScrimController.setQsPosition(0.5f, 300);
+        finishAnimationsImmediately();
+
+        assertScrimAlpha(Map.of(
+                mScrimBehind, OPAQUE,
+                mNotificationsScrim, SEMI_TRANSPARENT,
+                mScrimInFront, TRANSPARENT));
+    }
+
+    @Test
     public void testScrimsVisible_whenShadeVisibleOnLockscreen() {
         mScrimController.transitionTo(ScrimState.KEYGUARD);
         mScrimController.setQsPosition(0.5f, 300);
@@ -1008,8 +1099,6 @@
     }
 
     private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
-        // notifications scrim should have always transparent tint
-        assertScrimTint(mNotificationsScrim, false);
         scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint));
     }
 
@@ -1047,6 +1136,12 @@
         }
         scrimToAlpha.forEach((scrimView, alpha) -> assertScrimAlpha(scrimView, alpha));
 
+        // When clipping, QS scrim should not affect combined visibility.
+        if (mScrimController.getClipQsScrim() && scrimToAlpha.get(mScrimBehind) == OPAQUE) {
+            scrimToAlpha = new HashMap<>(scrimToAlpha);
+            scrimToAlpha.remove(mScrimBehind);
+        }
+
         // Check combined scrim visibility.
         final int visibility;
         if (scrimToAlpha.values().contains(OPAQUE)) {
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 11f96c8..8c8212c 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
@@ -86,6 +86,7 @@
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.demomode.DemoModeController;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.keyguard.ScreenLifecycle;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
@@ -271,6 +272,7 @@
     @Mock private TunerService mTunerService;
     @Mock private FeatureFlags mFeatureFlags;
     @Mock private IWallpaperManager mWallpaperManager;
+    @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
     private ShadeController mShadeController;
     private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
     private InitController mInitController = new InitController();
@@ -439,7 +441,8 @@
                 mAnimationScheduler,
                 mDotViewController,
                 mTunerService,
-                mFeatureFlags);
+                mFeatureFlags,
+                mKeyguardUnlockAnimationController);
         when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(ViewGroup.class),
                 any(NotificationPanelViewController.class), any(BiometricUnlockController.class),
                 any(ViewGroup.class), any(KeyguardBypassController.class)))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt
index 95a363e..e9d16a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.pm.ServiceInfo
+import android.provider.Settings
 import android.testing.AndroidTestingRunner
 
 import androidx.test.filters.SmallTest
@@ -37,6 +38,7 @@
 import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.PREFS_CONTROLS_SEEDING_COMPLETED
 import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_DEFAULT_POSITION
 import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_PRIORITY_POSITION
+import com.android.systemui.util.settings.SecureSettings
 
 import java.util.Optional
 import java.util.function.Consumer
@@ -55,6 +57,7 @@
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.`when`
 import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyObject
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
@@ -76,6 +79,8 @@
     private lateinit var serviceInfo: ServiceInfo
     @Mock
     private lateinit var userContextProvider: UserContextProvider
+    @Mock
+    private lateinit var secureSettings: SecureSettings
     @Captor
     private lateinit var seedCallback: ArgumentCaptor<Consumer<SeedResponse>>
 
@@ -98,7 +103,14 @@
         `when`(controlsComponent.getControlsListingController())
                 .thenReturn(Optional.of(controlsListingController))
 
-        controller = DeviceControlsControllerImpl(mContext, controlsComponent, userContextProvider)
+        controller = DeviceControlsControllerImpl(
+            mContext,
+            controlsComponent,
+            userContextProvider,
+            secureSettings
+        )
+
+        `when`(secureSettings.getInt(Settings.Secure.CONTROLS_ENABLED, 1)).thenReturn(1)
 
         `when`(serviceInfo.componentName).thenReturn(TEST_COMPONENT)
         controlsServiceInfo = ControlsServiceInfo(mContext, serviceInfo)
@@ -116,7 +128,16 @@
 
         verify(controlsListingController).addCallback(capture(listingCallbackCaptor))
         listingCallbackCaptor.value.onServicesUpdated(emptyList())
-        verify(callback, never()).onControlsAvailable(anyInt())
+        verify(callback, never()).onControlsUpdate(anyInt())
+    }
+
+    @Test
+    fun testCallbackWithNullValueWhenSettingIsDisabled() {
+        `when`(secureSettings.getInt(Settings.Secure.CONTROLS_ENABLED, 1)).thenReturn(0)
+        controller.setCallback(callback)
+
+        verify(controlsListingController, never()).addCallback(anyObject())
+        verify(callback).onControlsUpdate(null)
     }
 
     @Test
@@ -126,7 +147,7 @@
 
         verify(controlsListingController).addCallback(capture(listingCallbackCaptor))
         listingCallbackCaptor.value.onServicesUpdated(listOf(controlsServiceInfo))
-        verify(callback).onControlsAvailable(QS_PRIORITY_POSITION)
+        verify(callback).onControlsUpdate(QS_PRIORITY_POSITION)
     }
 
     @Test
@@ -146,6 +167,6 @@
             capture(seedCallback)
         )
         seedCallback.value.accept(SeedResponse(TEST_PKG, true))
-        verify(callback).onControlsAvailable(QS_DEFAULT_POSITION)
+        verify(callback).onControlsUpdate(QS_DEFAULT_POSITION)
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java
index e57bbc1..53a2efc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java
@@ -143,4 +143,14 @@
         verify(callback).onUnlockedChanged();
     }
 
+    @Test
+    public void testKeyguardDismissAmountCallbackInvoked() {
+        KeyguardStateController.Callback callback = mock(KeyguardStateController.Callback.class);
+        mKeyguardStateController.addCallback(callback);
+
+        mKeyguardStateController.notifyKeyguardDismissAmountChanged(100f, false);
+
+        verify(callback).onKeyguardDismissAmountChanged();
+    }
+
 }
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 40439a2..f33c9e8 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
@@ -129,7 +129,6 @@
     protected int mSubId;
 
     private NetworkCapabilities mNetCapabilities;
-    private Network mNetwork;
     private ConnectivityManager.NetworkCallback mDefaultCallbackInWifiTracker;
     private ConnectivityManager.NetworkCallback mDefaultCallbackInNetworkController;
     private ConnectivityManager.NetworkCallback mNetworkCallback;
@@ -174,10 +173,8 @@
         mMockCm = mock(ConnectivityManager.class);
         mMockBd = mock(BroadcastDispatcher.class);
         mMockNsm = mock(NetworkScoreManager.class);
-        mNetwork = mock(Network.class);
         mMockSubDefaults = mock(SubscriptionDefaults.class);
         mNetCapabilities = new NetworkCapabilities();
-        when(mNetwork.getNetId()).thenReturn(0);
         when(mMockTm.isDataCapable()).thenReturn(true);
         when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm);
         doAnswer(invocation -> {
@@ -326,7 +323,8 @@
                 new NetworkCapabilities.Builder(mNetCapabilities);
         builder.setTransportInfo(info);
         setConnectivityCommon(builder, networkType, validated, isConnected);
-        mDefaultCallbackInNetworkController.onCapabilitiesChanged(mNetwork, builder.build());
+        mDefaultCallbackInNetworkController.onCapabilitiesChanged(
+                mock(Network.class), builder.build());
     }
 
     public void setConnectivityViaCallbackInNetworkController(
@@ -337,7 +335,8 @@
             builder.setTransportInfo(wifiInfo);
         }
         setConnectivityCommon(builder, networkType, validated, isConnected);
-        mDefaultCallbackInNetworkController.onCapabilitiesChanged(mNetwork, builder.build());
+        mDefaultCallbackInNetworkController.onCapabilitiesChanged(
+                mock(Network.class), builder.build());
     }
 
     public void setConnectivityViaCallbackInWifiTracker(
@@ -351,10 +350,10 @@
         if (networkType == NetworkCapabilities.TRANSPORT_WIFI) {
             if (isConnected) {
                 final NetworkCapabilities newCap = builder.build();
-                mNetworkCallback.onAvailable(mNetwork);
-                mNetworkCallback.onCapabilitiesChanged(mNetwork, newCap);
+                mNetworkCallback.onAvailable(mock(Network.class));
+                mNetworkCallback.onCapabilitiesChanged(mock(Network.class), newCap);
             } else {
-                mNetworkCallback.onLost(mNetwork);
+                mNetworkCallback.onLost(mock(Network.class));
             }
         }
     }
@@ -368,11 +367,11 @@
         if (networkType == NetworkCapabilities.TRANSPORT_CELLULAR) {
             if (isConnected) {
                 final NetworkCapabilities newCap = builder.build();
-                mNetworkCallback.onAvailable(mNetwork);
-                mNetworkCallback.onCapabilitiesChanged(mNetwork, newCap);
-                mDefaultCallbackInWifiTracker.onCapabilitiesChanged(mNetwork, newCap);
+                mNetworkCallback.onAvailable(mock(Network.class));
+                mNetworkCallback.onCapabilitiesChanged(mock(Network.class), newCap);
+                mDefaultCallbackInWifiTracker.onCapabilitiesChanged(mock(Network.class), newCap);
             } else {
-                mNetworkCallback.onLost(mNetwork);
+                mNetworkCallback.onLost(mock(Network.class));
             }
         }
     }
@@ -386,7 +385,7 @@
         }
         setConnectivityCommon(builder, networkType, validated, isConnected);
         mDefaultCallbackInWifiTracker.onCapabilitiesChanged(
-                mNetwork, builder.build());
+                mock(Network.class), builder.build());
     }
 
     private static void setConnectivityCommon(NetworkCapabilities.Builder builder,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
index ddf39d1..2d9d715 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
@@ -203,6 +203,22 @@
     }
 
     @Test
+    public void onProfileAdded_setsTheme() {
+        mBroadcastReceiver.getValue().onReceive(null,
+                new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED));
+        verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any());
+    }
+
+    @Test
+    public void onProfileAdded_ignoresUntilSetupComplete() {
+        reset(mDeviceProvisionedController);
+        mBroadcastReceiver.getValue().onReceive(null,
+                new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED));
+        verify(mThemeOverlayApplier, never())
+                .applyCurrentUserOverlays(any(), any(), anyInt(), any());
+    }
+
+    @Test
     public void onWallpaperColorsChanged_firstEventBeforeUserSetup_shouldBeAccepted() {
         // By default, on setup() we make this controller return that the user finished setup
         // wizard. This test on the other hand, is testing the setup flow.
@@ -212,6 +228,18 @@
         mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM);
 
         verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any());
+
+        // Regression test: null events should not reset the internal state and allow colors to be
+        // applied again.
+        clearInvocations(mThemeOverlayApplier);
+        mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_WALLPAPER_CHANGED));
+        mColorsListener.getValue().onColorsChanged(null, WallpaperManager.FLAG_SYSTEM);
+        verify(mThemeOverlayApplier, never()).applyCurrentUserOverlays(any(), any(), anyInt(),
+                any());
+        mColorsListener.getValue().onColorsChanged(new WallpaperColors(Color.valueOf(Color.GREEN),
+                null, null), WallpaperManager.FLAG_SYSTEM);
+        verify(mThemeOverlayApplier, never()).applyCurrentUserOverlays(any(), any(), anyInt(),
+                any());
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt b/packages/SystemUI/tests/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt
index 3f095c7..bff99bf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt
@@ -41,6 +41,7 @@
  * Generic T is nullable because implicitly bounded by Any?.
  */
 fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
+inline fun <reified T> any(): T = any(T::class.java)
 
 /**
  * Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/time/FakeSystemClock.java b/packages/SystemUI/tests/src/com/android/systemui/util/time/FakeSystemClock.java
index d8271e8..db6164d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/time/FakeSystemClock.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/time/FakeSystemClock.java
@@ -71,6 +71,10 @@
         mCurrentTimeMillis = millis;
     }
 
+    public void setElapsedRealtime(long millis) {
+        mElapsedRealtime = millis;
+    }
+
     /**
      * Advances the time tracked by the fake clock and notifies any listeners that the time has
      * changed (for example, an attached {@link FakeExecutor} may fire its pending runnables).
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java
index 26cac29..5fb779a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java
@@ -92,4 +92,39 @@
     public long calculateGoingToFullShadeDelay() {
         return 0;
     }
+
+    @Override
+    public float getDismissAmount() {
+        return 0;
+    }
+
+    @Override
+    public boolean isDismissingFromSwipe() {
+        return false;
+    }
+
+    @Override
+    public boolean isFlingingToDismissKeyguard() {
+        return false;
+    }
+
+    @Override
+    public boolean isFlingingToDismissKeyguardDuringSwipeGesture() {
+        return false;
+    }
+
+    @Override
+    public boolean isSnappingKeyguardBackAfterSwipe() {
+        return false;
+    }
+
+    @Override
+    public void notifyPanelFlingStart(boolean dismiss) {
+
+    }
+
+    @Override
+    public void notifyPanelFlingEnd() {
+
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
index 64127b9..8ad6271 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
@@ -66,6 +66,10 @@
     }
 
     @Override
+    public void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states) {
+    }
+
+    @Override
     public void setNoCallingIcons(String slot, List<CallIndicatorIconState> states) {
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index abc8da2..6e2e4cb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -17,6 +17,7 @@
 package com.android.systemui.wmshell;
 
 import static android.app.Notification.FLAG_BUBBLE;
+import static android.app.PendingIntent.FLAG_MUTABLE;
 import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL;
 import static android.service.notification.NotificationListenerService.REASON_CANCEL;
 import static android.service.notification.NotificationListenerService.REASON_CANCEL_ALL;
@@ -44,11 +45,19 @@
 import android.app.INotificationManager;
 import android.app.Notification;
 import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.LauncherApps;
+import android.content.pm.PackageManager;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
 import android.hardware.display.AmbientDisplayConfiguration;
 import android.hardware.face.FaceManager;
 import android.os.Handler;
 import android.os.PowerManager;
+import android.os.UserHandle;
 import android.service.dreams.IDreamManager;
 import android.service.notification.NotificationListenerService;
 import android.service.notification.ZenModeConfig;
@@ -77,6 +86,7 @@
 import com.android.systemui.statusbar.notification.NotificationFilter;
 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
 import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
@@ -89,16 +99,20 @@
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
 import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.wm.shell.R;
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.WindowManagerShellWrapper;
 import com.android.wm.shell.bubbles.Bubble;
 import com.android.wm.shell.bubbles.BubbleData;
 import com.android.wm.shell.bubbles.BubbleDataRepository;
 import com.android.wm.shell.bubbles.BubbleEntry;
+import com.android.wm.shell.bubbles.BubbleIconFactory;
 import com.android.wm.shell.bubbles.BubbleLogger;
 import com.android.wm.shell.bubbles.BubbleOverflow;
 import com.android.wm.shell.bubbles.BubbleStackView;
+import com.android.wm.shell.bubbles.BubbleViewInfoTask;
 import com.android.wm.shell.bubbles.Bubbles;
+import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TaskStackListenerImpl;
@@ -172,14 +186,17 @@
     private NotificationRemoveInterceptor mRemoveInterceptor;
 
     private NotificationTestHelper mNotificationTestHelper;
-    private ExpandableNotificationRow mRow;
-    private ExpandableNotificationRow mRow2;
-    private ExpandableNotificationRow mRow3;
+    private NotificationEntry mRow;
+    private NotificationEntry mRow2;
+    private NotificationEntry mRow3;
     private ExpandableNotificationRow mNonBubbleNotifRow;
     private BubbleEntry mBubbleEntry;
     private BubbleEntry mBubbleEntry2;
     private BubbleEntry mBubbleEntry3;
 
+    private BubbleEntry mBubbleEntryUser11;
+    private BubbleEntry mBubbleEntry2User11;
+
     @Mock
     private Bubbles.BubbleExpandListener mBubbleExpandListener;
     @Mock
@@ -245,14 +262,20 @@
         mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent);
         mRow3 = mNotificationTestHelper.createBubble(mDeleteIntent);
         mNonBubbleNotifRow = mNotificationTestHelper.createRow();
-        mBubbleEntry = BubblesManager.notifToBubbleEntry(mRow.getEntry());
-        mBubbleEntry2 = BubblesManager.notifToBubbleEntry(mRow2.getEntry());
-        mBubbleEntry3 = BubblesManager.notifToBubbleEntry(mRow3.getEntry());
+        mBubbleEntry = BubblesManager.notifToBubbleEntry(mRow);
+        mBubbleEntry2 = BubblesManager.notifToBubbleEntry(mRow2);
+        mBubbleEntry3 = BubblesManager.notifToBubbleEntry(mRow3);
+
+        UserHandle handle = mock(UserHandle.class);
+        when(handle.getIdentifier()).thenReturn(11);
+        mBubbleEntryUser11 = BubblesManager.notifToBubbleEntry(
+                mNotificationTestHelper.createBubble(handle));
+        mBubbleEntry2User11 = BubblesManager.notifToBubbleEntry(
+                mNotificationTestHelper.createBubble(handle));
 
         // Return non-null notification data from the NEM
         when(mNotificationEntryManager
-                .getActiveNotificationUnfiltered(mRow.getEntry().getKey())).thenReturn(
-                mRow.getEntry());
+                .getActiveNotificationUnfiltered(mRow.getKey())).thenReturn(mRow);
 
         mZenModeConfig.suppressedVisualEffects = 0;
         when(mZenModeController.getConfig()).thenReturn(mZenModeConfig);
@@ -293,6 +316,7 @@
                 mTaskStackListener,
                 mShellTaskOrganizer,
                 mPositioner,
+                mock(DisplayController.class),
                 syncExecutor,
                 mock(Handler.class));
         mBubbleController.setExpandListener(mBubbleExpandListener);
@@ -351,8 +375,8 @@
         verify(mNotificationEntryManager).updateNotifications(any());
 
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
-        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
         verify(mNotificationEntryManager, times(2)).updateNotifications(anyString());
 
         assertFalse(mSysUiStateBubblesExpanded);
@@ -362,20 +386,20 @@
     public void testPromoteBubble_autoExpand() throws Exception {
         mBubbleController.updateBubble(mBubbleEntry2);
         mBubbleController.updateBubble(mBubbleEntry);
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getEntry().getKey()))
-                .thenReturn(mRow.getEntry());
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getEntry().getKey()))
-                .thenReturn(mRow2.getEntry());
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
+                .thenReturn(mRow);
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getKey()))
+                .thenReturn(mRow2);
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
 
-        Bubble b = mBubbleData.getOverflowBubbleWithKey(mRow.getEntry().getKey());
+        Bubble b = mBubbleData.getOverflowBubbleWithKey(mRow.getKey());
         assertThat(mBubbleData.getOverflowBubbles()).isEqualTo(ImmutableList.of(b));
         verify(mNotificationEntryManager, never()).performRemoveNotification(
-                eq(mRow.getEntry().getSbn()), any(),  anyInt());
-        assertThat(mRow.getEntry().isBubble()).isFalse();
+                eq(mRow.getSbn()), any(),  anyInt());
+        assertThat(mRow.isBubble()).isFalse();
 
-        Bubble b2 = mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey());
+        Bubble b2 = mBubbleData.getBubbleInStackWithKey(mRow2.getKey());
         assertThat(mBubbleData.getSelectedBubble()).isEqualTo(b2);
 
         mBubbleController.promoteBubbleFromOverflow(b);
@@ -393,19 +417,19 @@
         mBubbleController.updateBubble(mBubbleEntry2);
         mBubbleController.updateBubble(mBubbleEntry, /* suppressFlyout */
                 false, /* showInShade */ true);
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getEntry().getKey()))
-                .thenReturn(mRow.getEntry());
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getEntry().getKey()))
-                .thenReturn(mRow2.getEntry());
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
+                .thenReturn(mRow);
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getKey()))
+                .thenReturn(mRow2);
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
 
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_NOTIF_CANCEL);
+                mRow.getKey(), Bubbles.DISMISS_NOTIF_CANCEL);
         verify(mNotificationEntryManager, times(1)).performRemoveNotification(
-                eq(mRow.getEntry().getSbn()), any(), anyInt());
+                eq(mRow.getSbn()), any(), anyInt());
         assertThat(mBubbleData.getOverflowBubbles()).isEmpty();
-        assertFalse(mRow.getEntry().isBubble());
+        assertFalse(mRow.isBubble());
     }
 
     @Test
@@ -414,28 +438,28 @@
         assertTrue(mBubbleController.hasBubbles());
 
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_CHANGED);
+                mRow.getKey(), Bubbles.DISMISS_USER_CHANGED);
         verify(mNotificationEntryManager, never()).performRemoveNotification(
-                eq(mRow.getEntry().getSbn()), any(), anyInt());
+                eq(mRow.getSbn()), any(), anyInt());
         assertFalse(mBubbleController.hasBubbles());
         assertFalse(mSysUiStateBubblesExpanded);
-        assertTrue(mRow.getEntry().isBubble());
+        assertTrue(mRow.isBubble());
     }
 
     @Test
     public void testDismissStack() {
         mBubbleController.updateBubble(mBubbleEntry);
         verify(mNotificationEntryManager, times(1)).updateNotifications(any());
-        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
         mBubbleController.updateBubble(mBubbleEntry2);
         verify(mNotificationEntryManager, times(2)).updateNotifications(any());
-        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow2.getKey()));
         assertTrue(mBubbleController.hasBubbles());
 
         mBubbleData.dismissAll(Bubbles.DISMISS_USER_GESTURE);
         verify(mNotificationEntryManager, times(3)).updateNotifications(any());
-        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
-        assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getKey()));
 
         assertFalse(mSysUiStateBubblesExpanded);
     }
@@ -445,7 +469,7 @@
         assertFalse(mBubbleController.isStackExpanded());
 
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // We should have bubbles & their notifs should not be suppressed
@@ -457,7 +481,7 @@
         BubbleStackView stackView = mBubbleController.getStackView();
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         assertTrue(mSysUiStateBubblesExpanded);
 
@@ -467,7 +491,7 @@
 
         // Collapse
         mBubbleController.collapseStack();
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
         assertFalse(mBubbleController.isStackExpanded());
 
         assertFalse(mSysUiStateBubblesExpanded);
@@ -477,8 +501,8 @@
     @Ignore("Currently broken.")
     public void testCollapseAfterChangingExpandedBubble() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
-        mEntryListener.onPendingEntryAdded(mRow2.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
+        mEntryListener.onPendingEntryAdded(mRow2);
         mBubbleController.updateBubble(mBubbleEntry);
         mBubbleController.updateBubble(mBubbleEntry2);
 
@@ -494,30 +518,30 @@
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
         verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
-                true, mRow2.getEntry().getKey());
+                true, mRow2.getKey());
 
         assertTrue(mSysUiStateBubblesExpanded);
 
         // Last added is the one that is expanded
-        assertEquals(mRow2.getEntry().getKey(), mBubbleData.getSelectedBubble().getKey());
+        assertEquals(mRow2.getKey(), mBubbleData.getSelectedBubble().getKey());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
 
         // Switch which bubble is expanded
         mBubbleData.setSelectedBubble(mBubbleData.getBubbleInStackWithKey(
-                mRow.getEntry().getKey()));
+                mRow.getKey()));
         mBubbleData.setExpanded(true);
-        assertEquals(mRow.getEntry().getKey(), mBubbleData.getBubbleInStackWithKey(
+        assertEquals(mRow.getKey(), mBubbleData.getBubbleInStackWithKey(
                 stackView.getExpandedBubble().getKey()).getKey());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         // collapse for previous bubble
         verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
-                false, mRow2.getEntry().getKey());
+                false, mRow2.getKey());
         // expand for selected bubble
         verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
-                true, mRow.getEntry().getKey());
+                true, mRow.getKey());
 
         // Collapse
         mBubbleController.collapseStack();
@@ -529,7 +553,7 @@
     @Test
     public void testExpansionRemovesShowInShadeAndDot() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // We should have bubbles & their notifs should not be suppressed
@@ -538,12 +562,12 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         assertTrue(mSysUiStateBubblesExpanded);
 
@@ -551,13 +575,13 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
     }
 
     @Test
     public void testUpdateWhileExpanded_DoesntChangeShowInShadeAndDot() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // We should have bubbles & their notifs should not be suppressed
@@ -566,12 +590,12 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         assertTrue(mSysUiStateBubblesExpanded);
 
@@ -579,24 +603,24 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Send update
-        mEntryListener.onPreEntryUpdated(mRow.getEntry());
+        mEntryListener.onPreEntryUpdated(mRow);
 
         // Nothing should have changed
         // Notif is suppressed after expansion
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
     }
 
     @Test
     public void testRemoveLastExpanded_selectsOverflow() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
-        mEntryListener.onPendingEntryAdded(mRow2.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
+        mEntryListener.onPendingEntryAdded(mRow2);
         mBubbleController.updateBubble(mBubbleEntry);
         mBubbleController.updateBubble(mBubbleEntry2);
 
@@ -607,10 +631,10 @@
         assertTrue(mSysUiStateBubblesExpanded);
 
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getKey());
 
         // Last added is the one that is expanded
-        assertEquals(mRow2.getEntry().getKey(), mBubbleData.getBubbleInStackWithKey(
+        assertEquals(mRow2.getKey(), mBubbleData.getBubbleInStackWithKey(
                 stackView.getExpandedBubble().getKey()).getKey());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
@@ -620,12 +644,12 @@
                 mBubbleData.getBubbleInStackWithKey(
                         stackView.getExpandedBubble().getKey()).getKey(),
                 Bubbles.DISMISS_USER_GESTURE);
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getKey());
 
         // Make sure first bubble is selected
-        assertEquals(mRow.getEntry().getKey(), mBubbleData.getBubbleInStackWithKey(
+        assertEquals(mRow.getKey(), mBubbleData.getBubbleInStackWithKey(
                 stackView.getExpandedBubble().getKey()).getKey());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         // Dismiss that one
         mBubbleController.removeBubble(
@@ -643,7 +667,7 @@
     @Test
     public void testRemoveLastExpandedEmptyOverflow_collapses() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Expand
@@ -652,7 +676,7 @@
 
         assertTrue(mSysUiStateBubblesExpanded);
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         // Block the bubble so it won't be in the overflow
         mBubbleController.removeBubble(
@@ -660,10 +684,10 @@
                         stackView.getExpandedBubble().getKey()).getKey(),
                 Bubbles.DISMISS_BLOCKED);
 
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
 
         // We should be collapsed
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
         assertFalse(mBubbleController.hasBubbles());
         assertFalse(mSysUiStateBubblesExpanded);
     }
@@ -671,16 +695,16 @@
     @Test
     public void testAutoExpand_fails_noFlag() {
         assertFalse(mBubbleController.isStackExpanded());
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE, false /* enableFlag */);
 
         // Add the auto expand bubble
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Expansion shouldn't change
         verify(mBubbleExpandListener, never()).onBubbleExpandChanged(false /* expanded */,
-                mRow.getEntry().getKey());
+                mRow.getKey());
         assertFalse(mBubbleController.isStackExpanded());
 
         assertFalse(mSysUiStateBubblesExpanded);
@@ -688,16 +712,16 @@
 
     @Test
     public void testAutoExpand_succeeds_withFlag() {
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE, true /* enableFlag */);
 
         // Add the auto expand bubble
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Expansion should change
         verify(mBubbleExpandListener).onBubbleExpandChanged(true /* expanded */,
-                mRow.getEntry().getKey());
+                mRow.getKey());
         assertTrue(mBubbleController.isStackExpanded());
 
         assertTrue(mSysUiStateBubblesExpanded);
@@ -705,19 +729,19 @@
 
     @Test
     public void testSuppressNotif_onInitialNotif() {
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION, true /* enableFlag */);
 
         // Add the suppress notif bubble
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Notif should be suppressed because we were foreground
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
 
         assertFalse(mSysUiStateBubblesExpanded);
     }
@@ -730,10 +754,10 @@
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Should show dot
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Update to suppress notif
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION, true /* enableFlag */);
         mBubbleController.updateBubble(mBubbleEntry);
 
@@ -741,22 +765,20 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
 
         assertFalse(mSysUiStateBubblesExpanded);
     }
 
     @Test
     public void testExpandStackAndSelectBubble_removedFirst() {
-        final String key = mRow.getEntry().getKey();
-
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Simulate notification cancellation.
         mRemoveInterceptor.onNotificationRemoveRequested(
-                mRow.getEntry().getKey(), mRow.getEntry(), REASON_APP_CANCEL);
+                mRow.getKey(), mRow, REASON_APP_CANCEL);
 
         mBubbleController.expandStackAndSelectBubble(mBubbleEntry);
 
@@ -765,12 +787,12 @@
 
     @Test
     public void testMarkNewNotificationAsShowInShade() {
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
     }
 
     @Test
@@ -784,7 +806,7 @@
     @Test
     public void testDeleteIntent_removeBubble_aged() throws PendingIntent.CanceledException {
         mBubbleController.updateBubble(mBubbleEntry);
-        mBubbleController.removeBubble(mRow.getEntry().getKey(), Bubbles.DISMISS_AGED);
+        mBubbleController.removeBubble(mRow.getKey(), Bubbles.DISMISS_AGED);
         verify(mDeleteIntent, never()).send();
     }
 
@@ -792,7 +814,7 @@
     public void testDeleteIntent_removeBubble_user() throws PendingIntent.CanceledException {
         mBubbleController.updateBubble(mBubbleEntry);
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
         verify(mDeleteIntent, times(1)).send();
     }
 
@@ -810,11 +832,11 @@
         mBubbleController.updateBubble(mBubbleEntry);
         assertTrue(mBubbleController.hasBubbles());
 
-        mRow.getEntry().getSbn().getNotification().flags &= ~FLAG_BUBBLE;
+        mRow.getSbn().getNotification().flags &= ~FLAG_BUBBLE;
         NotificationListenerService.Ranking ranking = new RankingBuilder(
-                mRow.getEntry().getRanking()).setCanBubble(false).build();
-        mRow.getEntry().setRanking(ranking);
-        mEntryListener.onPreEntryUpdated(mRow.getEntry());
+                mRow.getRanking()).setCanBubble(false).build();
+        mRow.setRanking(ranking);
+        mEntryListener.onPreEntryUpdated(mRow);
 
         assertFalse(mBubbleController.hasBubbles());
         verify(mDeleteIntent, never()).send();
@@ -822,13 +844,13 @@
 
     @Test
     public void testRemoveBubble_succeeds_appCancel() {
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
 
         boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
-                mRow.getEntry().getKey(), mRow.getEntry(), REASON_APP_CANCEL);
+                mRow.getKey(), mRow, REASON_APP_CANCEL);
 
         // Cancels always remove so no need to intercept
         assertFalse(intercepted);
@@ -836,19 +858,19 @@
 
     @Test
     public void testRemoveBubble_entryListenerRemove() {
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
 
         // Removes the notification
-        mEntryListener.onEntryRemoved(mRow.getEntry(), null, false, REASON_APP_CANCEL);
+        mEntryListener.onEntryRemoved(mRow, null, false, REASON_APP_CANCEL);
         assertFalse(mBubbleController.hasBubbles());
     }
 
     @Test
     public void removeBubble_clearAllIntercepted()  {
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
@@ -856,7 +878,7 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
-                mRow.getEntry().getKey(), mRow.getEntry(), REASON_CANCEL_ALL);
+                mRow.getKey(), mRow, REASON_CANCEL_ALL);
 
         // Intercept!
         assertTrue(intercepted);
@@ -867,7 +889,7 @@
 
     @Test
     public void removeBubble_userDismissNotifIntercepted() {
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
@@ -875,7 +897,7 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
-                mRow.getEntry().getKey(), mRow.getEntry(), REASON_CANCEL);
+                mRow.getKey(), mRow, REASON_CANCEL);
 
         // Intercept!
         assertTrue(intercepted);
@@ -887,7 +909,7 @@
     @Test
     public void removeNotif_inOverflow_intercepted() {
         // Get bubble with notif in shade.
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
         assertTrue(mBubbleController.hasBubbles());
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
@@ -895,11 +917,11 @@
 
         // Dismiss the bubble into overflow.
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
         assertFalse(mBubbleController.hasBubbles());
 
         boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
-                mRow.getEntry().getKey(), mRow.getEntry(), REASON_CANCEL);
+                mRow.getKey(), mRow, REASON_CANCEL);
 
         // Notif is no longer a bubble, but still in overflow, so we intercept removal.
         assertTrue(intercepted);
@@ -908,7 +930,7 @@
     @Test
     public void removeNotif_notInOverflow_notIntercepted() {
         // Get bubble with notif in shade.
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
@@ -916,11 +938,11 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_NO_LONGER_BUBBLE);
+                mRow.getKey(), Bubbles.DISMISS_NO_LONGER_BUBBLE);
         assertFalse(mBubbleController.hasBubbles());
 
         boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
-                mRow.getEntry().getKey(), mRow.getEntry(), REASON_CANCEL);
+                mRow.getKey(), mRow, REASON_CANCEL);
 
         // Notif is no longer a bubble, so we should not intercept removal.
         assertFalse(intercepted);
@@ -934,25 +956,25 @@
                 mBubbleEntry2, /* suppressFlyout */ false, /* showInShade */ false);
         mBubbleController.updateBubble(
                 mBubbleEntry3, /* suppressFlyout */ false, /* showInShade */ false);
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getEntry().getKey()))
-                .thenReturn(mRow.getEntry());
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getEntry().getKey()))
-                .thenReturn(mRow2.getEntry());
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow3.getEntry().getKey()))
-                .thenReturn(mRow3.getEntry());
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
+                .thenReturn(mRow);
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getKey()))
+                .thenReturn(mRow2);
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow3.getKey()))
+                .thenReturn(mRow3);
         assertEquals(mBubbleData.getBubbles().size(), 3);
 
         mBubbleData.setMaxOverflowBubbles(1);
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
         assertEquals(mBubbleData.getBubbles().size(), 2);
         assertEquals(mBubbleData.getOverflowBubbles().size(), 1);
 
         mBubbleController.removeBubble(
-                mRow2.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+                mRow2.getKey(), Bubbles.DISMISS_USER_GESTURE);
         // Overflow max of 1 is reached; mRow is oldest, so it gets removed
         verify(mNotificationEntryManager, times(1)).performRemoveNotification(
-                eq(mRow.getEntry().getSbn()), any(), eq(REASON_CANCEL));
+                eq(mRow.getSbn()), any(), eq(REASON_CANCEL));
         assertEquals(mBubbleData.getBubbles().size(), 1);
         assertEquals(mBubbleData.getOverflowBubbles().size(), 1);
     }
@@ -963,14 +985,14 @@
                 mock(Bubbles.SuppressionChangedListener.class);
         mBubbleData.setSuppressionChangedListener(listener);
 
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
 
         assertTrue(mBubbleController.hasBubbles());
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mRemoveInterceptor.onNotificationRemoveRequested(
-                mRow.getEntry().getKey(), mRow.getEntry(), REASON_CANCEL);
+                mRow.getKey(), mRow, REASON_CANCEL);
 
         // Should update show in shade state
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
@@ -978,7 +1000,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
     }
 
     @Test
@@ -987,7 +1009,7 @@
                 mock(Bubbles.SuppressionChangedListener.class);
         mBubbleData.setSuppressionChangedListener(listener);
 
-        mEntryListener.onPendingEntryAdded(mRow.getEntry());
+        mEntryListener.onPendingEntryAdded(mRow);
 
         assertTrue(mBubbleController.hasBubbles());
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
@@ -1001,7 +1023,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
     }
 
     @Test
@@ -1094,14 +1116,116 @@
         assertTrue(mBubbleController.hasBubbles());
 
         // Overflow it
-        mBubbleData.dismissBubbleWithKey(mRow.getEntry().getKey(),
+        mBubbleData.dismissBubbleWithKey(mRow.getKey(),
                 Bubbles.DISMISS_USER_GESTURE);
-        assertThat(mBubbleData.hasBubbleInStackWithKey(mRow.getEntry().getKey())).isFalse();
-        assertThat(mBubbleData.hasOverflowBubbleWithKey(mRow.getEntry().getKey())).isTrue();
+        assertThat(mBubbleData.hasBubbleInStackWithKey(mRow.getKey())).isFalse();
+        assertThat(mBubbleData.hasOverflowBubbleWithKey(mRow.getKey())).isTrue();
 
         // Test
         mBubbleController.updateBubble(mBubbleEntry);
-        assertThat(mBubbleData.hasBubbleInStackWithKey(mRow.getEntry().getKey())).isFalse();
+        assertThat(mBubbleData.hasBubbleInStackWithKey(mRow.getKey())).isFalse();
+    }
+
+    /**
+     * Verifies that when the user changes, the bubbles in the overflow list is cleared. Doesn't
+     * test the loading from the repository which would be a nice thing to add.
+     */
+    @Test
+    public void testOnUserChanged_overflowState() {
+        int firstUserId = mBubbleEntry.getStatusBarNotification().getUser().getIdentifier();
+        int secondUserId = mBubbleEntryUser11.getStatusBarNotification().getUser().getIdentifier();
+
+        mBubbleController.updateBubble(mBubbleEntry);
+        mBubbleController.updateBubble(mBubbleEntry2);
+        assertTrue(mBubbleController.hasBubbles());
+        mBubbleData.dismissAll(Bubbles.DISMISS_USER_GESTURE);
+
+        // Verify these are in the overflow
+        assertThat(mBubbleData.getOverflowBubbleWithKey(mBubbleEntry.getKey())).isNotNull();
+        assertThat(mBubbleData.getOverflowBubbleWithKey(mBubbleEntry2.getKey())).isNotNull();
+
+        // Switch users
+        mBubbleController.onUserChanged(secondUserId);
+        assertThat(mBubbleData.getOverflowBubbles()).isEmpty();
+
+        // Give this user some bubbles
+        mBubbleController.updateBubble(mBubbleEntryUser11);
+        mBubbleController.updateBubble(mBubbleEntry2User11);
+        assertTrue(mBubbleController.hasBubbles());
+        mBubbleData.dismissAll(Bubbles.DISMISS_USER_GESTURE);
+
+        // Verify these are in the overflow
+        assertThat(mBubbleData.getOverflowBubbleWithKey(mBubbleEntryUser11.getKey())).isNotNull();
+        assertThat(mBubbleData.getOverflowBubbleWithKey(mBubbleEntry2User11.getKey())).isNotNull();
+    }
+
+
+    /**
+     * Verifies that the package manager for the user is used when loading info for the bubble.
+     */
+    @Test
+    public void test_bubbleViewInfoGetPackageForUser() throws Exception {
+        final int workProfileUserId = 10;
+        final UserHandle workUser = new UserHandle(workProfileUserId);
+        final String workPkg = "work.pkg";
+
+        final Bubble bubble = createBubble(workProfileUserId, workPkg);
+        assertEquals(workProfileUserId, bubble.getUser().getIdentifier());
+
+        final Context context = setUpContextWithPackageManager(workPkg, null /* AppInfo */);
+        when(context.getResources()).thenReturn(mContext.getResources());
+        final Context userContext = setUpContextWithPackageManager(workPkg,
+                mock(ApplicationInfo.class));
+
+        // If things are working correctly, StatusBar.getPackageManagerForUser will call this
+        when(context.createPackageContextAsUser(eq(workPkg), anyInt(), eq(workUser)))
+                .thenReturn(userContext);
+
+        BubbleViewInfoTask.BubbleViewInfo info = BubbleViewInfoTask.BubbleViewInfo.populate(context,
+                mBubbleController,
+                mBubbleController.getStackView(),
+                new BubbleIconFactory(mContext),
+                bubble,
+                true /* skipInflation */);
+        verify(userContext, times(1)).getPackageManager();
+        verify(context, times(1)).createPackageContextAsUser(eq(workPkg),
+                eq(Context.CONTEXT_RESTRICTED),
+                eq(workUser));
+        assertNotNull(info);
+    }
+
+    /** Creates a bubble using the userId and package. */
+    private Bubble createBubble(int userId, String pkg) {
+        final UserHandle userHandle = new UserHandle(userId);
+        NotificationEntry workEntry = new NotificationEntryBuilder()
+                .setPkg(pkg)
+                .setUser(userHandle)
+                .build();
+        workEntry.setBubbleMetadata(getMetadata());
+        workEntry.setFlagBubble(true);
+
+        return new Bubble(BubblesManager.notifToBubbleEntry(workEntry),
+                null,
+                mock(Bubbles.PendingIntentCanceledListener.class), new SyncExecutor());
+    }
+
+    /** Creates a context that will return a PackageManager with specific AppInfo. */
+    private Context setUpContextWithPackageManager(String pkg, ApplicationInfo info)
+            throws Exception {
+        final PackageManager pm = mock(PackageManager.class);
+        when(pm.getApplicationInfo(eq(pkg), anyInt())).thenReturn(info);
+
+        if (info != null) {
+            Drawable d = mock(Drawable.class);
+            when(d.getBounds()).thenReturn(new Rect());
+            when(pm.getApplicationIcon(anyString())).thenReturn(d);
+            when(pm.getUserBadgedIcon(any(), any())).thenReturn(d);
+        }
+
+        final Context context = mock(Context.class);
+        when(context.getPackageName()).thenReturn(pkg);
+        when(context.getPackageManager()).thenReturn(pm);
+        return context;
     }
 
     /**
@@ -1120,4 +1244,13 @@
         }
         bubbleMetadata.setFlags(flags);
     }
+
+    private Notification.BubbleMetadata getMetadata() {
+        Intent target = new Intent(mContext, BubblesTestActivity.class);
+        PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, FLAG_MUTABLE);
+
+        return new Notification.BubbleMetadata.Builder(bubbleIntent,
+                Icon.createWithResource(mContext, R.drawable.bubble_ic_create_bubble))
+                .build();
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
index 1ba7f8a..9339f81 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
@@ -92,6 +92,7 @@
 import com.android.wm.shell.bubbles.BubbleOverflow;
 import com.android.wm.shell.bubbles.BubbleStackView;
 import com.android.wm.shell.bubbles.Bubbles;
+import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TaskStackListenerImpl;
@@ -158,8 +159,8 @@
     private NotificationShadeWindowControllerImpl mNotificationShadeWindowController;
     private NotifCollectionListener mEntryListener;
     private NotificationTestHelper mNotificationTestHelper;
-    private ExpandableNotificationRow mRow;
-    private ExpandableNotificationRow mRow2;
+    private NotificationEntry mRow;
+    private NotificationEntry mRow2;
     private ExpandableNotificationRow mNonBubbleNotifRow;
     private BubbleEntry mBubbleEntry;
     private BubbleEntry mBubbleEntry2;
@@ -224,8 +225,8 @@
         mRow = mNotificationTestHelper.createBubble(mDeleteIntent);
         mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent);
         mNonBubbleNotifRow = mNotificationTestHelper.createRow();
-        mBubbleEntry = BubblesManager.notifToBubbleEntry(mRow.getEntry());
-        mBubbleEntry2 = BubblesManager.notifToBubbleEntry(mRow2.getEntry());
+        mBubbleEntry = BubblesManager.notifToBubbleEntry(mRow);
+        mBubbleEntry2 = BubblesManager.notifToBubbleEntry(mRow2);
 
         mZenModeConfig.suppressedVisualEffects = 0;
         when(mZenModeController.getConfig()).thenReturn(mZenModeConfig);
@@ -259,6 +260,7 @@
                 mTaskStackListener,
                 mShellTaskOrganizer,
                 mPositioner,
+                mock(DisplayController.class),
                 syncExecutor,
                 mock(Handler.class));
         mBubbleController.setExpandListener(mBubbleExpandListener);
@@ -306,19 +308,19 @@
     @Test
     public void testRemoveBubble() {
         mBubbleController.updateBubble(mBubbleEntry);
-        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
         assertTrue(mBubbleController.hasBubbles());
         verify(mNotifCallback, times(1)).invalidateNotifications(anyString());
 
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
-        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
         verify(mNotifCallback, times(2)).invalidateNotifications(anyString());
     }
 
     @Test
     public void testRemoveBubble_withDismissedNotif_inOverflow() {
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
@@ -326,40 +328,40 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         // Make it look like dismissed notif
-        mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).setSuppressNotification(true);
+        mBubbleData.getBubbleInStackWithKey(mRow.getKey()).setSuppressNotification(true);
 
         // Now remove the bubble
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
-        assertTrue(mBubbleData.hasOverflowBubbleWithKey(mRow.getEntry().getKey()));
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
+        assertTrue(mBubbleData.hasOverflowBubbleWithKey(mRow.getKey()));
 
         // We don't remove the notification since the bubble is still in overflow.
-        verify(mNotifCallback, never()).removeNotification(eq(mRow.getEntry()), any(), anyInt());
+        verify(mNotifCallback, never()).removeNotification(eq(mRow), any(), anyInt());
         assertFalse(mBubbleController.hasBubbles());
     }
 
     @Test
     public void testRemoveBubble_withDismissedNotif_notInOverflow() {
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
-        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getEntry().getKey()))
-                .thenReturn(mRow.getEntry());
+        when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
+                .thenReturn(mRow);
 
         assertTrue(mBubbleController.hasBubbles());
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         // Make it look like dismissed notif
-        mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).setSuppressNotification(true);
+        mBubbleData.getBubbleInStackWithKey(mRow.getKey()).setSuppressNotification(true);
 
         // Now remove the bubble
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_NOTIF_CANCEL);
-        assertFalse(mBubbleData.hasOverflowBubbleWithKey(mRow.getEntry().getKey()));
+                mRow.getKey(), Bubbles.DISMISS_NOTIF_CANCEL);
+        assertFalse(mBubbleData.hasOverflowBubbleWithKey(mRow.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()),
+        verify(mNotifCallback, times(1)).removeNotification(eq(mRow),
                 any(), anyInt());
         assertFalse(mBubbleController.hasBubbles());
     }
@@ -368,16 +370,16 @@
     public void testDismissStack() {
         mBubbleController.updateBubble(mBubbleEntry);
         verify(mNotifCallback, times(1)).invalidateNotifications(anyString());
-        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
         mBubbleController.updateBubble(mBubbleEntry2);
         verify(mNotifCallback, times(2)).invalidateNotifications(anyString());
-        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
+        assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow2.getKey()));
         assertTrue(mBubbleController.hasBubbles());
 
         mBubbleData.dismissAll(Bubbles.DISMISS_USER_GESTURE);
         verify(mNotifCallback, times(3)).invalidateNotifications(anyString());
-        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
-        assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
+        assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getKey()));
     }
 
     @Test
@@ -385,7 +387,7 @@
         assertFalse(mBubbleController.isStackExpanded());
 
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // We should have bubbles & their notifs should not be suppressed
@@ -397,7 +399,7 @@
         BubbleStackView stackView = mBubbleController.getStackView();
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         // Make sure the notif is suppressed
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
@@ -405,7 +407,7 @@
 
         // Collapse
         mBubbleController.collapseStack();
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
         assertFalse(mBubbleController.isStackExpanded());
     }
 
@@ -413,8 +415,8 @@
     @Ignore("Currently broken.")
     public void testCollapseAfterChangingExpandedBubble() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onEntryAdded(mRow.getEntry());
-        mEntryListener.onEntryAdded(mRow2.getEntry());
+        mEntryListener.onEntryAdded(mRow);
+        mEntryListener.onEntryAdded(mRow2);
         mBubbleController.updateBubble(mBubbleEntry);
         mBubbleController.updateBubble(mBubbleEntry2);
 
@@ -430,28 +432,28 @@
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
         verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
-                true, mRow2.getEntry().getKey());
+                true, mRow2.getKey());
 
         // Last added is the one that is expanded
-        assertEquals(mRow2.getEntry().getKey(), mBubbleData.getSelectedBubble().getKey());
+        assertEquals(mRow2.getKey(), mBubbleData.getSelectedBubble().getKey());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
 
         // Switch which bubble is expanded
         mBubbleData.setSelectedBubble(mBubbleData.getBubbleInStackWithKey(
-                mRow.getEntry().getKey()));
+                mRow.getKey()));
         mBubbleData.setExpanded(true);
-        assertEquals(mRow.getEntry().getKey(), mBubbleData.getBubbleInStackWithKey(
+        assertEquals(mRow.getKey(), mBubbleData.getBubbleInStackWithKey(
                 stackView.getExpandedBubble().getKey()).getKey());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         // collapse for previous bubble
         verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
-                false, mRow2.getEntry().getKey());
+                false, mRow2.getKey());
         // expand for selected bubble
         verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
-                true, mRow.getEntry().getKey());
+                true, mRow.getKey());
 
 
         // Collapse
@@ -462,7 +464,7 @@
     @Test
     public void testExpansionRemovesShowInShadeAndDot() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // We should have bubbles & their notifs should not be suppressed
@@ -471,24 +473,24 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         // Notif is suppressed after expansion
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
     }
 
     @Test
     public void testUpdateWhileExpanded_DoesntChangeShowInShadeAndDot() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // We should have bubbles & their notifs should not be suppressed
@@ -497,35 +499,35 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Expand
         mBubbleData.setExpanded(true);
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         // Notif is suppressed after expansion
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Send update
-        mEntryListener.onEntryUpdated(mRow.getEntry());
+        mEntryListener.onEntryUpdated(mRow);
 
         // Nothing should have changed
         // Notif is suppressed after expansion
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Notif shouldn't show dot after expansion
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
     }
 
     @Test
     public void testRemoveLastExpanded_selectsOverflow() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onEntryAdded(mRow.getEntry());
-        mEntryListener.onEntryAdded(mRow2.getEntry());
+        mEntryListener.onEntryAdded(mRow);
+        mEntryListener.onEntryAdded(mRow2);
         mBubbleController.updateBubble(mBubbleEntry);
         mBubbleController.updateBubble(mBubbleEntry2);
 
@@ -534,10 +536,10 @@
         mBubbleData.setExpanded(true);
 
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getKey());
 
         // Last added is the one that is expanded
-        assertEquals(mRow2.getEntry().getKey(), mBubbleData.getBubbleInStackWithKey(
+        assertEquals(mRow2.getKey(), mBubbleData.getBubbleInStackWithKey(
                 stackView.getExpandedBubble().getKey()).getKey());
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
@@ -547,12 +549,12 @@
                 mBubbleData.getBubbleInStackWithKey(
                         stackView.getExpandedBubble().getKey()).getKey(),
                 Bubbles.DISMISS_USER_GESTURE);
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow2.getKey());
 
         // Make sure first bubble is selected
-        assertEquals(mRow.getEntry().getKey(), mBubbleData.getBubbleInStackWithKey(
+        assertEquals(mRow.getKey(), mBubbleData.getBubbleInStackWithKey(
                 stackView.getExpandedBubble().getKey()).getKey());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         // Dismiss that one
         mBubbleController.removeBubble(
@@ -569,7 +571,7 @@
     @Test
     public void testRemoveLastExpandedEmptyOverflow_collapses() {
         // Mark it as a bubble and add it explicitly
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Expand
@@ -577,7 +579,7 @@
         mBubbleData.setExpanded(true);
 
         assertTrue(mBubbleController.isStackExpanded());
-        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
 
         // Block the bubble so it won't be in the overflow
         mBubbleController.removeBubble(
@@ -585,10 +587,10 @@
                         stackView.getExpandedBubble().getKey()).getKey(),
                 Bubbles.DISMISS_BLOCKED);
 
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
 
         // We should be collapsed
-        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey());
+        verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
         assertFalse(mBubbleController.hasBubbles());
     }
 
@@ -596,49 +598,49 @@
     @Test
     public void testAutoExpand_fails_noFlag() {
         assertFalse(mBubbleController.isStackExpanded());
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE, false /* enableFlag */);
 
         // Add the auto expand bubble
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Expansion shouldn't change
         verify(mBubbleExpandListener, never()).onBubbleExpandChanged(false /* expanded */,
-                mRow.getEntry().getKey());
+                mRow.getKey());
         assertFalse(mBubbleController.isStackExpanded());
     }
 
     @Test
     public void testAutoExpand_succeeds_withFlag() {
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE, true /* enableFlag */);
 
         // Add the auto expand bubble
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Expansion should change
         verify(mBubbleExpandListener).onBubbleExpandChanged(true /* expanded */,
-                mRow.getEntry().getKey());
+                mRow.getKey());
         assertTrue(mBubbleController.isStackExpanded());
     }
 
     @Test
     public void testSuppressNotif_onInitialNotif() {
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION, true /* enableFlag */);
 
         // Add the suppress notif bubble
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         // Notif should be suppressed because we were foreground
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
     }
 
     @Test
@@ -649,10 +651,10 @@
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Should show dot
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
 
         // Update to suppress notif
-        setMetadataFlags(mRow.getEntry(),
+        setMetadataFlags(mRow,
                 Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION, true /* enableFlag */);
         mBubbleController.updateBubble(mBubbleEntry);
 
@@ -660,18 +662,18 @@
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
         // Dot + flyout is hidden because notif is suppressed
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
-        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
+        assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
     }
 
     @Test
     public void testMarkNewNotificationAsShowInShade() {
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         mTestableLooper.processAllMessages();
-        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot());
+        assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
     }
 
     @Test
@@ -685,7 +687,7 @@
     @Test
     public void testDeleteIntent_removeBubble_aged() throws PendingIntent.CanceledException {
         mBubbleController.updateBubble(mBubbleEntry);
-        mBubbleController.removeBubble(mRow.getEntry().getKey(), Bubbles.DISMISS_AGED);
+        mBubbleController.removeBubble(mRow.getKey(), Bubbles.DISMISS_AGED);
         verify(mDeleteIntent, never()).send();
     }
 
@@ -693,7 +695,7 @@
     public void testDeleteIntent_removeBubble_user() throws PendingIntent.CanceledException {
         mBubbleController.updateBubble(mBubbleEntry);
         mBubbleController.removeBubble(
-                mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+                mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
         verify(mDeleteIntent, times(1)).send();
     }
 
@@ -711,11 +713,11 @@
         mBubbleController.updateBubble(mBubbleEntry);
         assertTrue(mBubbleController.hasBubbles());
 
-        mRow.getEntry().getSbn().getNotification().flags &= ~FLAG_BUBBLE;
+        mRow.getSbn().getNotification().flags &= ~FLAG_BUBBLE;
         NotificationListenerService.Ranking ranking = new RankingBuilder(
-                mRow.getEntry().getRanking()).setCanBubble(false).build();
-        mRow.getEntry().setRanking(ranking);
-        mEntryListener.onEntryUpdated(mRow.getEntry());
+                mRow.getRanking()).setCanBubble(false).build();
+        mRow.setRanking(ranking);
+        mEntryListener.onEntryUpdated(mRow);
 
         assertFalse(mBubbleController.hasBubbles());
         verify(mDeleteIntent, never()).send();
@@ -723,26 +725,26 @@
 
     @Test
     public void testRemoveBubble_entryListenerRemove() {
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
 
         // Removes the notification
-        mEntryListener.onEntryRemoved(mRow.getEntry(), 0);
+        mEntryListener.onEntryRemoved(mRow, 0);
         assertFalse(mBubbleController.hasBubbles());
     }
 
     @Test
     public void removeBubble_intercepted() {
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
-        boolean intercepted = mBubblesManager.handleDismissalInterception(mRow.getEntry());
+        boolean intercepted = mBubblesManager.handleDismissalInterception(mRow);
 
         // Intercept!
         assertTrue(intercepted);
@@ -753,7 +755,7 @@
 
     @Test
     public void removeBubble_dismissIntoOverflow_intercepted() {
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
@@ -761,11 +763,11 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         // Dismiss the bubble
-        mBubbleController.removeBubble(mRow.getEntry().getKey(), Bubbles.DISMISS_USER_GESTURE);
+        mBubbleController.removeBubble(mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
         assertFalse(mBubbleController.hasBubbles());
 
         // Dismiss the notification
-        boolean intercepted = mBubblesManager.handleDismissalInterception(mRow.getEntry());
+        boolean intercepted = mBubblesManager.handleDismissalInterception(mRow);
 
         // Intercept dismissal since bubble is going into overflow
         assertTrue(intercepted);
@@ -773,7 +775,7 @@
 
     @Test
     public void removeBubble_notIntercepted() {
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
         mBubbleController.updateBubble(mBubbleEntry);
 
         assertTrue(mBubbleController.hasBubbles());
@@ -781,11 +783,11 @@
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
         // Dismiss the bubble
-        mBubbleController.removeBubble(mRow.getEntry().getKey(), Bubbles.DISMISS_NOTIF_CANCEL);
+        mBubbleController.removeBubble(mRow.getKey(), Bubbles.DISMISS_NOTIF_CANCEL);
         assertFalse(mBubbleController.hasBubbles());
 
         // Dismiss the notification
-        boolean intercepted = mBubblesManager.handleDismissalInterception(mRow.getEntry());
+        boolean intercepted = mBubblesManager.handleDismissalInterception(mRow);
 
         // Not a bubble anymore so we don't intercept dismissal.
         assertFalse(intercepted);
@@ -797,13 +799,13 @@
                 mock(Bubbles.SuppressionChangedListener.class);
         mBubbleData.setSuppressionChangedListener(listener);
 
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
 
         assertTrue(mBubbleController.hasBubbles());
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
                 mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
 
-        mBubblesManager.handleDismissalInterception(mRow.getEntry());
+        mBubblesManager.handleDismissalInterception(mRow);
 
         // Should update show in shade state
         assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
@@ -811,7 +813,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
     }
 
     @Test
@@ -820,7 +822,7 @@
                 mock(Bubbles.SuppressionChangedListener.class);
         mBubbleData.setSuppressionChangedListener(listener);
 
-        mEntryListener.onEntryAdded(mRow.getEntry());
+        mEntryListener.onEntryAdded(mRow);
 
         assertTrue(mBubbleController.hasBubbles());
         assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
@@ -834,7 +836,7 @@
 
         // Should notify delegate that shade state changed
         verify(listener).onBubbleNotificationSuppressionChange(
-                mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()));
+                mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
index a9a558d..cd5aa9a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java
@@ -29,6 +29,7 @@
 import com.android.wm.shell.bubbles.BubbleDataRepository;
 import com.android.wm.shell.bubbles.BubbleLogger;
 import com.android.wm.shell.bubbles.BubblePositioner;
+import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TaskStackListenerImpl;
@@ -51,12 +52,13 @@
             TaskStackListenerImpl taskStackListener,
             ShellTaskOrganizer shellTaskOrganizer,
             BubblePositioner positioner,
+            DisplayController displayController,
             ShellExecutor shellMainExecutor,
             Handler shellMainHandler) {
         super(context, data, Runnable::run, floatingContentCoordinator, dataRepository,
                 statusBarService, windowManager, windowManagerShellWrapper, launcherApps,
-                bubbleLogger, taskStackListener, shellTaskOrganizer, positioner, shellMainExecutor,
-                shellMainHandler);
+                bubbleLogger, taskStackListener, shellTaskOrganizer, positioner, displayController,
+                shellMainExecutor, shellMainHandler);
         setInflateSynchronously(true);
         initialize();
     }
diff --git a/packages/overlays/IconPackVictorThemePickerOverlay/Android.bp b/packages/overlays/IconPackVictorThemePickerOverlay/Android.bp
index a18ebb3..690d0a0 100644
--- a/packages/overlays/IconPackVictorThemePickerOverlay/Android.bp
+++ b/packages/overlays/IconPackVictorThemePickerOverlay/Android.bp
@@ -26,6 +26,5 @@
 runtime_resource_overlay {
     name: "IconPackVictorThemePickerOverlay",
     theme: "IconPackVictorThemePicker",
-    certificate: "platform",
     product_specific: true,
 }
diff --git a/services/Android.bp b/services/Android.bp
index 20b89de..2281a15 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -180,68 +180,12 @@
         " --hide-package com.google.android.startop.iorap" +
         " --hide DeprecationMismatch" +
         " --hide HiddenTypedefConstant",
-    visibility: ["//visibility:private"],
+    visibility: ["//frameworks/base:__subpackages__"],
     filter_packages: ["com.android."],
 }
 
 droidstubs {
-    name: "services-stubs.sources",
-    srcs: [":services-all-sources"],
-    defaults: ["services-stubs-default"],
-    check_api: {
-        current: {
-            api_file: "api/current.txt",
-            removed_api_file: "api/removed.txt",
-        },
-        last_released: {
-            api_file: ":android.api.system-server.latest",
-            removed_api_file: ":removed.api.system-server.latest",
-            baseline_file: ":android-incompatibilities.api.system-server.latest",
-        },
-        api_lint: {
-            enabled: true,
-            new_since: ":android.api.system-server.latest",
-            baseline_file: "api/lint-baseline.txt",
-        },
-    },
-    dists: [
-        {
-            targets: [
-                "sdk",
-                "win_sdk",
-            ],
-            dir: "apistubs/android/system-server/api",
-            dest: "android.txt",
-            tag: ".api.txt",
-        },
-        {
-            targets: [
-                "sdk",
-                "win_sdk",
-            ],
-            dir: "apistubs/android/system-server/api",
-            dest: "removed.txt",
-            tag: ".removed-api.txt",
-        },
-    ],
-}
-
-java_library {
-    name: "android_system_server_stubs_current",
-    defaults: ["android_stubs_dists_default"],
-    srcs: [":services-stubs.sources"],
-    installable: false,
-    static_libs: ["android_module_lib_stubs_current"],
-    sdk_version: "none",
-    system_modules: "none",
-    java_version: "1.8",
-    dist: {
-        dir: "apistubs/android/system-server",
-    },
-}
-
-droidstubs {
-    name: "services-non-updatable-stubs.sources",
+    name: "services-non-updatable-stubs",
     srcs: [":services-non-updatable-sources"],
     defaults: ["services-stubs-default"],
     check_api: {
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 27be331..a80efc4 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -431,7 +431,7 @@
 
         final Session.SaveResult saveResult = session.showSaveLocked();
 
-        session.logContextCommitted(saveResult.getNoSaveReason());
+        session.logContextCommitted(saveResult.getNoSaveUiReason());
 
         if (saveResult.isLogSaveShown()) {
             session.logSaveUiShown();
@@ -876,7 +876,7 @@
                 changedFieldIds, changedDatasetIds, manuallyFilledFieldIds,
                 manuallyFilledDatasetIds, /* detectedFieldIdsList= */ null,
                 /* detectedFieldClassificationsList= */ null, appComponentName, compatMode,
-                Event.NO_SAVE_REASON_NONE);
+                Event.NO_SAVE_UI_REASON_NONE);
     }
 
     @GuardedBy("mLock")
diff --git a/services/autofill/java/com/android/server/autofill/AutofillUriGrantsManager.java b/services/autofill/java/com/android/server/autofill/AutofillUriGrantsManager.java
index 801be5e..51e023d 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillUriGrantsManager.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillUriGrantsManager.java
@@ -20,6 +20,8 @@
 
 import static com.android.server.autofill.Helper.sVerbose;
 
+import static java.lang.Integer.toHexString;
+
 import android.annotation.NonNull;
 import android.annotation.UserIdInt;
 import android.app.IUriGrantsManager;
@@ -33,32 +35,16 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 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.GuardedBy;
 import com.android.server.LocalServices;
-import com.android.server.uri.UriGrantsManagerInternal;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
+import com.android.server.wm.ActivityTaskManagerInternal;
 
 /**
- * Grants and revokes URI permissions for content-based autofill suggestions.
+ * Grants URI permissions for content-based autofill suggestions.
  *
- * <p>Note that the system cannot just hand out grants directly; it must always do so on behalf of
- * an owner (see {@link com.android.server.uri.UriGrantsManagerService}). For autofill, the owner
- * is the autofill service provider that creates a given autofill suggestion containing a content
- * URI. Therefore, this manager class must be instantiated with the service uid of the provider for
- * which it will manage URI grants.
- *
- * <p>To dump the state of this class, use {@code adb shell dumpsys autofill}.
+ * <p>URI permissions granted by this class are tied to the activity being filled. When the
+ * activity finishes, its URI grants are automatically revoked.
  *
  * <p>To dump all active URI permissions, use {@code adb shell dumpsys activity permissions}.
  */
@@ -69,26 +55,10 @@
     @UserIdInt
     private final int mSourceUserId;
     @NonNull
-    private final IBinder mPermissionOwner;
-    @NonNull
-    private final UriGrantsManagerInternal mUgmInternal;
+    private final ActivityTaskManagerInternal mActivityTaskMgrInternal;
     @NonNull
     private final IUriGrantsManager mUgm;
 
-    // We use a local lock here for simplicity, since the synchronized code does not depend on
-    // any other resources (the "hold and wait" condition required for deadlock is not present).
-    // If this changes in the future, instead of using a local lock this should be updated to
-    // use the shared lock from AutofillManagerServiceImpl.
-    @NonNull
-    private final Object mLock;
-
-    // Tracks the URIs that have been granted to each package. For each URI, the map stores the
-    // activities that triggered the grant. This allows revoking permissions only once all
-    // activities that triggered the grant are finished.
-    @NonNull
-    @GuardedBy("mLock")
-    private final ArrayMap<String, List<Pair<Uri, String>>> mActiveGrantsByPackage;
-
     /**
      * Creates a new instance of the manager.
      *
@@ -99,159 +69,60 @@
     AutofillUriGrantsManager(int serviceUid) {
         mSourceUid = serviceUid;
         mSourceUserId = UserHandle.getUserId(mSourceUid);
-        mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
-        mPermissionOwner = mUgmInternal.newUriPermissionOwner("autofill-" + serviceUid);
+        mActivityTaskMgrInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
         mUgm = UriGrantsManager.getService();
-        mLock = new Object();
-        mActiveGrantsByPackage = new ArrayMap<>(0);
     }
 
     public void grantUriPermissions(@NonNull ComponentName targetActivity,
-            @UserIdInt int targetUserId, @NonNull ClipData clip) {
-        String targetPkg = targetActivity.getPackageName();
+            @NonNull IBinder targetActivityToken, @UserIdInt int targetUserId,
+            @NonNull ClipData clip) {
+        final String targetPkg = targetActivity.getPackageName();
+        final IBinder permissionOwner =
+                mActivityTaskMgrInternal.getUriPermissionOwnerForActivity(targetActivityToken);
+        if (permissionOwner == null) {
+            Slog.w(TAG, "Can't grant URI permissions, because the target activity token is invalid:"
+                    + " clip=" + clip
+                    + ", targetActivity=" + targetActivity + ", targetUserId=" + targetUserId
+                    + ", targetActivityToken=" + toHexString(targetActivityToken.hashCode()));
+            return;
+        }
         for (int i = 0; i < clip.getItemCount(); i++) {
             ClipData.Item item = clip.getItemAt(i);
             Uri uri = item.getUri();
             if (uri == null || !SCHEME_CONTENT.equals(uri.getScheme())) {
                 continue;
             }
-            if (grantUriPermissions(targetPkg, targetUserId, uri)) {
-                addToActiveGrants(uri, targetActivity);
-            }
+            grantUriPermissions(uri, targetPkg, targetUserId, permissionOwner);
         }
     }
 
-    public void revokeUriPermissions(@NonNull ComponentName targetActivity,
-            @UserIdInt int targetUserId) {
-        String targetPkg = targetActivity.getPackageName();
-        Set<Uri> urisWhoseGrantsShouldBeRevoked = removeFromActiveGrants(targetActivity);
-        for (Uri uri : urisWhoseGrantsShouldBeRevoked) {
-            revokeUriPermissions(targetPkg, targetUserId, uri);
-        }
-    }
-
-    private boolean grantUriPermissions(@NonNull String targetPkg, @UserIdInt int targetUserId,
-            @NonNull Uri uri) {
+    private void grantUriPermissions(@NonNull Uri uri, @NonNull String targetPkg,
+            @UserIdInt int targetUserId, @NonNull IBinder permissionOwner) {
         final int sourceUserId = ContentProvider.getUserIdFromUri(uri, mSourceUserId);
         if (sVerbose) {
             Slog.v(TAG, "Granting URI permissions: uri=" + uri
                     + ", sourceUid=" + mSourceUid + ", sourceUserId=" + sourceUserId
-                    + ", targetPkg=" + targetPkg + ", targetUserId=" + targetUserId);
+                    + ", targetPkg=" + targetPkg + ", targetUserId=" + targetUserId
+                    + ", permissionOwner=" + toHexString(permissionOwner.hashCode()));
         }
         final Uri uriWithoutUserId = ContentProvider.getUriWithoutUserId(uri);
         final long ident = Binder.clearCallingIdentity();
         try {
             mUgm.grantUriPermissionFromOwner(
-                    mPermissionOwner,
+                    permissionOwner,
                     mSourceUid,
                     targetPkg,
                     uriWithoutUserId,
                     Intent.FLAG_GRANT_READ_URI_PERMISSION,
                     sourceUserId,
                     targetUserId);
-            return true;
         } catch (RemoteException e) {
             Slog.e(TAG, "Granting URI permissions failed: uri=" + uri
                     + ", sourceUid=" + mSourceUid + ", sourceUserId=" + sourceUserId
-                    + ", targetPkg=" + targetPkg + ", targetUserId=" + targetUserId, e);
-            return false;
+                    + ", targetPkg=" + targetPkg + ", targetUserId=" + targetUserId
+                    + ", permissionOwner=" + toHexString(permissionOwner.hashCode()), e);
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
     }
-
-    private void revokeUriPermissions(@NonNull String targetPkg, @UserIdInt int targetUserId,
-            @NonNull Uri uri) {
-        final int sourceUserId = ContentProvider.getUserIdFromUri(uri, mSourceUserId);
-        if (sVerbose) {
-            Slog.v(TAG, "Revoking URI permissions: uri=" + uri
-                    + ", sourceUid=" + mSourceUid + ", sourceUserId=" + sourceUserId
-                    + ", target=" + targetPkg + ", targetUserId=" + targetUserId);
-        }
-        final Uri uriWithoutUserId = ContentProvider.getUriWithoutUserId(uri);
-        final long ident = Binder.clearCallingIdentity();
-        try {
-            mUgmInternal.revokeUriPermissionFromOwner(
-                    mPermissionOwner,
-                    uriWithoutUserId,
-                    Intent.FLAG_GRANT_READ_URI_PERMISSION,
-                    sourceUserId,
-                    targetPkg,
-                    targetUserId);
-        } finally {
-            Binder.restoreCallingIdentity(ident);
-        }
-    }
-
-    private void addToActiveGrants(@NonNull Uri uri, @NonNull ComponentName targetActivity) {
-        synchronized (mLock) {
-            String packageName = targetActivity.getPackageName();
-            List<Pair<Uri, String>> uris = mActiveGrantsByPackage.computeIfAbsent(packageName,
-                    k -> new ArrayList<>(1));
-            uris.add(Pair.create(uri, targetActivity.getClassName()));
-        }
-    }
-
-    private Set<Uri> removeFromActiveGrants(@NonNull ComponentName targetActivity) {
-        synchronized (mLock) {
-            String targetPackageName = targetActivity.getPackageName();
-            List<Pair<Uri, String>> uris = mActiveGrantsByPackage.get(targetPackageName);
-            if (uris == null || uris.isEmpty()) {
-                return Collections.emptySet();
-            }
-
-            // Collect all URIs whose grant was triggered by the target activity.
-            String targetActivityClassName = targetActivity.getClassName();
-            Set<Uri> urisWhoseGrantsShouldBeRevoked = new ArraySet<>(1);
-            for (Iterator<Pair<Uri, String>> iter = uris.iterator(); iter.hasNext(); ) {
-                Pair<Uri, String> uriAndActivity = iter.next();
-                if (uriAndActivity.second.equals(targetActivityClassName)) {
-                    urisWhoseGrantsShouldBeRevoked.add(uriAndActivity.first);
-                    iter.remove();
-                }
-            }
-
-            // A URI grant may have been triggered by more than one activity for the same package.
-            // We should not revoke a grant if it was triggered by multiple activities and one or
-            // more of those activities is still alive. Therefore we do a second pass and prune
-            // the set of URIs to be revoked if an additional activity that triggered its grant
-            // is still present.
-            for (Pair<Uri, String> uriAndActivity : uris) {
-                urisWhoseGrantsShouldBeRevoked.remove(uriAndActivity.first);
-            }
-
-            // If there are no remaining URIs granted to the package, drop the entry from the map.
-            if (uris.isEmpty()) {
-                mActiveGrantsByPackage.remove(targetPackageName);
-            }
-            return urisWhoseGrantsShouldBeRevoked;
-        }
-    }
-
-    /**
-     * Dump the active URI grants.
-     */
-    public void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
-        synchronized (mLock) {
-            if (mActiveGrantsByPackage.isEmpty()) {
-                pw.print(prefix); pw.println("URI grants: none");
-                return;
-            }
-            pw.print(prefix); pw.println("URI grants:");
-            final String prefix2 = prefix + "  ";
-            final String prefix3 = prefix2 + "  ";
-            for (int i = mActiveGrantsByPackage.size() - 1; i >= 0; i--) {
-                String packageName = mActiveGrantsByPackage.keyAt(i);
-                pw.print(prefix2); pw.println(packageName);
-                List<Pair<Uri, String>> uris = mActiveGrantsByPackage.valueAt(i);
-                if (uris == null || uris.isEmpty())  {
-                    continue;
-                }
-                for (Pair<Uri, String> uriAndActivity : uris) {
-                    pw.print(prefix3);
-                    pw.println(uriAndActivity.first + ": " + uriAndActivity.second);
-                }
-            }
-        }
-    }
 }
diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
index db5bc4d..8525e36 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
@@ -57,7 +57,6 @@
 import com.android.internal.os.IResultReceiver;
 import com.android.server.autofill.ui.InlineFillUi;
 
-import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CancellationException;
@@ -152,8 +151,8 @@
      * Called by {@link Session} to request augmented autofill.
      */
     public void onRequestAutofillLocked(int sessionId, @NonNull IAutoFillManagerClient client,
-            int taskId, @NonNull ComponentName activityComponent, @NonNull AutofillId focusedId,
-            @Nullable AutofillValue focusedValue,
+            int taskId, @NonNull ComponentName activityComponent, @NonNull IBinder activityToken,
+            @NonNull AutofillId focusedId, @Nullable AutofillValue focusedValue,
             @Nullable InlineSuggestionsRequest inlineSuggestionsRequest,
             @Nullable Function<InlineFillUi, Boolean> inlineSuggestionsCallback,
             @NonNull Runnable onErrorCallback,
@@ -181,7 +180,8 @@
                                             inlineSuggestionsRequest, inlineSuggestionsData,
                                             clientState, focusedId, focusedValue,
                                             inlineSuggestionsCallback, client, onErrorCallback,
-                                            remoteRenderService, userId, activityComponent);
+                                            remoteRenderService, userId,
+                                            activityComponent, activityToken);
                                     if (!showingFillWindow) {
                                         requestAutofill.complete(null);
                                     }
@@ -253,7 +253,7 @@
             @NonNull IAutoFillManagerClient client, @NonNull Runnable onErrorCallback,
             @Nullable RemoteInlineSuggestionRenderService remoteRenderService,
             int userId,
-            @NonNull ComponentName targetActivity) {
+            @NonNull ComponentName targetActivity, @NonNull IBinder targetActivityToken) {
         if (inlineSuggestionsData == null || inlineSuggestionsData.isEmpty()
                 || inlineSuggestionsCallback == null || request == null
                 || remoteRenderService == null) {
@@ -307,8 +307,8 @@
                                     final ArrayList<AutofillId> fieldIds = dataset.getFieldIds();
                                     final ClipData content = dataset.getFieldContent();
                                     if (content != null) {
-                                        mUriGrantsManager.grantUriPermissions(
-                                                targetActivity, userId, content);
+                                        mUriGrantsManager.grantUriPermissions(targetActivity,
+                                                targetActivityToken, userId, content);
                                         final AutofillId fieldId = fieldIds.get(0);
                                         if (sDebug) {
                                             Slog.d(TAG, "Calling client autofillContent(): "
@@ -368,12 +368,6 @@
                 + ComponentName.flattenToShortString(mComponentName) + "]";
     }
 
-    @Override
-    public void dump(@NonNull String prefix, @NonNull PrintWriter pw) {
-        super.dump(prefix, pw);
-        mUriGrantsManager.dump(prefix, pw);
-    }
-
     /**
      * Called by {@link Session} when it's time to destroy all augmented autofill requests.
      */
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 6bf4967..042631d 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -450,7 +450,7 @@
                         return;
                     }
                     mPendingInlineSuggestionsRequest = inlineSuggestionsRequest;
-                    maybeRequestFillLocked();
+                    maybeRequestFillFromServiceLocked();
                     viewState.resetState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST);
                 }
             } : null;
@@ -462,7 +462,7 @@
             mPendingInlineSuggestionsRequest = inlineRequest;
         }
 
-        void maybeRequestFillLocked() {
+        void maybeRequestFillFromServiceLocked() {
             if (mPendingFillRequest == null) {
                 return;
             }
@@ -472,9 +472,12 @@
                     return;
                 }
 
-                mPendingFillRequest = new FillRequest(mPendingFillRequest.getId(),
-                        mPendingFillRequest.getFillContexts(), mPendingFillRequest.getClientState(),
-                        mPendingFillRequest.getFlags(), mPendingInlineSuggestionsRequest);
+                if (mPendingInlineSuggestionsRequest.isServiceSupported()) {
+                    mPendingFillRequest = new FillRequest(mPendingFillRequest.getId(),
+                            mPendingFillRequest.getFillContexts(),
+                            mPendingFillRequest.getClientState(),
+                            mPendingFillRequest.getFlags(), mPendingInlineSuggestionsRequest);
+                }
             }
 
             mRemoteFillService.onFillRequest(mPendingFillRequest);
@@ -581,7 +584,7 @@
                         /*inlineSuggestionsRequest=*/null);
 
                 mPendingFillRequest = request;
-                maybeRequestFillLocked();
+                maybeRequestFillFromServiceLocked();
             }
 
             if (mActivityToken != null) {
@@ -1686,7 +1689,7 @@
         if (content != null) {
             final AutofillUriGrantsManager autofillUgm =
                     remoteAugmentedAutofillService.getAutofillUriGrantsManager();
-            autofillUgm.grantUriPermissions(mComponentName, userId, content);
+            autofillUgm.grantUriPermissions(mComponentName, mActivityToken, userId, content);
         }
 
         // Fill the value into the field.
@@ -1774,7 +1777,7 @@
      */
     public void logContextCommitted() {
         mHandler.sendMessage(obtainMessage(Session::handleLogContextCommitted, this,
-                Event.NO_SAVE_REASON_NONE));
+                Event.NO_SAVE_UI_REASON_NONE));
     }
 
     /**
@@ -2163,7 +2166,7 @@
             Slog.w(TAG, "Call to Session#showSaveLocked() rejected - session: "
                     + id + " destroyed");
             return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ false,
-                    Event.NO_SAVE_REASON_NONE);
+                    Event.NO_SAVE_UI_REASON_NONE);
         }
         mSessionState = STATE_FINISHED;
         final FillResponse response = getLastResponseLocked("showSaveLocked(%s)");
@@ -2182,14 +2185,14 @@
         if (saveInfo == null) {
             if (sVerbose) Slog.v(TAG, "showSaveLocked(" + this.id + "): no saveInfo from service");
             return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
-                    Event.NO_SAVE_REASON_NO_SAVE_INFO);
+                    Event.NO_SAVE_UI_REASON_NO_SAVE_INFO);
         }
 
         if ((saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) != 0) {
             // TODO(b/113281366): log metrics
             if (sDebug) Slog.v(TAG, "showSaveLocked(" + this.id + "): service asked to delay save");
             return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ false,
-                    Event.NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG);
+                    Event.NO_SAVE_UI_REASON_WITH_DELAY_SAVE_FLAG);
         }
 
         final ArrayMap<AutofillId, InternalSanitizer> sanitizers = createSanitizers(saveInfo);
@@ -2283,7 +2286,7 @@
         }
         int saveDialogNotShowReason;
         if (!allRequiredAreNotEmpty) {
-            saveDialogNotShowReason = Event.NO_SAVE_REASON_HAS_EMPTY_REQUIRED;
+            saveDialogNotShowReason = Event.NO_SAVE_UI_REASON_HAS_EMPTY_REQUIRED;
         } else {
             // Must look up all optional ids in 2 scenarios:
             // - if no required id changed but an optional id did, it should trigger save / update
@@ -2336,7 +2339,7 @@
                 }
             }
             if (!atLeastOneChanged) {
-                saveDialogNotShowReason = Event.NO_SAVE_REASON_NO_VALUE_CHANGED;
+                saveDialogNotShowReason = Event.NO_SAVE_UI_REASON_NO_VALUE_CHANGED;
             } else {
                 if (sDebug) {
                     Slog.d(TAG, "at least one field changed, validate fields for save UI");
@@ -2356,14 +2359,14 @@
                         log.setType(MetricsEvent.TYPE_FAILURE);
                         mMetricsLogger.write(log);
                         return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
-                                Event.NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
+                                Event.NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED);
                     }
 
                     mMetricsLogger.write(log);
                     if (!isValid) {
                         Slog.i(TAG, "not showing save UI because fields failed validation");
                         return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
-                                Event.NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
+                                Event.NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED);
                     }
                 }
 
@@ -2403,7 +2406,7 @@
                                     + "dataset #" + i + ": " + dataset);
                         }
                         return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
-                                Event.NO_SAVE_REASON_DATASET_MATCH);
+                                Event.NO_SAVE_UI_REASON_DATASET_MATCH);
                     }
                 }
 
@@ -2424,7 +2427,7 @@
                 if (serviceLabel == null || serviceIcon == null) {
                     wtf(null, "showSaveLocked(): no service label or icon");
                     return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
-                            Event.NO_SAVE_REASON_NONE);
+                            Event.NO_SAVE_UI_REASON_NONE);
                 }
 
                 getUiForShowing().showSaveUi(serviceLabel, serviceIcon,
@@ -2439,7 +2442,7 @@
                 }
                 mSessionFlags.mShowingSaveUi = true;
                 return new SaveResult(/* logSaveShown= */ true, /* removeSession= */ false,
-                        Event.NO_SAVE_REASON_NONE);
+                        Event.NO_SAVE_UI_REASON_NONE);
             }
         }
         // Nothing changed...
@@ -3188,6 +3191,17 @@
             return false;
         }
 
+        final InlineSuggestionsRequest request = inlineSuggestionsRequest.get();
+        if (mSessionFlags.mClientSuggestionsEnabled && !request.isClientSupported()
+                || !mSessionFlags.mClientSuggestionsEnabled && !request.isServiceSupported()) {
+            if (sDebug) {
+                Slog.d(TAG, "Inline suggestions not supported for "
+                        + (mSessionFlags.mClientSuggestionsEnabled ? "client" : "service")
+                        + ". Falling back to dropdown.");
+            }
+            return false;
+        }
+
         final RemoteInlineSuggestionRenderService remoteRenderService =
                 mService.getRemoteInlineSuggestionRenderServiceLocked();
         if (remoteRenderService == null) {
@@ -3196,7 +3210,7 @@
         }
 
         final InlineFillUi.InlineFillUiInfo inlineFillUiInfo =
-                new InlineFillUi.InlineFillUiInfo(inlineSuggestionsRequest.get(), focusedId,
+                new InlineFillUi.InlineFillUiInfo(request, focusedId,
                         filterText, remoteRenderService, userId, id);
         InlineFillUi inlineFillUi = InlineFillUi.forAutofill(inlineFillUiInfo, response,
                 new InlineFillUi.InlineSuggestionUiCallback() {
@@ -3523,7 +3537,8 @@
                     synchronized (mLock) {
                         logAugmentedAutofillRequestLocked(mode, remoteService.getComponentName(),
                                 focusedId, isWhitelisted, inlineSuggestionsRequest != null);
-                        remoteService.onRequestAutofillLocked(id, mClient, taskId, mComponentName,
+                        remoteService.onRequestAutofillLocked(id, mClient,
+                                taskId, mComponentName, mActivityToken,
                                 AutofillId.withoutSession(focusedId), currentValue,
                                 inlineSuggestionsRequest, inlineSuggestionsResponseCallback,
                                 /*onErrorCallback=*/ () -> {
@@ -3809,6 +3824,10 @@
             mContexts = new ArrayList<>(1);
         }
 
+        if (inlineSuggestionsRequest != null && !inlineSuggestionsRequest.isClientSupported()) {
+            inlineSuggestionsRequest = null;
+        }
+
         mClientSuggestionsSession.onFillRequest(requestId, inlineSuggestionsRequest, mFlags);
     }
 
@@ -3882,7 +3901,7 @@
          * @return The reason why a save dialog was not shown.
          */
         @NoSaveReason
-        public int getNoSaveReason() {
+        public int getNoSaveUiReason() {
             return mSaveDialogNotShowReason;
         }
 
@@ -4149,13 +4168,6 @@
         if (remoteRenderService != null) {
             remoteRenderService.destroySuggestionViews(userId, id);
         }
-        final RemoteAugmentedAutofillService remoteAugmentedAutofillService =
-                mService.getRemoteAugmentedAutofillServiceIfCreatedLocked();
-        if (remoteAugmentedAutofillService != null) {
-            final AutofillUriGrantsManager autofillUgm =
-                    remoteAugmentedAutofillService.getAutofillUriGrantsManager();
-            autofillUgm.revokeUriPermissions(mComponentName, userId);
-        }
 
         mDestroyed = true;
 
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 5dd9b0e..b4fcb9c 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -1120,11 +1120,6 @@
             int filterCallingUid, int userId);
 
     /**
-     * Notifies that a package has crashed or ANR'd.
-     */
-    public abstract void notifyPackageCrashOrAnr(String packageName);
-
-    /**
      * Requesting the checksums for APKs within a package.
      * See {@link PackageManager#requestChecksums} for details.
      *
diff --git a/services/core/java/com/android/server/BinderCallsStatsService.java b/services/core/java/com/android/server/BinderCallsStatsService.java
index 78610a2..0bd331b 100644
--- a/services/core/java/com/android/server/BinderCallsStatsService.java
+++ b/services/core/java/com/android/server/BinderCallsStatsService.java
@@ -19,6 +19,15 @@
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
 
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_COLLECT_LATENCY_DATA_KEY;
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_DETAILED_TRACKING_KEY;
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_ENABLED_KEY;
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_IGNORE_BATTERY_STATUS_KEY;
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_MAX_CALL_STATS_KEY;
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_SAMPLING_INTERVAL_KEY;
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_TRACK_DIRECT_CALLING_UID_KEY;
+import static com.android.internal.os.BinderCallsStats.SettingsObserver.SETTINGS_TRACK_SCREEN_INTERACTIVE_KEY;
+
 import android.app.ActivityThread;
 import android.content.Context;
 import android.content.pm.PackageInfo;
@@ -43,7 +52,6 @@
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.os.BinderCallsStats;
 import com.android.internal.os.BinderInternal;
-import com.android.internal.os.BinderLatencyObserver;
 import com.android.internal.os.CachedDeviceState;
 import com.android.internal.util.DumpUtils;
 
@@ -125,28 +133,6 @@
 
     /** Listens for flag changes. */
     private static class SettingsObserver extends ContentObserver {
-        // Settings for BinderCallsStats.
-        private static final String SETTINGS_ENABLED_KEY = "enabled";
-        private static final String SETTINGS_DETAILED_TRACKING_KEY = "detailed_tracking";
-        private static final String SETTINGS_UPLOAD_DATA_KEY = "upload_data";
-        private static final String SETTINGS_SAMPLING_INTERVAL_KEY = "sampling_interval";
-        private static final String SETTINGS_TRACK_SCREEN_INTERACTIVE_KEY = "track_screen_state";
-        private static final String SETTINGS_TRACK_DIRECT_CALLING_UID_KEY = "track_calling_uid";
-        private static final String SETTINGS_MAX_CALL_STATS_KEY = "max_call_stats_count";
-        private static final String SETTINGS_IGNORE_BATTERY_STATUS_KEY = "ignore_battery_status";
-        // Settings for BinderLatencyObserver.
-        private static final String SETTINGS_COLLECT_LATENCY_DATA_KEY = "collect_Latency_data";
-        private static final String SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY =
-                "latency_observer_sampling_interval";
-        private static final String SETTINGS_LATENCY_OBSERVER_PUSH_INTERVAL_MINUTES_KEY =
-                "latency_observer_push_interval_minutes";
-        private static final String SETTINGS_LATENCY_HISTOGRAM_BUCKET_COUNT_KEY =
-                "latency_histogram_bucket_count";
-        private static final String SETTINGS_LATENCY_HISTOGRAM_FIRST_BUCKET_SIZE_KEY =
-                "latency_histogram_first_bucket_size";
-        private static final String SETTINGS_LATENCY_HISTOGRAM_BUCKET_SCALE_FACTOR_KEY =
-                "latency_histogram_bucket_scale_factor";
-
         private boolean mEnabled;
         private final Uri mUri = Settings.Global.getUriFor(Settings.Global.BINDER_CALLS_STATS);
         private final Context mContext;
@@ -206,23 +192,9 @@
                     mParser.getBoolean(SETTINGS_COLLECT_LATENCY_DATA_KEY,
                     BinderCallsStats.DEFAULT_COLLECT_LATENCY_DATA));
             // Binder latency observer settings.
-            BinderLatencyObserver binderLatencyObserver = mBinderCallsStats.getLatencyObserver();
-            binderLatencyObserver.setSamplingInterval(mParser.getInt(
-                    SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY,
-                    BinderLatencyObserver.PERIODIC_SAMPLING_INTERVAL_DEFAULT));
-            binderLatencyObserver.setHistogramBucketsParams(
-                    mParser.getInt(
-                        SETTINGS_LATENCY_HISTOGRAM_BUCKET_COUNT_KEY,
-                        BinderLatencyObserver.BUCKET_COUNT_DEFAULT),
-                    mParser.getInt(
-                        SETTINGS_LATENCY_HISTOGRAM_FIRST_BUCKET_SIZE_KEY,
-                        BinderLatencyObserver.FIRST_BUCKET_SIZE_DEFAULT),
-                    mParser.getFloat(
-                        SETTINGS_LATENCY_HISTOGRAM_BUCKET_SCALE_FACTOR_KEY,
-                        BinderLatencyObserver.BUCKET_SCALE_FACTOR_DEFAULT));
-            binderLatencyObserver.setPushInterval(mParser.getInt(
-                    SETTINGS_LATENCY_OBSERVER_PUSH_INTERVAL_MINUTES_KEY,
-                    BinderLatencyObserver.STATSD_PUSH_INTERVAL_MINUTES_DEFAULT));
+            BinderCallsStats.SettingsObserver.configureLatencyObserver(
+                    mParser,
+                    mBinderCallsStats.getLatencyObserver());
 
             final boolean enabled =
                     mParser.getBoolean(SETTINGS_ENABLED_KEY, BinderCallsStats.ENABLED_DEFAULT);
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index c3a5d1f..c5246c7 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -18,16 +18,20 @@
 
 import static android.Manifest.permission.BLUETOOTH_CONNECT;
 import static android.content.PermissionChecker.PERMISSION_HARD_DENIED;
+import static android.content.PermissionChecker.PID_UNKNOWN;
 import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
 import static android.os.UserHandle.USER_SYSTEM;
 
 import android.Manifest;
 import android.annotation.RequiresPermission;
 import android.annotation.SuppressLint;
+import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.AppGlobals;
 import android.app.AppOpsManager;
+import android.app.BroadcastOptions;
 import android.bluetooth.BluetoothA2dp;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothHearingAid;
@@ -42,6 +46,7 @@
 import android.bluetooth.IBluetoothProfileServiceConnection;
 import android.bluetooth.IBluetoothStateChangeCallback;
 import android.content.ActivityNotFoundException;
+import android.content.AttributionSource;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -62,6 +67,7 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
+import android.os.PowerExemptionManager;
 import android.os.Process;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
@@ -302,13 +308,13 @@
                 DELAY_BEFORE_RESTART_DUE_TO_INIT_FLAGS_CHANGED_MS);
     }
 
-    public boolean onFactoryReset() {
+    public boolean onFactoryReset(AttributionSource attributionSource) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED,
                 "Need BLUETOOTH_PRIVILEGED permission");
 
         final long token = Binder.clearCallingIdentity();
         try {
-            return onFactoryResetInternal();
+            return onFactoryResetInternal(attributionSource);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -318,7 +324,7 @@
             android.Manifest.permission.BLUETOOTH_CONNECT,
             android.Manifest.permission.BLUETOOTH_PRIVILEGED,
     })
-    private boolean onFactoryResetInternal() {
+    private boolean onFactoryResetInternal(AttributionSource attributionSource) {
         // Wait for stable state if bluetooth is temporary state.
         int state = getState();
         if (state == BluetoothAdapter.STATE_BLE_TURNING_ON
@@ -347,7 +353,7 @@
                 addActiveLog(
                         BluetoothProtoEnums.ENABLE_DISABLE_REASON_FACTORY_RESET,
                         mContext.getPackageName(), false);
-                mBluetooth.disable();
+                mBluetooth.disable(attributionSource);
                 return true;
             }
         } catch (RemoteException e) {
@@ -943,7 +949,8 @@
     }
 
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
-    private boolean checkBluetoothPermissions(String packageName, boolean requireForeground) {
+    private boolean checkBluetoothPermissions(AttributionSource attributionSource, String message,
+            boolean requireForeground) {
         if (isBluetoothDisallowed()) {
             if (DBG) {
                 Slog.d(TAG, "checkBluetoothPermissions: bluetooth disallowed");
@@ -954,22 +961,24 @@
         final int callingUid = Binder.getCallingUid();
         final boolean isCallerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID;
         if (!isCallerSystem) {
-            checkPackage(callingUid, packageName);
+            checkPackage(callingUid, attributionSource.getPackageName());
 
             if (requireForeground && !checkIfCallerIsForegroundUser()) {
                 Slog.w(TAG, "Not allowed for non-active and non system user");
                 return false;
             }
 
-            if (!checkConnectPermissionForPreflight(mContext)) {
+            if (!checkConnectPermissionForDataDelivery(mContext, attributionSource, message)) {
                 return false;
             }
         }
         return true;
     }
 
-    public boolean enableBle(String packageName, IBinder token) throws RemoteException {
-        if (!checkBluetoothPermissions(packageName, false)) {
+    public boolean enableBle(AttributionSource attributionSource, IBinder token)
+            throws RemoteException {
+        final String packageName = attributionSource.getPackageName();
+        if (!checkBluetoothPermissions(attributionSource, "enableBle", false)) {
             if (DBG) {
                 Slog.d(TAG, "enableBle(): bluetooth disallowed");
             }
@@ -999,8 +1008,10 @@
     }
 
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
-    public boolean disableBle(String packageName, IBinder token) throws RemoteException {
-        if (!checkBluetoothPermissions(packageName, false)) {
+    public boolean disableBle(AttributionSource attributionSource, IBinder token)
+            throws RemoteException {
+        final String packageName = attributionSource.getPackageName();
+        if (!checkBluetoothPermissions(attributionSource, "disableBle", false)) {
             if (DBG) {
                 Slog.d(TAG, "disableBLE(): bluetooth disallowed");
             }
@@ -1099,7 +1110,7 @@
         if (isBleAppPresent()) {
             // Need to stay at BLE ON. Disconnect all Gatt connections
             try {
-                mBluetoothGatt.unregAll();
+                mBluetoothGatt.unregAll(mContext.getAttributionSource());
             } catch (RemoteException e) {
                 Slog.e(TAG, "Unable to disconnect all apps.", e);
             }
@@ -1118,8 +1129,9 @@
 
     }
 
-    public boolean enableNoAutoConnect(String packageName) {
-        if (!checkBluetoothPermissions(packageName, false)) {
+    public boolean enableNoAutoConnect(AttributionSource attributionSource) {
+        final String packageName = attributionSource.getPackageName();
+        if (!checkBluetoothPermissions(attributionSource, "enableNoAutoConnect", false)) {
             if (DBG) {
                 Slog.d(TAG, "enableNoAutoConnect(): not enabling - bluetooth disallowed");
             }
@@ -1145,8 +1157,9 @@
         return true;
     }
 
-    public boolean enable(String packageName) throws RemoteException {
-        if (!checkBluetoothPermissions(packageName, true)) {
+    public boolean enable(AttributionSource attributionSource) throws RemoteException {
+        final String packageName = attributionSource.getPackageName();
+        if (!checkBluetoothPermissions(attributionSource, "enable", true)) {
             if (DBG) {
                 Slog.d(TAG, "enable(): not enabling - bluetooth disallowed");
             }
@@ -1179,8 +1192,10 @@
         return true;
     }
 
-    public boolean disable(String packageName, boolean persist) throws RemoteException {
-        if (!checkBluetoothPermissions(packageName, true)) {
+    public boolean disable(AttributionSource attributionSource, boolean persist)
+            throws RemoteException {
+        final String packageName = attributionSource.getPackageName();
+        if (!checkBluetoothPermissions(attributionSource, "disable", true)) {
             if (DBG) {
                 Slog.d(TAG, "disable(): not disabling - bluetooth disallowed");
             }
@@ -1696,8 +1711,8 @@
         }
     }
 
-    public String getAddress() {
-        if (!checkConnectPermissionForPreflight(mContext)) {
+    public String getAddress(AttributionSource attributionSource) {
+        if (!checkConnectPermissionForDataDelivery(mContext, attributionSource, "getAddress")) {
             return null;
         }
 
@@ -1714,7 +1729,7 @@
         try {
             mBluetoothLock.readLock().lock();
             if (mBluetooth != null) {
-                return mBluetooth.getAddress();
+                return mBluetooth.getAddressWithAttribution(mContext.getAttributionSource());
             }
         } catch (RemoteException e) {
             Slog.e(TAG,
@@ -1730,8 +1745,8 @@
         return mAddress;
     }
 
-    public String getName() {
-        if (!checkConnectPermissionForPreflight(mContext)) {
+    public String getName(AttributionSource attributionSource) {
+        if (!checkConnectPermissionForDataDelivery(mContext, attributionSource, "getName")) {
             return null;
         }
 
@@ -1743,7 +1758,7 @@
         try {
             mBluetoothLock.readLock().lock();
             if (mBluetooth != null) {
-                return mBluetooth.getName();
+                return mBluetooth.getName(mContext.getAttributionSource());
             }
         } catch (RemoteException e) {
             Slog.e(TAG, "getName(): Unable to retrieve name remotely. Returning cached name", e);
@@ -1830,7 +1845,10 @@
                             }
                         } else if (mBluetooth != null) {
                             try {
-                                storeNameAndAddress(mBluetooth.getName(), mBluetooth.getAddress());
+                                storeNameAndAddress(
+                                        mBluetooth.getName(mContext.getAttributionSource()),
+                                        mBluetooth.getAddressWithAttribution(
+                                                mContext.getAttributionSource()));
                             } catch (RemoteException re) {
                                 Slog.e(TAG, "Unable to grab names", re);
                             }
@@ -2096,7 +2114,7 @@
 
                         //Do enable request
                         try {
-                            if (!mBluetooth.enable(mQuietEnable)) {
+                            if (!mBluetooth.enable(mQuietEnable, mContext.getAttributionSource())) {
                                 Slog.e(TAG, "IBluetooth.enable() returned false");
                             }
                         } catch (RemoteException e) {
@@ -2417,7 +2435,7 @@
             } else if (mBluetooth != null) {
                 //Enable bluetooth
                 try {
-                    if (!mBluetooth.enable(mQuietEnable)) {
+                    if (!mBluetooth.enable(mQuietEnable, mContext.getAttributionSource())) {
                         Slog.e(TAG, "IBluetooth.enable() returned false");
                     }
                 } catch (RemoteException e) {
@@ -2447,7 +2465,7 @@
                 if (DBG) {
                     Slog.d(TAG, "Sending off request.");
                 }
-                if (!mBluetooth.disable()) {
+                if (!mBluetooth.disable(mContext.getAttributionSource())) {
                     Slog.e(TAG, "IBluetooth.disable() returned false");
                 }
             }
@@ -2494,7 +2512,7 @@
         intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
         intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
         intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
-        mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_CONNECT);
+        mContext.sendBroadcastAsUser(intent, UserHandle.ALL, null, getTempAllowlistBroadcastOptions());
     }
 
     @RequiresPermission(allOf = {
@@ -2577,7 +2595,8 @@
             intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
             intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
             intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
-            mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_CONNECT);
+            mContext.sendBroadcastAsUser(intent, UserHandle.ALL, null, 
+                    getTempAllowlistBroadcastOptions());
         }
     }
 
@@ -2871,6 +2890,25 @@
         }
     }
 
+    private static boolean checkPermissionForDataDelivery(Context context, String permission,
+            AttributionSource attributionSource, String message) {
+        final int result = PermissionChecker.checkPermissionForDataDeliveryFromDataSource(
+                context, permission, PID_UNKNOWN,
+                new AttributionSource(context.getAttributionSource(), attributionSource), message);
+        if (result == PERMISSION_GRANTED) {
+            return true;
+        }
+
+        final String msg = "Need " + permission + " permission for " + attributionSource + ": "
+                + message;
+        if (result == PERMISSION_HARD_DENIED) {
+            throw new SecurityException(msg);
+        } else {
+            Log.w(TAG, msg);
+            return false;
+        }
+    }
+
     /**
      * Returns true if the BLUETOOTH_CONNECT permission is granted for the calling app. Returns
      * false if the result is a soft denial. Throws SecurityException if the result is a hard
@@ -2879,12 +2917,18 @@
      * <p>Should be used in situations where the app op should not be noted.
      */
     @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
-    private static boolean checkConnectPermissionForPreflight(Context context) {
-        int permissionCheckResult = PermissionChecker.checkCallingOrSelfPermissionForPreflight(
-                context, BLUETOOTH_CONNECT);
-        if (permissionCheckResult == PERMISSION_HARD_DENIED) {
-            throw new SecurityException("Need BLUETOOTH_CONNECT permission");
-        }
-        return permissionCheckResult == PERMISSION_GRANTED;
+    public static boolean checkConnectPermissionForDataDelivery(
+            Context context, AttributionSource attributionSource, String message) {
+        return checkPermissionForDataDelivery(context, BLUETOOTH_CONNECT,
+                attributionSource, message);
+    }
+
+    static @NonNull Bundle getTempAllowlistBroadcastOptions() {
+        final long duration = 10_000;
+        final BroadcastOptions bOptions = BroadcastOptions.makeBasic();
+        bOptions.setTemporaryAppAllowlist(duration,
+                TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
+                PowerExemptionManager.REASON_BLUETOOTH_BROADCAST, "");
+        return bOptions.toBundle();
     }
 }
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 809ef41..8e12cb2 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -15,6 +15,7 @@
  */
 
 package com.android.server;
+
 import static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE;
 import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
 import static android.content.pm.PackageManager.FEATURE_WATCH;
@@ -33,7 +34,6 @@
 import static android.net.ConnectivityManager.BLOCKED_REASON_LOCKDOWN_VPN;
 import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
 import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
 import static android.net.ConnectivityManager.TYPE_BLUETOOTH;
 import static android.net.ConnectivityManager.TYPE_ETHERNET;
 import static android.net.ConnectivityManager.TYPE_MOBILE;
@@ -53,6 +53,7 @@
 import static android.net.ConnectivityManager.TYPE_WIFI_P2P;
 import static android.net.ConnectivityManager.getNetworkTypeName;
 import static android.net.ConnectivityManager.isNetworkTypeValid;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_PRIVDNS;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_PARTIAL;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_VALID;
@@ -77,7 +78,6 @@
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.net.NetworkCapabilities.TRANSPORT_TEST;
 import static android.net.NetworkCapabilities.TRANSPORT_VPN;
-import static android.net.NetworkPolicyManager.blockedReasonsToString;
 import static android.net.NetworkRequest.Type.LISTEN_FOR_BEST;
 import static android.net.shared.NetworkMonitorUtils.isPrivateDnsValidationRequired;
 import static android.os.Process.INVALID_UID;
@@ -321,7 +321,8 @@
     private static final int MAX_NETWORK_REQUESTS_PER_UID = 100;
 
     // The maximum number of network request allowed for system UIDs before an exception is thrown.
-    private static final int MAX_NETWORK_REQUESTS_PER_SYSTEM_UID = 250;
+    @VisibleForTesting
+    static final int MAX_NETWORK_REQUESTS_PER_SYSTEM_UID = 250;
 
     @VisibleForTesting
     protected int mLingerDelayMs;  // Can't be final, or test subclass constructors can't change it.
@@ -338,7 +339,8 @@
     protected final PermissionMonitor mPermissionMonitor;
 
     private final PerUidCounter mNetworkRequestCounter;
-    private final PerUidCounter mSystemNetworkRequestCounter;
+    @VisibleForTesting
+    final PerUidCounter mSystemNetworkRequestCounter;
 
     private volatile boolean mLockdownEnabled;
 
@@ -1060,8 +1062,9 @@
         private final int mMaxCountPerUid;
 
         // Map from UID to number of NetworkRequests that UID has filed.
+        @VisibleForTesting
         @GuardedBy("mUidToNetworkRequestCount")
-        private final SparseIntArray mUidToNetworkRequestCount = new SparseIntArray();
+        final SparseIntArray mUidToNetworkRequestCount = new SparseIntArray();
 
         /**
          * Constructor
@@ -1085,15 +1088,20 @@
          */
         public void incrementCountOrThrow(final int uid) {
             synchronized (mUidToNetworkRequestCount) {
-                final int networkRequests = mUidToNetworkRequestCount.get(uid, 0) + 1;
-                if (networkRequests >= mMaxCountPerUid) {
-                    throw new ServiceSpecificException(
-                            ConnectivityManager.Errors.TOO_MANY_REQUESTS);
-                }
-                mUidToNetworkRequestCount.put(uid, networkRequests);
+                incrementCountOrThrow(uid, 1 /* numToIncrement */);
             }
         }
 
+        private void incrementCountOrThrow(final int uid, final int numToIncrement) {
+            final int newRequestCount =
+                    mUidToNetworkRequestCount.get(uid, 0) + numToIncrement;
+            if (newRequestCount >= mMaxCountPerUid) {
+                throw new ServiceSpecificException(
+                        ConnectivityManager.Errors.TOO_MANY_REQUESTS);
+            }
+            mUidToNetworkRequestCount.put(uid, newRequestCount);
+        }
+
         /**
          * Decrements the request count of the given uid.
          *
@@ -1101,16 +1109,50 @@
          */
         public void decrementCount(final int uid) {
             synchronized (mUidToNetworkRequestCount) {
-                final int requests = mUidToNetworkRequestCount.get(uid, 0);
-                if (requests < 1) {
-                    logwtf("BUG: too small request count " + requests + " for UID " + uid);
-                } else if (requests == 1) {
-                    mUidToNetworkRequestCount.delete(uid);
-                } else {
-                    mUidToNetworkRequestCount.put(uid, requests - 1);
-                }
+                decrementCount(uid, 1 /* numToDecrement */);
             }
         }
+
+        private void decrementCount(final int uid, final int numToDecrement) {
+            final int newRequestCount =
+                    mUidToNetworkRequestCount.get(uid, 0) - numToDecrement;
+            if (newRequestCount < 0) {
+                logwtf("BUG: too small request count " + newRequestCount + " for UID " + uid);
+            } else if (newRequestCount == 0) {
+                mUidToNetworkRequestCount.delete(uid);
+            } else {
+                mUidToNetworkRequestCount.put(uid, newRequestCount);
+            }
+        }
+
+        /**
+         * Used to adjust the request counter for the per-app API flows. Directly adjusting the
+         * counter is not ideal however in the per-app flows, the nris can't be removed until they
+         * are used to create the new nris upon set. Therefore the request count limit can be
+         * artificially hit. This method is used as a workaround for this particular case so that
+         * the request counts are accounted for correctly.
+         * @param uid the uid to adjust counts for
+         * @param numOfNewRequests the new request count to account for
+         * @param r the runnable to execute
+         */
+        public void transact(final int uid, final int numOfNewRequests, @NonNull final Runnable r) {
+            // This should only be used on the handler thread as per all current and foreseen
+            // use-cases. ensureRunningOnConnectivityServiceThread() can't be used because there is
+            // no ref to the outer ConnectivityService.
+            synchronized (mUidToNetworkRequestCount) {
+                final int reqCountOverage = getCallingUidRequestCountOverage(uid, numOfNewRequests);
+                decrementCount(uid, reqCountOverage);
+                r.run();
+                incrementCountOrThrow(uid, reqCountOverage);
+            }
+        }
+
+        private int getCallingUidRequestCountOverage(final int uid, final int numOfNewRequests) {
+            final int newUidRequestCount = mUidToNetworkRequestCount.get(uid, 0)
+                    + numOfNewRequests;
+            return newUidRequestCount >= MAX_NETWORK_REQUESTS_PER_SYSTEM_UID
+                    ? newUidRequestCount - (MAX_NETWORK_REQUESTS_PER_SYSTEM_UID - 1) : 0;
+        }
     }
 
     /**
@@ -1594,7 +1636,7 @@
                 ? nri.getActiveRequest().requestId : nri.mRequests.get(0).requestId;
         mNetworkInfoBlockingLogs.log(String.format(
                 "%s %d(%d) on netId %d: %s", action, nri.mAsUid, requestId, net.getNetId(),
-                blockedReasonsToString(blocked)));
+                Integer.toHexString(blocked)));
     }
 
     /**
@@ -2152,11 +2194,11 @@
         for (NetworkStateSnapshot snapshot : getAllNetworkStateSnapshots()) {
             // NetworkStateSnapshot doesn't contain NetworkInfo, so need to fetch it from the
             // NetworkAgentInfo.
-            final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(snapshot.network);
+            final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(snapshot.getNetwork());
             if (nai != null && nai.networkInfo.isConnected()) {
                 result.add(new NetworkState(new NetworkInfo(nai.networkInfo),
-                        snapshot.linkProperties, snapshot.networkCapabilities, snapshot.network,
-                        snapshot.subscriberId));
+                        snapshot.getLinkProperties(), snapshot.getNetworkCapabilities(),
+                        snapshot.getNetwork(), snapshot.getSubscriberId()));
             }
         }
         return result.toArray(new NetworkState[result.size()]);
@@ -2878,7 +2920,7 @@
                 final int uid = mUidBlockedReasons.keyAt(i);
                 final int blockedReasons = mUidBlockedReasons.valueAt(i);
                 pw.println("UID=" + uid + " blockedReasons="
-                        + blockedReasonsToString(blockedReasons));
+                        + Integer.toHexString(blockedReasons));
             } catch (ArrayIndexOutOfBoundsException e) {
                 pw.println("  ArrayIndexOutOfBoundsException");
             } catch (ConcurrentModificationException e) {
@@ -8631,8 +8673,7 @@
 
         // restore private DNS settings to default mode (opportunistic)
         if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_PRIVATE_DNS)) {
-            Settings.Global.putString(mContext.getContentResolver(),
-                    ConnectivitySettingsManager.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OPPORTUNISTIC);
+            ConnectivitySettingsManager.setPrivateDnsMode(mContext, PRIVATE_DNS_MODE_OPPORTUNISTIC);
         }
 
         Settings.Global.putString(mContext.getContentResolver(),
@@ -8724,7 +8765,7 @@
         if (vpn == null) return VpnManager.TYPE_VPN_NONE;
         final TransportInfo ti = vpn.networkCapabilities.getTransportInfo();
         if (!(ti instanceof VpnTransportInfo)) return VpnManager.TYPE_VPN_NONE;
-        return ((VpnTransportInfo) ti).type;
+        return ((VpnTransportInfo) ti).getType();
     }
 
     /**
@@ -9653,7 +9694,8 @@
             // request.
             final ArrayList<NetworkRequest> nrs = new ArrayList<>();
             nrs.add(createNetworkRequest(NetworkRequest.Type.REQUEST, pref.capabilities));
-            nrs.add(createDefaultRequest());
+            nrs.add(createDefaultInternetRequestForTransport(
+                    TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT));
             setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids()));
             final NetworkRequestInfo nri = new NetworkRequestInfo(Process.myUid(), nrs);
             result.add(nri);
@@ -9680,9 +9722,13 @@
         validateNetworkCapabilitiesOfProfileNetworkPreference(preference.capabilities);
 
         mProfileNetworkPreferences = mProfileNetworkPreferences.plus(preference);
-        final ArraySet<NetworkRequestInfo> nris =
-                createNrisFromProfileNetworkPreferences(mProfileNetworkPreferences);
-        replaceDefaultNetworkRequestsForPreference(nris);
+        mSystemNetworkRequestCounter.transact(
+                mDeps.getCallingUid(), mProfileNetworkPreferences.preferences.size(),
+                () -> {
+                    final ArraySet<NetworkRequestInfo> nris =
+                            createNrisFromProfileNetworkPreferences(mProfileNetworkPreferences);
+                    replaceDefaultNetworkRequestsForPreference(nris);
+                });
         // Finally, rematch.
         rematchAllNetworksAndRequests();
 
@@ -9768,9 +9814,16 @@
         }
 
         mOemNetworkPreferencesLogs.log("UPDATE INITIATED: " + preference);
-        final ArraySet<NetworkRequestInfo> nris =
-                new OemNetworkRequestFactory().createNrisFromOemNetworkPreferences(preference);
-        replaceDefaultNetworkRequestsForPreference(nris);
+        final int uniquePreferenceCount = new ArraySet<>(
+                preference.getNetworkPreferences().values()).size();
+        mSystemNetworkRequestCounter.transact(
+                mDeps.getCallingUid(), uniquePreferenceCount,
+                () -> {
+                    final ArraySet<NetworkRequestInfo> nris =
+                            new OemNetworkRequestFactory()
+                                    .createNrisFromOemNetworkPreferences(preference);
+                    replaceDefaultNetworkRequestsForPreference(nris);
+                });
         mOemNetworkPreferences = preference;
 
         if (null != listener) {
@@ -9795,10 +9848,14 @@
         final ArraySet<NetworkRequestInfo> perAppCallbackRequestsToUpdate =
                 getPerAppCallbackRequestsToUpdate();
         final ArraySet<NetworkRequestInfo> nrisToRegister = new ArraySet<>(nris);
-        nrisToRegister.addAll(
-                createPerAppCallbackRequestsToRegister(perAppCallbackRequestsToUpdate));
-        handleRemoveNetworkRequests(perAppCallbackRequestsToUpdate);
-        handleRegisterNetworkRequests(nrisToRegister);
+        mSystemNetworkRequestCounter.transact(
+                mDeps.getCallingUid(), perAppCallbackRequestsToUpdate.size(),
+                () -> {
+                    nrisToRegister.addAll(
+                            createPerAppCallbackRequestsToRegister(perAppCallbackRequestsToUpdate));
+                    handleRemoveNetworkRequests(perAppCallbackRequestsToUpdate);
+                    handleRegisterNetworkRequests(nrisToRegister);
+                });
     }
 
     /**
@@ -9943,7 +10000,8 @@
                 case OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID:
                     requests.add(createUnmeteredNetworkRequest());
                     requests.add(createOemPaidNetworkRequest());
-                    requests.add(createDefaultRequest());
+                    requests.add(createDefaultInternetRequestForTransport(
+                            TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT));
                     break;
                 case OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK:
                     requests.add(createUnmeteredNetworkRequest());
diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS
index 7057b840..f27e7ff 100644
--- a/services/core/java/com/android/server/OWNERS
+++ b/services/core/java/com/android/server/OWNERS
@@ -1,5 +1,5 @@
 # Connectivity / Networking
-per-file ConnectivityService.java,ConnectivityServiceInitializer.java,NetworkManagementService.java,NsdService.java = file:/services/core/java/com/android/server/net/OWNERS
+per-file ConnectivityService.java,ConnectivityServiceInitializer.java,NetworkManagementService.java,NsdService.java,VpnManagerService.java = file:/services/core/java/com/android/server/net/OWNERS
 
 # Threads
 per-file DisplayThread.java = michaelwr@google.com, ogunwale@google.com
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index 08bff81..8561042 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -935,9 +935,7 @@
         int mapSize = 0;
 
         try {
-            int openFlags = (OsConstants.O_RDONLY |
-                             OsConstants.O_CLOEXEC |
-                             OsConstants.O_NOFOLLOW);
+            int openFlags = (OsConstants.O_RDONLY | OsConstants.O_CLOEXEC);
             fd = Os.open(fileToPin, openFlags, 0);
             mapSize = (int) Math.min(Os.fstat(fd).st_size, Integer.MAX_VALUE);
             address = Os.mmap(0, mapSize,
diff --git a/services/core/java/com/android/server/SensorNotificationService.java b/services/core/java/com/android/server/SensorNotificationService.java
index db3db0c..94bc963 100644
--- a/services/core/java/com/android/server/SensorNotificationService.java
+++ b/services/core/java/com/android/server/SensorNotificationService.java
@@ -115,7 +115,7 @@
                 "Location is (%f, %f), h %f, acc %f, mocked %b",
                 location.getLatitude(), location.getLongitude(),
                 location.getAltitude(), location.getAccuracy(),
-                location.isFromMockProvider()));
+                location.isMock()));
 
         // lat long == 0 usually means invalid location
         if (location.getLatitude() == 0 && location.getLongitude() == 0) {
@@ -130,7 +130,7 @@
         long time = System.currentTimeMillis();
         // Mocked location should not be used. Except in test, only use mocked location
         // Wrong system clock also gives bad values so ignore as well.
-        if (useMockedLocation() == location.isFromMockProvider() || time < MILLIS_2010_1_1) {
+        if (useMockedLocation() == location.isMock() || time < MILLIS_2010_1_1) {
             return;
         }
 
diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java
index 3ba4c34..cd3dca9 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -197,16 +197,16 @@
                 if (readPersistedSensorPrivacyStateLocked()) {
                     persistSensorPrivacyStateLocked();
                 }
-            }
 
-            for (int i = 0; i < mIndividualEnabled.size(); i++) {
-                int userId = mIndividualEnabled.keyAt(i);
-                SparseBooleanArray userIndividualEnabled =
-                        mIndividualEnabled.get(i);
-                for (int j = 0; j < userIndividualEnabled.size(); j++) {
-                    int sensor = userIndividualEnabled.keyAt(i);
-                    boolean enabled = userIndividualEnabled.valueAt(j);
-                    setUserRestriction(userId, sensor, enabled);
+                for (int i = 0; i < mIndividualEnabled.size(); i++) {
+                    int userId = mIndividualEnabled.keyAt(i);
+                    SparseBooleanArray userIndividualEnabled =
+                            mIndividualEnabled.valueAt(i);
+                    for (int j = 0; j < userIndividualEnabled.size(); j++) {
+                        int sensor = userIndividualEnabled.keyAt(i);
+                        boolean enabled = userIndividualEnabled.valueAt(j);
+                        setUserRestriction(userId, sensor, enabled);
+                    }
                 }
             }
 
@@ -743,6 +743,16 @@
             }
         }
 
+        @Override
+        public boolean supportsSensorToggle(int sensor) {
+            if (sensor == MICROPHONE) {
+                return mContext.getResources().getBoolean(R.bool.config_supportsMicToggle);
+            } else if (sensor == CAMERA) {
+                return mContext.getResources().getBoolean(R.bool.config_supportsCamToggle);
+            }
+            throw new IllegalArgumentException("Unable to find value " + sensor);
+        }
+
         /**
          * Registers a listener to be notified when the sensor privacy state changes.
          */
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index ee3530a..edf832f 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -2072,7 +2072,8 @@
 
     private void notifyCellLocationForSubscriber(int subId, CellIdentity cellIdentity,
             boolean hasUserSwitched) {
-        log("notifyCellLocationForSubscriber: subId=" + subId + " cellIdentity=" + cellIdentity);
+        log("notifyCellLocationForSubscriber: subId=" + subId + " cellIdentity="
+                + Rlog.pii(DBG || VDBG || DBG_LOC, cellIdentity));
         if (!checkNotifyPermission("notifyCellLocation()")) {
             return;
         }
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 915517a..d8af01e 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -1779,7 +1779,7 @@
                                 // TODO(b/173744200) Please replace FLAG_MUTABLE_UNAUDITED below
                                 // with either FLAG_IMMUTABLE (recommended) or FLAG_MUTABLE.
                                 PendingIntent.getActivityAsUser(context, 0,
-                                        carModeOffIntent, PendingIntent.FLAG_MUTABLE_UNAUDITED,
+                                        carModeOffIntent, PendingIntent.FLAG_MUTABLE,
                                         null, UserHandle.CURRENT));
                 mNotificationManager.notifyAsUser(null,
                         SystemMessage.NOTE_CAR_MODE_DISABLE, n.build(), UserHandle.ALL);
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index 4b52057..57254c1 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -612,6 +612,34 @@
         });
     }
 
+    /**
+     * Retrieves the list of subscription groups with configured VcnConfigs
+     *
+     * <p>Limited to subscription groups for which the caller is carrier privileged.
+     *
+     * <p>Implements the IVcnManagementService Binder interface.
+     */
+    @Override
+    @NonNull
+    public List<ParcelUuid> getConfiguredSubscriptionGroups(@NonNull String opPkgName) {
+        requireNonNull(opPkgName, "opPkgName was null");
+
+        mContext.getSystemService(AppOpsManager.class)
+                .checkPackage(mDeps.getBinderCallingUid(), opPkgName);
+        enforcePrimaryUser();
+
+        final List<ParcelUuid> result = new ArrayList<>();
+        synchronized (mLock) {
+            for (ParcelUuid subGrp : mConfigs.keySet()) {
+                if (mLastSnapshot.packageHasPermissionsForSubscriptionGroup(subGrp, opPkgName)) {
+                    result.add(subGrp);
+                }
+            }
+        }
+
+        return result;
+    }
+
     @GuardedBy("mLock")
     private void writeConfigsToDiskLocked() {
         try {
@@ -953,6 +981,14 @@
             pw.decreaseIndent();
             pw.println();
 
+            pw.println("mConfigs:");
+            pw.increaseIndent();
+            for (Entry<ParcelUuid, VcnConfig> entry : mConfigs.entrySet()) {
+                pw.println(entry.getKey() + ": " + entry.getValue().getProvisioningPackageName());
+            }
+            pw.decreaseIndent();
+            pw.println();
+
             pw.println("mVcns:");
             pw.increaseIndent();
             for (Vcn vcn : mVcns.values()) {
diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java
index d756c1f..26ecee8 100644
--- a/services/core/java/com/android/server/VpnManagerService.java
+++ b/services/core/java/com/android/server/VpnManagerService.java
@@ -605,7 +605,7 @@
             return null;
         } else {
             final UnderlyingNetworkInfo info = vpn.getUnderlyingNetworkInfo();
-            return (info == null || info.ownerUid != uid) ? null : vpn;
+            return (info == null || info.getOwnerUid() != uid) ? null : vpn;
         }
     }
 
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 5a1a505..206f135 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -26,6 +26,7 @@
 import static android.os.PowerExemptionManager.REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD;
 import static android.os.PowerExemptionManager.REASON_OP_ACTIVATE_PLATFORM_VPN;
 import static android.os.PowerExemptionManager.REASON_OP_ACTIVATE_VPN;
+import static android.os.PowerExemptionManager.REASON_TEMP_ALLOWED_WHILE_IN_USE;
 import static android.os.PowerWhitelistManager.REASON_ACTIVITY_STARTER;
 import static android.os.PowerWhitelistManager.REASON_ALLOWLISTED_PACKAGE;
 import static android.os.PowerWhitelistManager.REASON_BACKGROUND_ACTIVITY_PERMISSION;
@@ -69,6 +70,7 @@
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
 
+import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UptimeMillisLong;
@@ -1814,6 +1816,7 @@
                     notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
                     r.foregroundNoti = notification;
                     r.foregroundServiceType = foregroundServiceType;
+                    boolean enterForeground = false;
                     if (!r.isForeground) {
                         final ServiceMap smap = getServiceMapLocked(r.userId);
                         if (smap != null) {
@@ -1839,6 +1842,7 @@
                             active.mNumActive++;
                         }
                         r.isForeground = true;
+                        enterForeground = true;
                         r.mStartForegroundCount++;
                         r.mFgsEnterTime = SystemClock.uptimeMillis();
                         if (!stopProcStatsOp) {
@@ -1850,16 +1854,23 @@
                         } else {
                             stopProcStatsOp = false;
                         }
-                        postFgsNotificationLocked(r);
+
                         mAm.mAppOpsService.startOperation(
                                 AppOpsManager.getToken(mAm.mAppOpsService),
                                 AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName,
                                 null, true, false, "", false);
+                        registerAppOpCallbackLocked(r);
+                        mAm.updateForegroundServiceUsageStats(r.name, r.userId, true);
+                    }
+                    // Even if the service is already a FGS, we need to update the notification,
+                    // so we need to call it again.
+                    postFgsNotificationLocked(r);
+                    if (enterForeground) {
+                        // Because we want to log what's updated in postFgsNotificationLocked(),
+                        // this must be called after postFgsNotificationLocked().
                         logForegroundServiceStateChanged(r,
                                 FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER,
                                 0);
-                        registerAppOpCallbackLocked(r);
-                        mAm.updateForegroundServiceUsageStats(r.name, r.userId, true);
                     }
                     if (r.app != null) {
                         updateServiceForegroundLocked(psr, true);
@@ -3068,6 +3079,18 @@
                         + ", uid=" + callingUid
                         + " requires " + r.permission);
                 return new ServiceLookupResult(null, r.permission);
+            } else if (Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE.equals(r.permission)
+                    && callingUid != Process.SYSTEM_UID) {
+                // Hotword detection must run in its own sandbox, and we don't even trust
+                // its enclosing application to bind to it - only the system.
+                // TODO(b/185746653) remove this special case and generalize
+                Slog.w(TAG, "Permission Denial: Accessing service " + r.shortInstanceName
+                        + " from pid=" + callingPid
+                        + ", uid=" + callingUid
+                        + " requiring permission " + r.permission
+                        + " can only be bound to from the system.");
+                return new ServiceLookupResult(null, "can only be bound to "
+                        + "by the system.");
             } else if (r.permission != null && callingPackage != null) {
                 final int opCode = AppOpsManager.permissionToOpCode(r.permission);
                 if (opCode != AppOpsManager.OP_NONE && mAm.getAppOpsManager().checkOpNoThrow(
@@ -5644,6 +5667,12 @@
         }
 
         if (ret == REASON_DENIED) {
+            if (mAm.mInternal.isTempAllowlistedForFgsWhileInUse(callingUid)) {
+                return REASON_TEMP_ALLOWED_WHILE_IN_USE;
+            }
+        }
+
+        if (ret == REASON_DENIED) {
             if (targetService != null && targetService.app != null) {
                 ActiveInstrumentation instr = targetService.app.getActiveInstrumentation();
                 if (instr != null && instr.mHasBackgroundActivityStartsPermission) {
@@ -5691,7 +5720,7 @@
     private @ReasonCode int shouldAllowFgsStartForegroundLocked(
             @ReasonCode int allowWhileInUse, String callingPackage, int callingPid,
             int callingUid, Intent intent, ServiceRecord r, int userId) {
-        FgsStartTempAllowList.TempFgsAllowListEntry tempAllowListReason =
+        ActivityManagerService.FgsTempAllowListItem tempAllowListReason =
                 r.mInfoTempFgsAllowListReason = mAm.isAllowlistedForFgsStartLOSP(callingUid);
         int ret = shouldAllowFgsStartForegroundLocked(allowWhileInUse, callingPid, callingUid,
                 callingPackage, r);
@@ -5790,13 +5819,13 @@
         }
 
         if (ret == REASON_DENIED) {
-            FgsStartTempAllowList.TempFgsAllowListEntry entry =
+            ActivityManagerService.FgsTempAllowListItem item =
                     mAm.isAllowlistedForFgsStartLOSP(callingUid);
-            if (entry != null) {
-                if (entry == ActivityManagerService.FAKE_TEMP_ALLOWLIST_ENTRY) {
+            if (item != null) {
+                if (item == ActivityManagerService.FAKE_TEMP_ALLOW_LIST_ITEM) {
                     ret = REASON_SYSTEM_ALLOW_LISTED;
                 } else {
-                    ret = entry.mReasonCode;
+                    ret = item.mReasonCode;
                 }
             }
         }
@@ -5904,6 +5933,10 @@
      * @param durationMs Only meaningful for EXIT event, the duration from ENTER and EXIT state.
      */
     private void logForegroundServiceStateChanged(ServiceRecord r, int state, int durationMs) {
+        if (!ActivityManagerUtils.shouldSamplePackageForAtom(
+                r.packageName, mAm.mConstants.mDefaultFgsAtomSampleRate)) {
+            return;
+        }
         FrameworkStatsLog.write(FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED,
                 r.appInfo.uid,
                 r.shortInstanceName,
@@ -5921,4 +5954,12 @@
                 durationMs,
                 r.mStartForegroundCount);
     }
+
+    boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid,
+            String callingPackage) {
+        return shouldAllowFgsWhileInUsePermissionLocked(callingPackage, callingPid, callingUid,
+                /* targetService */ null,
+                /* allowBackgroundActivityStarts */ false)
+                != REASON_DENIED;
+    }
 }
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index c8363dd..bf57452 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -97,6 +97,7 @@
     static final String KEY_BOOT_TIME_TEMP_ALLOWLIST_DURATION = "boot_time_temp_allowlist_duration";
     static final String KEY_FG_TO_BG_FGS_GRACE_DURATION = "fg_to_bg_fgs_grace_duration";
     static final String KEY_FGS_START_FOREGROUND_TIMEOUT = "fgs_start_foreground_timeout";
+    static final String KEY_FGS_ATOM_SAMPLE_RATE = "fgs_atom_sample_rate";
 
     private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
     private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
@@ -137,6 +138,7 @@
     private static final int DEFAULT_BOOT_TIME_TEMP_ALLOWLIST_DURATION = 10 * 1000;
     private static final long DEFAULT_FG_TO_BG_FGS_GRACE_DURATION = 5 * 1000;
     private static final int DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS = 10 * 1000;
+    private static final float DEFAULT_FGS_ATOM_SAMPLE_RATE = 1; // 100 %
 
     // Flag stored in the DeviceConfig API.
     /**
@@ -430,6 +432,13 @@
      */
     volatile long mFgsStartForegroundTimeoutMs = DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS;
 
+    /**
+     * Sample rate for the FGS westworld atom.
+     *
+     * If the value is 0.1, 10% of the installed packages would be sampled.
+     */
+    volatile float mDefaultFgsAtomSampleRate = DEFAULT_FGS_ATOM_SAMPLE_RATE;
+
     private final ActivityManagerService mService;
     private ContentResolver mResolver;
     private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -629,6 +638,9 @@
                             case KEY_FGS_START_FOREGROUND_TIMEOUT:
                                 updateFgsStartForegroundTimeout();
                                 break;
+                            case KEY_FGS_ATOM_SAMPLE_RATE:
+                                updateFgsAtomSamplePercent();
+                                break;
                             default:
                                 break;
                         }
@@ -933,6 +945,13 @@
                 DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS);
     }
 
+    private void updateFgsAtomSamplePercent() {
+        mDefaultFgsAtomSampleRate = DeviceConfig.getFloat(
+                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+                KEY_FGS_ATOM_SAMPLE_RATE,
+                DEFAULT_FGS_ATOM_SAMPLE_RATE);
+    }
+
     private void updateImperceptibleKillExemptions() {
         IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.clear();
         IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.addAll(mDefaultImperceptibleKillExemptPackages);
@@ -1145,6 +1164,8 @@
         pw.println(mFlagFgsStartRestrictionEnabled);
         pw.print("  "); pw.print(KEY_DEFAULT_FGS_STARTS_RESTRICTION_CHECK_CALLER_TARGET_SDK);
         pw.print("="); pw.println(mFgsStartRestrictionCheckCallerTargetSdk);
+        pw.print("  "); pw.print(KEY_FGS_ATOM_SAMPLE_RATE);
+        pw.print("="); pw.println(mDefaultFgsAtomSampleRate);
 
         pw.println();
         if (mOverrideMaxCachedProcesses >= 0) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerLocal.java b/services/core/java/com/android/server/am/ActivityManagerLocal.java
index cd4180e..9a1bfdd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerLocal.java
+++ b/services/core/java/com/android/server/am/ActivityManagerLocal.java
@@ -36,4 +36,26 @@
      * @return whether the app will be able to start a foreground service or not.
      */
     boolean canStartForegroundService(int pid, int uid, @NonNull String packageName);
+
+    /**
+     * Returns {@code true} if a foreground service started by an uid is allowed to have
+     * while-in-use permissions.
+     *
+     * @param pid The process id belonging to the app to be checked.
+     * @param uid The UID of the app to be checked.
+     * @param packageName The package name of the app to be checked.
+     * @return whether the foreground service is allowed to have while-in-use permissions.
+     * @hide
+     */
+    boolean canAllowWhileInUsePermissionInFgs(int pid, int uid, @NonNull String packageName);
+
+    /**
+     * Temporarily allow foreground service started by an uid to have while-in-use permission
+     * for durationMs.
+     *
+     * @param uid The UID of the app that starts the foreground service.
+     * @param durationMs elapsedRealTime duration in milliseconds.
+     * @hide
+     */
+    void tempAllowWhileInUsePermissionInFgs(int uid, long durationMs);
 }
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index e3b06d6..00b13b1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -27,6 +27,7 @@
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_ISOLATED_STORAGE;
 import static android.app.ActivityManager.INSTR_FLAG_DISABLE_TEST_API_CHECKS;
 import static android.app.ActivityManager.INSTR_FLAG_NO_RESTART;
+import static android.app.ActivityManager.INTENT_SENDER_ACTIVITY;
 import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
 import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
 import static android.app.ActivityManager.PROCESS_STATE_TOP;
@@ -49,7 +50,7 @@
 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
 import static android.os.IServiceManager.DUMP_FLAG_PROTO;
 import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
-import static android.os.PowerWhitelistManager.REASON_SYSTEM_ALLOW_LISTED;
+import static android.os.PowerExemptionManager.REASON_SYSTEM_ALLOW_LISTED;
 import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
 import static android.os.Process.BLUETOOTH_UID;
 import static android.os.Process.FIRST_APPLICATION_UID;
@@ -258,6 +259,7 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
+import android.os.PowerExemptionManager;
 import android.os.PowerExemptionManager.ReasonCode;
 import android.os.PowerExemptionManager.TempAllowListType;
 import android.os.PowerManager;
@@ -345,6 +347,7 @@
 import com.android.internal.util.Preconditions;
 import com.android.internal.util.function.HeptFunction;
 import com.android.internal.util.function.HexFunction;
+import com.android.internal.util.function.NonaFunction;
 import com.android.internal.util.function.OctFunction;
 import com.android.internal.util.function.QuadFunction;
 import com.android.internal.util.function.TriFunction;
@@ -1201,15 +1204,45 @@
     @CompositeRWLock({"this", "mProcLock"})
     final PendingTempAllowlists mPendingTempAllowlist = new PendingTempAllowlists(this);
 
+    public static final class FgsTempAllowListItem {
+        final long mDuration;
+        final @PowerExemptionManager.ReasonCode int mReasonCode;
+        final String mReason;
+        final int mCallingUid;
+
+        FgsTempAllowListItem(long duration, @PowerExemptionManager.ReasonCode int reasonCode,
+                String reason, int callingUid) {
+            mDuration = duration;
+            mReasonCode = reasonCode;
+            mReason = reason;
+            mCallingUid = callingUid;
+        }
+
+        void dump(PrintWriter pw) {
+            pw.print(" duration=" + mDuration +
+                    " callingUid=" + UserHandle.formatUid(mCallingUid) +
+                    " reasonCode=" + PowerExemptionManager.reasonCodeToString(mReasonCode) +
+                    " reason=" + mReason);
+        }
+    }
+
     /**
      * The temp-allowlist that is allowed to start FGS from background.
      */
     @CompositeRWLock({"this", "mProcLock"})
-    final FgsStartTempAllowList mFgsStartTempAllowList = new FgsStartTempAllowList();
+    final FgsTempAllowList<Integer, FgsTempAllowListItem> mFgsStartTempAllowList =
+            new FgsTempAllowList();
 
-    static final FgsStartTempAllowList.TempFgsAllowListEntry FAKE_TEMP_ALLOWLIST_ENTRY = new
-            FgsStartTempAllowList.TempFgsAllowListEntry(Long.MAX_VALUE, Long.MAX_VALUE,
-            REASON_SYSTEM_ALLOW_LISTED, "", INVALID_UID);
+    static final FgsTempAllowListItem FAKE_TEMP_ALLOW_LIST_ITEM = new FgsTempAllowListItem(
+            Long.MAX_VALUE, REASON_SYSTEM_ALLOW_LISTED, "", INVALID_UID);
+
+    /*
+     * List of uids that are allowed to have while-in-use permission when FGS is started from
+     * background.
+     */
+    private final FgsTempAllowList<Integer, String> mFgsWhileInUseTempAllowList =
+            new FgsTempAllowList();
+
     /**
      * Information about and control over application operations
      */
@@ -3492,7 +3525,7 @@
                     JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class);
                     // Clearing data is a user-initiated action.
                     js.cancelJobsForUid(appInfo.uid, JobParameters.STOP_REASON_USER,
-                            JobParameters.DEBUG_REASON_DATA_CLEARED, "clear data");
+                            JobParameters.INTERNAL_STOP_REASON_DATA_CLEARED, "clear data");
 
                     // Clear its pending alarms
                     AlarmManagerInternal ami = LocalServices.getService(AlarmManagerInternal.class);
@@ -4783,10 +4816,27 @@
     public IIntentSender getIntentSenderWithFeature(int type, String packageName, String featureId,
             IBinder token, String resultWho, int requestCode, Intent[] intents,
             String[] resolvedTypes, int flags, Bundle bOptions, int userId) {
+        enforceNotIsolatedCaller("getIntentSender");
+
+        return getIntentSenderWithFeatureAsApp(type, packageName, featureId, token, resultWho,
+                requestCode, intents, resolvedTypes, flags, bOptions, userId,
+                Binder.getCallingUid());
+    }
+
+    /**
+     * System-internal callers can invoke this with owningUid being the app's own identity
+     * rather than the public API's behavior of always assigning ownership to the actual
+     * caller identity.  This will create an IntentSender as though the package/userid/uid app
+     * were the caller, so that the ultimate PendingIntent is triggered with only the app's
+     * capabilities and not the system's.  Used in cases like notification groups where
+     * the OS must synthesize a PendingIntent on an app's behalf.
+     */
+    public IIntentSender getIntentSenderWithFeatureAsApp(int type, String packageName,
+            String featureId, IBinder token, String resultWho, int requestCode, Intent[] intents,
+            String[] resolvedTypes, int flags, Bundle bOptions, int userId, int owningUid) {
         // NOTE: The service lock isn't held in this method because nothing in the method requires
         // the service lock to be held.
 
-        enforceNotIsolatedCaller("getIntentSender");
         // Refuse possible leaked file descriptors
         if (intents != null) {
             if (intents.length < 1) {
@@ -4817,9 +4867,8 @@
             }
         }
 
-        int callingUid = Binder.getCallingUid();
         int origUserId = userId;
-        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), callingUid, userId,
+        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), owningUid, userId,
                 type == ActivityManager.INTENT_SENDER_BROADCAST,
                 ALLOW_NON_FULL, "getIntentSender", null);
         if (origUserId == UserHandle.USER_CURRENT) {
@@ -4829,27 +4878,27 @@
             userId = UserHandle.USER_CURRENT;
         }
         try {
-            if (callingUid != 0 && callingUid != SYSTEM_UID) {
+            if (owningUid != 0 && owningUid != SYSTEM_UID) {
                 final int uid = AppGlobals.getPackageManager().getPackageUid(packageName,
-                        MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getUserId(callingUid));
-                if (!UserHandle.isSameApp(callingUid, uid)) {
+                        MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getUserId(owningUid));
+                if (!UserHandle.isSameApp(owningUid, uid)) {
                     String msg = "Permission Denial: getIntentSender() from pid="
-                        + Binder.getCallingPid()
-                        + ", uid=" + Binder.getCallingUid()
-                        + ", (need uid=" + uid + ")"
-                        + " is not allowed to send as package " + packageName;
+                            + Binder.getCallingPid()
+                            + ", uid=" + owningUid
+                            + ", (need uid=" + uid + ")"
+                            + " is not allowed to send as package " + packageName;
                     Slog.w(TAG, msg);
                     throw new SecurityException(msg);
                 }
             }
 
             if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) {
-                return mAtmInternal.getIntentSender(type, packageName, featureId, callingUid,
+                return mAtmInternal.getIntentSender(type, packageName, featureId, owningUid,
                         userId, token, resultWho, requestCode, intents, resolvedTypes, flags,
                         bOptions);
             }
             return mPendingIntentController.getIntentSender(type, packageName, featureId,
-                    callingUid, userId, token, resultWho, requestCode, intents, resolvedTypes,
+                    owningUid, userId, token, resultWho, requestCode, intents, resolvedTypes,
                     flags, bOptions);
         } catch (RemoteException e) {
             throw new SecurityException(e);
@@ -5563,11 +5612,12 @@
      */
     @Nullable
     @GuardedBy(anyOf = {"this", "mProcLock"})
-    FgsStartTempAllowList.TempFgsAllowListEntry isAllowlistedForFgsStartLOSP(int uid) {
+    FgsTempAllowListItem isAllowlistedForFgsStartLOSP(int uid) {
         if (Arrays.binarySearch(mDeviceIdleExceptIdleAllowlist, UserHandle.getAppId(uid)) >= 0) {
-            return FAKE_TEMP_ALLOWLIST_ENTRY;
+            return FAKE_TEMP_ALLOW_LIST_ITEM;
         }
-        return mFgsStartTempAllowList.getAllowedDurationAndReason(uid);
+        final Pair<Long, FgsTempAllowListItem> entry = mFgsStartTempAllowList.get(uid);
+        return entry == null ? null : entry.second;
     }
 
     /**
@@ -5718,7 +5768,7 @@
 
     @Override
     public List<RunningTaskInfo> getTasks(int maxNum) {
-        return mActivityTaskManager.getTasks(maxNum, false /* filterForVisibleRecents */);
+        return mActivityTaskManager.getTasks(maxNum);
     }
 
     @Override
@@ -6487,7 +6537,7 @@
         final long identity = Binder.clearCallingIdentity();
         try {
             // Send broadcast to shell to trigger bugreport using Bugreport API
-            mContext.sendBroadcast(triggerShellBugreport);
+            mContext.sendBroadcastAsUser(triggerShellBugreport, UserHandle.SYSTEM);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -7678,7 +7728,6 @@
         // Notify package manager service to possibly update package state
         if (r != null && r.info != null && r.info.packageName != null) {
             final String codePath = r.info.getCodePath();
-            mPackageManagerInt.notifyPackageCrashOrAnr(r.info.packageName);
             IncrementalStatesInfo incrementalStatesInfo =
                     mPackageManagerInt.getIncrementalStatesInfo(r.info.packageName, r.uid,
                             r.userId);
@@ -7726,7 +7775,17 @@
                                       : ServerProtoEnums.ERROR_SOURCE_UNKNOWN,
                 incrementalMetrics != null /* isIncremental */, loadingProgress,
                 incrementalMetrics != null ? incrementalMetrics.getMillisSinceOldestPendingRead()
-                        : -1
+                        : -1,
+                0 /* storage_health_code */,
+                0 /* data_loader_status_code */,
+                false /* read_logs_enabled */,
+                0 /* millis_since_last_data_loader_bind */,
+                0 /* data_loader_bind_delay_millis */,
+                0 /* total_delayed_reads */,
+                0 /* total_failed_reads */,
+                0 /* last_read_error_uid */,
+                0 /* last_read_error_millis_since */,
+                0 /* last_read_error_code */
         );
 
         final int relaunchReason = r == null ? RELAUNCH_REASON_NONE
@@ -9263,7 +9322,24 @@
                 }
             }
             pw.println("  mFgsStartTempAllowList:");
-            mFgsStartTempAllowList.dump(pw);
+            final long currentTimeNow = System.currentTimeMillis();
+            final long elapsedRealtimeNow = SystemClock.elapsedRealtime();
+            final Set<Integer> uids = mFgsStartTempAllowList.keySet();
+            for (Integer uid : uids) {
+                final Pair<Long, FgsTempAllowListItem> entry = mFgsStartTempAllowList.get(uid);
+                if (entry == null) {
+                    continue;
+                }
+                pw.print("    " + UserHandle.formatUid(uid) + ": ");
+                entry.second.dump(pw); pw.println();
+                pw.print("ms expiration=");
+                // Convert entry.mExpirationTime, which is an elapsed time since boot,
+                // to a time since epoch (i.e. System.currentTimeMillis()-based time.)
+                final long expirationInCurrentTime =
+                        currentTimeNow - elapsedRealtimeNow + entry.first;
+                TimeUtils.dumpTimeWithDelta(pw, expirationInCurrentTime, currentTimeNow);
+                pw.println();
+            }
         }
         if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
                 || mOrigWaitForDebugger) {
@@ -12977,11 +13053,6 @@
                 case Intent.ACTION_PRE_BOOT_COMPLETED:
                     timeoutExempt = true;
                     break;
-                case Intent.ACTION_PACKAGE_UNSTARTABLE:
-                    final String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
-                    forceStopPackageLocked(packageName, -1, false, true, true,
-                            false, false, userId, "package unstartable");
-                    break;
                 case Intent.ACTION_CLOSE_SYSTEM_DIALOGS:
                     if (!mAtmInternal.checkCanCloseSystemDialogs(callingPid, callingUid,
                             callerPackage)) {
@@ -14541,7 +14612,8 @@
             mUiHandler.obtainMessage(PUSH_TEMP_ALLOWLIST_UI_MSG).sendToTarget();
 
             if (type == TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED) {
-                mFgsStartTempAllowList.add(targetUid, duration, reasonCode, reason, callingUid);
+                mFgsStartTempAllowList.add(targetUid, duration,
+                        new FgsTempAllowListItem(duration, reasonCode, reason, callingUid));
             }
         }
     }
@@ -15214,8 +15286,9 @@
                     mDeviceIdleTempAllowlist = appids;
                     if (adding) {
                         if (type == TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED) {
-                            mFgsStartTempAllowList.add(changingUid, durationMs, reasonCode, reason,
-                                    callingUid);
+                            mFgsStartTempAllowList.add(changingUid, durationMs,
+                                    new FgsTempAllowListItem(durationMs, reasonCode, reason,
+                                    callingUid));
                         }
                     }
                     setAppIdTempAllowlistStateLSP(changingUid, adding);
@@ -16013,6 +16086,32 @@
         }
 
         @Override
+        public PendingIntent getPendingIntentActivityAsApp(
+                int requestCode, @NonNull Intent intent, int flags, Bundle options,
+                String ownerPkg, int ownerUid) {
+            // system callers must explicitly set mutability state
+            final boolean flagImmutableSet = (flags & PendingIntent.FLAG_IMMUTABLE) != 0;
+            final boolean flagMutableSet = (flags & PendingIntent.FLAG_MUTABLE) != 0;
+            if (flagImmutableSet == flagMutableSet) {
+                throw new IllegalArgumentException(
+                        "Must set exactly one of FLAG_IMMUTABLE or FLAG_MUTABLE");
+            }
+
+            final Context context = ActivityManagerService.this.mContext;
+            String resolvedType = intent.resolveTypeIfNeeded(context.getContentResolver());
+            intent.migrateExtraStreamToClipData(context);
+            intent.prepareToLeaveProcess(context);
+            IIntentSender target =
+                    ActivityManagerService.this.getIntentSenderWithFeatureAsApp(
+                            INTENT_SENDER_ACTIVITY, ownerPkg,
+                            context.getAttributionTag(), null, null, requestCode,
+                            new Intent[] { intent },
+                            resolvedType != null ? new String[] { resolvedType } : null,
+                            flags, options, UserHandle.getUserId(ownerUid), ownerUid);
+            return target != null ? new PendingIntent(target) : null;
+        }
+
+        @Override
         public long getBootTimeTempAllowListDuration() {
             // Do not lock ActivityManagerService.this here, this API is called by
             // PackageManagerService.
@@ -16035,6 +16134,24 @@
                 return mServices.canStartForegroundServiceLocked(pid, uid, packageName);
             }
         }
+
+        @Override
+        public void tempAllowWhileInUsePermissionInFgs(int uid, long durationMs) {
+            mFgsWhileInUseTempAllowList.add(uid, durationMs, "");
+        }
+
+        @Override
+        public boolean isTempAllowlistedForFgsWhileInUse(int uid) {
+            return mFgsWhileInUseTempAllowList.isAllowed(uid);
+        }
+
+        @Override
+        public boolean canAllowWhileInUsePermissionInFgs(int pid, int uid,
+                @NonNull String packageName) {
+            synchronized (ActivityManagerService.this) {
+                return mServices.canAllowWhileInUsePermissionInFgsLocked(pid, uid, packageName);
+            }
+        }
     }
 
     long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {
@@ -16668,6 +16785,29 @@
         }
 
         @Override
+        public SyncNotedAppOp startOperation(IBinder token, int code, int uid,
+                @Nullable String packageName, @Nullable String attributionTag,
+                boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
+                @Nullable String message, boolean shouldCollectMessage,
+                @NonNull NonaFunction<IBinder, Integer, Integer, String, String, Boolean,
+                        Boolean, String, Boolean, SyncNotedAppOp> superImpl) {
+            if (uid == mTargetUid && isTargetOp(code)) {
+                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
+                        Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    return superImpl.apply(token, code, shellUid, "com.android.shell",
+                            attributionTag, startIfModeDefault, shouldCollectAsyncNotedOp, message,
+                            shouldCollectMessage);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            return superImpl.apply(token, code, uid, packageName, attributionTag,
+                    startIfModeDefault, shouldCollectAsyncNotedOp, message, shouldCollectMessage);
+        }
+
+        @Override
         public SyncNotedAppOp startProxyOperation(IBinder token, int code,
                 @NonNull AttributionSource attributionSource, boolean startIfModeDefault,
                 boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 6fa8ecd4..f2762fc 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -3382,7 +3382,7 @@
             pw.println("      Sets the inactive state of an app.");
             pw.println("  get-inactive [--user <USER_ID>] <PACKAGE>");
             pw.println("      Returns the inactive state of an app.");
-            pw.println("  set-standby-bucket [--user <USER_ID>] <PACKAGE> active|working_set|frequent|rare");
+            pw.println("  set-standby-bucket [--user <USER_ID>] <PACKAGE> active|working_set|frequent|rare|restricted");
             pw.println("      Puts an app in the standby bucket.");
             pw.println("  get-standby-bucket [--user <USER_ID>] <PACKAGE>");
             pw.println("      Returns the standby bucket of an app.");
diff --git a/services/core/java/com/android/server/am/ActivityManagerUtils.java b/services/core/java/com/android/server/am/ActivityManagerUtils.java
new file mode 100644
index 0000000..dd24148
--- /dev/null
+++ b/services/core/java/com/android/server/am/ActivityManagerUtils.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.am;
+
+import android.app.ActivityThread;
+import android.provider.Settings;
+import android.util.ArrayMap;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * To store random utility methods...
+ */
+public class ActivityManagerUtils {
+    private ActivityManagerUtils() {
+    }
+
+    private static Integer sAndroidIdHash;
+
+    @GuardedBy("sHashCache")
+    private static final ArrayMap<String, Integer> sHashCache = new ArrayMap<>();
+
+    private static String sInjectedAndroidId;
+
+    /** Used by the unit tests to inject an android ID. Do not set in the prod code. */
+    @VisibleForTesting
+    static void injectAndroidIdForTest(String androidId) {
+        sInjectedAndroidId = androidId;
+        sAndroidIdHash = null;
+    }
+
+    /**
+     * Return a hash between [0, MAX_VALUE] generated from the android ID.
+     */
+    @VisibleForTesting
+    static int getAndroidIdHash() {
+        // No synchronization is required. Double-initialization is fine here.
+        if (sAndroidIdHash == null) {
+            final String androidId = Settings.Secure.getString(
+                    ActivityThread.currentApplication().getContentResolver(),
+                    Settings.Secure.ANDROID_ID);
+            sAndroidIdHash = getUnsignedHashUnCached(
+                    sInjectedAndroidId != null ? sInjectedAndroidId : androidId);
+        }
+        return sAndroidIdHash;
+    }
+
+    /**
+     * Return a hash between [0, MAX_VALUE] generated from a package name, using a cache.
+     *
+     * Because all the results are cached, do not use it for dynamically generated strings.
+     */
+    @VisibleForTesting
+    static int getUnsignedHashCached(String s) {
+        synchronized (sHashCache) {
+            final Integer cached = sHashCache.get(s);
+            if (cached != null) {
+                return cached;
+            }
+            final int hash = getUnsignedHashUnCached(s);
+            sHashCache.put(s.intern(), hash);
+            return hash;
+        }
+    }
+
+    /**
+     * Return a hash between [0, MAX_VALUE] generated from a package name.
+     */
+    private static int getUnsignedHashUnCached(String s) {
+        try {
+            final MessageDigest digest = MessageDigest.getInstance("SHA-1");
+            digest.update(s.getBytes());
+            return unsignedIntFromBytes(digest.digest());
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @VisibleForTesting
+    static int unsignedIntFromBytes(byte[] longEnoughBytes) {
+        return (extractByte(longEnoughBytes, 0)
+                | extractByte(longEnoughBytes, 1)
+                | extractByte(longEnoughBytes, 2)
+                | extractByte(longEnoughBytes, 3))
+                & 0x7FFF_FFFF;
+    }
+
+    private static int extractByte(byte[] bytes, int index) {
+        return (((int) bytes[index]) & 0xFF) << (index * 8);
+    }
+
+    /**
+     * @return whether a package should be logged, using a random value based on the ANDROID_ID,
+     * with a given sampling rate.
+     */
+    public static boolean shouldSamplePackageForAtom(String packageName, float rate) {
+        if (rate <= 0) {
+            return false;
+        }
+        if (rate >= 1) {
+            return true;
+        }
+        final int hash = getUnsignedHashCached(packageName) ^ getAndroidIdHash();
+
+        return (((double) hash) / Integer.MAX_VALUE) <= rate;
+    }
+}
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index 4942b11..859cc44 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -137,8 +137,8 @@
     @GuardedBy("mWorkerLock")
     private PowerStatsInternal mPowerStatsInternal = null;
 
-    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
-    // Keep the last WiFi stats so we can compute a delta.
+    // WiFi keeps an accumulated total of stats. Keep the last WiFi stats so we can compute a delta.
+    // (This is unlike Bluetooth, where BatteryStatsImpl is left responsible for taking the delta.)
     @GuardedBy("mWorkerLock")
     private WifiActivityEnergyInfo mLastWifiInfo =
             new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 8dc9d03..cc750ce 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -395,7 +395,7 @@
 
             pw.println("  Tracking last compaction stats for " + mLastCompactionStats.size()
                     + " processes.");
-            pw.println(" " + KEY_USE_FREEZER + "=" + mUseFreezer);
+            pw.println("  " + KEY_USE_FREEZER + "=" + mUseFreezer);
             pw.println("  " + KEY_FREEZER_STATSD_SAMPLE_RATE + "=" + mFreezerStatsdSampleRate);
             pw.println("  " + KEY_FREEZER_DEBOUNCE_TIMEOUT + "=" + mFreezerDebounceTimeout);
             if (DEBUG_COMPACTION) {
diff --git a/services/core/java/com/android/server/am/FgsStartTempAllowList.java b/services/core/java/com/android/server/am/FgsStartTempAllowList.java
deleted file mode 100644
index a844c2aa..0000000
--- a/services/core/java/com/android/server/am/FgsStartTempAllowList.java
+++ /dev/null
@@ -1,144 +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.am;
-
-import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
-
-import android.annotation.Nullable;
-import android.os.PowerWhitelistManager;
-import android.os.PowerWhitelistManager.ReasonCode;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.util.TimeUtils;
-
-import java.io.PrintWriter;
-
-/**
- * List of uids that are temporarily allowed to start FGS from background.
- */
-final class FgsStartTempAllowList {
-    private static final int MAX_SIZE = 100;
-
-    public static final class TempFgsAllowListEntry {
-        final long mExpirationTime;
-        final long mDuration;
-        final @ReasonCode int mReasonCode;
-        final String mReason;
-        final int mCallingUid;
-
-        TempFgsAllowListEntry(long expirationTime, long duration, @ReasonCode int reasonCode,
-                String reason, int callingUid) {
-            mExpirationTime = expirationTime;
-            mDuration = duration;
-            mReasonCode = reasonCode;
-            mReason = reason;
-            mCallingUid = callingUid;
-        }
-    }
-
-    /**
-     * The key is the uid, the value is a TempAllowListEntry.
-     */
-    private final SparseArray<TempFgsAllowListEntry> mTempAllowListFgs = new SparseArray<>();
-
-    FgsStartTempAllowList() {
-    }
-
-    /**
-     * Add a uid and its duration with reason into the FGS temp-allowlist.
-     * @param uid
-     * @param duration temp-allowlisted duration in milliseconds.
-     * @param reason A human-readable reason for logging purposes.
-     * @param callingUid the callingUid that setup this temp allowlist, only valid when param adding
-     *                   is true.
-     */
-    void add(int uid, long duration, @ReasonCode int reasonCode, @Nullable String reason,
-            int callingUid) {
-        if (duration <= 0) {
-            Slog.e(TAG_AM, "FgsStartTempAllowList bad duration:" + duration + " uid: "
-                    + uid);
-            return;
-        }
-        // The temp allowlist should be a short list with only a few entries in it.
-        final int size = mTempAllowListFgs.size();
-        if (size > MAX_SIZE) {
-            Slog.w(TAG_AM, "FgsStartTempAllowList length:" + size + " exceeds " + MAX_SIZE);
-        }
-        final long now = SystemClock.elapsedRealtime();
-        for (int index = mTempAllowListFgs.size() - 1; index >= 0; index--) {
-            if (mTempAllowListFgs.valueAt(index).mExpirationTime < now) {
-                mTempAllowListFgs.removeAt(index);
-            }
-        }
-        final TempFgsAllowListEntry existing = mTempAllowListFgs.get(uid);
-        final long expirationTime = now + duration;
-        if (existing == null || existing.mExpirationTime < expirationTime) {
-            mTempAllowListFgs.put(uid,
-                    new TempFgsAllowListEntry(expirationTime, duration, reasonCode,
-                            reason == null ? "" : reason, callingUid));
-        }
-    }
-
-    /**
-     * Is this uid temp-allowlisted to start FGS.
-     * @param uid
-     * @return If uid is in the temp-allowlist, return the {@link TempFgsAllowListEntry}; If not in
-     *         temp-allowlist, return null.
-     */
-    @Nullable
-    TempFgsAllowListEntry getAllowedDurationAndReason(int uid) {
-        final int index = mTempAllowListFgs.indexOfKey(uid);
-        if (index < 0) {
-            return null;
-        } else if (mTempAllowListFgs.valueAt(index).mExpirationTime
-                < SystemClock.elapsedRealtime()) {
-            mTempAllowListFgs.removeAt(index);
-            return null;
-        } else {
-            return mTempAllowListFgs.valueAt(index);
-        }
-    }
-
-    void remove(int uid) {
-        mTempAllowListFgs.delete(uid);
-    }
-
-    void dump(PrintWriter pw) {
-        final long currentTimeNow = System.currentTimeMillis();
-        final long elapsedRealtimeNow = SystemClock.elapsedRealtime();
-        for (int i = 0; i < mTempAllowListFgs.size(); i++) {
-            final int uid = mTempAllowListFgs.keyAt(i);
-            final TempFgsAllowListEntry entry = mTempAllowListFgs.valueAt(i);
-            pw.println(
-                    "    " + UserHandle.formatUid(uid) + ": " +
-                    " callingUid=" + UserHandle.formatUid(entry.mCallingUid) +
-                    " reasonCode=" + PowerWhitelistManager.reasonCodeToString(entry.mReasonCode) +
-                    " reason=" + entry.mReason);
-            pw.print("        duration=" + entry.mDuration +
-                    "ms expiration=");
-
-            // Convert entry.mExpirationTime, which is an elapsed time since boot,
-            // to a time since epoch (i.e. System.currentTimeMillis()-based time.)
-            final long expirationInCurrentTime =
-                    currentTimeNow - elapsedRealtimeNow + entry.mExpirationTime;
-            TimeUtils.dumpTimeWithDelta(pw, expirationInCurrentTime, currentTimeNow);
-            pw.println();
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/am/FgsTempAllowList.java b/services/core/java/com/android/server/am/FgsTempAllowList.java
new file mode 100644
index 0000000..847e82f
--- /dev/null
+++ b/services/core/java/com/android/server/am/FgsTempAllowList.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.am;
+
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+
+import android.annotation.Nullable;
+import android.os.SystemClock;
+import android.util.ArrayMap;
+import android.util.Pair;
+import android.util.Slog;
+
+import java.util.Set;
+
+/**
+ * List of keys that have expiration time.
+ * If the expiration time is less than current elapsedRealtime, the key has expired.
+ * Otherwise it is valid (or allowed).
+ *
+ * <p>This is used for both FGS-BG-start restriction, and FGS-while-in-use permissions check.</p>
+ *
+ * <p>Note: the underlying data structure is an {@link ArrayMap}, for performance reason, it is only
+ * suitable to hold up to hundreds of entries.</p>
+ * @param <K> type of the key.
+ * @param <E> type of the additional optional info.
+ */
+public class FgsTempAllowList<K, E> {
+    private static final int DEFAULT_MAX_SIZE = 100;
+
+    /**
+     * The value is Pair type, Pair.first is the expirationTime(an elapsedRealtime),
+     * Pair.second is the optional information entry about this key.
+     */
+    private final ArrayMap<K, Pair<Long, E>> mTempAllowList = new ArrayMap<>();
+    private int mMaxSize = DEFAULT_MAX_SIZE;
+    private final Object mLock = new Object();
+
+    public FgsTempAllowList() {
+    }
+
+    /**
+     *
+     * @param maxSize The max size of the list. It is only a suggestion. If the list size is
+     *                larger than max size, a warning message is printed in logcat, new entry can
+     *                still be added to the list. The default max size is {@link #DEFAULT_MAX_SIZE}.
+     */
+    public FgsTempAllowList(int maxSize) {
+        if (maxSize <= 0) {
+            Slog.e(TAG_AM, "Invalid FgsTempAllowList maxSize:" + maxSize
+                    + ", force default maxSize:" + DEFAULT_MAX_SIZE);
+            mMaxSize = DEFAULT_MAX_SIZE;
+        } else {
+            mMaxSize = maxSize;
+        }
+    }
+
+    /**
+     * Add a key and its duration with optional info into the temp allowlist.
+     * @param key
+     * @param durationMs temp-allowlisted duration in milliseconds.
+     * @param entry additional optional information of this key, could be null.
+     */
+    public void add(K key, long durationMs, @Nullable E entry) {
+        synchronized (mLock) {
+            if (durationMs <= 0) {
+                Slog.e(TAG_AM, "FgsTempAllowList bad duration:" + durationMs + " key: "
+                        + key);
+                return;
+            }
+            // The temp allowlist should be a short list with only a few entries in it.
+            // for a very large list, HashMap structure should be used.
+            final long now = SystemClock.elapsedRealtime();
+            final int size = mTempAllowList.size();
+            if (size > mMaxSize) {
+                Slog.w(TAG_AM, "FgsTempAllowList length:" + size + " exceeds maxSize"
+                        + mMaxSize);
+                for (int index = size - 1; index >= 0; index--) {
+                    if (mTempAllowList.valueAt(index).first < now) {
+                        mTempAllowList.removeAt(index);
+                    }
+                }
+            }
+            final Pair<Long, E> existing = mTempAllowList.get(key);
+            final long expirationTime = now + durationMs;
+            if (existing == null || existing.first < expirationTime) {
+                mTempAllowList.put(key, new Pair(expirationTime, entry));
+            }
+        }
+    }
+
+    /**
+     * If the key has not expired (AKA allowed), return its non-null value.
+     * If the key has expired, return null.
+     * @param key
+     * @return
+     */
+    @Nullable
+    public Pair<Long, E> get(K key) {
+        synchronized (mLock) {
+            final int index = mTempAllowList.indexOfKey(key);
+            if (index < 0) {
+                return null;
+            } else if (mTempAllowList.valueAt(index).first < SystemClock.elapsedRealtime()) {
+                mTempAllowList.removeAt(index);
+                return null;
+            } else {
+                return mTempAllowList.valueAt(index);
+            }
+        }
+    }
+
+    /**
+     * If the key has not expired (AKA allowed), return true.
+     * If the key has expired, return false.
+     * @param key
+     * @return
+     */
+    public boolean isAllowed(K key) {
+        Pair<Long, E> entry = get(key);
+        return entry != null;
+    }
+
+    public void remove(K key) {
+        synchronized (mLock) {
+            mTempAllowList.remove(key);
+        }
+    }
+
+    public Set<K> keySet() {
+        synchronized (mLock) {
+            return mTempAllowList.keySet();
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java b/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java
index 65d4755..a9fca4f 100644
--- a/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java
+++ b/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java
@@ -345,12 +345,29 @@
         for (int idx = 0; idx < size; idx++) {
             final EnergyConsumer consumer = mEnergyConsumers.valueAt(idx);
             if (consumer.type == (int) EnergyConsumerType.OTHER) {
-                names[consumerIndex++] = consumer.name;
+                names[consumerIndex++] = sanitizeCustomBucketName(consumer.name);
             }
         }
         return names;
     }
 
+    private String sanitizeCustomBucketName(String bucketName) {
+        if (bucketName == null) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder(bucketName.length());
+        for (char c : bucketName.toCharArray()) {
+            if (Character.isWhitespace(c)) {
+                sb.append(' ');
+            } else if (Character.isISOControl(c)) {
+                sb.append('_');
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
     /** Determines the number of ordinals for a given {@link EnergyConsumerType}. */
     private static int calculateNumOrdinals(@EnergyConsumerType int type,
             SparseArray<EnergyConsumer> idToConsumer) {
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 960cc42..649d050 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -345,8 +345,6 @@
         final ServiceThread adjusterThread =
                 new ServiceThread(TAG, THREAD_PRIORITY_TOP_APP_BOOST, false /* allowIo */);
         adjusterThread.start();
-        adjusterThread.getThreadHandler().post(() -> Process.setThreadGroupAndCpuset(
-                adjusterThread.getThreadId(), THREAD_GROUP_TOP_APP));
         return adjusterThread;
     }
 
@@ -3037,6 +3035,10 @@
             return;
         }
 
+        if (app.mOptRecord.isFreezeExempt()) {
+            return;
+        }
+
         final ProcessCachedOptimizerRecord opt = app.mOptRecord;
         // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
         if (opt.isFrozen() && opt.shouldNotFreeze()) {
diff --git a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
index 026c1d3..a33e7e5 100644
--- a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
+++ b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
@@ -80,6 +80,12 @@
     @GuardedBy("mProcLock")
     private boolean mShouldNotFreeze;
 
+    /**
+     * Exempt from freezer (now for system apps with INSTALL_PACKAGES permission)
+     */
+    @GuardedBy("mProcLock")
+    private boolean mFreezeExempt;
+
     @GuardedBy("mProcLock")
     long getLastCompactTime() {
         return mLastCompactTime;
@@ -160,6 +166,16 @@
         mShouldNotFreeze = shouldNotFreeze;
     }
 
+    @GuardedBy("mProcLock")
+    boolean isFreezeExempt() {
+        return mFreezeExempt;
+    }
+
+    @GuardedBy("mPreLock")
+    void setFreezeExempt(boolean exempt) {
+        mFreezeExempt = exempt;
+    }
+
     ProcessCachedOptimizerRecord(ProcessRecord app) {
         mApp = app;
         mProcLock = app.mService.mProcLock;
@@ -173,6 +189,7 @@
     void dump(PrintWriter pw, String prefix, long nowUptime) {
         pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime);
         pw.print(" lastCompactAction="); pw.println(mLastCompactAction);
+        pw.print(prefix); pw.print("isFreezeExempt="); pw.print(mFreezeExempt);
         pw.print(" " + IS_FROZEN + "="); pw.println(mFrozen);
     }
 }
diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
index 00184f9..167ed86 100644
--- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
@@ -432,7 +432,17 @@
                 (mApp.info != null) ? mApp.info.packageName : "",
                 incrementalMetrics != null /* isIncremental */, loadingProgress,
                 incrementalMetrics != null ? incrementalMetrics.getMillisSinceOldestPendingRead()
-                        : -1);
+                        : -1,
+                0 /* storage_health_code */,
+                0 /* data_loader_status_code */,
+                false /* read_logs_enabled */,
+                0 /* millis_since_last_data_loader_bind */,
+                0 /* data_loader_bind_delay_millis */,
+                0 /* total_delayed_reads */,
+                0 /* total_failed_reads */,
+                0 /* last_read_error_uid */,
+                0 /* last_read_error_millis_since */,
+                0 /* last_read_error_code */);
         final ProcessRecord parentPr = parentProcess != null
                 ? (ProcessRecord) parentProcess.mOwner : null;
         mService.addErrorToDropBox("anr", mApp, mApp.processName, activityShortComponentName,
@@ -472,11 +482,6 @@
                 mDialogController.setAnrController(anrController);
             }
 
-            // Notify package manager service to possibly update package state
-            if (aInfo != null && aInfo.packageName != null) {
-                packageManagerInternal.notifyPackageCrashOrAnr(aInfo.packageName);
-            }
-
             // mUiHandler can be null if the AMS is constructed with injector only. This will only
             // happen in tests.
             if (mService.mUiHandler != null) {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index fae941d..5a9c4de 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -54,6 +54,7 @@
 import static com.android.server.am.ActivityManagerService.TAG_PROCESSES;
 import static com.android.server.am.ActivityManagerService.TAG_UID_OBSERVERS;
 
+import android.Manifest;
 import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.ActivityManager.ProcessCapability;
@@ -76,6 +77,7 @@
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.res.Resources;
 import android.graphics.Point;
@@ -1774,8 +1776,8 @@
         checkSlow(startTime, "startProcess: done updating cpu stats");
 
         try {
+            final int userId = UserHandle.getUserId(app.uid);
             try {
-                final int userId = UserHandle.getUserId(app.uid);
                 AppGlobals.getPackageManager().checkPackageStartable(app.info.packageName, userId);
             } catch (RemoteException e) {
                 throw e.rethrowAsRuntimeException();
@@ -1798,6 +1800,12 @@
                             app.info.packageName);
                     externalStorageAccess = storageManagerInternal.hasExternalStorageAccess(uid,
                             app.info.packageName);
+                    if (pm.checkPermission(Manifest.permission.INSTALL_PACKAGES,
+                            app.info.packageName, userId)
+                            == PackageManager.PERMISSION_GRANTED) {
+                        Slog.i(TAG, app.info.packageName + " is exempt from freezer");
+                        app.mOptRecord.setFreezeExempt(true);
+                    }
                 } catch (RemoteException e) {
                     throw e.rethrowAsRuntimeException();
                 }
diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java
index d97d343..94e7f34 100644
--- a/services/core/java/com/android/server/am/ProcessStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessStateRecord.java
@@ -1253,13 +1253,13 @@
         if (mAllowStartFgs == REASON_DENIED) {
             // uid is on DeviceIdleController's user/system allowlist
             // or AMS's FgsStartTempAllowList.
-            FgsStartTempAllowList.TempFgsAllowListEntry entry =
+            ActivityManagerService.FgsTempAllowListItem item =
                     mService.isAllowlistedForFgsStartLOSP(mApp.info.uid);
-            if (entry != null) {
-                if (entry == ActivityManagerService.FAKE_TEMP_ALLOWLIST_ENTRY) {
+            if (item != null) {
+                if (item == ActivityManagerService.FAKE_TEMP_ALLOW_LIST_ITEM) {
                     mAllowStartFgs = REASON_SYSTEM_ALLOW_LISTED;
                 } else {
-                    mAllowStartFgs = entry.mReasonCode;
+                    mAllowStartFgs = item.mReasonCode;
                 }
             }
         }
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 21a02ed..fd59e85 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -179,7 +179,7 @@
     // Debug info why mAllowStartForeground is allowed or denied.
     String mInfoAllowStartForeground;
     // Debug info if mAllowStartForeground is allowed because of a temp-allowlist.
-    FgsStartTempAllowList.TempFgsAllowListEntry mInfoTempFgsAllowListReason;
+    ActivityManagerService.FgsTempAllowListItem mInfoTempFgsAllowListReason;
     // Is the same mInfoAllowStartForeground string has been logged before? Used for dedup.
     boolean mLoggedInfoAllowStartForeground;
     // The number of times Service.startForeground() is called;
diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
index fd829fa..52388ff 100644
--- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java
+++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
@@ -16,6 +16,7 @@
 
 package com.android.server.apphibernation;
 
+import static android.app.AppOpsManager.OP_NONE;
 import static android.content.Intent.ACTION_PACKAGE_ADDED;
 import static android.content.Intent.ACTION_PACKAGE_REMOVED;
 import static android.content.Intent.EXTRA_REMOVED_FOR_ALL_USERS;
@@ -25,20 +26,29 @@
 
 import static com.android.server.apphibernation.AppHibernationConstants.KEY_APP_HIBERNATION_ENABLED;
 
+import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityThread;
 import android.app.IActivityManager;
+import android.app.StatsManager;
+import android.app.StatsManager.StatsPullAtomCallback;
+import android.app.usage.UsageEvents;
+import android.app.usage.UsageStatsManagerInternal;
+import android.app.usage.UsageStatsManagerInternal.UsageEventListener;
 import android.apphibernation.IAppHibernationService;
 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.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
+import android.content.pm.UserInfo;
 import android.os.Binder;
 import android.os.Environment;
 import android.os.RemoteException;
@@ -55,10 +65,12 @@
 import android.util.ArraySet;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.StatsEvent;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.DumpUtils;
+import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
@@ -109,7 +121,7 @@
     private final boolean mOatArtifactDeletionEnabled;
 
     @VisibleForTesting
-    static boolean sIsServiceEnabled;
+    public static boolean sIsServiceEnabled;
 
     /**
      * Initializes the system service.
@@ -144,8 +156,8 @@
         intentFilter.addAction(ACTION_PACKAGE_REMOVED);
         intentFilter.addDataScheme("package");
         userAllContext.registerReceiver(mBroadcastReceiver, intentFilter);
-
         LocalServices.addService(AppHibernationManagerInternal.class, mLocalService);
+        mInjector.getUsageStatsManagerInternal().registerListener(mUsageEventListener);
     }
 
     @Override
@@ -170,6 +182,12 @@
                     NAMESPACE_APP_HIBERNATION,
                     ActivityThread.currentApplication().getMainExecutor(),
                     this::onDeviceConfigChanged);
+            getContext().getSystemService(StatsManager.class)
+                    .setPullAtomCallback(
+                            FrameworkStatsLog.USER_LEVEL_HIBERNATED_APPS,
+                            /* metadata */ null, // use default PullAtomMetadata values
+                            mBackgroundExecutor,
+                            new StatsPullAtomCallbackImpl());
         }
     }
 
@@ -265,6 +283,16 @@
             } else {
                 unhibernatePackageForUser(packageName, userId, pkgState);
             }
+            final UserLevelState stateSnapshot = new UserLevelState(pkgState);
+            final int userIdSnapshot = userId;
+            mBackgroundExecutor.execute(() -> {
+                FrameworkStatsLog.write(
+                        FrameworkStatsLog.USER_LEVEL_HIBERNATION_STATE_CHANGED,
+                        stateSnapshot.packageName,
+                        userIdSnapshot,
+                        stateSnapshot.hibernated,
+                        stateSnapshot.lastUnhibernatedMs);
+            });
             List<UserLevelState> states = new ArrayList<>(mUserStates.get(userId).values());
             mUserDiskStores.get(userId).scheduleWriteHibernationStates(states);
         }
@@ -365,6 +393,49 @@
         Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "unhibernatePackage");
         pkgState.hibernated = false;
         pkgState.lastUnhibernatedMs = System.currentTimeMillis();
+        // Deliver LOCKED_BOOT_COMPLETE AND BOOT_COMPLETE broadcast so app can re-register
+        // their alarms/jobs/etc.
+        try {
+            Intent lockedBcIntent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED)
+                    .setPackage(packageName);
+            final String[] requiredPermissions = {Manifest.permission.RECEIVE_BOOT_COMPLETED};
+            mIActivityManager.broadcastIntentWithFeature(
+                    null /* caller */,
+                    null /* callingFeatureId */,
+                    lockedBcIntent,
+                    null /* resolvedType */,
+                    null /* resultTo */,
+                    Activity.RESULT_OK,
+                    null /* resultData */,
+                    null /* resultExtras */,
+                    requiredPermissions,
+                    null /* excludedPermissions */,
+                    OP_NONE,
+                    null /* bOptions */,
+                    false /* serialized */,
+                    false /* sticky */,
+                    userId);
+
+            Intent bcIntent = new Intent(Intent.ACTION_BOOT_COMPLETED).setPackage(packageName);
+            mIActivityManager.broadcastIntentWithFeature(
+                    null /* caller */,
+                    null /* callingFeatureId */,
+                    bcIntent,
+                    null /* resolvedType */,
+                    null /* resultTo */,
+                    Activity.RESULT_OK,
+                    null /* resultData */,
+                    null /* resultExtras */,
+                    requiredPermissions,
+                    null /* excludedPermissions */,
+                    OP_NONE,
+                    null /* bOptions */,
+                    false /* serialized */,
+                    false /* sticky */,
+                    userId);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
         Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
     }
 
@@ -418,19 +489,29 @@
         }
 
         if (diskStates != null) {
-            Set<String> installedPackages = new ArraySet<>();
+            Map<String, PackageInfo> installedPackages = new ArrayMap<>();
             for (int i = 0, size = packages.size(); i < size; i++) {
-                installedPackages.add(packages.get(i).packageName);
+                installedPackages.put(packages.get(i).packageName, packages.get(i));
             }
             for (int i = 0, size = diskStates.size(); i < size; i++) {
                 String packageName = diskStates.get(i).packageName;
-                if (!installedPackages.contains(packageName)) {
+                PackageInfo pkgInfo = installedPackages.get(packageName);
+                UserLevelState currentState = diskStates.get(i);
+                if (pkgInfo == null) {
                     Slog.w(TAG, String.format(
                             "No hibernation state associated with package %s user %d. Maybe"
                                     + "the package was uninstalled? ", packageName, userId));
                     continue;
                 }
-                userLevelStates.put(packageName, diskStates.get(i));
+                if (pkgInfo.applicationInfo != null
+                        && (pkgInfo.applicationInfo.flags &= ApplicationInfo.FLAG_STOPPED) == 0
+                        && currentState.hibernated) {
+                    // App is not stopped but is hibernated. Disk state is stale, so unhibernate
+                    // the app.
+                    currentState.hibernated = false;
+                    currentState.lastUnhibernatedMs = System.currentTimeMillis();
+                }
+                userLevelStates.put(packageName, currentState);
             }
         }
         mUserStates.put(userId, userLevelStates);
@@ -487,6 +568,15 @@
                 // Ensure user hasn't stopped in the time to execute.
                 if (mUserManager.isUserUnlockingOrUnlocked(userId)) {
                     initializeUserHibernationStates(userId, storedStates);
+                    // Globally unhibernate a package if the unlocked user does not have it
+                    // hibernated.
+                    for (UserLevelState userState : mUserStates.get(userId).values()) {
+                        String pkgName = userState.packageName;
+                        GlobalLevelState globalState = mGlobalHibernationStates.get(pkgName);
+                        if (globalState.hibernated && !userState.hibernated) {
+                            setHibernatingGlobally(pkgName, false);
+                        }
+                    }
                 }
             }
         });
@@ -719,6 +809,20 @@
         }
     };
 
+    private final UsageEventListener mUsageEventListener = (userId, event) -> {
+        if (!isAppHibernationEnabled()) {
+            return;
+        }
+        final int eventType = event.mEventType;
+        if (eventType == UsageEvents.Event.USER_INTERACTION
+                || eventType == UsageEvents.Event.ACTIVITY_RESUMED
+                || eventType == UsageEvents.Event.APP_COMPONENT_USED) {
+            final String pkgName = event.mPackage;
+            setHibernatingForUser(pkgName, userId, false);
+            setHibernatingGlobally(pkgName, false);
+        }
+    };
+
     /**
      * Whether app hibernation is enabled on this device.
      *
@@ -751,6 +855,8 @@
 
         Executor getBackgroundExecutor();
 
+        UsageStatsManagerInternal getUsageStatsManagerInternal();
+
         HibernationStateDiskStore<GlobalLevelState> getGlobalLevelDiskStore();
 
         HibernationStateDiskStore<UserLevelState> getUserLevelDiskStore(int userId);
@@ -801,6 +907,11 @@
         }
 
         @Override
+        public UsageStatsManagerInternal getUsageStatsManagerInternal() {
+            return LocalServices.getService(UsageStatsManagerInternal.class);
+        }
+
+        @Override
         public HibernationStateDiskStore<GlobalLevelState> getGlobalLevelDiskStore() {
             File dir = new File(Environment.getDataSystemDirectory(), HIBERNATION_DIR_NAME);
             return new HibernationStateDiskStore<>(
@@ -820,4 +931,29 @@
                     com.android.internal.R.bool.config_hibernationDeletesOatArtifactsEnabled);
         }
     }
+
+    private final class StatsPullAtomCallbackImpl implements StatsPullAtomCallback {
+        @Override
+        public int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) {
+            if (atomTag != FrameworkStatsLog.USER_LEVEL_HIBERNATED_APPS) {
+                return StatsManager.PULL_SKIP;
+            }
+            if (isAppHibernationEnabled()) {
+                List<UserInfo> userInfos = mUserManager.getAliveUsers();
+                final int numUsers = userInfos.size();
+                for (int i = 0; i < numUsers; ++i) {
+                    final int userId = userInfos.get(i).id;
+                    if (mUserManager.isUserUnlockingOrUnlocked(userId)) {
+                        data.add(
+                                FrameworkStatsLog.buildStatsEvent(
+                                        atomTag,
+                                        getHibernatingPackagesForUser(userId).size(),
+                                        userId)
+                        );
+                    }
+                }
+            }
+            return StatsManager.PULL_SUCCESS;
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/apphibernation/UserLevelState.java b/services/core/java/com/android/server/apphibernation/UserLevelState.java
index b75b19d..68c363c 100644
--- a/services/core/java/com/android/server/apphibernation/UserLevelState.java
+++ b/services/core/java/com/android/server/apphibernation/UserLevelState.java
@@ -31,6 +31,14 @@
     @CurrentTimeMillisLong
     public long lastUnhibernatedMs;
 
+    UserLevelState() {}
+
+    UserLevelState(UserLevelState state) {
+        packageName = state.packageName;
+        hibernated = state.hibernated;
+        lastUnhibernatedMs = state.lastUnhibernatedMs;
+    }
+
     @Override
     public String toString() {
         return "UserLevelState{"
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 3f07572..7eaf18f 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -565,6 +565,9 @@
                 } else if (mActivityManagerInternal != null
                         && mActivityManagerInternal.isPendingTopUid(uid)) {
                     return MODE_ALLOWED;
+                } else if (mActivityManagerInternal != null
+                        && mActivityManagerInternal.isTempAllowlistedForFgsWhileInUse(uid)) {
+                    return MODE_ALLOWED;
                 } else if (state <= UID_STATE_TOP) {
                     // process is in TOP.
                     return MODE_ALLOWED;
@@ -3506,9 +3509,19 @@
     }
 
     @Override
-    public SyncNotedAppOp startOperation(IBinder clientId, int code, int uid, String packageName,
-            String attributionTag, boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
+    public SyncNotedAppOp startOperation(IBinder token, int code, int uid,
+            @Nullable String packageName, @Nullable String attributionTag,
+            boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
             String message, boolean shouldCollectMessage) {
+        return mCheckOpsDelegateDispatcher.startOperation(token, code, uid, packageName,
+                attributionTag, startIfModeDefault, shouldCollectAsyncNotedOp, message,
+                shouldCollectMessage);
+    }
+
+    private SyncNotedAppOp startOperationImpl(@NonNull IBinder clientId, int code, int uid,
+            @Nullable String packageName, @Nullable String attributionTag,
+            boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, @NonNull String message,
+            boolean shouldCollectMessage) {
         verifyIncomingUid(uid);
         verifyIncomingOp(code);
         verifyIncomingPackage(packageName, UserHandle.getUserId(uid));
@@ -3532,7 +3545,6 @@
         return startOperationUnchecked(clientId, code, uid, packageName, attributionTag,
                 Process.INVALID_UID, null, null, OP_FLAG_SELF, startIfModeDefault,
                 shouldCollectAsyncNotedOp, message, shouldCollectMessage, false);
-
     }
 
     @Override
@@ -6970,8 +6982,8 @@
         }
 
         public SyncNotedAppOp noteProxyOperation(int code, AttributionSource attributionSource,
-                boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
-                boolean skipProxyOperation) {
+                boolean shouldCollectAsyncNotedOp, @Nullable String message,
+                boolean shouldCollectMessage, boolean skipProxyOperation) {
             if (mPolicy != null) {
                 if (mCheckOpsDelegate != null) {
                     return mPolicy.noteProxyOperation(code, attributionSource,
@@ -7000,6 +7012,38 @@
                     AppOpsService.this::noteProxyOperationImpl);
         }
 
+        public SyncNotedAppOp startOperation(IBinder token, int code, int uid,
+                @Nullable String packageName, @NonNull String attributionTag,
+                boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
+                @Nullable String message, boolean shouldCollectMessage) {
+            if (mPolicy != null) {
+                if (mCheckOpsDelegate != null) {
+                    return mPolicy.startOperation(token, code, uid, packageName,
+                            attributionTag, startIfModeDefault, shouldCollectAsyncNotedOp, message,
+                            shouldCollectMessage, this::startDelegateOperationImpl);
+                } else {
+                    return mPolicy.startOperation(token, code, uid, packageName, attributionTag,
+                            startIfModeDefault, shouldCollectAsyncNotedOp, message,
+                            shouldCollectMessage, AppOpsService.this::startOperationImpl);
+                }
+            } else if (mCheckOpsDelegate != null) {
+                return startDelegateOperationImpl(token, code, uid, packageName, attributionTag,
+                        startIfModeDefault, shouldCollectAsyncNotedOp, message,
+                        shouldCollectMessage);
+            }
+            return startOperationImpl(token, code, uid, packageName, attributionTag,
+                    startIfModeDefault, shouldCollectAsyncNotedOp, message, shouldCollectMessage);
+        }
+
+        private SyncNotedAppOp startDelegateOperationImpl(IBinder token, int code, int uid,
+                @Nullable String packageName, @Nullable String attributionTag,
+                boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, String message,
+                boolean shouldCollectMessage) {
+            return mCheckOpsDelegate.startOperation(token, code, uid, packageName, attributionTag,
+                    startIfModeDefault, shouldCollectAsyncNotedOp, message, shouldCollectMessage,
+                    AppOpsService.this::startOperationImpl);
+        }
+
         public SyncNotedAppOp startProxyOperation(IBinder clientId, int code,
                 @NonNull AttributionSource attributionSource, boolean startIfModeDefault,
                 boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
diff --git a/services/core/java/com/android/server/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java
index f2e422d..63b41b7 100644
--- a/services/core/java/com/android/server/appop/DiscreteRegistry.java
+++ b/services/core/java/com/android/server/appop/DiscreteRegistry.java
@@ -92,8 +92,8 @@
             "discrete_history_quantization_millis";
     private static final String PROPERTY_DISCRETE_FLAGS = "discrete_history_op_flags";
     private static final String PROPERTY_DISCRETE_OPS_LIST = "discrete_history_ops_cslist";
-    private static final String DEFAULT_DISCRETE_OPS = OP_CAMERA + "," + OP_RECORD_AUDIO + ","
-            + OP_FINE_LOCATION + "," + OP_COARSE_LOCATION;
+    private static final String DEFAULT_DISCRETE_OPS = OP_FINE_LOCATION + "," + OP_COARSE_LOCATION
+            + "," + OP_CAMERA + "," + OP_RECORD_AUDIO;
     private static final long DEFAULT_DISCRETE_HISTORY_CUTOFF = Duration.ofHours(24).toMillis();
     private static final long MAXIMUM_DISCRETE_HISTORY_CUTOFF = Duration.ofDays(30).toMillis();
     private static final long DEFAULT_DISCRETE_HISTORY_QUANTIZATION =
@@ -104,7 +104,6 @@
     private static int[] sDiscreteOps;
     private static int sDiscreteFlags;
 
-
     private static final String TAG_HISTORY = "h";
     private static final String ATTR_VERSION = "v";
     private static final int CURRENT_VERSION = 1;
@@ -144,6 +143,8 @@
     @GuardedBy("mOnDiskLock")
     private DiscreteOps mCachedOps = null;
 
+    private boolean mDebugMode = false;
+
     DiscreteRegistry(Object inMemoryLock) {
         mInMemoryLock = inMemoryLock;
     }
@@ -159,40 +160,35 @@
                 AsyncTask.THREAD_POOL_EXECUTOR, (DeviceConfig.Properties p) -> {
                     setDiscreteHistoryParameters(p);
                 });
-        sDiscreteHistoryCutoff = DeviceConfig.getLong(DeviceConfig.NAMESPACE_PRIVACY,
-                PROPERTY_DISCRETE_HISTORY_CUTOFF, DEFAULT_DISCRETE_HISTORY_CUTOFF);
-        sDiscreteHistoryQuantization = DeviceConfig.getLong(DeviceConfig.NAMESPACE_PRIVACY,
-                PROPERTY_DISCRETE_HISTORY_QUANTIZATION, DEFAULT_DISCRETE_HISTORY_QUANTIZATION);
-        sDiscreteFlags = DeviceConfig.getInt(DeviceConfig.NAMESPACE_PRIVACY,
-                PROPERTY_DISCRETE_FLAGS, OP_FLAGS_DISCRETE);
-        sDiscreteOps = parseOpsList(DeviceConfig.getString(DeviceConfig.NAMESPACE_PRIVACY,
-                PROPERTY_DISCRETE_OPS_LIST, DEFAULT_DISCRETE_OPS));
+        setDiscreteHistoryParameters(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_PRIVACY));
     }
 
     private void setDiscreteHistoryParameters(DeviceConfig.Properties p) {
         if (p.getKeyset().contains(PROPERTY_DISCRETE_HISTORY_CUTOFF)) {
             sDiscreteHistoryCutoff = p.getLong(PROPERTY_DISCRETE_HISTORY_CUTOFF,
                     DEFAULT_DISCRETE_HISTORY_CUTOFF);
-            if (!Build.IS_DEBUGGABLE) {
+            if (!Build.IS_DEBUGGABLE && !mDebugMode) {
                 sDiscreteHistoryCutoff = min(MAXIMUM_DISCRETE_HISTORY_CUTOFF,
                         sDiscreteHistoryCutoff);
             }
+        } else {
+            sDiscreteHistoryCutoff = DEFAULT_DISCRETE_HISTORY_CUTOFF;
         }
         if (p.getKeyset().contains(PROPERTY_DISCRETE_HISTORY_QUANTIZATION)) {
             sDiscreteHistoryQuantization = p.getLong(PROPERTY_DISCRETE_HISTORY_QUANTIZATION,
                     DEFAULT_DISCRETE_HISTORY_QUANTIZATION);
-            if (!Build.IS_DEBUGGABLE) {
+            if (!Build.IS_DEBUGGABLE && !mDebugMode) {
                 sDiscreteHistoryQuantization = max(DEFAULT_DISCRETE_HISTORY_QUANTIZATION,
                         sDiscreteHistoryQuantization);
             }
+        } else {
+            sDiscreteHistoryQuantization = DEFAULT_DISCRETE_HISTORY_QUANTIZATION;
         }
-        if (p.getKeyset().contains(PROPERTY_DISCRETE_FLAGS)) {
-            sDiscreteFlags = p.getInt(PROPERTY_DISCRETE_FLAGS, OP_FLAGS_DISCRETE);
-        }
-        if (p.getKeyset().contains(PROPERTY_DISCRETE_OPS_LIST)) {
-            sDiscreteOps = parseOpsList(p.getString(PROPERTY_DISCRETE_OPS_LIST,
-                    DEFAULT_DISCRETE_OPS));
-        }
+        sDiscreteFlags = p.getKeyset().contains(PROPERTY_DISCRETE_FLAGS) ? sDiscreteFlags =
+                p.getInt(PROPERTY_DISCRETE_FLAGS, OP_FLAGS_DISCRETE) : OP_FLAGS_DISCRETE;
+        sDiscreteOps = p.getKeyset().contains(PROPERTY_DISCRETE_OPS_LIST) ? parseOpsList(
+                p.getString(PROPERTY_DISCRETE_OPS_LIST, DEFAULT_DISCRETE_OPS)) : parseOpsList(
+                DEFAULT_DISCRETE_OPS);
     }
 
     void recordDiscreteAccess(int uid, String packageName, int op, @Nullable String attributionTag,
@@ -232,6 +228,8 @@
             @Nullable String packageNameFilter, @Nullable String[] opNamesFilter,
             @Nullable String attributionTagFilter, @AppOpsManager.OpFlags int flagsFilter) {
         DiscreteOps discreteOps = getAllDiscreteOps();
+        beginTimeMillis = max(beginTimeMillis, Instant.now().minus(sDiscreteHistoryCutoff,
+                ChronoUnit.MILLIS).toEpochMilli());
         discreteOps.filter(beginTimeMillis, endTimeMillis, filter, uidFilter, packageNameFilter,
                 opNamesFilter, attributionTagFilter, flagsFilter);
         discreteOps.applyToHistoricalOps(result);
@@ -282,6 +280,18 @@
         }
     }
 
+    void offsetHistory(long offset) {
+        synchronized (mOnDiskLock) {
+            DiscreteOps discreteOps;
+            synchronized (mInMemoryLock) {
+                discreteOps = getAllDiscreteOps();
+                clearHistory();
+            }
+            discreteOps.offsetHistory(offset);
+            persistDiscreteOpsLocked(discreteOps);
+        }
+    }
+
     void dump(@NonNull PrintWriter pw, int uidFilter, @Nullable String packageNameFilter,
             @Nullable String attributionTagFilter,
             @AppOpsManager.HistoricalOpsRequestFilter int filter, int dumpOp,
@@ -363,6 +373,13 @@
             }
         }
 
+        private void offsetHistory(long offset) {
+            int nUids = mUids.size();
+            for (int i = 0; i < nUids; i++) {
+                mUids.valueAt(i).offsetHistory(offset);
+            }
+        }
+
         private void clearHistory(int uid, String packageName) {
             if (mUids.containsKey(uid)) {
                 mUids.get(uid).clearPackage(packageName);
@@ -549,6 +566,13 @@
             }
         }
 
+        private void offsetHistory(long offset) {
+            int nPackages = mPackages.size();
+            for (int i = 0; i < nPackages; i++) {
+                mPackages.valueAt(i).offsetHistory(offset);
+            }
+        }
+
         private void clearPackage(String packageName) {
             mPackages.remove(packageName);
         }
@@ -656,6 +680,13 @@
             }
         }
 
+        private void offsetHistory(long offset) {
+            int nOps = mPackageOps.size();
+            for (int i = 0; i < nOps; i++) {
+                mPackageOps.valueAt(i).offsetHistory(offset);
+            }
+        }
+
         private DiscreteOp getOrCreateDiscreteOp(int op) {
             DiscreteOp result = mPackageOps.get(op);
             if (result == null) {
@@ -749,12 +780,29 @@
             }
         }
 
+        private void offsetHistory(long offset) {
+            int nTags = mAttributedOps.size();
+            for (int i = 0; i < nTags; i++) {
+                List<DiscreteOpEvent> list = mAttributedOps.valueAt(i);
+
+                int n = list.size();
+                for (int j = 0; j < n; j++) {
+                    DiscreteOpEvent event = list.get(j);
+                    list.set(j, new DiscreteOpEvent(event.mNoteTime - offset, event.mNoteDuration,
+                            event.mUidState, event.mOpFlag));
+                }
+            }
+        }
+
         void addDiscreteAccess(@Nullable String attributionTag,
                 @AppOpsManager.OpFlags int flags, @AppOpsManager.UidState int uidState,
                 long accessTime, long accessDuration) {
             List<DiscreteOpEvent> attributedOps = getOrCreateDiscreteOpEventsList(
                     attributionTag);
             accessTime = accessTime / sDiscreteHistoryQuantization * sDiscreteHistoryQuantization;
+            accessDuration = accessDuration == -1 ? -1
+                    : (accessDuration + sDiscreteHistoryQuantization - 1)
+                            / sDiscreteHistoryQuantization * sDiscreteHistoryQuantization;
 
             int nAttributedOps = attributedOps.size();
             int i = nAttributedOps;
@@ -764,8 +812,7 @@
                     break;
                 }
                 if (previousOp.mOpFlag == flags && previousOp.mUidState == uidState) {
-                    if (accessDuration != previousOp.mNoteDuration
-                            && accessDuration > sDiscreteHistoryQuantization) {
+                    if (accessDuration != previousOp.mNoteDuration) {
                         break;
                     } else {
                         return;
@@ -983,5 +1030,9 @@
         }
         return true;
     }
+
+    void setDebugMode(boolean debugMode) {
+        this.mDebugMode = debugMode;
+    }
 }
 
diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java
index ffd2458..72e582e 100644
--- a/services/core/java/com/android/server/appop/HistoricalRegistry.java
+++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java
@@ -553,6 +553,11 @@
                     if (mMode == AppOpsManager.HISTORICAL_MODE_DISABLED) {
                         clearHistoryOnDiskDLocked();
                     }
+                    if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_PASSIVE) {
+                        mDiscreteRegistry.setDebugMode(true);
+                    } else {
+                        mDiscreteRegistry.setDebugMode(false);
+                    }
                 }
                 if (mBaseSnapshotInterval != baseSnapshotInterval) {
                     mBaseSnapshotInterval = baseSnapshotInterval;
@@ -591,6 +596,7 @@
                 mPersistence.persistHistoricalOpsDLocked(history);
             }
         }
+        mDiscreteRegistry.offsetHistory(offsetMillis);
     }
 
     void addHistoricalOps(HistoricalOps ops) {
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index edacd40..098ce7c 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -84,6 +84,7 @@
 import android.media.AudioRoutesInfo;
 import android.media.AudioSystem;
 import android.media.IAudioFocusDispatcher;
+import android.media.IAudioModeDispatcher;
 import android.media.IAudioRoutesObserver;
 import android.media.IAudioServerStateDispatcher;
 import android.media.IAudioService;
@@ -120,6 +121,7 @@
 import android.os.Message;
 import android.os.PowerManager;
 import android.os.Process;
+import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
@@ -312,6 +314,7 @@
     private static final int MSG_RECORDING_CONFIG_CHANGE = 37;
     private static final int MSG_SET_A2DP_DEV_CONNECTION_STATE = 38;
     private static final int MSG_A2DP_DEV_CONFIG_CHANGE = 39;
+    private static final int MSG_DISPATCH_AUDIO_MODE = 40;
 
     // start of messages handled under wakelock
     //   these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),
@@ -843,8 +846,8 @@
         mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
         mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator();
 
-        mSupportsMicPrivacyToggle = mContext.getPackageManager()
-                .hasSystemFeature(PackageManager.FEATURE_MICROPHONE_TOGGLE);
+        mSupportsMicPrivacyToggle = context.getSystemService(SensorPrivacyManager.class)
+                .supportsSensorToggle(SensorPrivacyManager.Sensors.MICROPHONE);
 
         // Initialize volume
         // Priority 1 - Android Property
@@ -4712,6 +4715,8 @@
                 if (DEBUG_MODE) {
                     Log.v(TAG, "onUpdateAudioMode: mode successfully set to " + mode);
                 }
+                sendMsg(mAudioHandler, MSG_DISPATCH_AUDIO_MODE, SENDMSG_REPLACE, mode, 0,
+                        /*obj*/ null, /*delay*/ 0);
                 int previousMode = mMode.getAndSet(mode);
                 // Note: newModeOwnerPid is always 0 when actualMode is MODE_NORMAL
                 mModeLogger.log(new PhoneStateEvent(requesterPackage, requesterPid,
@@ -4756,6 +4761,38 @@
         return mIsCallScreeningModeSupported;
     }
 
+    protected void dispatchMode(int mode) {
+        final int nbDispatchers = mModeDispatchers.beginBroadcast();
+        for (int i = 0; i < nbDispatchers; i++) {
+            try {
+                mModeDispatchers.getBroadcastItem(i).dispatchAudioModeChanged(mode);
+            } catch (RemoteException e) {
+            }
+        }
+        mModeDispatchers.finishBroadcast();
+    }
+
+    final RemoteCallbackList<IAudioModeDispatcher> mModeDispatchers =
+            new RemoteCallbackList<IAudioModeDispatcher>();
+
+    /**
+     * @see {@link AudioManager#addOnModeChangedListener(Executor, AudioManager.OnModeChangedListener)}
+     * @param dispatcher
+     */
+    public void registerModeDispatcher(
+            @NonNull IAudioModeDispatcher dispatcher) {
+        mModeDispatchers.register(dispatcher);
+    }
+
+    /**
+     * @see {@link AudioManager#removeOnModeChangedListener(AudioManager.OnModeChangedListener)}
+     * @param dispatcher
+     */
+    public void unregisterModeDispatcher(
+            @NonNull IAudioModeDispatcher dispatcher) {
+        mModeDispatchers.unregister(dispatcher);
+    }
+
     /** @see AudioManager#setRttEnabled() */
     @Override
     public void setRttEnabled(boolean rttEnabled) {
@@ -7522,6 +7559,10 @@
                 case MSG_A2DP_DEV_CONFIG_CHANGE:
                     mDeviceBroker.postBluetoothA2dpDeviceConfigChange((BluetoothDevice) msg.obj);
                     break;
+
+                case MSG_DISPATCH_AUDIO_MODE:
+                    dispatchMode(msg.arg1);
+                    break;
             }
         }
     }
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
index 88e47a0..6f73985 100644
--- a/services/core/java/com/android/server/biometrics/AuthService.java
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
@@ -30,12 +30,14 @@
 import static android.hardware.biometrics.BiometricManager.Authenticators;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricManager;
+import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.biometrics.IAuthService;
-import android.hardware.biometrics.IBiometricAuthenticator;
 import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
 import android.hardware.biometrics.IBiometricService;
 import android.hardware.biometrics.IBiometricServiceReceiver;
@@ -44,7 +46,11 @@
 import android.hardware.biometrics.ITestSessionCallback;
 import android.hardware.biometrics.PromptInfo;
 import android.hardware.biometrics.SensorPropertiesInternal;
+import android.hardware.face.FaceSensorProperties;
+import android.hardware.face.FaceSensorPropertiesInternal;
 import android.hardware.face.IFaceService;
+import android.hardware.fingerprint.FingerprintSensorProperties;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.hardware.fingerprint.IFingerprintService;
 import android.hardware.iris.IIrisService;
 import android.os.Binder;
@@ -58,11 +64,10 @@
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
 import com.android.server.SystemService;
-import com.android.server.biometrics.sensors.face.FaceAuthenticator;
-import com.android.server.biometrics.sensors.fingerprint.FingerprintAuthenticator;
-import com.android.server.biometrics.sensors.iris.IrisAuthenticator;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -337,7 +342,7 @@
         }
 
         @Override
-        public long[] getAuthenticatorIds() throws RemoteException {
+        public long[] getAuthenticatorIds(int userId) throws RemoteException {
             // In this method, we're not checking whether the caller is permitted to use face
             // API because current authenticator ID is leaked (in a more contrived way) via Android
             // Keystore (android.security.keystore package): the user of that API can create a key
@@ -355,9 +360,13 @@
             // method from inside app processes.
 
             final int callingUserId = UserHandle.getCallingUserId();
+            if (userId != callingUserId) {
+                getContext().enforceCallingOrSelfPermission(USE_BIOMETRIC_INTERNAL,
+                        "Must have " + USE_BIOMETRIC_INTERNAL + " permission.");
+            }
             final long identity = Binder.clearCallingIdentity();
             try {
-                return mBiometricService.getAuthenticatorIds(callingUserId);
+                return mBiometricService.getAuthenticatorIds(userId);
             } finally {
                 Binder.restoreCallingIdentity(identity);
             }
@@ -574,81 +583,119 @@
         mImpl = new AuthServiceImpl();
     }
 
+
+    /**
+     * Registration of all HIDL and AIDL biometric HALs starts here.
+     * The flow looks like this:
+     * AuthService
+     * └── .onStart()
+     *     └── .registerAuthenticators(...)
+     *         ├── FaceService.registerAuthenticators(...)
+     *         │   └── for (p : serviceProviders)
+     *         │       └── for (s : p.sensors)
+     *         │           └── BiometricService.registerAuthenticator(s)
+     *         │
+     *         ├── FingerprintService.registerAuthenticators(...)
+     *         │   └── for (p : serviceProviders)
+     *         │       └── for (s : p.sensors)
+     *         │           └── BiometricService.registerAuthenticator(s)
+     *         │
+     *         └── IrisService.registerAuthenticators(...)
+     *             └── for (p : serviceProviders)
+     *                 └── for (s : p.sensors)
+     *                     └── BiometricService.registerAuthenticator(s)
+     */
     @Override
     public void onStart() {
         mBiometricService = mInjector.getBiometricService();
 
+        final SensorConfig[] hidlConfigs;
         if (!mInjector.isHidlDisabled(getContext())) {
-            final String[] configs = mInjector.getConfiguration(getContext());
-            for (String config : configs) {
-                try {
-                    registerAuthenticator(new SensorConfig(config));
-                } catch (RemoteException e) {
-                    Slog.e(TAG, "Remote exception", e);
-                }
+            final String[] configStrings = mInjector.getConfiguration(getContext());
+            hidlConfigs = new SensorConfig[configStrings.length];
+            for (int i = 0; i < configStrings.length; ++i) {
+                hidlConfigs[i] = new SensorConfig(configStrings[i]);
             }
+        } else {
+            hidlConfigs = null;
         }
 
+        // Registers HIDL and AIDL authenticators, but only HIDL configs need to be provided.
+        registerAuthenticators(hidlConfigs);
+
         mInjector.publishBinderService(this, mImpl);
     }
 
-    private void registerAuthenticator(SensorConfig config) throws RemoteException {
-        Slog.d(TAG, "Registering ID: " + config.id
-                + " Modality: " + config.modality
-                + " Strength: " + config.strength);
+    /**
+     * Registers HIDL and AIDL authenticators for all of the available modalities.
+     *
+     * @param hidlSensors Array of {@link SensorConfig} configuration for all of the HIDL sensors
+     *                    available on the device. This array may contain configuration for
+     *                    different modalities and different sensors of the same modality in
+     *                    arbitrary order. Can be null if no HIDL sensors exist on the device.
+     */
+    private void registerAuthenticators(@Nullable SensorConfig[] hidlSensors) {
+        List<FingerprintSensorPropertiesInternal> hidlFingerprintSensors = new ArrayList<>();
+        List<FaceSensorPropertiesInternal> hidlFaceSensors = new ArrayList<>();
+        // Iris doesn't have IrisSensorPropertiesInternal, using SensorPropertiesInternal instead.
+        List<SensorPropertiesInternal> hidlIrisSensors = new ArrayList<>();
 
-        final IBiometricAuthenticator.Stub authenticator;
+        if (hidlSensors != null) {
+            for (SensorConfig sensor : hidlSensors) {
+                Slog.d(TAG, "Registering HIDL ID: " + sensor.id + " Modality: " + sensor.modality
+                        + " Strength: " + sensor.strength);
+                switch (sensor.modality) {
+                    case TYPE_FINGERPRINT:
+                        hidlFingerprintSensors.add(
+                                getHidlFingerprintSensorProps(sensor.id, sensor.strength));
+                        break;
 
-        switch (config.modality) {
-            case TYPE_FINGERPRINT:
-                final IFingerprintService fingerprintService = mInjector.getFingerprintService();
-                if (fingerprintService == null) {
-                    Slog.e(TAG, "Attempting to register with null FingerprintService."
-                            + " Please check your device configuration.");
-                    return;
+                    case TYPE_FACE:
+                        hidlFaceSensors.add(getHidlFaceSensorProps(sensor.id, sensor.strength));
+                        break;
+
+                    case TYPE_IRIS:
+                        hidlIrisSensors.add(getHidlIrisSensorProps(sensor.id, sensor.strength));
+                        break;
+
+                    default:
+                        Slog.e(TAG, "Unknown modality: " + sensor.modality);
                 }
-
-                // Initialize this outside of FingerprintAuthenticator. Only HIDL HALs require
-                // initialization from here. AIDL HALs are initialized by FingerprintService since
-                // the HAL interface provides ID, strength, and other configuration information.
-                fingerprintService.initializeConfiguration(config.id, config.strength);
-                authenticator = new FingerprintAuthenticator(fingerprintService, config.id);
-                break;
-
-            case TYPE_FACE:
-                final IFaceService faceService = mInjector.getFaceService();
-                if (faceService == null) {
-                    Slog.e(TAG, "Attempting to register with null FaceService. Please check "
-                            + " your device configuration.");
-                    return;
-                }
-
-                // Initialize this outside of FingerprintAuthenticator. Only HIDL HALs require
-                // initialization from here. AIDL HALs are initialized by FaceService since
-                // the HAL interface provides ID, strength, and other configuration information.
-                faceService.initializeConfiguration(config.id, config.strength);
-                authenticator = new FaceAuthenticator(faceService, config.id);
-                break;
-
-            case TYPE_IRIS:
-                final IIrisService irisService = mInjector.getIrisService();
-                if (irisService == null) {
-                    Slog.e(TAG, "Attempting to register with null IrisService. Please check"
-                            + " your device configuration.");
-                    return;
-                }
-
-                irisService.initializeConfiguration(config.id, config.strength);
-                authenticator = new IrisAuthenticator(irisService, config.id);
-                break;
-
-            default:
-                Slog.e(TAG, "Unknown modality: " + config.modality);
-                return;
+            }
         }
 
-        mBiometricService.registerAuthenticator(config.id, config.modality, config.strength,
-                authenticator);
+        final IFingerprintService fingerprintService = mInjector.getFingerprintService();
+        if (fingerprintService != null) {
+            try {
+                fingerprintService.registerAuthenticators(hidlFingerprintSensors);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "RemoteException when registering fingerprint authenticators", e);
+            }
+        } else if (hidlFingerprintSensors.size() > 0) {
+            Slog.e(TAG, "HIDL fingerprint configuration exists, but FingerprintService is null.");
+        }
+
+        final IFaceService faceService = mInjector.getFaceService();
+        if (faceService != null) {
+            try {
+                faceService.registerAuthenticators(hidlFaceSensors);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "RemoteException when registering face authenticators", e);
+            }
+        } else if (hidlFaceSensors.size() > 0) {
+            Slog.e(TAG, "HIDL face configuration exists, but FaceService is null.");
+        }
+
+        final IIrisService irisService = mInjector.getIrisService();
+        if (irisService != null) {
+            try {
+                irisService.registerAuthenticators(hidlIrisSensors);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "RemoteException when registering iris authenticators", e);
+            }
+        } else if (hidlIrisSensors.size() > 0) {
+            Slog.e(TAG, "HIDL iris configuration exists, but IrisService is null.");
+        }
     }
 
     private void checkInternalPermission() {
@@ -674,4 +721,72 @@
         return modality == BiometricAuthenticator.TYPE_CREDENTIAL
                 ? modality : (modality & ~BiometricAuthenticator.TYPE_CREDENTIAL);
     }
+
+
+    private FingerprintSensorPropertiesInternal getHidlFingerprintSensorProps(int sensorId,
+            @BiometricManager.Authenticators.Types int strength) {
+        // The existence of config_udfps_sensor_props indicates that the sensor is UDFPS.
+        final int[] udfpsProps = getContext().getResources().getIntArray(
+                com.android.internal.R.array.config_udfps_sensor_props);
+
+        final boolean isUdfps = !ArrayUtils.isEmpty(udfpsProps);
+
+        // config_is_powerbutton_fps indicates whether device has a power button fingerprint sensor.
+        final boolean isPowerbuttonFps = getContext().getResources().getBoolean(
+                R.bool.config_is_powerbutton_fps);
+
+        final @FingerprintSensorProperties.SensorType int sensorType;
+        if (isUdfps) {
+            sensorType = FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
+        } else if (isPowerbuttonFps) {
+            sensorType = FingerprintSensorProperties.TYPE_POWER_BUTTON;
+        } else {
+            sensorType = FingerprintSensorProperties.TYPE_REAR;
+        }
+
+        // IBiometricsFingerprint@2.1 does not manage timeout below the HAL, so the Gatekeeper HAT
+        // cannot be checked.
+        final boolean resetLockoutRequiresHardwareAuthToken = false;
+        final int maxEnrollmentsPerUser = getContext().getResources().getInteger(
+                R.integer.config_fingerprintMaxTemplatesPerUser);
+
+        final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+        if (isUdfps && udfpsProps.length == 3) {
+            return new FingerprintSensorPropertiesInternal(sensorId,
+                    Utils.authenticatorStrengthToPropertyStrength(strength), maxEnrollmentsPerUser,
+                    componentInfo, sensorType, resetLockoutRequiresHardwareAuthToken, udfpsProps[0],
+                    udfpsProps[1], udfpsProps[2]);
+        } else {
+            return new FingerprintSensorPropertiesInternal(sensorId,
+                    Utils.authenticatorStrengthToPropertyStrength(strength), maxEnrollmentsPerUser,
+                    componentInfo, sensorType, resetLockoutRequiresHardwareAuthToken);
+        }
+    }
+
+    private FaceSensorPropertiesInternal getHidlFaceSensorProps(int sensorId,
+            @BiometricManager.Authenticators.Types int strength) {
+        final boolean supportsSelfIllumination = getContext().getResources().getBoolean(
+                R.bool.config_faceAuthSupportsSelfIllumination);
+        final int maxTemplatesAllowed = getContext().getResources().getInteger(
+                R.integer.config_faceMaxTemplatesPerUser);
+        final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+        final boolean supportsFaceDetect = false;
+        final boolean resetLockoutRequiresChallenge = true;
+        return new FaceSensorPropertiesInternal(sensorId,
+                Utils.authenticatorStrengthToPropertyStrength(strength), maxTemplatesAllowed,
+                componentInfo, FaceSensorProperties.TYPE_UNKNOWN, supportsFaceDetect,
+                supportsSelfIllumination, resetLockoutRequiresChallenge);
+    }
+
+    private SensorPropertiesInternal getHidlIrisSensorProps(int sensorId,
+            @BiometricManager.Authenticators.Types int strength) {
+        final int maxEnrollmentsPerUser = 1;
+        final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+        final boolean resetLockoutRequiresHardwareAuthToken = false;
+        final boolean resetLockoutRequiresChallenge = false;
+        return new SensorPropertiesInternal(sensorId,
+                Utils.authenticatorStrengthToPropertyStrength(strength), maxEnrollmentsPerUser,
+                componentInfo, resetLockoutRequiresHardwareAuthToken,
+                resetLockoutRequiresChallenge);
+    }
 }
diff --git a/services/core/java/com/android/server/biometrics/BiometricStrengthController.java b/services/core/java/com/android/server/biometrics/BiometricStrengthController.java
index c96a182..270621c 100644
--- a/services/core/java/com/android/server/biometrics/BiometricStrengthController.java
+++ b/services/core/java/com/android/server/biometrics/BiometricStrengthController.java
@@ -84,6 +84,8 @@
             final int id = sensor.id;
             if (idToStrength.containsKey(id)) {
                 final int newStrength = idToStrength.get(id);
+                Slog.d(TAG, "updateStrengths: update sensorId=" + id + " to newStrength="
+                        + newStrength);
                 sensor.updateStrength(newStrength);
             }
         }
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java
index f4cb387..996f0fd 100644
--- a/services/core/java/com/android/server/biometrics/Utils.java
+++ b/services/core/java/com/android/server/biometrics/Utils.java
@@ -411,6 +411,23 @@
     }
 
     /**
+     * Returns the sensor's current strength, taking any updated strengths into effect.
+     *
+     * @param sensorId The sensor Id
+     * @return see {@link BiometricManager.Authenticators}
+     */
+    public static @Authenticators.Types int getCurrentStrength(int sensorId) {
+        IBiometricService service = IBiometricService.Stub.asInterface(
+                ServiceManager.getService(Context.BIOMETRIC_SERVICE));
+        try {
+            return service.getCurrentStrength(sensorId);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "RemoteException", e);
+            return Authenticators.EMPTY_SET;
+        }
+    }
+
+    /**
      * Checks if a client package matches Keyguard and can perform internal biometric operations.
      *
      * @param context The system context.
diff --git a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
index f744374..fbf2492 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AcquisitionClient.java
@@ -17,6 +17,7 @@
 package com.android.server.biometrics.sensors;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.Context;
 import android.hardware.biometrics.BiometricConstants;
 import android.media.AudioAttributes;
@@ -26,6 +27,7 @@
 import android.os.SystemClock;
 import android.os.VibrationEffect;
 import android.os.Vibrator;
+import android.text.TextUtils;
 import android.util.Slog;
 
 /**
@@ -43,6 +45,15 @@
                     .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
                     .build();
 
+    private final VibrationEffect mEffectTick = VibrationEffect.get(VibrationEffect.EFFECT_TICK);
+    private final VibrationEffect mEffectTextureTick =
+            VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK);
+    private final VibrationEffect mEffectClick = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+    private final VibrationEffect mEffectHeavy =
+            VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK);
+    private final VibrationEffect mDoubleClick =
+            VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+
     private final PowerManager mPowerManager;
     private final VibrationEffect mSuccessVibrationEffect;
     private final VibrationEffect mErrorVibrationEffect;
@@ -61,8 +72,8 @@
         super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality,
                 statsAction, statsClient);
         mPowerManager = context.getSystemService(PowerManager.class);
-        mSuccessVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-        mErrorVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+        mSuccessVibrationEffect = mEffectClick;
+        mErrorVibrationEffect = mDoubleClick;
     }
 
     @Override
@@ -181,18 +192,47 @@
         mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
     }
 
+    protected @NonNull VibrationEffect getSuccessVibrationEffect() {
+        return mSuccessVibrationEffect;
+    }
+
+    protected @NonNull VibrationEffect getErrorVibrationEffect() {
+        return mErrorVibrationEffect;
+    }
 
     protected final void vibrateSuccess() {
         Vibrator vibrator = getContext().getSystemService(Vibrator.class);
         if (vibrator != null) {
-            vibrator.vibrate(mSuccessVibrationEffect, VIBRATION_SONFICATION_ATTRIBUTES);
+            vibrator.vibrate(getSuccessVibrationEffect(), VIBRATION_SONFICATION_ATTRIBUTES);
         }
     }
 
     protected final void vibrateError() {
         Vibrator vibrator = getContext().getSystemService(Vibrator.class);
         if (vibrator != null) {
-            vibrator.vibrate(mErrorVibrationEffect, VIBRATION_SONFICATION_ATTRIBUTES);
+            vibrator.vibrate(getErrorVibrationEffect(), VIBRATION_SONFICATION_ATTRIBUTES);
+        }
+    }
+
+    protected final @NonNull VibrationEffect getVibration(@Nullable String effect,
+            @NonNull VibrationEffect defaultEffect) {
+        if (TextUtils.isEmpty(effect)) {
+            return defaultEffect;
+        }
+
+        switch (effect.toLowerCase()) {
+            case "click":
+                return mEffectClick;
+            case "heavy":
+                return mEffectHeavy;
+            case "texture_tick":
+                return mEffectTextureTick;
+            case "tick":
+                return mEffectTick;
+            case "double_click":
+                return mDoubleClick;
+            default:
+                return defaultEffect;
         }
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
index cf545f3..8668828 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
@@ -22,6 +22,7 @@
 import android.app.ActivityTaskManager;
 import android.app.TaskStackListener;
 import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.hardware.biometrics.BiometricAuthenticator;
@@ -30,6 +31,8 @@
 import android.hardware.biometrics.BiometricsProtoEnums;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.os.VibrationEffect;
+import android.provider.Settings;
 import android.security.KeyStore;
 import android.util.EventLog;
 import android.util.Slog;
@@ -56,12 +59,14 @@
     private final LockoutTracker mLockoutTracker;
     private final boolean mIsRestricted;
     private final boolean mAllowBackgroundAuthentication;
+    @NonNull private final ContentResolver mContentResolver;
 
     protected final long mOperationId;
 
     private long mStartTimeMs;
 
     protected boolean mAuthAttempted;
+    private final boolean mCustomHaptics;
 
     public AuthenticationClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
             @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
@@ -80,6 +85,10 @@
         mLockoutTracker = lockoutTracker;
         mIsRestricted = restricted;
         mAllowBackgroundAuthentication = allowBackgroundAuthentication;
+
+        mContentResolver = context.getContentResolver();
+        mCustomHaptics = Settings.Global.getInt(mContentResolver,
+                "fp_custom_success_error", 0) == 1;
     }
 
     public @LockoutTracker.LockoutMode int handleFailedAttempt(int userId) {
@@ -333,4 +342,25 @@
     public boolean interruptsPrecedingClients() {
         return true;
     }
+
+    @Override
+    protected @NonNull VibrationEffect getSuccessVibrationEffect() {
+        if (!mCustomHaptics) {
+            return super.getSuccessVibrationEffect();
+        }
+
+        return getVibration(Settings.Global.getString(mContentResolver,
+                "fp_success_type"), super.getSuccessVibrationEffect());
+    }
+
+    @Override
+    protected @NonNull VibrationEffect getErrorVibrationEffect() {
+        if (!mCustomHaptics) {
+            return super.getErrorVibrationEffect();
+        }
+
+        return getVibration(Settings.Global.getString(mContentResolver,
+                "fp_error_type"), super.getErrorVibrationEffect());
+
+    }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
index cc27127..aa50790 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java
@@ -471,8 +471,7 @@
      * Adds a {@link BaseClientMonitor} to the pending queue
      *
      * @param clientMonitor        operation to be scheduled
-     * @param clientCallback optional callback, invoked when the client is finished, but
-     *                             before it has been removed from the queue.
+     * @param clientCallback optional callback, invoked when the client state changes.
      */
     public void scheduleClientMonitor(@NonNull BaseClientMonitor clientMonitor,
             @Nullable BaseClientMonitor.Callback clientCallback) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricServiceCallback.java b/services/core/java/com/android/server/biometrics/sensors/BiometricServiceCallback.java
deleted file mode 100644
index 2ae6ccd..0000000
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricServiceCallback.java
+++ /dev/null
@@ -1,28 +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.biometrics.sensors;
-
-/**
- * System_server services that require BiometricService to load before finishing initialization
- * should implement this interface.
- */
-public interface BiometricServiceCallback {
-    /**
-     * Notifies the service that BiometricService is initialized.
-     */
-    void onBiometricServiceReady();
-}
diff --git a/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java b/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java
index 25b7add..d82847c 100644
--- a/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java
+++ b/services/core/java/com/android/server/biometrics/sensors/ClientMonitorCallbackConverter.java
@@ -146,9 +146,10 @@
         }
     }
 
-    public void onFeatureGet(boolean success, int feature, boolean value) throws RemoteException {
+    public void onFeatureGet(boolean success, int[] features, boolean[] featureState)
+            throws RemoteException {
         if (mFaceServiceReceiver != null) {
-            mFaceServiceReceiver.onFeatureGet(success, feature, value);
+            mFaceServiceReceiver.onFeatureGet(success, features, featureState);
         }
     }
 
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
index 0002ad2..0bc4f1b 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java
@@ -36,7 +36,7 @@
     private final IFaceService mFaceService;
     private final int mSensorId;
 
-    public FaceAuthenticator(IFaceService faceService, int sensorId) throws RemoteException {
+    public FaceAuthenticator(IFaceService faceService, int sensorId) {
         mFaceService = faceService;
         mSensorId = sensorId;
     }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
index ada8476..779558e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
@@ -57,7 +57,6 @@
 import com.android.server.ServiceThread;
 import com.android.server.SystemService;
 import com.android.server.biometrics.Utils;
-import com.android.server.biometrics.sensors.BiometricServiceCallback;
 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.LockoutTracker;
@@ -76,7 +75,7 @@
  * The service is responsible for maintaining a list of clients and dispatching all
  * face-related events.
  */
-public class FaceService extends SystemService implements BiometricServiceCallback {
+public class FaceService extends SystemService {
 
     protected static final String TAG = "FaceService";
 
@@ -618,12 +617,76 @@
                     new ClientMonitorCallbackConverter(receiver), opPackageName);
         }
 
+        private void addHidlProviders(@NonNull List<FaceSensorPropertiesInternal> hidlSensors) {
+            for (FaceSensorPropertiesInternal hidlSensor : hidlSensors) {
+                mServiceProviders.add(
+                        new Face10(getContext(), hidlSensor, mLockoutResetDispatcher));
+            }
+        }
+
+        private void addAidlProviders() {
+            final String[] instances = ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
+            if (instances == null || instances.length == 0) {
+                return;
+            }
+            for (String instance : instances) {
+                final String fqName = IFace.DESCRIPTOR + "/" + instance;
+                final IFace face = IFace.Stub.asInterface(
+                        Binder.allowBlocking(ServiceManager.waitForDeclaredService(fqName)));
+                if (face == null) {
+                    Slog.e(TAG, "Unable to get declared service: " + fqName);
+                    continue;
+                }
+                try {
+                    final SensorProps[] props = face.getSensorProps();
+                    final FaceProvider provider = new FaceProvider(getContext(), props, instance,
+                            mLockoutResetDispatcher);
+                    mServiceProviders.add(provider);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Remote exception in getSensorProps: " + fqName);
+                }
+            }
+        }
+
         @Override // Binder call
-        public void initializeConfiguration(int sensorId,
-                @BiometricManager.Authenticators.Types int strength) {
+        public void registerAuthenticators(
+                @NonNull List<FaceSensorPropertiesInternal> hidlSensors) {
             Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
-            mServiceProviders.add(
-                    new Face10(getContext(), sensorId, strength, mLockoutResetDispatcher));
+
+            // Some HAL might not be started before the system service and will cause the code below
+            // to wait, and some of the operations below might take a significant amount of time to
+            // complete (calls to the HALs). To avoid blocking the rest of system server we put
+            // this on a background thread.
+            final ServiceThread thread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND,
+                    true /* allowIo */);
+            thread.start();
+            final Handler handler = new Handler(thread.getLooper());
+
+            handler.post(() -> {
+                addHidlProviders(hidlSensors);
+                addAidlProviders();
+
+                final IBiometricService biometricService = IBiometricService.Stub.asInterface(
+                        ServiceManager.getService(Context.BIOMETRIC_SERVICE));
+
+                // Register each sensor individually with BiometricService
+                for (ServiceProvider provider : mServiceProviders) {
+                    final List<FaceSensorPropertiesInternal> props = provider.getSensorProperties();
+                    for (FaceSensorPropertiesInternal prop : props) {
+                        final int sensorId = prop.sensorId;
+                        final @BiometricManager.Authenticators.Types int strength =
+                                Utils.propertyStrengthToAuthenticatorStrength(prop.sensorStrength);
+                        final FaceAuthenticator authenticator = new FaceAuthenticator(
+                                mServiceWrapper, sensorId);
+                        try {
+                            biometricService.registerAuthenticator(sensorId, TYPE_FACE, strength,
+                                    authenticator);
+                        } catch (RemoteException e) {
+                            Slog.e(TAG, "Remote exception when registering sensorId: " + sensorId);
+                        }
+                    }
+                }
+            });
         }
     }
 
@@ -636,57 +699,6 @@
     }
 
     @Override
-    public void onBiometricServiceReady() {
-        final IBiometricService biometricService = IBiometricService.Stub.asInterface(
-                ServiceManager.getService(Context.BIOMETRIC_SERVICE));
-
-        final String[] instances = ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
-        if (instances == null || instances.length == 0) {
-            return;
-        }
-
-        // If for some reason the HAL is not started before the system service, do not block
-        // the rest of system server. Put this on a background thread.
-        final ServiceThread thread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND,
-                true /* allowIo */);
-        thread.start();
-        final Handler handler = new Handler(thread.getLooper());
-
-        handler.post(() -> {
-            for (String instance : instances) {
-                final String fqName = IFace.DESCRIPTOR + "/" + instance;
-                final IFace face = IFace.Stub.asInterface(
-                        ServiceManager.waitForDeclaredService(fqName));
-                try {
-                    final SensorProps[] props = face.getSensorProps();
-                    final FaceProvider provider = new FaceProvider(getContext(), props, instance,
-                            mLockoutResetDispatcher);
-                    mServiceProviders.add(provider);
-
-                    // Register each sensor individually with BiometricService
-                    for (SensorProps prop : props) {
-                        final int sensorId = prop.commonProps.sensorId;
-                        @BiometricManager.Authenticators.Types int strength =
-                                Utils.propertyStrengthToAuthenticatorStrength(
-                                        prop.commonProps.sensorStrength);
-                        final FaceAuthenticator authenticator =
-                                new FaceAuthenticator(mServiceWrapper, sensorId);
-                        try {
-                            biometricService.registerAuthenticator(sensorId, TYPE_FACE, strength,
-                                    authenticator);
-                        } catch (RemoteException e) {
-                            Slog.e(TAG, "Remote exception when registering sensorId: "
-                                    + sensorId);
-                        }
-                    }
-                } catch (RemoteException e) {
-                    Slog.e(TAG, "Remote exception when initializing instance: " + fqName);
-                }
-            }
-        });
-    }
-
-    @Override
     public void onStart() {
         publishBinderService(Context.FACE_SERVICE, mServiceWrapper);
     }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java
index 769c47a..5d713f3 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java
@@ -18,52 +18,131 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.hardware.biometrics.BiometricFaceConstants;
+import android.hardware.biometrics.face.AcquiredInfo;
 import android.hardware.biometrics.face.AuthenticationFrame;
 import android.hardware.biometrics.face.BaseFrame;
 import android.hardware.biometrics.face.Cell;
 import android.hardware.biometrics.face.EnrollmentFrame;
+import android.hardware.biometrics.face.Error;
 import android.hardware.face.FaceAuthenticationFrame;
 import android.hardware.face.FaceDataFrame;
 import android.hardware.face.FaceEnrollCell;
 import android.hardware.face.FaceEnrollFrame;
 
 /**
- * Utilities for converting between hardware and framework-defined AIDL models.
+ * Utilities for converting from hardware to framework-defined AIDL models.
  */
 final class AidlConversionUtils {
     // Prevent instantiation.
-    private AidlConversionUtils() {}
+    private AidlConversionUtils() {
+    }
 
-    @NonNull
-    public static FaceAuthenticationFrame convert(@NonNull AuthenticationFrame frame) {
-        return new FaceAuthenticationFrame(convert(frame.data));
+    public static @BiometricFaceConstants.FaceError int toFrameworkError(byte aidlError) {
+        if (aidlError == Error.UNKNOWN) {
+            // No framework constant available
+            return BiometricFaceConstants.FACE_ERROR_UNKNOWN;
+        } else if (aidlError == Error.HW_UNAVAILABLE) {
+            return BiometricFaceConstants.FACE_ERROR_HW_UNAVAILABLE;
+        } else if (aidlError == Error.UNABLE_TO_PROCESS) {
+            return BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS;
+        } else if (aidlError == Error.TIMEOUT) {
+            return BiometricFaceConstants.FACE_ERROR_TIMEOUT;
+        } else if (aidlError == Error.NO_SPACE) {
+            return BiometricFaceConstants.FACE_ERROR_NO_SPACE;
+        } else if (aidlError == Error.CANCELED) {
+            return BiometricFaceConstants.FACE_ERROR_CANCELED;
+        } else if (aidlError == Error.UNABLE_TO_REMOVE) {
+            return BiometricFaceConstants.FACE_ERROR_UNABLE_TO_REMOVE;
+        } else if (aidlError == Error.VENDOR) {
+            return BiometricFaceConstants.FACE_ERROR_VENDOR;
+        } else if (aidlError == Error.REENROLL_REQUIRED) {
+            return BiometricFaceConstants.BIOMETRIC_ERROR_RE_ENROLL;
+        } else {
+            return BiometricFaceConstants.FACE_ERROR_UNKNOWN;
+        }
+    }
+
+    public static @BiometricFaceConstants.FaceAcquired int toFrameworkAcquiredInfo(
+            byte aidlAcquired) {
+        if (aidlAcquired == AcquiredInfo.UNKNOWN) {
+            return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
+        } else if (aidlAcquired == AcquiredInfo.GOOD) {
+            return BiometricFaceConstants.FACE_ACQUIRED_GOOD;
+        } else if (aidlAcquired == AcquiredInfo.INSUFFICIENT) {
+            return BiometricFaceConstants.FACE_ACQUIRED_INSUFFICIENT;
+        } else if (aidlAcquired == AcquiredInfo.TOO_BRIGHT) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_BRIGHT;
+        } else if (aidlAcquired == AcquiredInfo.TOO_DARK) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_DARK;
+        } else if (aidlAcquired == AcquiredInfo.TOO_CLOSE) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_CLOSE;
+        } else if (aidlAcquired == AcquiredInfo.TOO_FAR) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_FAR;
+        } else if (aidlAcquired == AcquiredInfo.FACE_TOO_HIGH) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_HIGH;
+        } else if (aidlAcquired == AcquiredInfo.FACE_TOO_LOW) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_LOW;
+        } else if (aidlAcquired == AcquiredInfo.FACE_TOO_RIGHT) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_RIGHT;
+        } else if (aidlAcquired == AcquiredInfo.FACE_TOO_LEFT) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_LEFT;
+        } else if (aidlAcquired == AcquiredInfo.POOR_GAZE) {
+            return BiometricFaceConstants.FACE_ACQUIRED_POOR_GAZE;
+        } else if (aidlAcquired == AcquiredInfo.NOT_DETECTED) {
+            return BiometricFaceConstants.FACE_ACQUIRED_NOT_DETECTED;
+        } else if (aidlAcquired == AcquiredInfo.TOO_MUCH_MOTION) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_MUCH_MOTION;
+        } else if (aidlAcquired == AcquiredInfo.RECALIBRATE) {
+            return BiometricFaceConstants.FACE_ACQUIRED_RECALIBRATE;
+        } else if (aidlAcquired == AcquiredInfo.TOO_DIFFERENT) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_DIFFERENT;
+        } else if (aidlAcquired == AcquiredInfo.TOO_SIMILAR) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TOO_SIMILAR;
+        } else if (aidlAcquired == AcquiredInfo.PAN_TOO_EXTREME) {
+            return BiometricFaceConstants.FACE_ACQUIRED_PAN_TOO_EXTREME;
+        } else if (aidlAcquired == AcquiredInfo.TILT_TOO_EXTREME) {
+            return BiometricFaceConstants.FACE_ACQUIRED_TILT_TOO_EXTREME;
+        } else if (aidlAcquired == AcquiredInfo.ROLL_TOO_EXTREME) {
+            return BiometricFaceConstants.FACE_ACQUIRED_ROLL_TOO_EXTREME;
+        } else if (aidlAcquired == AcquiredInfo.FACE_OBSCURED) {
+            return BiometricFaceConstants.FACE_ACQUIRED_FACE_OBSCURED;
+        } else if (aidlAcquired == AcquiredInfo.START) {
+            return BiometricFaceConstants.FACE_ACQUIRED_START;
+        } else if (aidlAcquired == AcquiredInfo.SENSOR_DIRTY) {
+            return BiometricFaceConstants.FACE_ACQUIRED_SENSOR_DIRTY;
+        } else if (aidlAcquired == AcquiredInfo.VENDOR) {
+            return BiometricFaceConstants.FACE_ACQUIRED_VENDOR;
+        } else if (aidlAcquired == AcquiredInfo.FIRST_FRAME_RECEIVED) {
+            // No framework constant available
+            return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
+        } else if (aidlAcquired == AcquiredInfo.DARK_GLASSES_DETECTED) {
+            // No framework constant available
+            return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
+        } else if (aidlAcquired == AcquiredInfo.MOUTH_COVERING_DETECTED) {
+            // No framework constant available
+            return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
+        } else {
+            return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
+        }
     }
 
     @NonNull
-    public static AuthenticationFrame convert(@NonNull FaceAuthenticationFrame frame) {
-        final AuthenticationFrame convertedFrame = new AuthenticationFrame();
-        convertedFrame.data = convert(frame.getData());
-        return convertedFrame;
+    public static FaceAuthenticationFrame toFrameworkAuthenticationFrame(
+            @NonNull AuthenticationFrame frame) {
+        return new FaceAuthenticationFrame(toFrameworkBaseFrame(frame.data));
     }
 
     @NonNull
-    public static FaceEnrollFrame convert(@NonNull EnrollmentFrame frame) {
-        return new FaceEnrollFrame(convert(frame.cell), frame.stage, convert(frame.data));
+    public static FaceEnrollFrame toFrameworkEnrollmentFrame(@NonNull EnrollmentFrame frame) {
+        return new FaceEnrollFrame(toFrameworkCell(frame.cell), frame.stage,
+                toFrameworkBaseFrame(frame.data));
     }
 
     @NonNull
-    public static EnrollmentFrame convert(@NonNull FaceEnrollFrame frame) {
-        final EnrollmentFrame convertedFrame = new EnrollmentFrame();
-        convertedFrame.cell = convert(frame.getCell());
-        convertedFrame.stage = (byte) frame.getStage();
-        convertedFrame.data = convert(frame.getData());
-        return convertedFrame;
-    }
-
-    @NonNull
-    public static FaceDataFrame convert(@NonNull BaseFrame frame) {
+    public static FaceDataFrame toFrameworkBaseFrame(@NonNull BaseFrame frame) {
         return new FaceDataFrame(
-                frame.acquiredInfo,
+                toFrameworkAcquiredInfo(frame.acquiredInfo),
                 frame.vendorCode,
                 frame.pan,
                 frame.tilt,
@@ -71,33 +150,8 @@
                 frame.isCancellable);
     }
 
-    @NonNull
-    public static BaseFrame convert(@NonNull FaceDataFrame frame) {
-        final BaseFrame convertedFrame = new BaseFrame();
-        convertedFrame.acquiredInfo = (byte) frame.getAcquiredInfo();
-        convertedFrame.vendorCode = frame.getVendorCode();
-        convertedFrame.pan = frame.getPan();
-        convertedFrame.tilt = frame.getTilt();
-        convertedFrame.distance = frame.getDistance();
-        convertedFrame.isCancellable = frame.isCancellable();
-        return convertedFrame;
-    }
-
     @Nullable
-    public static FaceEnrollCell convert(@Nullable Cell cell) {
+    public static FaceEnrollCell toFrameworkCell(@Nullable Cell cell) {
         return cell == null ? null : new FaceEnrollCell(cell.x, cell.y, cell.z);
     }
-
-    @Nullable
-    public static Cell convert(@Nullable FaceEnrollCell cell) {
-        if (cell == null) {
-            return null;
-        }
-
-        final Cell convertedCell = new Cell();
-        convertedCell.x = cell.getX();
-        convertedCell.y = cell.getY();
-        convertedCell.z = cell.getZ();
-        return convertedCell;
-    }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
index ca9be67..8726923 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java
@@ -105,7 +105,7 @@
         }
 
         @Override
-        public void onFeatureGet(boolean success, int feature, boolean value) {
+        public void onFeatureGet(boolean success, int[] features, boolean[] featureState) {
 
         }
 
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
index 0c883b0..d04c17c 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.NotificationManager;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.Resources;
 import android.hardware.biometrics.BiometricAuthenticator;
@@ -32,6 +33,8 @@
 import android.hardware.face.FaceManager;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.os.VibrationEffect;
+import android.provider.Settings;
 import android.util.Slog;
 
 import com.android.internal.R;
@@ -57,6 +60,9 @@
     @Nullable private final NotificationManager mNotificationManager;
     @Nullable private ICancellationSignal mCancellationSignal;
 
+    @NonNull private final ContentResolver mContentResolver;
+    private final boolean mCustomHaptics;
+
     private final int[] mBiometricPromptIgnoreList;
     private final int[] mBiometricPromptIgnoreListVendor;
     private final int[] mKeyguardIgnoreList;
@@ -87,6 +93,10 @@
                 R.array.config_face_acquire_keyguard_ignorelist);
         mKeyguardIgnoreListVendor = resources.getIntArray(
                 R.array.config_face_acquire_vendor_keyguard_ignorelist);
+
+        mContentResolver = context.getContentResolver();
+        mCustomHaptics = Settings.Global.getInt(mContentResolver,
+                "face_custom_success_error", 0) == 1;
     }
 
     @Override
@@ -243,4 +253,24 @@
             Slog.e(TAG, "Remote exception", e);
         }
     }
+
+    @Override
+    protected @NonNull VibrationEffect getSuccessVibrationEffect() {
+        if (!mCustomHaptics) {
+            return super.getSuccessVibrationEffect();
+        }
+
+        return getVibration(Settings.Global.getString(mContentResolver,
+                "face_success_type"), super.getSuccessVibrationEffect());
+    }
+
+    @Override
+    protected @NonNull VibrationEffect getErrorVibrationEffect() {
+        if (!mCustomHaptics) {
+            return super.getErrorVibrationEffect();
+        }
+
+        return getVibration(Settings.Global.getString(mContentResolver,
+                "face_error_type"), super.getErrorVibrationEffect());
+    }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java
new file mode 100644
index 0000000..12f3e87
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.sensors.face.aidl;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.biometrics.BiometricFaceConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
+import android.hardware.biometrics.face.Feature;
+import android.hardware.biometrics.face.IFace;
+import android.hardware.biometrics.face.ISession;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.util.Slog;
+
+import com.android.server.biometrics.BiometricsProto;
+import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
+import com.android.server.biometrics.sensors.ErrorConsumer;
+import com.android.server.biometrics.sensors.HalClientMonitor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Face-specific get feature client for the {@link IFace} AIDL HAL interface.
+ */
+public class FaceGetFeatureClient extends HalClientMonitor<ISession> implements ErrorConsumer {
+
+    private static final String TAG = "FaceGetFeatureClient";
+
+    private final int mUserId;
+
+    FaceGetFeatureClient(@NonNull Context context, @NonNull LazyDaemon<ISession> lazyDaemon,
+            @NonNull IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
+            @NonNull String owner, int sensorId) {
+        super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
+                BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
+                BiometricsProtoEnums.CLIENT_UNKNOWN);
+        mUserId = userId;
+    }
+
+    @Override
+    public void unableToStart() {
+        mCallback.onClientFinished(this, false /* success */);
+    }
+
+    @Override
+    public void start(@NonNull Callback callback) {
+        super.start(callback);
+        startHalOperation();
+    }
+
+    @Override
+    protected void startHalOperation() {
+        try {
+            getFreshDaemon().getFeatures();
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Unable to getFeature", e);
+            mCallback.onClientFinished(this, false /* success */);
+        }
+    }
+
+    @Override
+    public int getProtoEnum() {
+        return BiometricsProto.CM_GET_FEATURE;
+    }
+
+    public void onFeatureGet(boolean success, byte[] features) {
+        HashMap<Integer, Boolean> featureMap = getFeatureMap();
+        int[] featuresToSend = new int[featureMap.size()];
+        boolean[] featureState = new boolean[featureMap.size()];
+
+        // The AIDL get feature api states that the presence of a feature means
+        // it is enabled, while the lack thereof means its disabled.
+        for (int i = 0; i < features.length; i++) {
+            Integer feature = convertAidlToFrameworkFeature(features[i]);
+            if (feature != null) {
+                featureMap.put(feature, true);
+            }
+        }
+
+        int i = 0;
+        for (Map.Entry<Integer, Boolean> entry : featureMap.entrySet()) {
+            featuresToSend[i] = entry.getKey();
+            featureState[i] = entry.getValue();
+            i++;
+        }
+
+        boolean attentionEnabled = featureMap.get(BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION);
+        Slog.d(TAG, "Updating attention value for user: " + mUserId
+                + " to value: " + attentionEnabled);
+        Settings.Secure.putIntForUser(getContext().getContentResolver(),
+                Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED,
+                attentionEnabled ? 1 : 0, mUserId);
+        try {
+            getListener().onFeatureGet(success, featuresToSend, featureState);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Remote exception", e);
+        }
+
+        mCallback.onClientFinished(this, true /* success */);
+    }
+
+    private @NonNull HashMap<Integer, Boolean> getFeatureMap() {
+        HashMap<Integer, Boolean> featureMap = new HashMap<>();
+        featureMap.put(BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION, false);
+        return featureMap;
+    }
+
+    private Integer convertAidlToFrameworkFeature(byte feature) {
+        switch (feature) {
+            case Feature.REQUIRE_ATTENTION:
+                return new Integer(BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION);
+            default:
+                return null;
+        }
+    }
+
+    @Override
+    public void onError(int errorCode, int vendorCode) {
+        try {
+            getListener().onFeatureGet(false /* success */, new int[0], new boolean[0]);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Remote exception", e);
+        }
+
+        mCallback.onClientFinished(this, false /* success */);
+    }
+
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
index b8bac40..84d239e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java
@@ -33,6 +33,7 @@
 import android.hardware.face.Face;
 import android.hardware.face.FaceSensorPropertiesInternal;
 import android.hardware.face.IFaceServiceReceiver;
+import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
@@ -173,7 +174,9 @@
         Slog.d(getTag(), "Daemon was null, reconnecting");
 
         mDaemon = IFace.Stub.asInterface(
-                ServiceManager.waitForDeclaredService(IFace.DESCRIPTOR + "/" + mHalInstanceName));
+                Binder.allowBlocking(
+                        ServiceManager.waitForDeclaredService(
+                                IFace.DESCRIPTOR + "/" + mHalInstanceName)));
         if (mDaemon == null) {
             Slog.e(getTag(), "Unable to get daemon");
             return null;
@@ -435,13 +438,36 @@
     public void scheduleSetFeature(int sensorId, @NonNull IBinder token, int userId, int feature,
             boolean enabled, @NonNull byte[] hardwareAuthToken,
             @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName) {
-        // TODO(b/171335732): implement this.
+        mHandler.post(() -> {
+            final List<Face> faces = FaceUtils.getInstance(sensorId)
+                    .getBiometricsForUser(mContext, userId);
+            if (faces.isEmpty()) {
+                Slog.w(getTag(), "Ignoring setFeature, no templates enrolled for user: " + userId);
+                return;
+            }
+            final FaceSetFeatureClient client = new FaceSetFeatureClient(mContext,
+                    mSensors.get(sensorId).getLazySession(), token,
+                    new ClientMonitorCallbackConverter(receiver), userId,
+                    mContext.getOpPackageName(), sensorId, feature, enabled, hardwareAuthToken);
+            scheduleForSensor(sensorId, client);
+        });
     }
 
     @Override
     public void scheduleGetFeature(int sensorId, @NonNull IBinder token, int userId, int feature,
             @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName) {
-        // TODO(b/171335732): implement this.
+        mHandler.post(() -> {
+            final List<Face> faces = FaceUtils.getInstance(sensorId)
+                    .getBiometricsForUser(mContext, userId);
+            if (faces.isEmpty()) {
+                Slog.w(getTag(), "Ignoring getFeature, no templates enrolled for user: " + userId);
+                return;
+            }
+            final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext,
+                    mSensors.get(sensorId).getLazySession(), token, callback, userId,
+                    mContext.getOpPackageName(), sensorId);
+            scheduleForSensor(sensorId, client);
+        });
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java
new file mode 100644
index 0000000..c3abfc2
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.biometrics.sensors.face.aidl;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.hardware.biometrics.BiometricFaceConstants;
+import android.hardware.biometrics.BiometricsProtoEnums;
+import android.hardware.biometrics.face.Feature;
+import android.hardware.biometrics.face.IFace;
+import android.hardware.biometrics.face.ISession;
+import android.hardware.keymaster.HardwareAuthToken;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import com.android.server.biometrics.BiometricsProto;
+import com.android.server.biometrics.HardwareAuthTokenUtils;
+import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
+import com.android.server.biometrics.sensors.ErrorConsumer;
+import com.android.server.biometrics.sensors.HalClientMonitor;
+
+/**
+ * Face-specific get feature client for the {@link IFace} AIDL HAL interface.
+ */
+public class FaceSetFeatureClient extends HalClientMonitor<ISession> implements ErrorConsumer {
+
+    private static final String TAG = "FaceSetFeatureClient";
+
+    private final int mFeature;
+    private final boolean mEnabled;
+    private final HardwareAuthToken mHardwareAuthToken;
+
+    FaceSetFeatureClient(@NonNull Context context, @NonNull LazyDaemon<ISession> lazyDaemon,
+            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
+            @NonNull String owner, int sensorId, int feature, boolean enabled,
+            byte[] hardwareAuthToken) {
+        super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
+                BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
+                BiometricsProtoEnums.CLIENT_UNKNOWN);
+        mFeature = feature;
+        mEnabled = enabled;
+        mHardwareAuthToken = HardwareAuthTokenUtils.toHardwareAuthToken(hardwareAuthToken);
+    }
+
+    @Override
+    public void unableToStart() {
+        try {
+            getListener().onFeatureSet(false /* success */, mFeature);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Unable to send error", e);
+        }
+    }
+
+    @Override
+    public void start(@NonNull Callback callback) {
+        super.start(callback);
+        startHalOperation();
+    }
+
+    @Override
+    protected void startHalOperation() {
+        try {
+            getFreshDaemon()
+                    .setFeature(mHardwareAuthToken,
+                    convertFrameworkToAidlFeature(mFeature), mEnabled);
+        } catch (RemoteException | IllegalArgumentException e) {
+            Slog.e(TAG, "Unable to set feature: " + mFeature + " to enabled: " + mEnabled, e);
+            mCallback.onClientFinished(this, false /* success */);
+        }
+    }
+
+    @Override
+    public int getProtoEnum() {
+        return BiometricsProto.CM_SET_FEATURE;
+    }
+
+    public void onFeatureSet(boolean success) {
+        try {
+            getListener().onFeatureSet(success, mFeature);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Remote exception", e);
+        }
+
+        mCallback.onClientFinished(this, true /* success */);
+    }
+
+    private byte convertFrameworkToAidlFeature(int feature) throws IllegalArgumentException {
+        switch (feature) {
+            case BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION:
+                return Feature.REQUIRE_ATTENTION;
+            default:
+                Slog.e(TAG, "Unsupported feature : " + feature);
+                throw new IllegalArgumentException();
+        }
+    }
+
+    @Override
+    public void onError(int errorCode, int vendorCode) {
+        try {
+            getListener().onFeatureSet(false /* success */, mFeature);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Remote exception", e);
+        }
+
+        mCallback.onClientFinished(this, false /* success */);
+    }
+
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
index b795b54..724531e 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
@@ -186,7 +186,7 @@
                     return;
                 }
                 ((FaceAuthenticationClient) client).onAuthenticationFrame(
-                        AidlConversionUtils.convert(frame));
+                        AidlConversionUtils.toFrameworkAuthenticationFrame(frame));
             });
         }
 
@@ -204,7 +204,8 @@
                             + Utils.getClientName(client));
                     return;
                 }
-                ((FaceEnrollClient) client).onEnrollmentFrame(AidlConversionUtils.convert(frame));
+                ((FaceEnrollClient) client).onEnrollmentFrame(
+                        AidlConversionUtils.toFrameworkEnrollmentFrame(frame));
             });
         }
 
@@ -223,7 +224,7 @@
                 }
 
                 final ErrorConsumer errorConsumer = (ErrorConsumer) client;
-                errorConsumer.onError(error, vendorCode);
+                errorConsumer.onError(AidlConversionUtils.toFrameworkError(error), vendorCode);
 
                 if (error == Error.HW_UNAVAILABLE) {
                     mCallback.onHardwareUnavailable();
@@ -376,12 +377,32 @@
 
         @Override
         public void onFeaturesRetrieved(byte[] features) {
+            mHandler.post(() -> {
+                final BaseClientMonitor client = mScheduler.getCurrentClient();
+                if (!(client instanceof FaceGetFeatureClient)) {
+                    Slog.e(mTag, "onFeaturesRetrieved for non-get feature consumer: "
+                            + Utils.getClientName(client));
+                    return;
+                }
+                final FaceGetFeatureClient faceGetFeatureClient = (FaceGetFeatureClient) client;
+                faceGetFeatureClient.onFeatureGet(true /* success */, features);
+            });
 
         }
 
         @Override
         public void onFeatureSet(byte feature) {
+            mHandler.post(() -> {
+                final BaseClientMonitor client = mScheduler.getCurrentClient();
+                if (!(client instanceof FaceSetFeatureClient)) {
+                    Slog.e(mTag, "onFeatureSet for non-set consumer: "
+                            + Utils.getClientName(client));
+                    return;
+                }
 
+                final FaceSetFeatureClient faceSetFeatureClient = (FaceSetFeatureClient) client;
+                faceSetFeatureClient.onFeatureSet(true /* success */);
+            });
         }
 
         @Override
@@ -557,6 +578,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FACE);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java
index f1bfd53..bf3f7b4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java
@@ -17,6 +17,7 @@
 package com.android.server.biometrics.sensors.face.aidl;
 
 import android.hardware.biometrics.common.ICancellationSignal;
+import android.hardware.biometrics.face.EnrollmentStageConfig;
 import android.hardware.biometrics.face.Error;
 import android.hardware.biometrics.face.IFace;
 import android.hardware.biometrics.face.ISession;
@@ -57,6 +58,11 @@
             }
 
             @Override
+            public EnrollmentStageConfig[] getEnrollmentConfig(byte enrollmentType) {
+                return new EnrollmentStageConfig[0];
+            }
+
+            @Override
             public ICancellationSignal enroll(HardwareAuthToken hat,
                     byte enrollmentType, byte[] features, NativeHandle previewSurface) {
                 Slog.w(TAG, "enroll");
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java
index e8668ed..f806767 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java
@@ -94,7 +94,7 @@
         }
 
         @Override
-        public void onFeatureGet(boolean success, int feature, boolean value) {
+        public void onFeatureGet(boolean success, int[] features, boolean[] featureState) {
 
         }
 
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
index 2cb2939..5dfc590 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
@@ -25,15 +25,12 @@
 import android.content.pm.UserInfo;
 import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.BiometricFaceConstants;
-import android.hardware.biometrics.BiometricManager;
 import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.biometrics.ITestSession;
 import android.hardware.biometrics.ITestSessionCallback;
 import android.hardware.biometrics.face.V1_0.IBiometricsFace;
 import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback;
 import android.hardware.face.Face;
-import android.hardware.face.FaceSensorProperties;
 import android.hardware.face.FaceSensorPropertiesInternal;
 import android.hardware.face.IFaceServiceReceiver;
 import android.os.Binder;
@@ -51,7 +48,6 @@
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 
-import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.biometrics.SensorServiceStateProto;
@@ -66,7 +62,6 @@
 import com.android.server.biometrics.sensors.EnumerateConsumer;
 import com.android.server.biometrics.sensors.ErrorConsumer;
 import com.android.server.biometrics.sensors.HalClientMonitor;
-import com.android.server.biometrics.sensors.Interruptable;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.LockoutTracker;
 import com.android.server.biometrics.sensors.PerformanceTracker;
@@ -327,19 +322,13 @@
         }
     }
 
-    @VisibleForTesting
-    Face10(@NonNull Context context, int sensorId,
-            @BiometricManager.Authenticators.Types int strength,
+    @VisibleForTesting Face10(@NonNull Context context,
+            @NonNull FaceSensorPropertiesInternal sensorProps,
             @NonNull LockoutResetDispatcher lockoutResetDispatcher,
-            boolean supportsSelfIllumination, int maxTemplatesAllowed,
             @NonNull BiometricScheduler scheduler) {
-        mSensorProperties = new FaceSensorPropertiesInternal(sensorId,
-                Utils.authenticatorStrengthToPropertyStrength(strength),
-                maxTemplatesAllowed, new ArrayList<ComponentInfoInternal>() /* componentInfo */,
-                FaceSensorProperties.TYPE_UNKNOWN, false /* supportsFaceDetect */,
-                supportsSelfIllumination, true /* resetLockoutRequiresChallenge */);
+        mSensorProperties = sensorProps;
         mContext = context;
-        mSensorId = sensorId;
+        mSensorId = sensorProps.sensorId;
         mScheduler = scheduler;
         mHandler = new Handler(Looper.getMainLooper());
         mUsageStats = new UsageStats(context);
@@ -347,8 +336,8 @@
         mLazyDaemon = Face10.this::getDaemon;
         mLockoutTracker = new LockoutHalImpl();
         mLockoutResetDispatcher = lockoutResetDispatcher;
-        mHalResultController = new HalResultController(sensorId, context, mHandler, mScheduler,
-                mLockoutTracker, lockoutResetDispatcher);
+        mHalResultController = new HalResultController(sensorProps.sensorId, context, mHandler,
+                mScheduler, mLockoutTracker, lockoutResetDispatcher);
         mHalResultController.setCallback(() -> {
             mDaemon = null;
             mCurrentUserId = UserHandle.USER_NULL;
@@ -361,12 +350,9 @@
         }
     }
 
-    public Face10(@NonNull Context context, int sensorId,
-            @BiometricManager.Authenticators.Types int strength,
+    public Face10(@NonNull Context context, @NonNull FaceSensorPropertiesInternal sensorProps,
             @NonNull LockoutResetDispatcher lockoutResetDispatcher) {
-        this(context, sensorId, strength, lockoutResetDispatcher,
-                context.getResources().getBoolean(R.bool.config_faceAuthSupportsSelfIllumination),
-                context.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser),
+        this(context, sensorProps, lockoutResetDispatcher,
                 new BiometricScheduler(TAG, null /* gestureAvailabilityTracker */));
     }
 
@@ -807,6 +793,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FACE);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
index ff06a4a..c4bdb32 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java
@@ -17,6 +17,7 @@
 package com.android.server.biometrics.sensors.face.hidl;
 
 import android.annotation.NonNull;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.Resources;
 import android.hardware.biometrics.BiometricAuthenticator;
@@ -27,6 +28,8 @@
 import android.hardware.face.FaceManager;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.os.VibrationEffect;
+import android.provider.Settings;
 import android.util.Slog;
 
 import com.android.internal.R;
@@ -47,7 +50,8 @@
 
     private static final String TAG = "FaceAuthenticationClient";
 
-
+    @NonNull private final ContentResolver mContentResolver;
+    private final boolean mCustomHaptics;
     private final UsageStats mUsageStats;
 
     private final int[] mBiometricPromptIgnoreList;
@@ -78,6 +82,10 @@
                 R.array.config_face_acquire_keyguard_ignorelist);
         mKeyguardIgnoreListVendor = resources.getIntArray(
                 R.array.config_face_acquire_vendor_keyguard_ignorelist);
+
+        mContentResolver = context.getContentResolver();
+        mCustomHaptics = Settings.Global.getInt(mContentResolver,
+                "face_custom_success_error", 0) == 1;
     }
 
     @Override
@@ -188,4 +196,24 @@
         final boolean shouldSend = shouldSend(acquireInfo, vendorCode);
         onAcquiredInternal(acquireInfo, vendorCode, shouldSend);
     }
+
+    @Override
+    protected @NonNull VibrationEffect getSuccessVibrationEffect() {
+        if (!mCustomHaptics) {
+            return super.getSuccessVibrationEffect();
+        }
+
+        return getVibration(Settings.Global.getString(mContentResolver,
+                "face_success_type"), super.getSuccessVibrationEffect());
+    }
+
+    @Override
+    protected @NonNull VibrationEffect getErrorVibrationEffect() {
+        if (!mCustomHaptics) {
+            return super.getErrorVibrationEffect();
+        }
+
+        return getVibration(Settings.Global.getString(mContentResolver,
+                "face_error_type"), super.getErrorVibrationEffect());
+    }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java
index b1083d4..7821601 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceGetFeatureClient.java
@@ -58,7 +58,7 @@
     public void unableToStart() {
         try {
             if (getListener() != null) {
-                getListener().onFeatureGet(false /* success */, mFeature, false /* value */);
+                getListener().onFeatureGet(false /* success */, new int[0], new boolean[0]);
             }
         } catch (RemoteException e) {
             Slog.e(TAG, "Unable to send error", e);
@@ -75,9 +75,14 @@
     protected void startHalOperation() {
         try {
             final OptionalBool result = getFreshDaemon().getFeature(mFeature, mFaceId);
+            int[] features = new int[1];
+            boolean[] featureState = new boolean[1];
+            features[0] = mFeature;
+            featureState[0] = result.value;
             mValue = result.value;
+
             if (getListener() != null) {
-                getListener().onFeatureGet(result.status == Status.OK, mFeature, mValue);
+                getListener().onFeatureGet(result.status == Status.OK, features, featureState);
             }
             mCallback.onClientFinished(this, true /* success */);
         } catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
index 8109680..1e59429 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java
@@ -36,8 +36,7 @@
     private final IFingerprintService mFingerprintService;
     private final int mSensorId;
 
-    public FingerprintAuthenticator(IFingerprintService fingerprintService, int sensorId)
-            throws RemoteException {
+    public FingerprintAuthenticator(IFingerprintService fingerprintService, int sensorId) {
         mFingerprintService = fingerprintService;
         mSensorId = sensorId;
     }
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index cbef6609..39b7a74 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -50,9 +50,11 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.hardware.fingerprint.FingerprintServiceReceiver;
+import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
 import android.hardware.fingerprint.IFingerprintClientActiveCallback;
 import android.hardware.fingerprint.IFingerprintService;
 import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.hardware.fingerprint.IFingerprintStateListener;
 import android.hardware.fingerprint.IUdfpsOverlayController;
 import android.os.Binder;
 import android.os.Build;
@@ -60,6 +62,7 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Process;
+import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -70,12 +73,12 @@
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.DumpUtils;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.server.ServiceThread;
 import com.android.server.SystemService;
 import com.android.server.biometrics.Utils;
-import com.android.server.biometrics.sensors.BiometricServiceCallback;
 import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.LockoutTracker;
@@ -95,16 +98,33 @@
  * The service is responsible for maintaining a list of clients and dispatching all
  * fingerprint-related events.
  */
-public class FingerprintService extends SystemService implements BiometricServiceCallback {
+public class FingerprintService extends SystemService {
 
     protected static final String TAG = "FingerprintService";
 
+    private final Object mLock = new Object();
     private final AppOpsManager mAppOps;
     private final LockoutResetDispatcher mLockoutResetDispatcher;
     private final GestureAvailabilityDispatcher mGestureAvailabilityDispatcher;
     private final LockPatternUtils mLockPatternUtils;
     private final FingerprintServiceWrapper mServiceWrapper;
-    @NonNull private List<ServiceProvider> mServiceProviders;
+    @NonNull private final List<ServiceProvider> mServiceProviders;
+    @NonNull private final FingerprintStateCallback mFingerprintStateCallback;
+
+    @GuardedBy("mLock")
+    @NonNull private final RemoteCallbackList<IFingerprintAuthenticatorsRegisteredCallback>
+            mAuthenticatorsRegisteredCallbacks;
+
+    @GuardedBy("mLock")
+    @NonNull private final List<FingerprintSensorPropertiesInternal> mSensorProps;
+
+    /**
+     * Registers FingerprintStateListener in list stored by FingerprintService
+     * @param listener new FingerprintStateListener being added
+     */
+    public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) {
+        mFingerprintStateCallback.registerFingerprintStateListener(listener);
+    }
 
     /**
      * Receives the incoming binder calls from FingerprintManager.
@@ -122,7 +142,8 @@
                 return null;
             }
 
-            return provider.createTestSession(sensorId, callback, opPackageName);
+            return provider.createTestSession(sensorId, callback, mFingerprintStateCallback,
+                    opPackageName);
         }
 
         @Override
@@ -205,7 +226,7 @@
             }
 
             provider.second.scheduleEnroll(provider.first, token, hardwareAuthToken, userId,
-                    receiver, opPackageName, enrollReason);
+                    receiver, opPackageName, enrollReason, mFingerprintStateCallback);
         }
 
         @Override // Binder call
@@ -284,7 +305,7 @@
             } else {
                 provider.second.scheduleAuthenticate(provider.first, token, operationId, userId,
                         0 /* cookie */, new ClientMonitorCallbackConverter(receiver), opPackageName,
-                        restricted, statsClient, isKeyguard);
+                        restricted, statsClient, isKeyguard, mFingerprintStateCallback);
             }
         }
 
@@ -393,7 +414,7 @@
 
             provider.second.scheduleFingerDetect(provider.first, token, userId,
                     new ClientMonitorCallbackConverter(receiver), opPackageName,
-                    BiometricsProtoEnums.CLIENT_KEYGUARD);
+                    BiometricsProtoEnums.CLIENT_KEYGUARD, mFingerprintStateCallback);
         }
 
         @Override // Binder call
@@ -411,7 +432,8 @@
             final boolean restricted = true; // BiometricPrompt is always restricted
             provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie,
                     new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted,
-                    BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication);
+                    BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication,
+                    mFingerprintStateCallback);
         }
 
         @Override // Binder call
@@ -568,6 +590,8 @@
                                 : provider.getSensorProperties()) {
                             pw.println("Dumping for sensorId: " + props.sensorId
                                     + ", provider: " + provider.getClass().getSimpleName());
+                            pw.println("Fps state: "
+                                    + mFingerprintStateCallback.getFingerprintState());
                             provider.dumpInternal(props.sensorId, pw);
                             pw.println();
                         }
@@ -731,7 +755,7 @@
 
         @Override // Binder call
         public void resetLockout(IBinder token, int sensorId, int userId,
-                @Nullable byte [] hardwareAuthToken, String opPackageName) {
+                @Nullable byte[] hardwareAuthToken, String opPackageName) {
             Utils.checkPermission(getContext(), RESET_FINGERPRINT_LOCKOUT);
 
             final ServiceProvider provider = getProviderForSensor(sensorId);
@@ -761,24 +785,119 @@
             mGestureAvailabilityDispatcher.removeCallback(callback);
         }
 
+        private void addHidlProviders(List<FingerprintSensorPropertiesInternal> hidlSensors) {
+            for (FingerprintSensorPropertiesInternal hidlSensor : hidlSensors) {
+                final Fingerprint21 fingerprint21;
+                if ((Build.IS_USERDEBUG || Build.IS_ENG)
+                        && getContext().getResources().getBoolean(R.bool.allow_test_udfps)
+                        && Settings.Secure.getIntForUser(getContext().getContentResolver(),
+                        Fingerprint21UdfpsMock.CONFIG_ENABLE_TEST_UDFPS, 0 /* default */,
+                        UserHandle.USER_CURRENT) != 0) {
+                    fingerprint21 = Fingerprint21UdfpsMock.newInstance(getContext(), hidlSensor,
+                            mLockoutResetDispatcher, mGestureAvailabilityDispatcher);
+                } else {
+                    fingerprint21 = Fingerprint21.newInstance(getContext(), hidlSensor,
+                            mLockoutResetDispatcher, mGestureAvailabilityDispatcher);
+                }
+                mServiceProviders.add(fingerprint21);
+            }
+        }
+
+        private void addAidlProviders() {
+            final String[] instances = ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR);
+            if (instances == null || instances.length == 0) {
+                return;
+            }
+            for (String instance : instances) {
+                final String fqName = IFingerprint.DESCRIPTOR + "/" + instance;
+                final IFingerprint fp = IFingerprint.Stub.asInterface(
+                        ServiceManager.waitForDeclaredService(fqName));
+                if (fp == null) {
+                    Slog.e(TAG, "Unable to get declared service: " + fqName);
+                    continue;
+                }
+                try {
+                    final SensorProps[] props = fp.getSensorProps();
+                    final FingerprintProvider provider =
+                            new FingerprintProvider(getContext(), props, instance,
+                                    mLockoutResetDispatcher, mGestureAvailabilityDispatcher);
+                    mServiceProviders.add(provider);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Remote exception in getSensorProps: " + fqName);
+                }
+            }
+        }
+
         @Override // Binder call
-        public void initializeConfiguration(int sensorId,
-                @BiometricManager.Authenticators.Types int strength) {
+        public void registerAuthenticators(
+                @NonNull List<FingerprintSensorPropertiesInternal> hidlSensors) {
             Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
 
-            final Fingerprint21 fingerprint21;
-            if ((Build.IS_USERDEBUG || Build.IS_ENG)
-                    && getContext().getResources().getBoolean(R.bool.allow_test_udfps)
-                    && Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                    Fingerprint21UdfpsMock.CONFIG_ENABLE_TEST_UDFPS, 0 /* default */,
-                    UserHandle.USER_CURRENT) != 0) {
-                fingerprint21 = Fingerprint21UdfpsMock.newInstance(getContext(), sensorId,
-                        strength, mLockoutResetDispatcher, mGestureAvailabilityDispatcher);
-            } else {
-                fingerprint21 = Fingerprint21.newInstance(getContext(), sensorId, strength,
-                        mLockoutResetDispatcher, mGestureAvailabilityDispatcher);
+            // Some HAL might not be started before the system service and will cause the code below
+            // to wait, and some of the operations below might take a significant amount of time to
+            // complete (calls to the HALs). To avoid blocking the rest of system server we put
+            // this on a background thread.
+            final ServiceThread thread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND,
+                    true /* allowIo */);
+            thread.start();
+            final Handler handler = new Handler(thread.getLooper());
+
+            handler.post(() -> {
+                addHidlProviders(hidlSensors);
+                addAidlProviders();
+
+                final IBiometricService biometricService = IBiometricService.Stub.asInterface(
+                        ServiceManager.getService(Context.BIOMETRIC_SERVICE));
+
+                // Register each sensor individually with BiometricService
+                for (ServiceProvider provider : mServiceProviders) {
+                    final List<FingerprintSensorPropertiesInternal> props =
+                            provider.getSensorProperties();
+                    for (FingerprintSensorPropertiesInternal prop : props) {
+                        final int sensorId = prop.sensorId;
+                        final @BiometricManager.Authenticators.Types int strength =
+                                Utils.propertyStrengthToAuthenticatorStrength(prop.sensorStrength);
+                        final FingerprintAuthenticator authenticator = new FingerprintAuthenticator(
+                                mServiceWrapper, sensorId);
+                        try {
+                            biometricService.registerAuthenticator(sensorId, TYPE_FINGERPRINT,
+                                    strength, authenticator);
+                        } catch (RemoteException e) {
+                            Slog.e(TAG, "Remote exception when registering sensorId: " + sensorId);
+                        }
+                    }
+                }
+
+                synchronized (mLock) {
+                    for (ServiceProvider provider : mServiceProviders) {
+                        mSensorProps.addAll(provider.getSensorProperties());
+                    }
+                }
+
+                broadcastAllAuthenticatorsRegistered();
+            });
+        }
+
+        @Override
+        public void addAuthenticatorsRegisteredCallback(
+                IFingerprintAuthenticatorsRegisteredCallback callback) {
+            Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
+            if (callback == null) {
+                Slog.e(TAG, "addAuthenticatorsRegisteredCallback, callback is null");
+                return;
             }
-            mServiceProviders.add(fingerprint21);
+
+            final boolean registered;
+            final boolean hasSensorProps;
+            synchronized (mLock) {
+                registered = mAuthenticatorsRegisteredCallbacks.register(callback);
+                hasSensorProps = !mSensorProps.isEmpty();
+            }
+            if (registered && hasSensorProps) {
+                broadcastAllAuthenticatorsRegistered();
+            } else if (!registered) {
+                Slog.e(TAG, "addAuthenticatorsRegisteredCallback failed to register callback");
+            }
         }
 
         @Override
@@ -813,6 +932,11 @@
                 provider.setUdfpsOverlayController(controller);
             }
         }
+
+        @Override
+        public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) {
+            FingerprintService.this.registerFingerprintStateListener(listener);
+        }
     }
 
     public FingerprintService(Context context) {
@@ -823,58 +947,41 @@
         mLockoutResetDispatcher = new LockoutResetDispatcher(context);
         mLockPatternUtils = new LockPatternUtils(context);
         mServiceProviders = new ArrayList<>();
+        mFingerprintStateCallback = new FingerprintStateCallback();
+        mAuthenticatorsRegisteredCallbacks = new RemoteCallbackList<>();
+        mSensorProps = new ArrayList<>();
     }
 
-    @Override
-    public void onBiometricServiceReady() {
-        final IBiometricService biometricService = IBiometricService.Stub.asInterface(
-                        ServiceManager.getService(Context.BIOMETRIC_SERVICE));
-
-        final String[] instances = ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR);
-        if (instances == null || instances.length == 0) {
-            return;
-        }
-
-        // If for some reason the HAL is not started before the system service, do not block
-        // the rest of system server. Put this on a background thread.
-        final ServiceThread thread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND,
-                true /* allowIo */);
-        thread.start();
-        final Handler handler = new Handler(thread.getLooper());
-
-        handler.post(() -> {
-            for (String instance : instances) {
-                final String fqName = IFingerprint.DESCRIPTOR + "/" + instance;
-                final IFingerprint fp = IFingerprint.Stub.asInterface(
-                        ServiceManager.waitForDeclaredService(fqName));
-                try {
-                    final SensorProps[] props = fp.getSensorProps();
-                    final FingerprintProvider provider =
-                            new FingerprintProvider(getContext(), props, instance,
-                                    mLockoutResetDispatcher, mGestureAvailabilityDispatcher);
-                    mServiceProviders.add(provider);
-
-                    // Register each sensor individually with BiometricService
-                    for (SensorProps prop : props) {
-                        final int sensorId = prop.commonProps.sensorId;
-                        @BiometricManager.Authenticators.Types int strength =
-                                Utils.propertyStrengthToAuthenticatorStrength(
-                                        prop.commonProps.sensorStrength);
-                        final FingerprintAuthenticator authenticator =
-                                new FingerprintAuthenticator(mServiceWrapper, sensorId);
-                        try {
-                            biometricService.registerAuthenticator(sensorId,
-                                    TYPE_FINGERPRINT, strength, authenticator);
-                        } catch (RemoteException e) {
-                            Slog.e(TAG, "Remote exception when registering sensorId: "
-                                    + sensorId);
-                        }
-                    }
-                } catch (RemoteException e) {
-                    Slog.e(TAG, "Remote exception when initializing instance: " + fqName);
-                }
+    // Notifies the callbacks that all of the authenticators have been registered and removes the
+    // invoked callbacks from the callback list.
+    private void broadcastAllAuthenticatorsRegistered() {
+        // Make a local copy of the data so it can be used outside of the synchronized block when
+        // making Binder calls.
+        final List<IFingerprintAuthenticatorsRegisteredCallback> callbacks = new ArrayList<>();
+        final List<FingerprintSensorPropertiesInternal> props;
+        synchronized (mLock) {
+            if (!mSensorProps.isEmpty()) {
+                props = new ArrayList<>(mSensorProps);
+            } else {
+                Slog.e(TAG, "mSensorProps is empty");
+                return;
             }
-        });
+            final int n = mAuthenticatorsRegisteredCallbacks.beginBroadcast();
+            for (int i = 0; i < n; ++i) {
+                final IFingerprintAuthenticatorsRegisteredCallback cb =
+                        mAuthenticatorsRegisteredCallbacks.getBroadcastItem(i);
+                callbacks.add(cb);
+                mAuthenticatorsRegisteredCallbacks.unregister(cb);
+            }
+            mAuthenticatorsRegisteredCallbacks.finishBroadcast();
+        }
+        for (IFingerprintAuthenticatorsRegisteredCallback cb : callbacks) {
+            try {
+                cb.onAllAuthenticatorsRegistered(props);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Remote exception in onAllAuthenticatorsRegistered", e);
+            }
+        }
     }
 
     @Override
@@ -919,12 +1026,9 @@
 
     @NonNull
     private List<FingerprintSensorPropertiesInternal> getSensorProperties() {
-        final List<FingerprintSensorPropertiesInternal> properties = new ArrayList<>();
-
-        for (ServiceProvider provider : mServiceProviders) {
-            properties.addAll(provider.getSensorProperties());
+        synchronized (mLock) {
+            return mSensorProps;
         }
-        return properties;
     }
 
     @NonNull
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallback.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallback.java
new file mode 100644
index 0000000..5f998d8
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintStateCallback.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.sensors.fingerprint;
+
+import static android.hardware.fingerprint.FingerprintStateListener.STATE_AUTH_OTHER;
+import static android.hardware.fingerprint.FingerprintStateListener.STATE_BP_AUTH;
+import static android.hardware.fingerprint.FingerprintStateListener.STATE_ENROLLING;
+import static android.hardware.fingerprint.FingerprintStateListener.STATE_IDLE;
+import static android.hardware.fingerprint.FingerprintStateListener.STATE_KEYGUARD_AUTH;
+
+import android.annotation.NonNull;
+import android.hardware.fingerprint.FingerprintStateListener;
+import android.hardware.fingerprint.IFingerprintStateListener;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import com.android.server.biometrics.Utils;
+import com.android.server.biometrics.sensors.AuthenticationClient;
+import com.android.server.biometrics.sensors.BaseClientMonitor;
+import com.android.server.biometrics.sensors.fingerprint.hidl.FingerprintEnrollClient;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * A callback for receiving notifications about changes in fingerprint state.
+ */
+public class FingerprintStateCallback implements BaseClientMonitor.Callback {
+    private @FingerprintStateListener.State int mFingerprintState;
+    @NonNull private final CopyOnWriteArrayList<IFingerprintStateListener>
+        mFingerprintStateListeners = new CopyOnWriteArrayList<>();
+
+    public FingerprintStateCallback() {
+        mFingerprintState = STATE_IDLE;
+    }
+
+    public int getFingerprintState() {
+        return mFingerprintState;
+    }
+
+    @Override
+    public void onClientStarted(@NonNull BaseClientMonitor client) {
+        final int previousFingerprintState = mFingerprintState;
+        if (client instanceof AuthenticationClient) {
+            AuthenticationClient authClient = (AuthenticationClient) client;
+            if (authClient.isKeyguard()) {
+                mFingerprintState = STATE_KEYGUARD_AUTH;
+            } else if (authClient.isBiometricPrompt()) {
+                mFingerprintState = STATE_BP_AUTH;
+            } else {
+                mFingerprintState = STATE_AUTH_OTHER;
+            }
+        } else if (client instanceof FingerprintEnrollClient) {
+            mFingerprintState = STATE_ENROLLING;
+        } else {
+            Slog.w(FingerprintService.TAG,
+                    "Other authentication client: " + Utils.getClientName(client));
+            mFingerprintState = STATE_IDLE;
+        }
+        Slog.d(FingerprintService.TAG, "Fps state updated from " + previousFingerprintState
+                + " to " + mFingerprintState + ", client " + client);
+        notifyFingerprintStateListeners(mFingerprintState);
+    }
+
+    @Override
+    public void onClientFinished(@NonNull BaseClientMonitor client, boolean success) {
+        mFingerprintState = STATE_IDLE;
+        Slog.d(FingerprintService.TAG,
+                "Client finished, fps state updated to " + mFingerprintState + ", client "
+                        + client);
+        notifyFingerprintStateListeners(mFingerprintState);
+    }
+
+    private void notifyFingerprintStateListeners(@FingerprintStateListener.State int newState) {
+        for (IFingerprintStateListener listener : mFingerprintStateListeners) {
+            try {
+                listener.onStateChanged(newState);
+            } catch (RemoteException e) {
+                Slog.e(FingerprintService.TAG, "Remote exception in fingerprint state change", e);
+            }
+        }
+    }
+
+    /**
+     * Enables clients to register a FingerprintStateListener. Used by FingerprintService to forward
+     * updates in fingerprint sensor state to the SideFpNsEventHandler
+     * @param listener
+     */
+    public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) {
+        mFingerprintStateListeners.add(listener);
+    }
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
index c09d2d3..701b9a7 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java
@@ -86,18 +86,21 @@
 
     void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken, int userId,
             @NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName,
-            @FingerprintManager.EnrollReason int enrollReason);
+            @FingerprintManager.EnrollReason int enrollReason,
+            @NonNull FingerprintStateCallback fingerprintStateCallback);
 
     void cancelEnrollment(int sensorId, @NonNull IBinder token);
 
     void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
             @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName,
-            int statsClient);
+            int statsClient,
+            @NonNull FingerprintStateCallback fingerprintStateCallback);
 
     void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId,
             int cookie, @NonNull ClientMonitorCallbackConverter callback,
             @NonNull String opPackageName, boolean restricted, int statsClient,
-            boolean allowBackgroundAuthentication);
+            boolean allowBackgroundAuthentication,
+            @NonNull FingerprintStateCallback fingerprintStateCallback);
 
     void startPreparedClient(int sensorId, int cookie);
 
@@ -148,5 +151,6 @@
 
     @NonNull
     ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
+            @NonNull FingerprintStateCallback fingerprintStateCallback,
             @NonNull String opPackageName);
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/AidlConversionUtils.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/AidlConversionUtils.java
new file mode 100644
index 0000000..66142bf
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/AidlConversionUtils.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.sensors.fingerprint.aidl;
+
+import android.hardware.biometrics.BiometricFingerprintConstants;
+import android.hardware.biometrics.fingerprint.AcquiredInfo;
+import android.hardware.biometrics.fingerprint.Error;
+
+/**
+ * Utilities for converting from hardware to framework-defined AIDL models.
+ */
+final class AidlConversionUtils {
+    // Prevent instantiation.
+    private AidlConversionUtils() {
+    }
+
+    public static @BiometricFingerprintConstants.FingerprintError int toFrameworkError(
+            byte aidlError) {
+        if (aidlError == Error.UNKNOWN) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNKNOWN;
+        } else if (aidlError == Error.HW_UNAVAILABLE) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE;
+        } else if (aidlError == Error.UNABLE_TO_PROCESS) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS;
+        } else if (aidlError == Error.TIMEOUT) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_TIMEOUT;
+        } else if (aidlError == Error.NO_SPACE) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_NO_SPACE;
+        } else if (aidlError == Error.CANCELED) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_CANCELED;
+        } else if (aidlError == Error.UNABLE_TO_REMOVE) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_REMOVE;
+        } else if (aidlError == Error.VENDOR) {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR;
+        } else {
+            return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNKNOWN;
+        }
+    }
+
+    public static @BiometricFingerprintConstants.FingerprintAcquired int toFrameworkAcquiredInfo(
+            byte aidlAcquiredInfo) {
+        if (aidlAcquiredInfo == AcquiredInfo.UNKNOWN) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
+        } else if (aidlAcquiredInfo == AcquiredInfo.GOOD) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD;
+        } else if (aidlAcquiredInfo == AcquiredInfo.PARTIAL) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_PARTIAL;
+        } else if (aidlAcquiredInfo == AcquiredInfo.INSUFFICIENT) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_INSUFFICIENT;
+        } else if (aidlAcquiredInfo == AcquiredInfo.SENSOR_DIRTY) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_IMAGER_DIRTY;
+        } else if (aidlAcquiredInfo == AcquiredInfo.TOO_SLOW) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_TOO_SLOW;
+        } else if (aidlAcquiredInfo == AcquiredInfo.TOO_FAST) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_TOO_FAST;
+        } else if (aidlAcquiredInfo == AcquiredInfo.VENDOR) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_VENDOR;
+        } else if (aidlAcquiredInfo == AcquiredInfo.START) {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START;
+        } else if (aidlAcquiredInfo == AcquiredInfo.TOO_DARK) {
+            // No framework constant available
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
+        } else if (aidlAcquiredInfo == AcquiredInfo.TOO_BRIGHT) {
+            // No framework constant available
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
+        } else if (aidlAcquiredInfo == AcquiredInfo.IMMOBILE) {
+            // No framework constant available
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
+        } else if (aidlAcquiredInfo == AcquiredInfo.RETRYING_CAPTURE) {
+            // No framework constant available
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
+        } else {
+            return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
index 1c88d67..e34afc0 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java
@@ -32,6 +32,7 @@
 import com.android.server.biometrics.HardwareAuthTokenUtils;
 import com.android.server.biometrics.Utils;
 import com.android.server.biometrics.sensors.BaseClientMonitor;
+import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
 
 import java.util.HashSet;
@@ -50,6 +51,7 @@
     @NonNull private final Context mContext;
     private final int mSensorId;
     @NonNull private final ITestSessionCallback mCallback;
+    @NonNull private final FingerprintStateCallback mFingerprintStateCallback;
     @NonNull private final FingerprintProvider mProvider;
     @NonNull private final Sensor mSensor;
     @NonNull private final Set<Integer> mEnrollmentIds;
@@ -114,11 +116,14 @@
     };
 
     BiometricTestSessionImpl(@NonNull Context context, int sensorId,
-            @NonNull ITestSessionCallback callback, @NonNull FingerprintProvider provider,
+            @NonNull ITestSessionCallback callback,
+            @NonNull FingerprintStateCallback fingerprintStateCallback,
+            @NonNull FingerprintProvider provider,
             @NonNull Sensor sensor) {
         mContext = context;
         mSensorId = sensorId;
         mCallback = callback;
+        mFingerprintStateCallback = fingerprintStateCallback;
         mProvider = provider;
         mSensor = sensor;
         mEnrollmentIds = new HashSet<>();
@@ -138,7 +143,8 @@
         Utils.checkPermission(mContext, TEST_BIOMETRIC);
 
         mProvider.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver,
-                mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL);
+                mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL,
+                mFingerprintStateCallback);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
index 9851ae0..c23c113 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java
@@ -55,6 +55,7 @@
 import com.android.server.biometrics.sensors.InvalidationRequesterClient;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.PerformanceTracker;
+import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
 import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
 import com.android.server.biometrics.sensors.fingerprint.ServiceProvider;
@@ -318,7 +319,8 @@
     @Override
     public void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken,
             int userId, @NonNull IFingerprintServiceReceiver receiver,
-            @NonNull String opPackageName, @FingerprintManager.EnrollReason int enrollReason) {
+            @NonNull String opPackageName, @FingerprintManager.EnrollReason int enrollReason,
+            @NonNull FingerprintStateCallback fingerprintStateCallback) {
         mHandler.post(() -> {
             final int maxTemplatesPerUser = mSensors.get(sensorId).getSensorProperties()
                     .maxEnrollmentsPerUser;
@@ -328,9 +330,16 @@
                     opPackageName, FingerprintUtils.getInstance(sensorId), sensorId,
                     mUdfpsOverlayController, maxTemplatesPerUser, enrollReason);
             scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() {
+
+                @Override
+                public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
+                    fingerprintStateCallback.onClientStarted(clientMonitor);
+                }
+
                 @Override
                 public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
                         boolean success) {
+                    fingerprintStateCallback.onClientFinished(clientMonitor, success);
                     if (success) {
                         scheduleLoadAuthenticatorIdsForUser(sensorId, userId);
                         scheduleInvalidationRequest(sensorId, userId);
@@ -348,14 +357,15 @@
     @Override
     public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
             @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName,
-            int statsClient) {
+            int statsClient,
+            @NonNull FingerprintStateCallback fingerprintStateCallback) {
         mHandler.post(() -> {
             final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
             final FingerprintDetectClient client = new FingerprintDetectClient(mContext,
                     mSensors.get(sensorId).getLazySession(), token, callback, userId,
                     opPackageName, sensorId, mUdfpsOverlayController, isStrongBiometric,
                     statsClient);
-            scheduleForSensor(sensorId, client);
+            scheduleForSensor(sensorId, client, fingerprintStateCallback);
         });
     }
 
@@ -363,7 +373,8 @@
     public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
             int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback,
             @NonNull String opPackageName, boolean restricted, int statsClient,
-            boolean allowBackgroundAuthentication) {
+            boolean allowBackgroundAuthentication,
+            @NonNull FingerprintStateCallback fingerprintStateCallback) {
         mHandler.post(() -> {
             final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId);
             final FingerprintAuthenticationClient client = new FingerprintAuthenticationClient(
@@ -372,7 +383,7 @@
                     false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient,
                     mTaskStackListener, mSensors.get(sensorId).getLockoutCache(),
                     mUdfpsOverlayController, allowBackgroundAuthentication);
-            scheduleForSensor(sensorId, client);
+            scheduleForSensor(sensorId, client, fingerprintStateCallback);
         });
     }
 
@@ -561,8 +572,9 @@
     @NonNull
     @Override
     public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
+            @NonNull FingerprintStateCallback fingerprintStateCallback,
             @NonNull String opPackageName) {
-        return mSensors.get(sensorId).createTestSession(callback);
+        return mSensors.get(sensorId).createTestSession(callback, fingerprintStateCallback);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
index 6a9b125..cf915ad 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
@@ -52,13 +52,13 @@
 import com.android.server.biometrics.sensors.EnumerateConsumer;
 import com.android.server.biometrics.sensors.ErrorConsumer;
 import com.android.server.biometrics.sensors.HalClientMonitor;
-import com.android.server.biometrics.sensors.Interruptable;
 import com.android.server.biometrics.sensors.LockoutCache;
 import com.android.server.biometrics.sensors.LockoutConsumer;
 import com.android.server.biometrics.sensors.RemovalConsumer;
 import com.android.server.biometrics.sensors.StartUserClient;
 import com.android.server.biometrics.sensors.StopUserClient;
 import com.android.server.biometrics.sensors.UserAwareBiometricScheduler;
+import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
 import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
 
@@ -179,7 +179,8 @@
                 }
 
                 final AcquisitionClient<?> acquisitionClient = (AcquisitionClient<?>) client;
-                acquisitionClient.onAcquired(info, vendorCode);
+                acquisitionClient.onAcquired(AidlConversionUtils.toFrameworkAcquiredInfo(info),
+                        vendorCode);
             });
         }
 
@@ -198,7 +199,7 @@
                 }
 
                 final ErrorConsumer errorConsumer = (ErrorConsumer) client;
-                errorConsumer.onError(error, vendorCode);
+                errorConsumer.onError(AidlConversionUtils.toFrameworkError(error), vendorCode);
 
                 if (error == Error.HW_UNAVAILABLE) {
                     mCallback.onHardwareUnavailable();
@@ -486,9 +487,10 @@
         }
     }
 
-    @NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback) {
+    @NonNull ITestSession createTestSession(@NonNull ITestSessionCallback callback,
+            @NonNull FingerprintStateCallback fingerprintStateCallback) {
         return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
-                mProvider, this);
+                fingerprintStateCallback, mProvider, this);
     }
 
     @NonNull BiometricScheduler getScheduler() {
@@ -527,6 +529,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FINGERPRINT);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java
index 766a882..ad4f679 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java
@@ -31,6 +31,7 @@
 
 import com.android.server.biometrics.Utils;
 import com.android.server.biometrics.sensors.BaseClientMonitor;
+import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
 
 import java.util.ArrayList;
@@ -51,6 +52,7 @@
     @NonNull private final Context mContext;
     private final int mSensorId;
     @NonNull private final ITestSessionCallback mCallback;
+    @NonNull private final FingerprintStateCallback mFingerprintStateCallback;
     @NonNull private final Fingerprint21 mFingerprint21;
     @NonNull private final Fingerprint21.HalResultController mHalResultController;
     @NonNull private final Set<Integer> mEnrollmentIds;
@@ -116,12 +118,14 @@
 
     BiometricTestSessionImpl(@NonNull Context context, int sensorId,
             @NonNull ITestSessionCallback callback,
+            @NonNull FingerprintStateCallback fingerprintStateCallback,
             @NonNull Fingerprint21 fingerprint21,
             @NonNull Fingerprint21.HalResultController halResultController) {
         mContext = context;
         mSensorId = sensorId;
         mCallback = callback;
         mFingerprint21 = fingerprint21;
+        mFingerprintStateCallback = fingerprintStateCallback;
         mHalResultController = halResultController;
         mEnrollmentIds = new HashSet<>();
         mRandom = new Random();
@@ -139,7 +143,8 @@
         Utils.checkPermission(mContext, TEST_BIOMETRIC);
 
         mFingerprint21.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver,
-                mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL);
+                mContext.getOpPackageName(), FingerprintManager.ENROLL_ENROLL,
+                mFingerprintStateCallback);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index eb78245..3528690 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -26,9 +26,7 @@
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.hardware.biometrics.BiometricConstants;
-import android.hardware.biometrics.BiometricManager;
 import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.biometrics.IInvalidationCallback;
 import android.hardware.biometrics.ITestSession;
 import android.hardware.biometrics.ITestSessionCallback;
@@ -50,9 +48,7 @@
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 
-import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.biometrics.SensorServiceStateProto;
 import com.android.server.biometrics.SensorStateProto;
@@ -70,11 +66,11 @@
 import com.android.server.biometrics.sensors.EnumerateConsumer;
 import com.android.server.biometrics.sensors.ErrorConsumer;
 import com.android.server.biometrics.sensors.HalClientMonitor;
-import com.android.server.biometrics.sensors.Interruptable;
 import com.android.server.biometrics.sensors.LockoutResetDispatcher;
 import com.android.server.biometrics.sensors.LockoutTracker;
 import com.android.server.biometrics.sensors.PerformanceTracker;
 import com.android.server.biometrics.sensors.RemovalConsumer;
+import com.android.server.biometrics.sensors.fingerprint.FingerprintStateCallback;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintUtils;
 import com.android.server.biometrics.sensors.fingerprint.GestureAvailabilityDispatcher;
 import com.android.server.biometrics.sensors.fingerprint.ServiceProvider;
@@ -120,7 +116,7 @@
     private int mCurrentUserId = UserHandle.USER_NULL;
     private final boolean mIsUdfps;
     private final int mSensorId;
-    private boolean mIsPowerbuttonFps;
+    private final boolean mIsPowerbuttonFps;
 
     private final class BiometricTaskStackListener extends TaskStackListener {
         @Override
@@ -314,17 +310,22 @@
         }
     }
 
-    Fingerprint21(@NonNull Context context, @NonNull BiometricScheduler scheduler,
-            @NonNull Handler handler, int sensorId,
-            @BiometricManager.Authenticators.Types int strength,
+    Fingerprint21(@NonNull Context context,
+            @NonNull FingerprintSensorPropertiesInternal sensorProps,
+            @NonNull BiometricScheduler scheduler, @NonNull Handler handler,
             @NonNull LockoutResetDispatcher lockoutResetDispatcher,
             @NonNull HalResultController controller) {
         mContext = context;
-        mSensorId = sensorId;
+
+        mSensorProperties = sensorProps;
+        mSensorId = sensorProps.sensorId;
+        mIsUdfps = sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL
+                || sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC;
+        mIsPowerbuttonFps = sensorProps.sensorType == FingerprintSensorProperties.TYPE_POWER_BUTTON;
+
         mScheduler = scheduler;
         mHandler = handler;
         mActivityTaskManager = ActivityTaskManager.getInstance();
-
         mTaskStackListener = new BiometricTaskStackListener();
         mAuthenticatorIds = Collections.synchronizedMap(new HashMap<>());
         mLazyDaemon = Fingerprint21.this::getDaemon;
@@ -341,46 +342,20 @@
         } catch (RemoteException e) {
             Slog.e(TAG, "Unable to register user switch observer");
         }
-
-        // TODO(b/179175438): Remove this code block after transition to AIDL.
-        // The existence of config_udfps_sensor_props indicates that the sensor is UDFPS.
-        mIsUdfps = !ArrayUtils.isEmpty(
-                mContext.getResources().getIntArray(R.array.config_udfps_sensor_props));
-
-        // config_is_powerbutton_fps indicates whether device has a power button fingerprint sensor.
-        mIsPowerbuttonFps = mContext.getResources().getBoolean(R.bool.config_is_powerbutton_fps);
-
-        final @FingerprintSensorProperties.SensorType int sensorType;
-        if (mIsUdfps) {
-            sensorType = FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
-        } else if (mIsPowerbuttonFps) {
-            sensorType = FingerprintSensorProperties.TYPE_POWER_BUTTON;
-        } else {
-            sensorType = FingerprintSensorProperties.TYPE_REAR;
-        }
-
-        // IBiometricsFingerprint@2.1 does not manage timeout below the HAL, so the Gatekeeper HAT
-        // cannot be checked
-        final boolean resetLockoutRequiresHardwareAuthToken = false;
-        final int maxEnrollmentsPerUser = mContext.getResources()
-                .getInteger(R.integer.config_fingerprintMaxTemplatesPerUser);
-
-        mSensorProperties = new FingerprintSensorPropertiesInternal(context, sensorId,
-                Utils.authenticatorStrengthToPropertyStrength(strength), maxEnrollmentsPerUser,
-                new ArrayList<ComponentInfoInternal>() /* componentInfo */, sensorType,
-                resetLockoutRequiresHardwareAuthToken);
     }
 
-    public static Fingerprint21 newInstance(@NonNull Context context, int sensorId, int strength,
+    public static Fingerprint21 newInstance(@NonNull Context context,
+            @NonNull FingerprintSensorPropertiesInternal sensorProps,
             @NonNull LockoutResetDispatcher lockoutResetDispatcher,
             @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher) {
         final Handler handler = new Handler(Looper.getMainLooper());
         final BiometricScheduler scheduler =
                 new BiometricScheduler(TAG, gestureAvailabilityDispatcher);
-        final HalResultController controller = new HalResultController(sensorId, context, handler,
+        final HalResultController controller = new HalResultController(sensorProps.sensorId,
+                context, handler,
                 scheduler);
-        return new Fingerprint21(context, scheduler, handler, sensorId, strength,
-                lockoutResetDispatcher, controller);
+        return new Fingerprint21(context, sensorProps, scheduler, handler, lockoutResetDispatcher,
+                controller);
     }
 
     @Override
@@ -573,7 +548,8 @@
     public void scheduleEnroll(int sensorId, @NonNull IBinder token,
             @NonNull byte[] hardwareAuthToken, int userId,
             @NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName,
-            @FingerprintManager.EnrollReason int enrollReason) {
+            @FingerprintManager.EnrollReason int enrollReason,
+            @NonNull FingerprintStateCallback fingerprintStateCallback) {
         mHandler.post(() -> {
             scheduleUpdateActiveUserWithoutHandler(userId);
 
@@ -584,8 +560,14 @@
                     enrollReason);
             mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() {
                 @Override
+                public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) {
+                    fingerprintStateCallback.onClientStarted(clientMonitor);
+                }
+
+                @Override
                 public void onClientFinished(@NonNull BaseClientMonitor clientMonitor,
                         boolean success) {
+                    fingerprintStateCallback.onClientFinished(clientMonitor, success);
                     if (success) {
                         // Update authenticatorIds
                         scheduleUpdateActiveUserWithoutHandler(clientMonitor.getTargetUserId(),
@@ -606,7 +588,8 @@
     @Override
     public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId,
             @NonNull ClientMonitorCallbackConverter listener, @NonNull String opPackageName,
-            int statsClient) {
+            int statsClient,
+            @NonNull FingerprintStateCallback fingerprintStateCallback) {
         mHandler.post(() -> {
             scheduleUpdateActiveUserWithoutHandler(userId);
 
@@ -615,7 +598,7 @@
                     mLazyDaemon, token, listener, userId, opPackageName,
                     mSensorProperties.sensorId, mUdfpsOverlayController, isStrongBiometric,
                     statsClient);
-            mScheduler.scheduleClientMonitor(client);
+            mScheduler.scheduleClientMonitor(client, fingerprintStateCallback);
         });
     }
 
@@ -623,7 +606,8 @@
     public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId,
             int userId, int cookie, @NonNull ClientMonitorCallbackConverter listener,
             @NonNull String opPackageName, boolean restricted, int statsClient,
-            boolean allowBackgroundAuthentication) {
+            boolean allowBackgroundAuthentication,
+            @NonNull FingerprintStateCallback fingerprintStateCallback) {
         mHandler.post(() -> {
             scheduleUpdateActiveUserWithoutHandler(userId);
 
@@ -634,7 +618,7 @@
                     mSensorProperties.sensorId, isStrongBiometric, statsClient,
                     mTaskStackListener, mLockoutTracker, mUdfpsOverlayController,
                     allowBackgroundAuthentication);
-            mScheduler.scheduleClientMonitor(client);
+            mScheduler.scheduleClientMonitor(client, fingerprintStateCallback);
         });
     }
 
@@ -764,6 +748,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FINGERPRINT);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {
@@ -885,8 +871,9 @@
     @NonNull
     @Override
     public ITestSession createTestSession(int sensorId, @NonNull ITestSessionCallback callback,
+            @NonNull FingerprintStateCallback fingerprintStateCallback,
             @NonNull String opPackageName) {
-        return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback, this,
-                mHalResultController);
+        return new BiometricTestSessionImpl(mContext, mSensorProperties.sensorId, callback,
+                fingerprintStateCallback, this, mHalResultController);
     }
 }
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java
index 90c4b4a..d1020a6 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java
@@ -21,8 +21,6 @@
 import android.app.trust.TrustManager;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.hardware.biometrics.BiometricManager;
-import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
 import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
@@ -39,7 +37,6 @@
 import android.util.SparseBooleanArray;
 
 import com.android.internal.R;
-import com.android.server.biometrics.Utils;
 import com.android.server.biometrics.sensors.AuthenticationConsumer;
 import com.android.server.biometrics.sensors.BaseClientMonitor;
 import com.android.server.biometrics.sensors.BiometricScheduler;
@@ -271,8 +268,8 @@
         }
     }
 
-    public static Fingerprint21UdfpsMock newInstance(@NonNull Context context, int sensorId,
-            @BiometricManager.Authenticators.Types int strength,
+    public static Fingerprint21UdfpsMock newInstance(@NonNull Context context,
+            @NonNull FingerprintSensorPropertiesInternal sensorProps,
             @NonNull LockoutResetDispatcher lockoutResetDispatcher,
             @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher) {
         Slog.d(TAG, "Creating Fingerprint23Mock!");
@@ -281,8 +278,8 @@
         final TestableBiometricScheduler scheduler =
                 new TestableBiometricScheduler(TAG, gestureAvailabilityDispatcher);
         final MockHalResultController controller =
-                new MockHalResultController(sensorId, context, handler, scheduler);
-        return new Fingerprint21UdfpsMock(context, scheduler, handler, sensorId, strength,
+                new MockHalResultController(sensorProps.sensorId, context, handler, scheduler);
+        return new Fingerprint21UdfpsMock(context, sensorProps, scheduler, handler,
                 lockoutResetDispatcher, controller);
     }
 
@@ -402,17 +399,17 @@
             // internal preemption logic is not run.
             mFingerprint21.scheduleAuthenticate(mFingerprint21.mSensorProperties.sensorId, token,
                     operationId, user, cookie, listener, opPackageName, restricted, statsClient,
-                    isKeyguard);
+                    isKeyguard, null /* fingerprintStateCallback */);
         }
     }
 
     private Fingerprint21UdfpsMock(@NonNull Context context,
+            @NonNull FingerprintSensorPropertiesInternal sensorProps,
             @NonNull TestableBiometricScheduler scheduler,
-            @NonNull Handler handler, int sensorId,
-            @BiometricManager.Authenticators.Types int strength,
+            @NonNull Handler handler,
             @NonNull LockoutResetDispatcher lockoutResetDispatcher,
             @NonNull MockHalResultController controller) {
-        super(context, scheduler, handler, sensorId, strength, lockoutResetDispatcher, controller);
+        super(context, sensorProps, scheduler, handler, lockoutResetDispatcher, controller);
         mScheduler = scheduler;
         mScheduler.init(this);
         mHandler = handler;
@@ -420,11 +417,11 @@
         final boolean resetLockoutRequiresHardwareAuthToken = false;
         final int maxTemplatesAllowed = mContext.getResources()
                 .getInteger(R.integer.config_fingerprintMaxTemplatesPerUser);
-        mSensorProperties = new FingerprintSensorPropertiesInternal(sensorId,
-                Utils.authenticatorStrengthToPropertyStrength(strength), maxTemplatesAllowed,
-                new ArrayList<ComponentInfoInternal>() /* componentInfo */,
+        mSensorProperties = new FingerprintSensorPropertiesInternal(sensorProps.sensorId,
+                sensorProps.sensorStrength, maxTemplatesAllowed, sensorProps.componentInfo,
                 FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
-                resetLockoutRequiresHardwareAuthToken);
+                resetLockoutRequiresHardwareAuthToken, sensorProps.sensorLocationX,
+                sensorProps.sensorLocationY, sensorProps.sensorRadius);
         mMockHalResultController = controller;
         mUserHasTrust = new SparseBooleanArray();
         mTrustManager = context.getSystemService(TrustManager.class);
diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
index 1003c26..4918185 100644
--- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java
@@ -35,7 +35,7 @@
 public final class IrisAuthenticator extends IBiometricAuthenticator.Stub {
     private final IIrisService mIrisService;
 
-    public IrisAuthenticator(IIrisService irisService, int sensorId) throws RemoteException {
+    public IrisAuthenticator(IIrisService irisService, int sensorId) {
         mIrisService = irisService;
     }
 
diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java
index 08b2489..d684bb8 100644
--- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisService.java
@@ -17,14 +17,26 @@
 package com.android.server.biometrics.sensors.iris;
 
 import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_IRIS;
 
 import android.annotation.NonNull;
 import android.content.Context;
+import android.hardware.biometrics.BiometricManager;
+import android.hardware.biometrics.IBiometricService;
+import android.hardware.biometrics.SensorPropertiesInternal;
 import android.hardware.iris.IIrisService;
+import android.os.Handler;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Slog;
 
+import com.android.server.ServiceThread;
 import com.android.server.SystemService;
 import com.android.server.biometrics.Utils;
 
+import java.util.List;
+
 /**
  * A service to manage multiple clients that want to access the Iris HAL API.
  * The service is responsible for maintaining a list of clients and dispatching all
@@ -37,22 +49,54 @@
 
     private static final String TAG = "IrisService";
 
+    private final IrisServiceWrapper mServiceWrapper;
+
     /**
      * Receives the incoming binder calls from IrisManager.
      */
     private final class IrisServiceWrapper extends IIrisService.Stub {
         @Override // Binder call
-        public void initializeConfiguration(int sensorId, int strength) {
+        public void registerAuthenticators(@NonNull List<SensorPropertiesInternal> hidlSensors) {
             Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL);
+
+            // Some HAL might not be started before the system service and will cause the code below
+            // to wait, and some of the operations below might take a significant amount of time to
+            // complete (calls to the HALs). To avoid blocking the rest of system server we put
+            // this on a background thread.
+            final ServiceThread thread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND,
+                    true /* allowIo */);
+            thread.start();
+            final Handler handler = new Handler(thread.getLooper());
+
+            handler.post(() -> {
+                final IBiometricService biometricService = IBiometricService.Stub.asInterface(
+                        ServiceManager.getService(Context.BIOMETRIC_SERVICE));
+
+                for (SensorPropertiesInternal hidlSensor : hidlSensors) {
+                    final int sensorId = hidlSensor.sensorId;
+                    final @BiometricManager.Authenticators.Types int strength =
+                            Utils.propertyStrengthToAuthenticatorStrength(
+                                    hidlSensor.sensorStrength);
+                    final IrisAuthenticator authenticator = new IrisAuthenticator(mServiceWrapper,
+                            sensorId);
+                    try {
+                        biometricService.registerAuthenticator(sensorId, TYPE_IRIS, strength,
+                                authenticator);
+                    } catch (RemoteException e) {
+                        Slog.e(TAG, "Remote exception when registering sensorId: " + sensorId);
+                    }
+                }
+            });
         }
     }
 
     public IrisService(@NonNull Context context) {
         super(context);
+        mServiceWrapper = new IrisServiceWrapper();
     }
 
     @Override
     public void onStart() {
-        publishBinderService(Context.IRIS_SERVICE, new IrisServiceWrapper());
+        publishBinderService(Context.IRIS_SERVICE, mServiceWrapper);
     }
 }
diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java
index 47c7e39..e2aa071 100644
--- a/services/core/java/com/android/server/clipboard/ClipboardService.java
+++ b/services/core/java/com/android/server/clipboard/ClipboardService.java
@@ -952,14 +952,8 @@
             try {
                 CharSequence callingAppLabel = mPm.getApplicationLabel(
                         mPm.getApplicationInfoAsUser(callingPackage, 0, userId));
-                String message;
-                if (isText(clipboard.primaryClip)) {
-                    message = getContext().getString(
-                            R.string.pasted_text, callingAppLabel);
-                } else {
-                    message = getContext().getString(
-                            R.string.pasted_content, callingAppLabel);
-                }
+                String message =
+                        getContext().getString(R.string.pasted_from_clipboard, callingAppLabel);
                 Slog.i(TAG, message);
                 Toast.makeText(
                         getContext(), UiThread.get().getLooper(), message, Toast.LENGTH_SHORT)
diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java
index cf4fe1e..05b12ba 100644
--- a/services/core/java/com/android/server/connectivity/DnsManager.java
+++ b/services/core/java/com/android/server/connectivity/DnsManager.java
@@ -16,14 +16,14 @@
 
 package com.android.server.connectivity;
 
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 import static android.net.ConnectivitySettingsManager.DNS_RESOLVER_MAX_SAMPLES;
 import static android.net.ConnectivitySettingsManager.DNS_RESOLVER_MIN_SAMPLES;
 import static android.net.ConnectivitySettingsManager.DNS_RESOLVER_SAMPLE_VALIDITY_SECONDS;
 import static android.net.ConnectivitySettingsManager.DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT;
 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_DEFAULT_MODE;
 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OFF;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_SPECIFIER;
 import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_FAILURE;
 import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_SUCCESS;
@@ -33,6 +33,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.ConnectivityManager;
+import android.net.ConnectivitySettingsManager;
 import android.net.IDnsResolver;
 import android.net.InetAddresses;
 import android.net.LinkProperties;
@@ -131,11 +132,11 @@
      * Get PrivateDnsConfig.
      */
     public static PrivateDnsConfig getPrivateDnsConfig(Context context) {
-        final String mode = ConnectivityManager.getPrivateDnsMode(context);
+        final int mode = ConnectivitySettingsManager.getPrivateDnsMode(context);
 
-        final boolean useTls = !TextUtils.isEmpty(mode) && !PRIVATE_DNS_MODE_OFF.equals(mode);
+        final boolean useTls = mode != PRIVATE_DNS_MODE_OFF;
 
-        if (PRIVATE_DNS_MODE_PROVIDER_HOSTNAME.equals(mode)) {
+        if (PRIVATE_DNS_MODE_PROVIDER_HOSTNAME == mode) {
             final String specifier = getStringSetting(context.getContentResolver(),
                     PRIVATE_DNS_SPECIFIER);
             return new PrivateDnsConfig(specifier, null);
diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
index 4ecc759..091e6c4 100644
--- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
+++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
@@ -27,6 +27,7 @@
 import static android.net.NetworkPolicy.WARNING_DISABLED;
 import static android.net.NetworkTemplate.NETWORK_TYPE_ALL;
 import static android.net.NetworkTemplate.OEM_MANAGED_ALL;
+import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT;
 import static android.provider.Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES;
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
@@ -227,7 +228,8 @@
             mNetworkTemplate = new NetworkTemplate(
                     NetworkTemplate.MATCH_MOBILE, subscriberId, new String[] { subscriberId },
                     null, NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
-                    NetworkStats.DEFAULT_NETWORK_NO, NETWORK_TYPE_ALL, OEM_MANAGED_ALL);
+                    NetworkStats.DEFAULT_NETWORK_NO, NETWORK_TYPE_ALL, OEM_MANAGED_ALL,
+                    SUBSCRIBER_ID_MATCH_RULE_EXACT);
             mUsageCallback = new UsageCallback() {
                 @Override
                 public void onThresholdReached(int networkType, String subscriberId) {
diff --git a/services/core/java/com/android/server/connectivity/NetworkRanker.java b/services/core/java/com/android/server/connectivity/NetworkRanker.java
index 346af44..e839837 100644
--- a/services/core/java/com/android/server/connectivity/NetworkRanker.java
+++ b/services/core/java/com/android/server/connectivity/NetworkRanker.java
@@ -63,7 +63,7 @@
         NetworkCapabilities getCapsNoCopy();
     }
 
-    private static final boolean USE_POLICY_RANKING = false;
+    private static final boolean USE_POLICY_RANKING = true;
 
     public NetworkRanker() { }
 
diff --git a/services/core/java/com/android/server/connectivity/ProxyTracker.java b/services/core/java/com/android/server/connectivity/ProxyTracker.java
index f572b46..bc0929c 100644
--- a/services/core/java/com/android/server/connectivity/ProxyTracker.java
+++ b/services/core/java/com/android/server/connectivity/ProxyTracker.java
@@ -55,6 +55,11 @@
     private static final String TAG = ProxyTracker.class.getSimpleName();
     private static final boolean DBG = true;
 
+    // EXTRA_PROXY_INFO is now @removed. In order to continue sending it, hardcode its value here.
+    // The Proxy.EXTRA_PROXY_INFO constant is not visible to this code because android.net.Proxy
+    // a hidden platform constant not visible to mainline modules.
+    private static final String EXTRA_PROXY_INFO = "android.intent.extra.PROXY_INFO";
+
     @NonNull
     private final Context mContext;
 
@@ -253,7 +258,7 @@
         Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION);
         intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING |
                 Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
-        intent.putExtra(Proxy.EXTRA_PROXY_INFO, proxyInfo);
+        intent.putExtra(EXTRA_PROXY_INFO, proxyInfo);
         final long ident = Binder.clearCallingIdentity();
         try {
             mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 33224f4..ddac19b 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -2698,19 +2698,21 @@
                 // prevent the NetworkManagementEventObserver from killing this VPN based on the
                 // interface going down (which we expect).
                 mInterface = null;
-                mConfig.interfaze = null;
+                if (mConfig != null) {
+                    mConfig.interfaze = null;
 
-                // Set as unroutable to prevent traffic leaking while the interface is down.
-                if (mConfig != null && mConfig.routes != null) {
-                    final List<RouteInfo> oldRoutes = new ArrayList<>(mConfig.routes);
+                    // Set as unroutable to prevent traffic leaking while the interface is down.
+                    if (mConfig.routes != null) {
+                        final List<RouteInfo> oldRoutes = new ArrayList<>(mConfig.routes);
 
-                    mConfig.routes.clear();
-                    for (final RouteInfo route : oldRoutes) {
-                        mConfig.routes.add(new RouteInfo(route.getDestination(), null /*gateway*/,
-                                null /*iface*/, RTN_UNREACHABLE));
-                    }
-                    if (mNetworkAgent != null) {
-                        mNetworkAgent.sendLinkProperties(makeLinkProperties());
+                        mConfig.routes.clear();
+                        for (final RouteInfo route : oldRoutes) {
+                            mConfig.routes.add(new RouteInfo(route.getDestination(),
+                                    null /*gateway*/, null /*iface*/, RTN_UNREACHABLE));
+                        }
+                        if (mNetworkAgent != null) {
+                            mNetworkAgent.sendLinkProperties(makeLinkProperties());
+                        }
                     }
                 }
             }
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index 0e71496..17f39dd 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -807,12 +807,14 @@
     public String[] getSyncAdapterPackagesForAuthorityAsUser(String authority, int userId) {
         enforceCrossUserPermission(userId,
                 "no permission to read sync settings for user " + userId);
+        final int callingUid = Binder.getCallingUid();
         // This makes it so that future permission checks will be in the context of this
         // process rather than the caller's process. We will restore this before returning.
         final long identityToken = clearCallingIdentity();
         try {
             SyncManager syncManager = getSyncManager();
-            return syncManager.getSyncAdapterPackagesForAuthorityAsUser(authority, userId);
+            return syncManager.getSyncAdapterPackagesForAuthorityAsUser(authority, callingUid,
+                    userId);
         } finally {
             restoreCallingIdentity(identityToken);
         }
diff --git a/services/core/java/com/android/server/content/SyncJobService.java b/services/core/java/com/android/server/content/SyncJobService.java
index 1f46061..1da7f0c 100644
--- a/services/core/java/com/android/server/content/SyncJobService.java
+++ b/services/core/java/com/android/server/content/SyncJobService.java
@@ -119,7 +119,7 @@
     public boolean onStopJob(JobParameters params) {
         if (Log.isLoggable(TAG, Log.VERBOSE)) {
             Slog.v(TAG, "onStopJob called " + params.getJobId() + ", reason: "
-                    + params.getLegacyStopReason());
+                    + params.getInternalStopReasonCode());
         }
         final SyncOperation op = SyncOperation.maybeCreateFromJobExtras(params.getExtras());
         if (op == null) {
@@ -161,9 +161,11 @@
         m.obj = op;
 
         // Reschedule if this job was NOT explicitly canceled.
-        m.arg1 = params.getLegacyStopReason() != JobParameters.REASON_CANCELED ? 1 : 0;
+        m.arg1 = params.getInternalStopReasonCode() != JobParameters.INTERNAL_STOP_REASON_CANCELED
+                ? 1 : 0;
         // Apply backoff only if stop is called due to timeout.
-        m.arg2 = params.getLegacyStopReason() == JobParameters.REASON_TIMEOUT ? 1 : 0;
+        m.arg2 = params.getInternalStopReasonCode() == JobParameters.INTERNAL_STOP_REASON_TIMEOUT
+                ? 1 : 0;
 
         SyncManager.sendMessage(m);
         return false;
@@ -204,7 +206,7 @@
             return "job:null";
         } else {
             return "job:#" + params.getJobId() + ":"
-                    + "sr=[" + params.getLegacyStopReason()
+                    + "sr=[" + params.getInternalStopReasonCode()
                     + "/" + params.getDebugStopReason() + "]:"
                     + SyncOperation.maybeCreateFromJobExtras(params.getExtras());
         }
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 614e488..4bd1fd8 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -194,12 +194,6 @@
     private static final int SYNC_MONITOR_PROGRESS_THRESHOLD_BYTES = 10; // 10 bytes
 
     /**
-     * If a previously scheduled sync becomes ready and we are low on storage, it gets
-     * pushed back for this amount of time.
-     */
-    private static final long SYNC_DELAY_ON_LOW_STORAGE = 60*60*1000;   // 1 hour
-
-    /**
      * If a sync becomes ready and it conflicts with an already running sync, it gets
      * pushed back for this amount of time.
      */
@@ -242,9 +236,7 @@
 
     volatile private PowerManager.WakeLock mSyncManagerWakeLock;
     volatile private boolean mDataConnectionIsConnected = false;
-    volatile private boolean mStorageIsLow = false;
-    volatile private boolean mDeviceIsIdle = false;
-    volatile private boolean mReportedSyncActive = false;
+    private volatile int mNextJobIdOffset = 0;
 
     private final NotificationManager mNotificationMgr;
     private final IBatteryStats mBatteryStats;
@@ -264,17 +256,17 @@
 
     protected final SyncAdaptersCache mSyncAdapters;
 
-    private final Random mRand;
-
     private final SyncLogger mLogger;
 
     private boolean isJobIdInUseLockedH(int jobId, List<JobInfo> pendingJobs) {
-        for (JobInfo job: pendingJobs) {
+        for (int i = 0, size = pendingJobs.size(); i < size; i++) {
+            JobInfo job = pendingJobs.get(i);
             if (job.getId() == jobId) {
                 return true;
             }
         }
-        for (ActiveSyncContext asc: mActiveSyncContexts) {
+        for (int i = 0, size = mActiveSyncContexts.size(); i < size; i++) {
+            ActiveSyncContext asc = mActiveSyncContexts.get(i);
             if (asc.mSyncOperation.jobId == jobId) {
                 return true;
             }
@@ -283,19 +275,28 @@
     }
 
     private int getUnusedJobIdH() {
-        int newJobId;
-        do {
-            newJobId = MIN_SYNC_JOB_ID + mRand.nextInt(MAX_SYNC_JOB_ID - MIN_SYNC_JOB_ID);
-        } while (isJobIdInUseLockedH(newJobId,
-                mJobSchedulerInternal.getSystemScheduledPendingJobs()));
-        return newJobId;
+        final int maxNumSyncJobIds = MAX_SYNC_JOB_ID - MIN_SYNC_JOB_ID;
+        final List<JobInfo> pendingJobs = mJobSchedulerInternal.getSystemScheduledPendingJobs();
+        for (int i = 0; i < maxNumSyncJobIds; ++i) {
+            int newJobId = MIN_SYNC_JOB_ID + ((mNextJobIdOffset + i) % maxNumSyncJobIds);
+            if (!isJobIdInUseLockedH(newJobId, pendingJobs)) {
+                mNextJobIdOffset = (mNextJobIdOffset + i + 1) % maxNumSyncJobIds;
+                return newJobId;
+            }
+        }
+        // We've used all 10,000 intended job IDs.... We're probably in a world of pain right now :/
+        Slog.wtf(TAG, "All " + maxNumSyncJobIds + " possible sync job IDs are taken :/");
+        mNextJobIdOffset = (mNextJobIdOffset + 1) % maxNumSyncJobIds;
+        return MIN_SYNC_JOB_ID + mNextJobIdOffset;
     }
 
     private List<SyncOperation> getAllPendingSyncs() {
         verifyJobScheduler();
         List<JobInfo> pendingJobs = mJobSchedulerInternal.getSystemScheduledPendingJobs();
-        List<SyncOperation> pendingSyncs = new ArrayList<SyncOperation>(pendingJobs.size());
-        for (JobInfo job: pendingJobs) {
+        final int numJobs = pendingJobs.size();
+        final List<SyncOperation> pendingSyncs = new ArrayList<>(numJobs);
+        for (int i = 0; i < numJobs; ++i) {
+            final JobInfo job = pendingJobs.get(i);
             SyncOperation op = SyncOperation.maybeCreateFromJobExtras(job.getExtras());
             if (op != null) {
                 pendingSyncs.add(op);
@@ -304,31 +305,6 @@
         return pendingSyncs;
     }
 
-    private final BroadcastReceiver mStorageIntentReceiver =
-            new BroadcastReceiver() {
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    String action = intent.getAction();
-                    if (Intent.ACTION_DEVICE_STORAGE_LOW.equals(action)) {
-                        if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                            Slog.v(TAG, "Internal storage is low.");
-                        }
-                        mStorageIsLow = true;
-                        cancelActiveSync(
-                                SyncStorageEngine.EndPoint.USER_ALL_PROVIDER_ALL_ACCOUNTS_ALL,
-                                null /* any sync */,
-                                "storage low");
-                    } else if (Intent.ACTION_DEVICE_STORAGE_OK.equals(action)) {
-                        if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                            Slog.v(TAG, "Internal storage is ok.");
-                        }
-                        mStorageIsLow = false;
-                        rescheduleSyncs(EndPoint.USER_ALL_PROVIDER_ALL_ACCOUNTS_ALL,
-                                "storage ok");
-                    }
-                }
-            };
-
     private final BroadcastReceiver mAccountsUpdatedReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -637,16 +613,11 @@
             }
         }, mSyncHandler);
 
-        mRand = new Random(System.currentTimeMillis());
         mConstants = new SyncManagerConstants(context);
 
         IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
         context.registerReceiver(mConnectivityIntentReceiver, intentFilter);
 
-        intentFilter = new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW);
-        intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
-        context.registerReceiver(mStorageIntentReceiver, intentFilter);
-
         intentFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
         intentFilter.setPriority(100);
         context.registerReceiver(mShutdownIntentReceiver, intentFilter);
@@ -957,7 +928,6 @@
         }
 
         if (ArrayUtils.isEmpty(accounts)) {
-            mLogger.log("scheduleSync: no accounts configured, dropping");
             return;
         }
 
@@ -1261,8 +1231,19 @@
         return types.toArray(new SyncAdapterType[] {});
     }
 
-    public String[] getSyncAdapterPackagesForAuthorityAsUser(String authority, int userId) {
-        return mSyncAdapters.getSyncAdapterPackagesForAuthority(authority, userId);
+    public String[] getSyncAdapterPackagesForAuthorityAsUser(String authority, int callingUid,
+            int userId) {
+        final String[] syncAdapterPackages = mSyncAdapters.getSyncAdapterPackagesForAuthority(
+                authority, userId);
+        final List<String> filteredResult = new ArrayList<>(syncAdapterPackages.length);
+        for (String packageName : syncAdapterPackages) {
+            if (TextUtils.isEmpty(packageName) || mPackageManagerInternal.filterAppAccess(
+                    packageName, callingUid, userId)) {
+                continue;
+            }
+            filteredResult.add(packageName);
+        }
+        return filteredResult.toArray(new String[] {});
     }
 
     private void sendSyncFinishedOrCanceledMessage(ActiveSyncContext syncContext,
@@ -1518,6 +1499,10 @@
 
         if (minDelay < 0) {
             minDelay = 0;
+        } else if (minDelay > 0) {
+            // We can't apply a delay to an EJ. If we want to delay it, we must demote it to a
+            // regular job.
+            syncOperation.scheduleEjAsRegularJob = true;
         }
 
         // Check if duplicate syncs are pending. If found, keep one with least expected run time.
@@ -1636,6 +1621,7 @@
                 new ComponentName(mContext, SyncJobService.class))
                 .setExtras(syncOperation.toJobInfoExtras())
                 .setRequiredNetworkType(networkType)
+                .setRequiresStorageNotLow(true)
                 .setPersisted(true)
                 .setPriority(priority)
                 .setFlags(jobFlags);
@@ -1728,6 +1714,8 @@
         }
 
         operation.enableBackoff();
+        // Never run a rescheduled requested-EJ-sync as an EJ.
+        operation.scheduleEjAsRegularJob = true;
 
         if (operation.hasDoNotRetry() && !syncResult.syncAlreadyInProgress) {
             // syncAlreadyInProgress flag is set by AbstractThreadedSyncAdapter. The sync adapter
@@ -2183,9 +2171,9 @@
             }
             pw.println();
         }
-        pw.print("Memory low: "); pw.println(mStorageIsLow);
-        pw.print("Device idle: "); pw.println(mDeviceIsIdle);
-        pw.print("Reported active: "); pw.println(mReportedSyncActive);
+        Intent storageLowIntent =
+                mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW));
+        pw.print("Storage low: "); pw.println(storageLowIntent != null);
         pw.print("Clock valid: "); pw.println(mSyncStorageEngine.isClockValid());
 
         final AccountAndUser[] accounts = AccountManagerService.getSingleton().getAllAccounts();
@@ -3137,7 +3125,7 @@
                 scheduleSyncOperationH(op.createOneTimeSyncOperation(), delay);
             } else {
                 // mSyncJobService.callJobFinished is async, so cancel the job to ensure we don't
-                // find the this job in the pending jobs list while looking for duplicates
+                // find this job in the pending jobs list while looking for duplicates
                 // before scheduling it at a later time.
                 cancelJob(op, "deferSyncH()");
                 scheduleSyncOperationH(op, delay);
@@ -3172,11 +3160,6 @@
 
             SyncJobService.markSyncStarted(op.jobId);
 
-            if (mStorageIsLow) {
-                deferSyncH(op, SYNC_DELAY_ON_LOW_STORAGE, "storage low");
-                return;
-            }
-
             if (op.isPeriodic) {
                 // Don't allow this periodic to run if a previous instance failed and is currently
                 // scheduled according to some backoff criteria.
@@ -3265,7 +3248,8 @@
                 removeStaleAccounts();
 
                 AccountAndUser[] accounts = mRunningAccounts;
-                for (ActiveSyncContext currentSyncContext : mActiveSyncContexts) {
+                for (int i = 0, size = mActiveSyncContexts.size(); i < size; i++) {
+                    ActiveSyncContext currentSyncContext = mActiveSyncContexts.get(i);
                     if (!containsAccountAndUser(accounts,
                             currentSyncContext.mSyncOperation.target.account,
                             currentSyncContext.mSyncOperation.target.userId)) {
@@ -3277,7 +3261,8 @@
 
                 if (syncTargets != null) {
                     // On account add, check if there are any settings to be restored.
-                    for (AccountAndUser aau : mRunningAccounts) {
+                    for (int i = 0, length = mRunningAccounts.length; i < length; i++) {
+                        AccountAndUser aau = mRunningAccounts[i];
                         if (!containsAccountAndUser(oldAccounts, aau.account, aau.userId)) {
                             if (Log.isLoggable(TAG, Log.DEBUG)) {
                                 Log.d(TAG, "Account " + aau.account
@@ -3294,7 +3279,8 @@
             // Cancel all jobs from non-existent accounts.
             AccountAndUser[] allAccounts = AccountManagerService.getSingleton().getAllAccounts();
             List<SyncOperation> ops = getAllPendingSyncs();
-            for (SyncOperation op: ops) {
+            for (int i = 0, opsSize = ops.size(); i < opsSize; i++) {
+                SyncOperation op = ops.get(i);
                 if (!containsAccountAndUser(allAccounts, op.target.account, op.target.userId)) {
                     mLogger.log("canceling: ", op);
                     cancelJob(op, "updateRunningAccountsH()");
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 0071b2f..2d7145f 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -34,6 +34,7 @@
 import com.android.server.display.config.HighBrightnessMode;
 import com.android.server.display.config.NitsMap;
 import com.android.server.display.config.Point;
+import com.android.server.display.config.SensorDetails;
 import com.android.server.display.config.XmlParser;
 
 import org.xmlpull.v1.XmlPullParserException;
@@ -75,6 +76,9 @@
 
     private final Context mContext;
 
+    // The details of the ambient light sensor associated with this display.
+    private final SensorIdentifier mAmbientLightSensor = new SensorIdentifier();
+
     // Nits and backlight values that are loaded from either the display device config file, or
     // config.xml. These are the raw values and just used for the dumpsys
     private float[] mRawNits;
@@ -249,6 +253,10 @@
         return mBrightnessRampSlowIncrease;
     }
 
+    SensorIdentifier getAmbientLightSensor() {
+        return mAmbientLightSensor;
+    }
+
     /**
      * @param quirkValue The quirk to test.
      * @return {@code true} if the specified quirk is present in this configuration,
@@ -291,6 +299,7 @@
                 + ", mBrightnessRampFastIncrease=" + mBrightnessRampFastIncrease
                 + ", mBrightnessRampSlowDecrease=" + mBrightnessRampSlowDecrease
                 + ", mBrightnessRampSlowIncrease=" + mBrightnessRampSlowIncrease
+                + ", mAmbientLightSensor=" + mAmbientLightSensor
                 + "}";
         return str;
     }
@@ -318,7 +327,7 @@
 
     private static DisplayDeviceConfig getConfigFromPmValues(Context context) {
         DisplayDeviceConfig config = new DisplayDeviceConfig(context);
-        config.initFromPmValues();
+        config.initFromDefaultValues();
         return config;
     }
 
@@ -342,6 +351,7 @@
                 loadHighBrightnessModeData(config);
                 loadQuirks(config);
                 loadBrightnessRamps(config);
+                loadAmbientLightSensorFromDdc(config);
             } else {
                 Slog.w(TAG, "DisplayDeviceConfig file is null");
             }
@@ -357,9 +367,10 @@
         loadBrightnessConstraintsFromConfigXml();
         loadBrightnessMapFromConfigXml();
         loadBrightnessRampsFromConfigXml();
+        loadAmbientLightSensorFromConfigXml();
     }
 
-    private void initFromPmValues() {
+    private void initFromDefaultValues() {
         // Set all to basic values
         mBacklightMinimum = PowerManager.BRIGHTNESS_MIN;
         mBacklightMaximum = PowerManager.BRIGHTNESS_MAX;
@@ -369,6 +380,7 @@
         mBrightnessRampSlowDecrease = PowerManager.BRIGHTNESS_MAX;
         mBrightnessRampSlowIncrease = PowerManager.BRIGHTNESS_MAX;
         setSimpleMappingStrategyValues();
+        loadAmbientLightSensorFromConfigXml();
     }
 
     private void loadBrightnessDefaultFromDdcXml(DisplayConfiguration config) {
@@ -637,6 +649,33 @@
         mBrightnessRampSlowDecrease = mBrightnessRampSlowIncrease;
     }
 
+    private void loadAmbientLightSensorFromConfigXml() {
+        mAmbientLightSensor.name = "";
+        mAmbientLightSensor.type = mContext.getResources().getString(
+                com.android.internal.R.string.config_displayLightSensorType);
+    }
+
+    private void loadAmbientLightSensorFromDdc(DisplayConfiguration config) {
+        final SensorDetails sensorDetails = config.getLightSensor();
+        if (sensorDetails != null) {
+            mAmbientLightSensor.type = sensorDetails.getType();
+            mAmbientLightSensor.name = sensorDetails.getName();
+        }
+    }
+
+    static class SensorIdentifier {
+        public String type;
+        public String name;
+
+        @Override
+        public String toString() {
+            return "Sensor{"
+                    + "type: \"" + type + "\""
+                    + ", name: \"" + name + "\""
+                    + "} ";
+        }
+    }
+
     /**
      * Container for high brightness mode configuration data.
      */
@@ -656,6 +695,17 @@
         /** Minimum time that HBM can be on before being enabled. */
         public long timeMinMillis;
 
+        HighBrightnessModeData() {}
+
+        HighBrightnessModeData(float minimumLux, float transitionPoint,
+                long timeWindowMillis, long timeMaxMillis, long timeMinMillis) {
+            this.minimumLux = minimumLux;
+            this.transitionPoint = transitionPoint;
+            this.timeWindowMillis = timeWindowMillis;
+            this.timeMaxMillis = timeMaxMillis;
+            this.timeMinMillis = timeMinMillis;
+        }
+
         /**
          * Copies the HBM data to the specified parameter instance.
          * @param other the instance to copy data to.
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 393a4eb..789f08f 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -55,6 +55,7 @@
 import android.hardware.display.AmbientBrightnessDayStats;
 import android.hardware.display.BrightnessChangeEvent;
 import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.BrightnessInfo;
 import android.hardware.display.Curve;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayManagerGlobal;
@@ -430,8 +431,8 @@
         mHandler = new DisplayManagerHandler(DisplayThread.get().getLooper());
         mUiHandler = UiThread.getHandler();
         mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore);
-        mLogicalDisplayMapper = new LogicalDisplayMapper(mDisplayDeviceRepo,
-                new LogicalDisplayListener());
+        mLogicalDisplayMapper = new LogicalDisplayMapper(mContext, mDisplayDeviceRepo,
+                new LogicalDisplayListener(), mSyncRoot, mHandler);
         mDisplayModeDirector = new DisplayModeDirector(context, mHandler);
         mBrightnessSynchronizer = new BrightnessSynchronizer(mContext);
         Resources resources = mContext.getResources();
@@ -842,8 +843,6 @@
             return overriddenInfo;
         }
 
-
-
         return info;
     }
 
@@ -1269,7 +1268,7 @@
 
         DisplayPowerController dpc = mDisplayPowerControllers.get(displayId);
         if (dpc != null) {
-            dpc.onDisplayChangedLocked();
+            dpc.onDisplayChanged();
         }
     }
 
@@ -1305,12 +1304,23 @@
         handleLogicalDisplayChangedLocked(display);
     }
 
+    private void handleLogicalDisplayDeviceStateTransitionLocked(@NonNull LogicalDisplay display) {
+        final int displayId = display.getDisplayIdLocked();
+        final DisplayPowerController dpc = mDisplayPowerControllers.get(displayId);
+        if (dpc != null) {
+            dpc.onDeviceStateTransition();
+        }
+    }
+
     private Runnable updateDisplayStateLocked(DisplayDevice device) {
         // Blank or unblank the display immediately to match the state requested
         // by the display power controller (if known).
         DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
         if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
             final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(device);
+            if (display == null) {
+                return null;
+            }
             final int displayId = display.getDisplayIdLocked();
             final int state = mDisplayStates.get(displayId);
 
@@ -1454,9 +1464,12 @@
         clearViewportsLocked();
 
         // Configure each display device.
-        mDisplayDeviceRepo.forEachLocked((DisplayDevice device) -> {
-            configureDisplayLocked(t, device);
-            device.performTraversalLocked(t);
+        mLogicalDisplayMapper.forEachLocked((LogicalDisplay display) -> {
+            final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
+            if (device != null) {
+                configureDisplayLocked(t, device);
+                device.performTraversalLocked(t);
+            }
         });
 
         // Tell the input system about these new viewports.
@@ -2062,10 +2075,16 @@
                 display, mContext);
         final DisplayPowerController displayPowerController = new DisplayPowerController(
                 mContext, mDisplayPowerCallbacks, mPowerHandler, mSensorManager,
-                mDisplayBlanker, display, mBrightnessTracker, brightnessSetting);
+                mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
+                () -> handleBrightnessChange(display));
         mDisplayPowerControllers.append(display.getDisplayIdLocked(), displayPowerController);
     }
 
+    private void handleBrightnessChange(LogicalDisplay display) {
+        sendDisplayEventLocked(display.getDisplayIdLocked(),
+                DisplayManagerGlobal.EVENT_DISPLAY_BRIGHTNESS_CHANGED);
+    }
+
     private final class DisplayManagerHandler extends Handler {
         public DisplayManagerHandler(Looper looper) {
             super(looper, null, true /*async*/);
@@ -2154,6 +2173,10 @@
                 case LogicalDisplayMapper.LOGICAL_DISPLAY_EVENT_FRAME_RATE_OVERRIDES_CHANGED:
                     handleLogicalDisplayFrameRateOverridesChangedLocked(display);
                     break;
+
+                case LogicalDisplayMapper.LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION:
+                    handleLogicalDisplayDeviceStateTransitionLocked(display);
+                    break;
             }
         }
 
@@ -2219,6 +2242,8 @@
                     return (mask & DisplayManager.EVENT_FLAG_DISPLAY_ADDED) != 0;
                 case DisplayManagerGlobal.EVENT_DISPLAY_CHANGED:
                     return (mask & DisplayManager.EVENT_FLAG_DISPLAY_CHANGED) != 0;
+                case DisplayManagerGlobal.EVENT_DISPLAY_BRIGHTNESS_CHANGED:
+                    return (mask & DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS) != 0;
                 case DisplayManagerGlobal.EVENT_DISPLAY_REMOVED:
                     return (mask & DisplayManager.EVENT_FLAG_DISPLAY_REMOVED) != 0;
                 default:
@@ -2781,6 +2806,25 @@
             }
         }
 
+        @Override
+        public BrightnessInfo getBrightnessInfo(int displayId) {
+            mContext.enforceCallingOrSelfPermission(
+                    Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS,
+                    "Permission required to read the display's brightness info.");
+            final long token = Binder.clearCallingIdentity();
+            try {
+                synchronized (mSyncRoot) {
+                    DisplayPowerController dpc = mDisplayPowerControllers.get(displayId);
+                    if (dpc != null) {
+                        return dpc.getBrightnessInfo();
+                    }
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+            return null;
+        }
+
         @Override // Binder call
         public boolean isMinimalPostProcessingRequested(int displayId) {
             synchronized (mSyncRoot) {
@@ -3232,4 +3276,17 @@
             }
         }
     };
+
+    /**
+     * Functional interface for providing time.
+     * TODO(b/184781936): merge with PowerManagerService.Clock
+     */
+    @VisibleForTesting
+    public interface Clock {
+        /**
+         * Returns current time in milliseconds since boot, not counting time spent in deep sleep.
+         */
+        long uptimeMillis();
+    }
+
 }
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 5cd0534..3340e3c 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -32,6 +32,7 @@
 import android.hardware.display.AmbientBrightnessDayStats;
 import android.hardware.display.BrightnessChangeEvent;
 import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.BrightnessInfo;
 import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks;
 import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
 import android.metrics.LogMaker;
@@ -53,6 +54,7 @@
 import android.util.TimeUtils;
 import android.view.Display;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.app.IBatteryStats;
 import com.android.internal.display.BrightnessSynchronizer;
 import com.android.internal.logging.MetricsLogger;
@@ -146,6 +148,9 @@
     private static final int REPORTED_TO_POLICY_SCREEN_ON = 2;
     private static final int REPORTED_TO_POLICY_SCREEN_TURNING_OFF = 3;
 
+    private static final Uri BRIGHTNESS_FLOAT_URI =
+            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FLOAT);
+
     private final Object mLock = new Object();
 
     private final Context mContext;
@@ -215,6 +220,9 @@
     // Whether or not the color fade on screen on / off is enabled.
     private final boolean mColorFadeEnabled;
 
+    @GuardedBy("mCachedBrightnessInfo")
+    private final CachedBrightnessInfo mCachedBrightnessInfo = new CachedBrightnessInfo();
+
     // True if we should fade the screen while turning it off, false if we should play
     // a stylish color fade animation instead.
     private boolean mColorFadeFadesConfig;
@@ -359,6 +367,8 @@
 
     private final BrightnessSetting mBrightnessSetting;
 
+    private final Runnable mOnBrightnessChangeRunnable;
+
     // A record of state for skipping brightness ramps.
     private int mSkipRampState = RAMP_STATE_SKIP_NONE;
 
@@ -368,6 +378,8 @@
     // The controller for the automatic brightness level.
     private AutomaticBrightnessController mAutomaticBrightnessController;
 
+    private Sensor mLightSensor;
+
     // The mapper between ambient lux, display backlight values, and display brightness.
     @Nullable
     private BrightnessMappingStrategy mBrightnessMapper;
@@ -418,13 +430,16 @@
     // True if this DisplayPowerController has been stopped and should no longer be running.
     private boolean mStopped;
 
+    private DisplayDeviceConfig mDisplayDeviceConfig;
+
     /**
      * Creates the display power controller.
      */
     public DisplayPowerController(Context context,
             DisplayPowerCallbacks callbacks, Handler handler,
             SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
-            BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting) {
+            BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
+            Runnable onBrightnessChangeRunnable) {
         mLogicalDisplay = logicalDisplay;
         mDisplayId = mLogicalDisplay.getDisplayIdLocked();
         mHandler = new DisplayControllerHandler(handler.getLooper());
@@ -442,8 +457,9 @@
         mBlanker = blanker;
         mContext = context;
         mBrightnessTracker = brightnessTracker;
-
         mBrightnessSetting = brightnessSetting;
+        mOnBrightnessChangeRunnable = onBrightnessChangeRunnable;
+
         PowerManager pm = context.getSystemService(PowerManager.class);
 
         final Resources resources = context.getResources();
@@ -478,17 +494,20 @@
                 com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing);
 
 
-        DisplayDeviceConfig displayDeviceConfig = logicalDisplay
+        mDisplayDeviceConfig = logicalDisplay
                 .getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig();
-        mBrightnessRampRateFastDecrease = displayDeviceConfig.getBrightnessRampFastDecrease();
-        mBrightnessRampRateFastIncrease = displayDeviceConfig.getBrightnessRampFastIncrease();
-        mBrightnessRampRateSlowDecrease = displayDeviceConfig.getBrightnessRampSlowDecrease();
-        mBrightnessRampRateSlowIncrease = displayDeviceConfig.getBrightnessRampSlowIncrease();
+        mBrightnessRampRateFastDecrease = mDisplayDeviceConfig.getBrightnessRampFastDecrease();
+        mBrightnessRampRateFastIncrease = mDisplayDeviceConfig.getBrightnessRampFastIncrease();
+        mBrightnessRampRateSlowDecrease = mDisplayDeviceConfig.getBrightnessRampSlowDecrease();
+        mBrightnessRampRateSlowIncrease = mDisplayDeviceConfig.getBrightnessRampSlowIncrease();
         mSkipScreenOnBrightnessRamp = resources.getBoolean(
                 com.android.internal.R.bool.config_skipScreenOnBrightnessRamp);
 
         mHbmController = createHbmController();
 
+        // Seed the cached brightness
+        saveBrightnessInfo(getScreenBrightnessSetting());
+
         if (mUseSoftwareAutoBrightnessConfig) {
             final float dozeScaleFactor = resources.getFraction(
                     com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor,
@@ -534,16 +553,12 @@
                         + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ").");
             }
 
-            String lightSensorType = resources.getString(
-                    com.android.internal.R.string.config_displayLightSensorType);
-            Sensor lightSensor = findDisplayLightSensor(lightSensorType);
+            loadAmbientLightSensor();
 
-            final DisplayDeviceConfig ddc =
-                    logicalDisplay.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig();
-            mBrightnessMapper = BrightnessMappingStrategy.create(resources, ddc);
+            mBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig);
             if (mBrightnessMapper != null) {
                 mAutomaticBrightnessController = new AutomaticBrightnessController(this,
-                        handler.getLooper(), sensorManager, lightSensor, mBrightnessMapper,
+                        handler.getLooper(), sensorManager, mLightSensor, mBrightnessMapper,
                         lightSensorWarmUpTimeConfig, PowerManager.BRIGHTNESS_MIN,
                         PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, lightSensorRate,
                         initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce,
@@ -597,8 +612,8 @@
         mDisplayWhiteBalanceSettings = displayWhiteBalanceSettings;
         mDisplayWhiteBalanceController = displayWhiteBalanceController;
 
-        if (displayDeviceConfig != null && displayDeviceConfig.getNits() != null) {
-            mNitsRange = displayDeviceConfig.getNits();
+        if (mDisplayDeviceConfig != null && mDisplayDeviceConfig.getNits() != null) {
+            mNitsRange = mDisplayDeviceConfig.getNits();
         } else {
             Slog.w(TAG, "Screen brightness nits configuration is unavailable; falling back");
             mNitsRange = BrightnessMappingStrategy.getFloatArray(context.getResources()
@@ -638,17 +653,19 @@
         mBrightnessMapper.recalculateSplines(mCdsi.isReduceBrightColorsActivated(), adjustedNits);
     }
 
-    private Sensor findDisplayLightSensor(String sensorType) {
-        if (!TextUtils.isEmpty(sensorType)) {
-            List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
-            for (int i = 0; i < sensors.size(); i++) {
-                Sensor sensor = sensors.get(i);
-                if (sensorType.equals(sensor.getStringType())) {
+    private Sensor findSensor(String sensorType, String sensorName, int fallbackType) {
+        final boolean isNameSpecified = !TextUtils.isEmpty(sensorName);
+        final boolean isTypeSpecified = !TextUtils.isEmpty(sensorType);
+        List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
+        if (isNameSpecified || isTypeSpecified) {
+            for (Sensor sensor : sensors) {
+                if ((!isNameSpecified || sensorName.equals(sensor.getName()))
+                        && (!isTypeSpecified || sensorType.equals(sensor.getStringType()))) {
                     return sensor;
                 }
             }
         }
-        return mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
+        return mSensorManager.getDefaultSensor(fallbackType);
     }
 
     /**
@@ -763,10 +780,21 @@
      * when displays get swapped on foldable devices.  For example, different brightness properties
      * of each display need to be properly reflected in AutomaticBrightnessController.
      */
-    public void onDisplayChangedLocked() {
+    public void onDisplayChanged() {
         // TODO: b/175821789 - Support high brightness on multiple (folding) displays
-
         mUniqueDisplayId = mLogicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId();
+        mDisplayDeviceConfig = mLogicalDisplay.getPrimaryDisplayDeviceLocked()
+                .getDisplayDeviceConfig();
+        loadAmbientLightSensor();
+    }
+
+    /**
+     * Called when the displays are preparing to transition from one device state to another.
+     * This process involves turning off some displays so we need updatePowerState() to run and
+     * calculate the new state.
+     */
+    public void onDeviceStateTransition() {
+        sendUpdatePowerState();
     }
 
     /**
@@ -1004,7 +1032,9 @@
             mIgnoreProximityUntilChanged = false;
         }
 
-        if (!mLogicalDisplay.isEnabled() || mScreenOffBecauseOfProximity) {
+        if (!mLogicalDisplay.isEnabled()
+                || mLogicalDisplay.getPhase() == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION
+                || mScreenOffBecauseOfProximity) {
             state = Display.STATE_OFF;
         }
 
@@ -1158,6 +1188,10 @@
             mBrightnessReasonTemp.setReason(BrightnessReason.REASON_MANUAL);
         }
 
+        // Save out the brightness info now that the brightness state for this iteration has been
+        // finalized and before we send out notifications about the brightness changing.
+        saveBrightnessInfo(brightnessState);
+
         if (updateScreenBrightnessSetting) {
             // Tell the rest of the system about the new brightness in case we had to change it
             // for things like auto-brightness or high-brightness-mode. Note that we do this
@@ -1390,13 +1424,36 @@
         msg.sendToTarget();
     }
 
+    public BrightnessInfo getBrightnessInfo() {
+        synchronized (mCachedBrightnessInfo) {
+            return new BrightnessInfo(
+                    mCachedBrightnessInfo.brightness,
+                    mCachedBrightnessInfo.brightnessMin,
+                    mCachedBrightnessInfo.brightnessMax,
+                    mCachedBrightnessInfo.hbmMode);
+        }
+    }
+
+    private void saveBrightnessInfo(float brightness) {
+        synchronized (mCachedBrightnessInfo) {
+            mCachedBrightnessInfo.brightness = brightness;
+            mCachedBrightnessInfo.brightnessMin = mHbmController.getCurrentBrightnessMin();
+            mCachedBrightnessInfo.brightnessMax = mHbmController.getCurrentBrightnessMax();
+            mCachedBrightnessInfo.hbmMode = mHbmController.getHighBrightnessMode();
+        }
+    }
+
     private HighBrightnessModeController createHbmController() {
         final DisplayDeviceConfig ddConfig =
                 mLogicalDisplay.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig();
         final DisplayDeviceConfig.HighBrightnessModeData hbmData =
                 ddConfig != null ? ddConfig.getHighBrightnessModeData() : null;
         return new HighBrightnessModeController(mHandler, PowerManager.BRIGHTNESS_MIN,
-                PowerManager.BRIGHTNESS_MAX, hbmData, () -> sendUpdatePowerStateLocked());
+                PowerManager.BRIGHTNESS_MAX, hbmData,
+                () -> {
+                    sendUpdatePowerStateLocked();
+                    mHandler.post(mOnBrightnessChangeRunnable);
+                });
     }
 
     private void blockScreenOn() {
@@ -1510,6 +1567,14 @@
         mReportedScreenStateToPolicy = state;
     }
 
+    private void loadAmbientLightSensor() {
+        DisplayDeviceConfig.SensorIdentifier lightSensor =
+                mDisplayDeviceConfig.getAmbientLightSensor();
+        String lightSensorName = lightSensor.name;
+        String lightSensorType = lightSensor.type;
+        mLightSensor = findSensor(lightSensorType, lightSensorName, Sensor.TYPE_LIGHT);
+    }
+
     private float clampScreenBrightnessForVr(float value) {
         return MathUtils.constrain(
                 value, mScreenBrightnessForVrRangeMinimum,
@@ -1819,7 +1884,7 @@
         mPendingScreenBrightnessSetting = getScreenBrightnessSetting();
         if (userSwitch) {
             // Don't treat user switches as user initiated change.
-            mCurrentScreenBrightnessSetting = mPendingScreenBrightnessSetting;
+            setCurrentScreenBrightness(mPendingScreenBrightnessSetting);
             if (mAutomaticBrightnessController != null) {
                 mAutomaticBrightnessController.resetShortTermModel();
             }
@@ -1858,11 +1923,18 @@
 
     private void putScreenBrightnessSetting(float brightnessValue, boolean updateCurrent) {
         if (updateCurrent) {
-            mCurrentScreenBrightnessSetting = brightnessValue;
+            setCurrentScreenBrightness(brightnessValue);
         }
         mBrightnessSetting.setBrightness(brightnessValue);
     }
 
+    private void setCurrentScreenBrightness(float brightnessValue) {
+        if (brightnessValue != mCurrentScreenBrightnessSetting) {
+            mCurrentScreenBrightnessSetting = brightnessValue;
+            mHandler.post(mOnBrightnessChangeRunnable);
+        }
+    }
+
     private void putAutoBrightnessAdjustmentSetting(float adjustment) {
         if (mDisplayId == Display.DEFAULT_DISPLAY) {
             mAutoBrightnessAdjustment = adjustment;
@@ -1895,7 +1967,7 @@
             mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
             return false;
         }
-        mCurrentScreenBrightnessSetting = mPendingScreenBrightnessSetting;
+        setCurrentScreenBrightness(mPendingScreenBrightnessSetting);
         mLastUserSetScreenBrightness = mPendingScreenBrightnessSetting;
         mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
         mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
@@ -1987,6 +2059,7 @@
             pw.println();
             pw.println("Display Power Controller:");
             pw.println("  mDisplayId=" + mDisplayId);
+            pw.println("  mLightSensor=" + mLightSensor);
 
             pw.println();
             pw.println("Display Power Controller Locked State:");
@@ -2037,10 +2110,10 @@
         pw.println("  mPendingProximityDebounceTime="
                 + TimeUtils.formatUptime(mPendingProximityDebounceTime));
         pw.println("  mScreenOffBecauseOfProximity=" + mScreenOffBecauseOfProximity);
-        pw.println("  mLastUserSetScreenBrightnessFloat=" + mLastUserSetScreenBrightness);
-        pw.println("  mPendingScreenBrightnessSettingFloat="
+        pw.println("  mLastUserSetScreenBrightness=" + mLastUserSetScreenBrightness);
+        pw.println("  mPendingScreenBrightnessSetting="
                 + mPendingScreenBrightnessSetting);
-        pw.println("  mTemporaryScreenBrightnessFloat=" + mTemporaryScreenBrightness);
+        pw.println("  mTemporaryScreenBrightness=" + mTemporaryScreenBrightness);
         pw.println("  mAutoBrightnessAdjustment=" + mAutoBrightnessAdjustment);
         pw.println("  mBrightnessReason=" + mBrightnessReason);
         pw.println("  mTemporaryAutoBrightnessAdjustment=" + mTemporaryAutoBrightnessAdjustment);
@@ -2083,6 +2156,10 @@
             mAutomaticBrightnessController.dump(pw);
         }
 
+        if (mHbmController != null) {
+            mHbmController.dump(pw);
+        }
+
         pw.println();
         if (mDisplayWhiteBalanceController != null) {
             mDisplayWhiteBalanceController.dump(pw);
@@ -2411,4 +2488,11 @@
             }
         }
     }
+
+    static class CachedBrightnessInfo {
+        public float brightness;
+        public float brightnessMin;
+        public float brightnessMax;
+        public int hbmMode;
+    }
 }
diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java
index 2e5561d..e6486bd 100644
--- a/services/core/java/com/android/server/display/HighBrightnessModeController.java
+++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java
@@ -16,13 +16,17 @@
 
 package com.android.server.display;
 
+import android.hardware.display.BrightnessInfo;
 import android.os.Handler;
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.util.Slog;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.display.DisplayDeviceConfig.HighBrightnessModeData;
+import com.android.server.display.DisplayManagerService.Clock;
 
+import java.io.PrintWriter;
 import java.util.Iterator;
 import java.util.LinkedList;
 
@@ -45,11 +49,13 @@
     private final Handler mHandler;
     private final Runnable mHbmChangeCallback;
     private final Runnable mRecalcRunnable;
+    private final Clock mClock;
 
     private boolean mIsInAllowedAmbientRange = false;
     private boolean mIsTimeAvailable = false;
     private boolean mIsAutoBrightnessEnabled = false;
     private float mAutoBrightness;
+    private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
 
     /**
      * If HBM is currently running, this is the start time for the current HBM session.
@@ -65,28 +71,25 @@
 
     HighBrightnessModeController(Handler handler, float brightnessMin, float brightnessMax,
             HighBrightnessModeData hbmData, Runnable hbmChangeCallback) {
+        this(SystemClock::uptimeMillis, handler, brightnessMin, brightnessMax, hbmData,
+                hbmChangeCallback);
+    }
+
+    @VisibleForTesting
+    HighBrightnessModeController(Clock clock, Handler handler, float brightnessMin,
+            float brightnessMax, HighBrightnessModeData hbmData, Runnable hbmChangeCallback) {
+        mClock = clock;
         mHandler = handler;
         mBrightnessMin = brightnessMin;
         mBrightnessMax = brightnessMax;
         mHbmData = hbmData;
         mHbmChangeCallback = hbmChangeCallback;
         mAutoBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
-
-        mRecalcRunnable = () -> {
-            boolean oldIsAllowed = isCurrentlyAllowed();
-            recalculateTimeAllowance();
-            if (oldIsAllowed != isCurrentlyAllowed()) {
-                // Our allowed state has changed; tell AutomaticBrightnessController
-                // to update the brightness.
-                if (mHbmChangeCallback != null) {
-                    mHbmChangeCallback.run();
-                }
-            }
-        };
+        mRecalcRunnable = this::recalculateTimeAllowance;
     }
 
     void setAutoBrightnessEnabled(boolean isEnabled) {
-        if (isEnabled == mIsAutoBrightnessEnabled) {
+        if (!deviceSupportsHbm() || isEnabled == mIsAutoBrightnessEnabled) {
             return;
         }
         if (DEBUG) {
@@ -94,6 +97,7 @@
         }
         mIsAutoBrightnessEnabled = isEnabled;
         mIsInAllowedAmbientRange = false; // reset when auto-brightness switches
+        recalculateTimeAllowance();
     }
 
     float getCurrentBrightnessMin() {
@@ -137,7 +141,7 @@
         final boolean wasOldBrightnessHigh = oldAutoBrightness > mHbmData.transitionPoint;
         final boolean isNewBrightnessHigh = mAutoBrightness > mHbmData.transitionPoint;
         if (wasOldBrightnessHigh != isNewBrightnessHigh) {
-            final long currentTime = SystemClock.uptimeMillis();
+            final long currentTime = mClock.uptimeMillis();
             if (isNewBrightnessHigh) {
                 mRunningStartTimeMillis = currentTime;
             } else {
@@ -153,6 +157,21 @@
         recalculateTimeAllowance();
     }
 
+    int getHighBrightnessMode() {
+        return mHbmMode;
+    }
+
+    void dump(PrintWriter pw) {
+        pw.println("HighBrightnessModeController:");
+        pw.println("  mBrightnessMin=" + mBrightnessMin);
+        pw.println("  mBrightnessMax=" + mBrightnessMax);
+        pw.println("  mHbmData=" + mHbmData);
+        pw.println("  mIsInAllowedAmbientRange=" + mIsInAllowedAmbientRange);
+        pw.println("  mIsTimeAvailable= " + mIsTimeAvailable);
+        pw.println("  mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled);
+        pw.println("  mAutoBrightness=" + mAutoBrightness);
+    }
+
     private boolean isCurrentlyAllowed() {
         return mIsAutoBrightnessEnabled && mIsTimeAvailable && mIsInAllowedAmbientRange;
     }
@@ -165,7 +184,7 @@
      * Recalculates the allowable HBM time.
      */
     private void recalculateTimeAllowance() {
-        final long currentTime = SystemClock.uptimeMillis();
+        final long currentTime = mClock.uptimeMillis();
         long timeAlreadyUsed = 0;
 
         // First, lets see how much time we've taken for any currently running
@@ -247,8 +266,22 @@
 
         if (nextTimeout != -1) {
             mHandler.removeCallbacks(mRecalcRunnable);
-            mHandler.postAtTime(mRecalcRunnable, nextTimeout);
+            mHandler.postAtTime(mRecalcRunnable, nextTimeout + 1);
         }
+
+        // Update the state of the world
+        int newHbmMode = calculateHighBrightnessMode();
+        if (mHbmMode != newHbmMode) {
+            mHbmMode = newHbmMode;
+            mHbmChangeCallback.run();
+        }
+    }
+
+    private int calculateHighBrightnessMode() {
+        if (deviceSupportsHbm() && isCurrentlyAllowed()) {
+            return BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT;
+        }
+        return BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
     }
 
     /**
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 1589419..9acb4c8 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -16,6 +16,7 @@
 
 package com.android.server.display;
 
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.graphics.Point;
@@ -65,6 +66,33 @@
 final class LogicalDisplay {
     private static final String TAG = "LogicalDisplay";
 
+    /**
+     * Phase indicating the logical display's existence is hidden from the rest of the framework.
+     * This can happen if the current layout has specifically requested to keep this display
+     * disabled.
+     */
+    static final int DISPLAY_PHASE_DISABLED = -1;
+
+    /**
+     * Phase indicating that the logical display is going through a layout transition.
+     * When in this phase, other systems can choose to special case power-state handling of a
+     * display that might be in a transition.
+     */
+    static final int DISPLAY_PHASE_LAYOUT_TRANSITION = 0;
+
+    /**
+     * The display is exposed to the rest of the system and its power state is determined by a
+     * power-request from PowerManager.
+     */
+    static final int DISPLAY_PHASE_ENABLED = 1;
+
+    @IntDef(prefix = {"DISPLAY_PHASE" }, value = {
+        DISPLAY_PHASE_DISABLED,
+        DISPLAY_PHASE_LAYOUT_TRANSITION,
+        DISPLAY_PHASE_ENABLED
+    })
+    @interface DisplayPhase {}
+
     // The layer stack we use when the display has been blanked to prevent any
     // of its content from appearing.
     private static final int BLANK_LAYER_STACK = -1;
@@ -129,10 +157,12 @@
     private final Rect mTempDisplayRect = new Rect();
 
     /**
-     * Indicates that the Logical display is enabled (default). See {@link #setEnabled} for
-     * more information.
+     * Indicates the current phase of the display. Generally, phases supersede any
+     * requests from PowerManager in DPC's calculation for the display state. Only when the
+     * phase is ENABLED does PowerManager's request for the display take effect.
      */
-    private boolean mIsEnabled = true;
+    @DisplayPhase
+    private int mPhase = DISPLAY_PHASE_ENABLED;
 
     /**
      * The UID mappings for refresh rate override
@@ -721,27 +751,32 @@
         return old;
     }
 
-    /**
-     * Sets the LogicalDisplay to be enabled or disabled. If the display is not enabled,
-     * the system will always set the display to power off, regardless of the global state of the
-     * device.
-     * TODO: b/170498827 - Remove when updateDisplayStateLocked is updated.
-     */
-    public void setEnabled(boolean isEnabled) {
-        mIsEnabled = isEnabled;
+    public void setPhase(@DisplayPhase int phase) {
+        mPhase = phase;
     }
 
     /**
-     * @return {@code true} iff the LogicalDisplay is enabled or {@code false}
-     * if disabled indicating that the display has been forced to be OFF.
+     * Returns the currently set phase for this LogicalDisplay. Phases are used when transitioning
+     * from one device state to another. {@see LogicalDisplayMapper}.
+     */
+    @DisplayPhase
+    public int getPhase() {
+        return mPhase;
+    }
+
+    /**
+     * @return {@code true} if the LogicalDisplay is enabled or {@code false}
+     * if disabled indicating that the display should be hidden from the rest of the apps and
+     * framework.
      */
     public boolean isEnabled() {
-        return mIsEnabled;
+        // DISPLAY_PHASE_LAYOUT_TRANSITION is still considered an 'enabled' phase.
+        return mPhase == DISPLAY_PHASE_ENABLED || mPhase == DISPLAY_PHASE_LAYOUT_TRANSITION;
     }
 
     public void dumpLocked(PrintWriter pw) {
         pw.println("mDisplayId=" + mDisplayId);
-        pw.println("mIsEnabled=" + mIsEnabled);
+        pw.println("mPhase=" + mPhase);
         pw.println("mLayerStack=" + mLayerStack);
         pw.println("mHasContent=" + mHasContent);
         pw.println("mDesiredDisplayModeSpecs={" + mDesiredDisplayModeSpecs + "}");
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index fcfa674..4c9a2d7 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -16,18 +16,24 @@
 
 package com.android.server.display;
 
+import android.annotation.NonNull;
+import android.content.Context;
 import android.hardware.devicestate.DeviceStateManager;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
 import android.os.SystemProperties;
 import android.text.TextUtils;
 import android.util.IndentingPrintWriter;
 import android.util.Slog;
 import android.util.SparseArray;
-import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 import android.view.Display;
 import android.view.DisplayAddress;
 import android.view.DisplayInfo;
 
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.LogicalDisplay.DisplayPhase;
 import com.android.server.display.layout.Layout;
 
 import java.io.PrintWriter;
@@ -55,11 +61,20 @@
     public static final int LOGICAL_DISPLAY_EVENT_REMOVED = 3;
     public static final int LOGICAL_DISPLAY_EVENT_SWAPPED = 4;
     public static final int LOGICAL_DISPLAY_EVENT_FRAME_RATE_OVERRIDES_CHANGED = 5;
+    public static final int LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION = 6;
 
     public static final int DISPLAY_GROUP_EVENT_ADDED = 1;
     public static final int DISPLAY_GROUP_EVENT_CHANGED = 2;
     public static final int DISPLAY_GROUP_EVENT_REMOVED = 3;
 
+    private static final int TIMEOUT_STATE_TRANSITION_MILLIS = 500;
+
+    private static final int MSG_TRANSITION_TO_PENDING_DEVICE_STATE = 1;
+
+    private static final int UPDATE_STATE_NEW = 0;
+    private static final int UPDATE_STATE_TRANSITION = 1;
+    private static final int UPDATE_STATE_UPDATED = 2;
+
     /**
      * Temporary display info, used for comparing display configurations.
      */
@@ -76,6 +91,11 @@
     private final boolean mSingleDisplayDemoMode;
 
     /**
+     * True if the device can have more than one internal display on at a time.
+     */
+    private final boolean mSupportsConcurrentInternalDisplays;
+
+    /**
      * Map of all logical displays indexed by logical display id.
      * Any modification to mLogicalDisplays must invalidate the DisplayManagerGlobal cache.
      * TODO: multi-display - Move the aforementioned comment?
@@ -89,13 +109,16 @@
     private final DisplayDeviceRepository mDisplayDeviceRepo;
     private final DeviceStateToLayoutMap mDeviceStateToLayoutMap;
     private final Listener mListener;
+    private final DisplayManagerService.SyncRoot mSyncRoot;
+    private final LogicalDisplayMapperHandler mHandler;
 
     /**
      * Has an entry for every logical display that the rest of the system has been notified about.
      * Any entry in here requires us to send a {@link  LOGICAL_DISPLAY_EVENT_REMOVED} event when it
-     * is deleted or {@link  LOGICAL_DISPLAY_EVENT_CHANGED} when it is changed.
+     * is deleted or {@link  LOGICAL_DISPLAY_EVENT_CHANGED} when it is changed. The values are any
+     * of the {@code UPDATE_STATE_*} constant types.
      */
-    private final SparseBooleanArray mUpdatedLogicalDisplays = new SparseBooleanArray();
+    private final SparseIntArray mUpdatedLogicalDisplays = new SparseIntArray();
 
     /**
      * Keeps track of all the display groups that we already told other people about. IOW, if a
@@ -119,11 +142,18 @@
     private int mNextNonDefaultGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
     private Layout mCurrentLayout = null;
     private int mDeviceState = DeviceStateManager.INVALID_DEVICE_STATE;
+    private int mPendingDeviceState = DeviceStateManager.INVALID_DEVICE_STATE;
 
-    LogicalDisplayMapper(DisplayDeviceRepository repo, Listener listener) {
+    LogicalDisplayMapper(@NonNull Context context, @NonNull DisplayDeviceRepository repo,
+            @NonNull Listener listener, @NonNull DisplayManagerService.SyncRoot syncRoot,
+            @NonNull Handler handler) {
+        mSyncRoot = syncRoot;
+        mHandler = new LogicalDisplayMapperHandler(handler.getLooper());
         mDisplayDeviceRepo = repo;
         mListener = listener;
         mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
+        mSupportsConcurrentInternalDisplays = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_supportsConcurrentInternalDisplays);
         mDisplayDeviceRepo.addListener(this);
         mDeviceStateToLayoutMap = new DeviceStateToLayoutMap();
     }
@@ -142,6 +172,7 @@
                 if (DEBUG) {
                     Slog.d(TAG, "Display device changed: " + device.getDisplayDeviceInfoLocked());
                 }
+                finishStateTransitionLocked(false /*force*/);
                 updateLogicalDisplaysLocked();
                 break;
 
@@ -166,7 +197,7 @@
     public LogicalDisplay getDisplayLocked(DisplayDevice device) {
         final int count = mLogicalDisplays.size();
         for (int i = 0; i < count; i++) {
-            LogicalDisplay display = mLogicalDisplays.valueAt(i);
+            final LogicalDisplay display = mLogicalDisplays.valueAt(i);
             if (display.getPrimaryDisplayDeviceLocked() == device) {
                 return display;
             }
@@ -198,6 +229,7 @@
         }
     }
 
+    @VisibleForTesting
     public int getDisplayGroupIdFromDisplayIdLocked(int displayId) {
         final LogicalDisplay display = getDisplayLocked(displayId);
         if (display == null) {
@@ -225,7 +257,6 @@
         ipw.increaseIndent();
 
         ipw.println("mSingleDisplayDemoMode=" + mSingleDisplayDemoMode);
-
         ipw.println("mCurrentLayout=" + mCurrentLayout);
 
         final int logicalDisplayCount = mLogicalDisplays.size();
@@ -244,19 +275,78 @@
     }
 
     void setDeviceStateLocked(int state) {
-        if (state != mDeviceState) {
-            resetLayoutLocked();
-            mDeviceState = state;
-            applyLayoutLocked();
-            updateLogicalDisplaysLocked();
+        Slog.i(TAG, "Requesting Transition to state: " + state);
+        // As part of a state transition, we may need to turn off some displays temporarily so that
+        // the transition is smooth. Plus, on some devices, only one internal displays can be
+        // on at a time. We use DISPLAY_PHASE_LAYOUT_TRANSITION to mark a display that needs to be
+        // temporarily turned off.
+        if (mDeviceState != DeviceStateManager.INVALID_DEVICE_STATE) {
+            resetLayoutLocked(mDeviceState, state, LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION);
+        }
+        mPendingDeviceState = state;
+        if (areAllTransitioningDisplaysOffLocked()) {
+            // Nothing to wait on, we're good to go
+            transitionToPendingStateLocked();
+            return;
+        }
+
+        if (DEBUG) {
+            Slog.d(TAG, "Postponing transition to state: " + mPendingDeviceState);
+        }
+        // Send the transitioning phase updates to DisplayManager so that the displays can
+        // start turning OFF in preparation for the new layout.
+        updateLogicalDisplaysLocked();
+        mHandler.sendEmptyMessageDelayed(MSG_TRANSITION_TO_PENDING_DEVICE_STATE,
+                TIMEOUT_STATE_TRANSITION_MILLIS);
+    }
+
+    private boolean areAllTransitioningDisplaysOffLocked() {
+        final int count = mLogicalDisplays.size();
+        for (int i = 0; i < count; i++) {
+            final LogicalDisplay display = mLogicalDisplays.valueAt(i);
+            if (display.getPhase() != LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION) {
+                continue;
+            }
+
+            final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
+            if (device != null) {
+                final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
+                if (info.state != Display.STATE_OFF) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    private void transitionToPendingStateLocked() {
+        resetLayoutLocked(mDeviceState, mPendingDeviceState, LogicalDisplay.DISPLAY_PHASE_ENABLED);
+        mDeviceState = mPendingDeviceState;
+        mPendingDeviceState = DeviceStateManager.INVALID_DEVICE_STATE;
+        applyLayoutLocked();
+        updateLogicalDisplaysLocked();
+    }
+
+    private void finishStateTransitionLocked(boolean force) {
+        if (mPendingDeviceState == DeviceStateManager.INVALID_DEVICE_STATE) {
+            return;
+        }
+
+        final boolean displaysOff = areAllTransitioningDisplaysOffLocked();
+        if (displaysOff || force) {
+            transitionToPendingStateLocked();
+            mHandler.removeMessages(MSG_TRANSITION_TO_PENDING_DEVICE_STATE);
+        } else if (DEBUG) {
+            Slog.d(TAG, "Not yet ready to transition to state=" + mPendingDeviceState
+                    + " with displays-off=" + displaysOff + " and force=" + force);
         }
     }
 
     private void handleDisplayDeviceAddedLocked(DisplayDevice device) {
         DisplayDeviceInfo deviceInfo = device.getDisplayDeviceInfoLocked();
         // Internal Displays need to have additional initialization.
-        // TODO: b/168208162 - This initializes a default dynamic display layout for INTERNAL
-        // devices, which will eventually just be a fallback in case no static layout definitions
+        // This initializes a default dynamic display layout for INTERNAL
+        // devices, which is used as a fallback in case no static layout definitions
         // exist or cannot be loaded.
         if (deviceInfo.type == Display.TYPE_INTERNAL) {
             initializeInternalDisplayDeviceLocked(device);
@@ -289,7 +379,8 @@
 
             display.updateLocked(mDisplayDeviceRepo);
             final DisplayInfo newDisplayInfo = display.getDisplayInfoLocked();
-            final boolean wasPreviouslyUpdated = mUpdatedLogicalDisplays.get(displayId);
+            final int updateState = mUpdatedLogicalDisplays.get(displayId, UPDATE_STATE_NEW);
+            final boolean wasPreviouslyUpdated = updateState != UPDATE_STATE_NEW;
 
             // The display is no longer valid and needs to be removed.
             if (!display.isValidLocked()) {
@@ -331,6 +422,10 @@
                 assignDisplayGroupLocked(display);
                 mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_CHANGED);
 
+            } else if (updateState == UPDATE_STATE_TRANSITION) {
+                mLogicalDisplaysToUpdate.put(displayId,
+                        LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION);
+
             // Display frame rate overrides changed.
             } else if (!display.getPendingFrameRateOverrideUids().isEmpty()) {
                 mLogicalDisplaysToUpdate.put(
@@ -347,7 +442,7 @@
                 }
             }
 
-            mUpdatedLogicalDisplays.put(displayId, true);
+            mUpdatedLogicalDisplays.put(displayId, UPDATE_STATE_UPDATED);
         }
 
         // Go through the groups and do the same thing. We do this after displays since group
@@ -376,12 +471,13 @@
 
         // Send the display and display group updates in order by message type. This is important
         // to ensure that addition and removal notifications happen in the right order.
+        sendUpdatesForDisplaysLocked(LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION);
         sendUpdatesForGroupsLocked(DISPLAY_GROUP_EVENT_ADDED);
         sendUpdatesForDisplaysLocked(LOGICAL_DISPLAY_EVENT_REMOVED);
         sendUpdatesForDisplaysLocked(LOGICAL_DISPLAY_EVENT_CHANGED);
         sendUpdatesForDisplaysLocked(LOGICAL_DISPLAY_EVENT_FRAME_RATE_OVERRIDES_CHANGED);
-        sendUpdatesForDisplaysLocked(LOGICAL_DISPLAY_EVENT_ADDED);
         sendUpdatesForDisplaysLocked(LOGICAL_DISPLAY_EVENT_SWAPPED);
+        sendUpdatesForDisplaysLocked(LOGICAL_DISPLAY_EVENT_ADDED);
         sendUpdatesForGroupsLocked(DISPLAY_GROUP_EVENT_CHANGED);
         sendUpdatesForGroupsLocked(DISPLAY_GROUP_EVENT_REMOVED);
 
@@ -400,7 +496,14 @@
             }
 
             final int id = mLogicalDisplaysToUpdate.keyAt(i);
-            mListener.onLogicalDisplayEventLocked(getDisplayLocked(id), msg);
+            final LogicalDisplay display = getDisplayLocked(id);
+            if (DEBUG) {
+                final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
+                final String uniqueId = device == null ? "null" : device.getUniqueId();
+                Slog.d(TAG, "Sending " + displayEventToString(msg) + " for display=" + id
+                        + " with device=" + uniqueId);
+            }
+            mListener.onLogicalDisplayEventLocked(display, msg);
             if (msg == LOGICAL_DISPLAY_EVENT_REMOVED) {
                 // We wait until we sent the EVENT_REMOVED event before actually removing the
                 // display.
@@ -464,36 +567,81 @@
     }
 
     /**
-     * Resets the current layout in preparation for a new layout. Layouts can specify if some
-     * displays should be disabled (OFF). When switching from one layout to another, we go
-     * through each of the displays and make sure any displays we might have disabled are
-     * enabled again.
+     * Goes through all the displays used in the layouts for the specified {@code fromState} and
+     * {@code toState} and applies the specified {@code phase}. When a new layout is requested, we
+     * put the displays that will change into a transitional phase so that they can all be turned
+     * OFF. Once all are confirmed OFF, then this method gets called again to reset the phase to
+     * normal operation. This helps to ensure that all display-OFF requests are made before
+     * display-ON which in turn hides any resizing-jank windows might incur when switching displays.
+     *
+     * @param fromState The state we are switching from.
+     * @param toState The state we are switching to.
+     * @param phase The new phase to apply to the displays.
      */
-    private void resetLayoutLocked() {
-        final Layout layout = mDeviceStateToLayoutMap.get(mDeviceState);
-        for (int i = layout.size() - 1; i >= 0; i--) {
-            final Layout.Display displayLayout = layout.getAt(i);
-            final LogicalDisplay display = getDisplayLocked(displayLayout.getLogicalDisplayId());
-            if (display != null) {
-                enableDisplayLocked(display, true); // Reset all displays back to enabled
+    private void resetLayoutLocked(int fromState, int toState, @DisplayPhase int phase) {
+        final Layout fromLayout = mDeviceStateToLayoutMap.get(fromState);
+        final Layout toLayout = mDeviceStateToLayoutMap.get(toState);
+
+        final int count = mLogicalDisplays.size();
+        for (int i = 0; i < count; i++) {
+            final LogicalDisplay logicalDisplay = mLogicalDisplays.valueAt(i);
+            final int displayId = logicalDisplay.getDisplayIdLocked();
+            final DisplayDevice device = logicalDisplay.getPrimaryDisplayDeviceLocked();
+            if (device == null) {
+                // If there's no device, then the logical display is due to be removed. Ignore it.
+                continue;
+            }
+
+            // Grab the display associations this display-device has in the old layout and the
+            // new layout.
+            final DisplayAddress address = device.getDisplayDeviceInfoLocked().address;
+
+            // Virtual displays do not have addresses.
+            final Layout.Display fromDisplay =
+                    address != null ? fromLayout.getByAddress(address) : null;
+            final Layout.Display toDisplay =
+                    address != null ? toLayout.getByAddress(address) : null;
+
+            // If a layout doesn't mention a display-device at all, then the display-device defaults
+            // to enabled. This is why we treat null as "enabled" in the code below.
+            final boolean wasEnabled = fromDisplay == null || fromDisplay.isEnabled();
+            final boolean willBeEnabled = toDisplay == null || toDisplay.isEnabled();
+
+            final boolean deviceHasNewLogicalDisplayId = fromDisplay != null && toDisplay != null
+                    && fromDisplay.getLogicalDisplayId() != toDisplay.getLogicalDisplayId();
+
+            // We consider a display-device as changing/transition if
+            // 1) It's already marked as transitioning
+            // 2) It's going from enabled to disabled
+            // 3) It's enabled, but it's mapped to a new logical display ID. To the user this
+            //    would look like apps moving from one screen to another since task-stacks stay
+            //    with the logical display [ID].
+            final boolean isTransitioning =
+                    (logicalDisplay.getPhase() == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION)
+                    || (wasEnabled && !willBeEnabled)
+                    || (wasEnabled && deviceHasNewLogicalDisplayId);
+
+            if (isTransitioning) {
+                setDisplayPhase(logicalDisplay, phase);
+                if (phase == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION) {
+                    mUpdatedLogicalDisplays.put(displayId, UPDATE_STATE_TRANSITION);
+                }
             }
         }
     }
 
-
     /**
      * Apply (or reapply) the currently selected display layout.
      */
     private void applyLayoutLocked() {
-        final Layout layout = mDeviceStateToLayoutMap.get(mDeviceState);
-        mCurrentLayout = layout;
-        Slog.i(TAG, "Applying the display layout for device state(" + mDeviceState
-                + "): " + layout);
+        final Layout oldLayout = mCurrentLayout;
+        mCurrentLayout = mDeviceStateToLayoutMap.get(mDeviceState);
+        Slog.i(TAG, "Applying layout: " + mCurrentLayout + ", Previous layout: " + oldLayout);
 
         // Go through each of the displays in the current layout set.
-        final int size = layout.size();
+        final int size = mCurrentLayout.size();
         for (int i = 0; i < size; i++) {
-            final Layout.Display displayLayout = layout.getAt(i);
+            final Layout.Display displayLayout = mCurrentLayout.getAt(i);
 
             // If the underlying display-device we want to use for this display
             // doesn't exist, then skip it. This can happen at startup as display-devices
@@ -521,8 +669,12 @@
             if (newDisplay != oldDisplay) {
                 newDisplay.swapDisplaysLocked(oldDisplay);
             }
-            enableDisplayLocked(newDisplay, displayLayout.isEnabled());
+
+            if (!displayLayout.isEnabled()) {
+                setDisplayPhase(newDisplay, LogicalDisplay.DISPLAY_PHASE_DISABLED);
+            }
         }
+
     }
 
 
@@ -540,23 +692,23 @@
         final LogicalDisplay display = new LogicalDisplay(displayId, layerStack, device);
         display.updateLocked(mDisplayDeviceRepo);
         mLogicalDisplays.put(displayId, display);
-        enableDisplayLocked(display, device != null);
+        setDisplayPhase(display, LogicalDisplay.DISPLAY_PHASE_ENABLED);
         return display;
     }
 
-    private void enableDisplayLocked(LogicalDisplay display, boolean isEnabled) {
+    private void setDisplayPhase(LogicalDisplay display, @DisplayPhase int phase) {
         final int displayId = display.getDisplayIdLocked();
         final DisplayInfo info = display.getDisplayInfoLocked();
 
         final boolean disallowSecondaryDisplay = mSingleDisplayDemoMode
                 && (info.type != Display.TYPE_INTERNAL);
-        if (isEnabled && disallowSecondaryDisplay) {
+        if (phase != LogicalDisplay.DISPLAY_PHASE_DISABLED && disallowSecondaryDisplay) {
             Slog.i(TAG, "Not creating a logical display for a secondary display because single"
                     + " display demo mode is enabled: " + display.getDisplayInfoLocked());
-            isEnabled = false;
+            phase = LogicalDisplay.DISPLAY_PHASE_DISABLED;
         }
 
-        display.setEnabled(isEnabled);
+        display.setPhase(phase);
     }
 
     private int assignDisplayGroupIdLocked(boolean isOwnDisplayGroup) {
@@ -564,14 +716,15 @@
     }
 
     private void initializeInternalDisplayDeviceLocked(DisplayDevice device) {
-        // We always want to make sure that our default display layout creates a logical
+        // We always want to make sure that our default layout creates a logical
         // display for every internal display device that is found.
         // To that end, when we are notified of a new internal display, we add it to
-        // the default definition if it is not already there.
-        final Layout layoutSet = mDeviceStateToLayoutMap.get(DeviceStateToLayoutMap.STATE_DEFAULT);
+        // the default layout definition if it is not already there.
+        final Layout layout = mDeviceStateToLayoutMap.get(DeviceStateToLayoutMap.STATE_DEFAULT);
         final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
         final boolean isDefault = (info.flags & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0;
-        layoutSet.createDisplayLocked(info.address, isDefault, true /* isEnabled */);
+        final boolean isEnabled = isDefault || mSupportsConcurrentInternalDisplays;
+        layout.createDisplayLocked(info.address, isDefault, isEnabled);
     }
 
     private int assignLayerStackLocked(int displayId) {
@@ -580,9 +733,45 @@
         return displayId;
     }
 
+    private String displayEventToString(int msg) {
+        switch(msg) {
+            case LOGICAL_DISPLAY_EVENT_ADDED:
+                return "added";
+            case LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION:
+                return "transition";
+            case LOGICAL_DISPLAY_EVENT_CHANGED:
+                return "changed";
+            case LOGICAL_DISPLAY_EVENT_FRAME_RATE_OVERRIDES_CHANGED:
+                return "framerate_override";
+            case LOGICAL_DISPLAY_EVENT_SWAPPED:
+                return "swapped";
+            case LOGICAL_DISPLAY_EVENT_REMOVED:
+                return "removed";
+        }
+        return null;
+    }
+
     public interface Listener {
         void onLogicalDisplayEventLocked(LogicalDisplay display, int event);
         void onDisplayGroupEventLocked(int groupId, int event);
         void onTraversalRequested();
     }
+
+    private class LogicalDisplayMapperHandler extends Handler {
+        LogicalDisplayMapperHandler(Looper looper) {
+            super(looper, null, true /*async*/);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_TRANSITION_TO_PENDING_DEVICE_STATE:
+                    synchronized (mSyncRoot) {
+                        finishStateTransitionLocked(true /*force*/);
+                    }
+                    break;
+            }
+        }
+    }
+
 }
diff --git a/services/core/java/com/android/server/display/layout/Layout.java b/services/core/java/com/android/server/display/layout/Layout.java
index ef33667..e53aec1 100644
--- a/services/core/java/com/android/server/display/layout/Layout.java
+++ b/services/core/java/com/android/server/display/layout/Layout.java
@@ -19,6 +19,7 @@
 import static android.view.Display.DEFAULT_DISPLAY;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.util.Slog;
 import android.view.DisplayAddress;
 
@@ -100,11 +101,28 @@
      *
      * @return The display corresponding to the specified display ID.
      */
+    @Nullable
     public Display getById(int id) {
         for (int i = 0; i < mDisplays.size(); i++) {
-            Display layout = mDisplays.get(i);
-            if (id == layout.getLogicalDisplayId()) {
-                return layout;
+            Display display = mDisplays.get(i);
+            if (id == display.getLogicalDisplayId()) {
+                return display;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @param address The display address to check.
+     *
+     * @return The display corresponding to the specified address.
+     */
+    @Nullable
+    public Display getByAddress(@NonNull DisplayAddress address) {
+        for (int i = 0; i < mDisplays.size(); i++) {
+            Display display = mDisplays.get(i);
+            if (address.equals(display.getAddress())) {
+                return display;
             }
         }
         return null;
diff --git a/services/core/java/com/android/server/graphics/fonts/FontManagerService.java b/services/core/java/com/android/server/graphics/fonts/FontManagerService.java
index 7269a8f..7c013e0 100644
--- a/services/core/java/com/android/server/graphics/fonts/FontManagerService.java
+++ b/services/core/java/com/android/server/graphics/fonts/FontManagerService.java
@@ -52,7 +52,6 @@
 import java.nio.ByteBuffer;
 import java.nio.NioUtils;
 import java.nio.channels.FileChannel;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -249,8 +248,6 @@
         // If apk verity is supported, fs-verity should be available.
         if (!VerityUtils.isFsVeritySupported()) return null;
         return new UpdatableFontDir(new File(FONT_FILES_DIR),
-                Arrays.asList(new File(SystemFonts.SYSTEM_FONT_DIR),
-                        new File(SystemFonts.OEM_FONT_DIR)),
                 new OtfFontFileParser(), new FsverityUtilImpl());
     }
 
@@ -314,12 +311,16 @@
         }
     }
 
+    /* package */ void restart() {
+        initialize();
+    }
+
     /* package */ Map<String, File> getFontFileMap() {
         if (mUpdatableFontDir == null) {
             return Collections.emptyMap();
         }
         synchronized (mUpdatableFontDirLock) {
-            return mUpdatableFontDir.getFontFileMap();
+            return mUpdatableFontDir.getPostScriptMap();
         }
     }
 
diff --git a/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java b/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java
index 5457ef2..8508aa7 100644
--- a/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java
+++ b/services/core/java/com/android/server/graphics/fonts/FontManagerShellCommand.java
@@ -95,6 +95,15 @@
         w.println();
         w.println("clear");
         w.println("    Remove all installed font files and reset to the initial state.");
+        w.println();
+        w.println("restart");
+        w.println("    Restart FontManagerService emulating device reboot.");
+        w.println("    WARNING: this is not a safe operation. Other processes may misbehave if");
+        w.println("    they are using fonts updated by FontManagerService.");
+        w.println("    This command exists merely for testing.");
+        w.println();
+        w.println("status");
+        w.println("    Prints status of current system font configuration.");
     }
 
     /* package */ void dumpAll(@NonNull IndentingPrintWriter w) {
@@ -368,7 +377,13 @@
         return 0;
     }
 
-    private int status(ShellCommand shell) throws SystemFontException {
+    private int restart(ShellCommand shell) {
+        mService.restart();
+        shell.getOutPrintWriter().println("Success");
+        return 0;
+    }
+
+    private int status(ShellCommand shell) {
         final IndentingPrintWriter writer =
                 new IndentingPrintWriter(shell.getOutPrintWriter(), "  ");
         FontConfig config = mService.getSystemFontConfig();
@@ -396,6 +411,8 @@
                     return update(shell);
                 case "clear":
                     return clear(shell);
+                case "restart":
+                    return restart(shell);
                 case "status":
                     return status(shell);
                 default:
diff --git a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
index c0ab093..38d1aab 100644
--- a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
+++ b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
@@ -43,6 +43,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.function.Supplier;
 
 /**
@@ -117,15 +118,15 @@
      * randomized dir. The font file path would be {@code mFilesDir/~~{randomStr}/{fontFileName}}.
      */
     private final File mFilesDir;
-    private final List<File> mPreinstalledFontDirs;
     private final FontFileParser mParser;
     private final FsverityUtil mFsverityUtil;
     private final File mConfigFile;
     private final File mTmpConfigFile;
     private final Supplier<Long> mCurrentTimeSupplier;
+    private final Function<Map<String, File>, FontConfig> mConfigSupplier;
 
     private long mLastModifiedMillis;
-    private int mConfigVersion = 1;
+    private int mConfigVersion;
 
     /**
      * A mutable map containing mapping from font file name (e.g. "NotoColorEmoji.ttf") to {@link
@@ -134,27 +135,35 @@
      */
     private final ArrayMap<String, FontFileInfo> mFontFileInfoMap = new ArrayMap<>();
 
-    UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser,
-            FsverityUtil fsverityUtil) {
-        this(filesDir, preinstalledFontDirs, parser, fsverityUtil, new File(CONFIG_XML_FILE),
-                () -> System.currentTimeMillis());
+    UpdatableFontDir(File filesDir, FontFileParser parser, FsverityUtil fsverityUtil) {
+        this(filesDir, parser, fsverityUtil, new File(CONFIG_XML_FILE),
+                () -> System.currentTimeMillis(),
+                (map) -> SystemFonts.getSystemFontConfig(map, 0, 0)
+        );
     }
 
     // For unit testing
-    UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser,
-            FsverityUtil fsverityUtil, File configFile, Supplier<Long> currentTimeSupplier) {
+    UpdatableFontDir(File filesDir, FontFileParser parser, FsverityUtil fsverityUtil,
+            File configFile, Supplier<Long> currentTimeSupplier,
+            Function<Map<String, File>, FontConfig> configSupplier) {
         mFilesDir = filesDir;
-        mPreinstalledFontDirs = preinstalledFontDirs;
         mParser = parser;
         mFsverityUtil = fsverityUtil;
         mConfigFile = configFile;
         mTmpConfigFile = new File(configFile.getAbsoluteFile() + ".tmp");
         mCurrentTimeSupplier = currentTimeSupplier;
+        mConfigSupplier = configSupplier;
     }
 
+    /**
+     * Loads fonts from file system, validate them, and delete obsolete font files.
+     * Note that this method may be called by multiple times in integration tests via {@link
+     * FontManagerService#restart()}.
+     */
     /* package */ void loadFontFileMap() {
         mFontFileInfoMap.clear();
         mLastModifiedMillis = 0;
+        mConfigVersion = 1;
         boolean success = false;
         try {
             PersistentSystemFontConfig.Config config = new PersistentSystemFontConfig.Config();
@@ -168,6 +177,7 @@
 
             File[] dirs = mFilesDir.listFiles();
             if (dirs == null) return;
+            FontConfig fontConfig = getSystemFontConfig();
             for (File dir : dirs) {
                 if (!dir.getName().startsWith(RANDOM_DIR_PREFIX)) {
                     Slog.e(TAG, "Unexpected dir found: " + dir);
@@ -184,7 +194,7 @@
                     return;
                 }
                 FontFileInfo fontFileInfo = validateFontFile(files[0]);
-                addFileToMapIfSameOrNewer(fontFileInfo, true /* deleteOldFile */);
+                addFileToMapIfSameOrNewer(fontFileInfo, fontConfig, true /* deleteOldFile */);
             }
             success = true;
         } catch (Throwable t) {
@@ -296,7 +306,7 @@
      * Installs a new font file, or updates an existing font file.
      *
      * <p>The new font will be immediately available for new Zygote-forked processes through
-     * {@link #getFontFileMap()}. Old font files will be kept until next system server reboot,
+     * {@link #getPostScriptMap()}. Old font files will be kept until next system server reboot,
      * because existing Zygote-forked processes have paths to old font files.
      *
      * @param fd             A file descriptor to the font file.
@@ -367,7 +377,8 @@
                         "Failed to change mode to 711", e);
             }
             FontFileInfo fontFileInfo = validateFontFile(newFontFile);
-            if (!addFileToMapIfSameOrNewer(fontFileInfo, false)) {
+            FontConfig fontConfig = getSystemFontConfig();
+            if (!addFileToMapIfSameOrNewer(fontFileInfo, fontConfig, false)) {
                 throw new SystemFontException(
                         FontManager.RESULT_ERROR_DOWNGRADING,
                         "Downgrading font file is forbidden.");
@@ -411,14 +422,15 @@
      * equal to or higher than the revision of currently used font file (either in
      * {@link #mFontFileInfoMap} or {@link #mPreinstalledFontDirs}).
      */
-    private boolean addFileToMapIfSameOrNewer(FontFileInfo fontFileInfo, boolean deleteOldFile) {
+    private boolean addFileToMapIfSameOrNewer(FontFileInfo fontFileInfo, FontConfig fontConfig,
+            boolean deleteOldFile) {
         FontFileInfo existingInfo = lookupFontFileInfo(fontFileInfo.getPostScriptName());
         final boolean shouldAddToMap;
         if (existingInfo == null) {
             // We got a new updatable font. We need to check if it's newer than preinstalled fonts.
             // Note that getPreinstalledFontRevision() returns -1 if there is no preinstalled font
             // with 'name'.
-            long preInstalledRev = getPreinstalledFontRevision(fontFileInfo.getFile().getName());
+            long preInstalledRev = getPreinstalledFontRevision(fontFileInfo, fontConfig);
             shouldAddToMap = preInstalledRev <= fontFileInfo.getRevision();
         } else {
             shouldAddToMap = existingInfo.getRevision() <= fontFileInfo.getRevision();
@@ -436,21 +448,33 @@
         return shouldAddToMap;
     }
 
-    private long getPreinstalledFontRevision(String name) {
-        long maxRevision = -1;
-        for (File dir : mPreinstalledFontDirs) {
-            File preinstalledFontFile = new File(dir, name);
-            if (!preinstalledFontFile.exists()) continue;
-            long revision = getFontRevision(preinstalledFontFile);
-            if (revision == -1) {
-                Slog.w(TAG, "Invalid preinstalled font file");
-                continue;
-            }
-            if (revision > maxRevision) {
-                maxRevision = revision;
+    private long getPreinstalledFontRevision(FontFileInfo info, FontConfig fontConfig) {
+        String psName = info.getPostScriptName();
+        FontConfig.Font targetFont = null;
+        for (int i = 0; i < fontConfig.getFontFamilies().size(); i++) {
+            FontConfig.FontFamily family = fontConfig.getFontFamilies().get(i);
+            for (int j = 0; j < family.getFontList().size(); ++j) {
+                FontConfig.Font font = family.getFontList().get(j);
+                if (font.getPostScriptName().equals(psName)) {
+                    targetFont = font;
+                    break;
+                }
             }
         }
-        return maxRevision;
+        if (targetFont == null) {
+            return -1;
+        }
+
+        File preinstalledFontFile = targetFont.getOriginalFile() != null
+                ? targetFont.getOriginalFile() : targetFont.getFile();
+        if (!preinstalledFontFile.exists()) {
+            return -1;
+        }
+        long revision = getFontRevision(preinstalledFontFile);
+        if (revision == -1) {
+            Slog.w(TAG, "Invalid preinstalled font file");
+        }
+        return revision;
     }
 
     /**
@@ -509,17 +533,17 @@
                 null, FontConfig.FontFamily.VARIANT_DEFAULT);
     }
 
-    Map<String, File> getFontFileMap() {
+    Map<String, File> getPostScriptMap() {
         Map<String, File> map = new ArrayMap<>();
         for (int i = 0; i < mFontFileInfoMap.size(); ++i) {
-            File file = mFontFileInfoMap.valueAt(i).getFile();
-            map.put(file.getName(), file);
+            FontFileInfo info = mFontFileInfoMap.valueAt(i);
+            map.put(info.getPostScriptName(), info.getFile());
         }
         return map;
     }
 
     /* package */ FontConfig getSystemFontConfig() {
-        FontConfig config = SystemFonts.getSystemFontConfig(getFontFileMap(), 0, 0);
+        FontConfig config = mConfigSupplier.apply(getPostScriptMap());
         PersistentSystemFontConfig.Config persistentConfig = readPersistentConfig();
         List<FontUpdateRequest.Family> families = persistentConfig.fontFamilies;
 
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
index 2bf74c9..5802e53 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
@@ -232,7 +232,8 @@
                 DEST_DIRECT);
 
         // Messages for Feature Discovery.
-        addValidationInfo(Constants.MESSAGE_GIVE_FEATURES, noneValidator, DEST_DIRECT);
+        addValidationInfo(Constants.MESSAGE_GIVE_FEATURES, noneValidator,
+                DEST_DIRECT | SRC_UNREGISTERED);
         addValidationInfo(Constants.MESSAGE_REPORT_FEATURES, new VariableLengthValidator(4, 14),
                 DEST_BROADCAST);
 
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 754fa25..77de187 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -422,6 +422,9 @@
     // Set to true if the logical address allocation is completed.
     private boolean mAddressAllocated = false;
 
+    // Whether a CEC-enabled sink is connected to the playback device
+    private boolean mIsCecAvailable = false;
+
     // Object that handles logging statsd atoms.
     // Use getAtomWriter() instead of accessing directly, to allow dependency injection for testing.
     private HdmiCecAtomWriter mAtomWriter = new HdmiCecAtomWriter();
@@ -2229,6 +2232,7 @@
 
             pw.println("mProhibitMode: " + mProhibitMode);
             pw.println("mPowerStatus: " + mPowerStatusController.getPowerStatus());
+            pw.println("mIsCecAvailable: " + mIsCecAvailable);
             pw.println("mCecVersion: " + mCecVersion);
 
             // System settings
@@ -2450,7 +2454,7 @@
         if (hdmiCecEnabled != HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
             return false;
         }
-        return true;
+        return mIsCecAvailable;
     }
 
     @ServiceThreadOnly
@@ -2835,24 +2839,24 @@
     private void invokeHdmiControlStatusChangeListenerLocked(
             Collection<IHdmiControlStatusChangeListener> listeners,
             @HdmiControlManager.HdmiCecControl int isEnabled) {
-        if (listeners.isEmpty()) {
-            return;
-        }
         if (isEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
             queryDisplayStatus(new IHdmiControlCallback.Stub() {
                 public void onComplete(int status) {
-                    boolean isAvailable = true;
                     if (status == HdmiControlManager.POWER_STATUS_UNKNOWN
                             || status == HdmiControlManager.RESULT_EXCEPTION
                             || status == HdmiControlManager.RESULT_SOURCE_NOT_AVAILABLE) {
-                        isAvailable = false;
+                        mIsCecAvailable = false;
+                    } else {
+                        mIsCecAvailable = true;
                     }
-                    invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, isAvailable);
                 }
             });
-            return;
+        } else {
+            mIsCecAvailable = false;
         }
-        invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, false);
+        if (!listeners.isEmpty()) {
+            invokeHdmiControlStatusChangeListenerLocked(listeners, isEnabled, mIsCecAvailable);
+        }
     }
 
     private void invokeHdmiControlStatusChangeListenerLocked(
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 0a800e9..c51571a 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -270,6 +270,8 @@
     private final Object mAssociationsLock = new Object();
     @GuardedBy("mAssociationLock")
     private final Map<String, Integer> mRuntimeAssociations = new ArrayMap<String, Integer>();
+    @GuardedBy("mAssociationLock")
+    private final Map<String, String> mUniqueIdAssociations = new ArrayMap<>();
 
     private static native long nativeInit(InputManagerService service,
             Context context, MessageQueue messageQueue);
@@ -340,6 +342,7 @@
             boolean enabled);
     private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId);
     private static native void nativeNotifyPortAssociationsChanged(long ptr);
+    private static native void nativeChangeUniqueIdAssociation(long ptr);
     private static native void nativeSetMotionClassifierEnabled(long ptr, boolean enabled);
     private static native InputSensorInfo[] nativeGetSensorList(long ptr, int deviceId);
     private static native boolean nativeFlushSensor(long ptr, int deviceId, int sensorType);
@@ -2222,10 +2225,10 @@
     @Override // Binder call
     public void addPortAssociation(@NonNull String inputPort, int displayPort) {
         if (!checkCallingPermission(
-                android.Manifest.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT,
+                android.Manifest.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY,
                 "addPortAssociation()")) {
             throw new SecurityException(
-                    "Requires ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT permission");
+                    "Requires ASSOCIATE_INPUT_DEVICE_TO_DISPLAY permission");
         }
 
         Objects.requireNonNull(inputPort);
@@ -2243,10 +2246,10 @@
     @Override // Binder call
     public void removePortAssociation(@NonNull String inputPort) {
         if (!checkCallingPermission(
-                android.Manifest.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT,
+                android.Manifest.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY,
                 "clearPortAssociations()")) {
             throw new SecurityException(
-                    "Requires ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT permission");
+                    "Requires ASSOCIATE_INPUT_DEVICE_TO_DISPLAY permission");
         }
 
         Objects.requireNonNull(inputPort);
@@ -2256,6 +2259,49 @@
         nativeNotifyPortAssociationsChanged(mPtr);
     }
 
+    /**
+     * Add a runtime association between the input device name and the display unique id.
+     * @param inputDeviceName The name of the input device.
+     * @param displayUniqueId The unique id of the associated display.
+     */
+    @Override // Binder call
+    public void addUniqueIdAssociation(@NonNull String inputDeviceName,
+            @NonNull String displayUniqueId) {
+        if (!checkCallingPermission(
+                android.Manifest.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY,
+                "addNameAssociation()")) {
+            throw new SecurityException(
+                    "Requires ASSOCIATE_INPUT_DEVICE_TO_DISPLAY permission");
+        }
+
+        Objects.requireNonNull(inputDeviceName);
+        Objects.requireNonNull(displayUniqueId);
+        synchronized (mAssociationsLock) {
+            mUniqueIdAssociations.put(inputDeviceName, displayUniqueId);
+        }
+        nativeChangeUniqueIdAssociation(mPtr);
+    }
+
+    /**
+     * Remove the runtime association between the input device and the display.
+     * @param inputDeviceName The port of the input device to be cleared.
+     */
+    @Override // Binder call
+    public void removeUniqueIdAssociation(@NonNull String inputDeviceName) {
+        if (!checkCallingPermission(
+                android.Manifest.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY,
+                "removeUniqueIdAssociation()")) {
+            throw new SecurityException(
+                    "Requires ASSOCIATE_INPUT_DEVICE_TO_DISPLAY permission");
+        }
+
+        Objects.requireNonNull(inputDeviceName);
+        synchronized (mAssociationsLock) {
+            mUniqueIdAssociations.remove(inputDeviceName);
+        }
+        nativeChangeUniqueIdAssociation(mPtr);
+    }
+
     @Override // Binder call
     public InputSensorInfo[] getSensorList(int deviceId) {
         return nativeGetSensorList(mPtr, deviceId);
@@ -2790,13 +2836,13 @@
      * key.
      * @return Flattened list
      */
-    private static List<String> flatten(@NonNull Map<String, Integer> map) {
+    private static <T> String[] flatten(@NonNull Map<String, T> map) {
         final List<String> list = new ArrayList<>(map.size() * 2);
         map.forEach((k, v)-> {
             list.add(k);
             list.add(v.toString());
         });
-        return list;
+        return list.toArray(new String[0]);
     }
 
     /**
@@ -2828,8 +2874,17 @@
             associations.putAll(mRuntimeAssociations);
         }
 
-        final List<String> associationList = flatten(associations);
-        return associationList.toArray(new String[0]);
+        return flatten(associations);
+    }
+
+    // Native callback
+    private String[] getInputUniqueIdAssociations() {
+        final Map<String, String> associations;
+        synchronized (mAssociationsLock) {
+            associations = new HashMap<>(mUniqueIdAssociations);
+        }
+
+        return flatten(associations);
     }
 
     /**
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
index 3ac95d7..bfb9db8 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
@@ -125,6 +125,11 @@
     public abstract void removeImeSurface();
 
     /**
+     * Updates the IME visibility, back disposition and show IME picker status for SystemUI.
+     */
+    public abstract void updateImeWindowStatus();
+
+    /**
      * Fake implementation of {@link InputMethodManagerInternal}.  All the methods do nothing.
      */
     private static final InputMethodManagerInternal NOP =
@@ -175,6 +180,10 @@
                 @Override
                 public void removeImeSurface() {
                 }
+
+                @Override
+                public void updateImeWindowStatus() {
+                }
             };
 
     /**
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 94a5099..5f8e707 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -248,6 +248,7 @@
     static final int MSG_CREATE_SESSION = 1050;
     static final int MSG_REMOVE_IME_SURFACE = 1060;
     static final int MSG_REMOVE_IME_SURFACE_FROM_WINDOW = 1061;
+    static final int MSG_UPDATE_IME_WINDOW_STATUS = 1070;
 
     static final int MSG_START_INPUT = 2000;
 
@@ -2940,6 +2941,12 @@
         }
     }
 
+    private void updateImeWindowStatus() {
+        synchronized (mMethodMap) {
+            updateSystemUiLocked();
+        }
+    }
+
     void updateSystemUiLocked() {
         updateSystemUiLocked(mImeWindowVis, mBackDisposition);
     }
@@ -3136,7 +3143,8 @@
 
     @Override
     public void showSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
-            ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
+            IBooleanResultCallback resultCallback) {
         CallbackUtils.onResult(resultCallback, () -> {
             Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.showSoftInput");
             int uid = Binder.getCallingUid();
@@ -3165,8 +3173,7 @@
                         }
                     }
                     if (DEBUG) Slog.v(TAG, "Client requesting input be shown");
-                    return showCurrentInputLocked(windowToken, flags, resultReceiver,
-                                    SoftInputShowHideReason.SHOW_SOFT_INPUT);
+                    return showCurrentInputLocked(windowToken, flags, resultReceiver, reason);
                 } finally {
                     Binder.restoreCallingIdentity(ident);
                     Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
@@ -3255,7 +3262,8 @@
 
     @Override
     public void hideSoftInput(IInputMethodClient client, IBinder windowToken, int flags,
-            ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
+            IBooleanResultCallback resultCallback) {
         CallbackUtils.onResult(resultCallback, () -> {
             int uid = Binder.getCallingUid();
             ImeTracing.getInstance().triggerManagerServiceDump(
@@ -3289,8 +3297,7 @@
 
                     if (DEBUG) Slog.v(TAG, "Client requesting input be hidden");
                     return InputMethodManagerService.this.hideCurrentInputLocked(windowToken,
-                            flags, resultReceiver,
-                            SoftInputShowHideReason.HIDE_SOFT_INPUT);
+                            flags, resultReceiver, reason);
                 } finally {
                     Binder.restoreCallingIdentity(ident);
                     Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
@@ -3319,8 +3326,8 @@
         // since Android Eclair.  That's why we need to accept IMM#hideSoftInput() even when only
         // IMMS#InputShown indicates that the software keyboard is shown.
         // TODO: Clean up, IMMS#mInputShown, IMMS#mImeWindowVis and mShowRequested.
-        final boolean shouldHideSoftInput = (mCurMethod != null) && (mInputShown ||
-                (mImeWindowVis & InputMethodService.IME_ACTIVE) != 0);
+        final boolean shouldHideSoftInput = (mCurMethod != null) && (mInputShown
+                || (mImeWindowVis & InputMethodService.IME_ACTIVE) != 0);
         boolean res;
         if (shouldHideSoftInput) {
             final Binder hideInputToken = new Binder();
@@ -3348,68 +3355,100 @@
 
     @NonNull
     @Override
+    public void reportWindowGainedFocusAsync(
+            boolean nextFocusHasConnection, IInputMethodClient client, IBinder windowToken,
+            @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode,
+            int windowFlags, int unverifiedTargetSdkVersion) {
+        final int startInputReason = nextFocusHasConnection
+                ? StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
+                : StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
+        try {
+            startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
+                    startInputFlags, softInputMode, windowFlags, null /* attribute */,
+                    null /* inputContext */, 0 /* missingMethods */, unverifiedTargetSdkVersion);
+        } catch (Throwable t) {
+            if (client != null) {
+                try {
+                    client.throwExceptionFromSystem(t.getMessage());
+                } catch (RemoteException ignore) { }
+            }
+        }
+    }
+
+    @NonNull
+    @Override
     public void startInputOrWindowGainedFocus(
             @StartInputReason int startInputReason, IInputMethodClient client, IBinder windowToken,
             @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode,
             int windowFlags, @Nullable EditorInfo attribute, IInputContext inputContext,
             @MissingMethodFlags int missingMethods, int unverifiedTargetSdkVersion,
             IInputBindResultResultCallback resultCallback) {
-        CallbackUtils.onResult(resultCallback, (Supplier<InputBindResult>) () -> {
-            if (windowToken == null) {
-                Slog.e(TAG, "windowToken cannot be null.");
+        CallbackUtils.onResult(resultCallback, (Supplier<InputBindResult>) () ->
+                startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
+                startInputFlags, softInputMode, windowFlags, attribute, inputContext,
+                missingMethods, unverifiedTargetSdkVersion));
+    }
+
+    @NonNull
+    private InputBindResult startInputOrWindowGainedFocusInternal(
+            @StartInputReason int startInputReason, IInputMethodClient client, IBinder windowToken,
+            @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode,
+            int windowFlags, @Nullable EditorInfo attribute, @Nullable IInputContext inputContext,
+            @MissingMethodFlags int missingMethods, int unverifiedTargetSdkVersion) {
+        if (windowToken == null) {
+            Slog.e(TAG, "windowToken cannot be null.");
+            return InputBindResult.NULL;
+        }
+        try {
+            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
+                    "IMMS.startInputOrWindowGainedFocus");
+            ImeTracing.getInstance().triggerManagerServiceDump(
+                    "InputMethodManagerService#startInputOrWindowGainedFocus");
+            final int callingUserId = UserHandle.getCallingUserId();
+            final int userId;
+            if (attribute != null && attribute.targetInputMethodUser != null
+                    && attribute.targetInputMethodUser.getIdentifier() != callingUserId) {
+                mContext.enforceCallingPermission(
+                        Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+                        "Using EditorInfo.targetInputMethodUser requires"
+                                + " INTERACT_ACROSS_USERS_FULL.");
+                userId = attribute.targetInputMethodUser.getIdentifier();
+                if (!mUserManagerInternal.isUserRunning(userId)) {
+                    // There is a chance that we hit here because of race condition. Let's just
+                    // return an error code instead of crashing the caller process, which at
+                    // least has INTERACT_ACROSS_USERS_FULL permission thus is likely to be an
+                    // important process.
+                    Slog.e(TAG, "User #" + userId + " is not running.");
+                    return InputBindResult.INVALID_USER;
+                }
+            } else {
+                userId = callingUserId;
+            }
+            final InputBindResult result;
+            synchronized (mMethodMap) {
+                final long ident = Binder.clearCallingIdentity();
+                try {
+                    result = startInputOrWindowGainedFocusInternalLocked(startInputReason,
+                            client, windowToken, startInputFlags, softInputMode, windowFlags,
+                            attribute, inputContext, missingMethods, unverifiedTargetSdkVersion,
+                            userId);
+                } finally {
+                    Binder.restoreCallingIdentity(ident);
+                }
+            }
+            if (result == null) {
+                // This must never happen, but just in case.
+                Slog.wtf(TAG, "InputBindResult is @NonNull. startInputReason="
+                        + InputMethodDebug.startInputReasonToString(startInputReason)
+                        + " windowFlags=#" + Integer.toHexString(windowFlags)
+                        + " editorInfo=" + attribute);
                 return InputBindResult.NULL;
             }
-            try {
-                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
-                        "IMMS.startInputOrWindowGainedFocus");
-                ImeTracing.getInstance().triggerManagerServiceDump(
-                        "InputMethodManagerService#startInputOrWindowGainedFocus");
-                final int callingUserId = UserHandle.getCallingUserId();
-                final int userId;
-                if (attribute != null && attribute.targetInputMethodUser != null
-                        && attribute.targetInputMethodUser.getIdentifier() != callingUserId) {
-                    mContext.enforceCallingPermission(
-                            Manifest.permission.INTERACT_ACROSS_USERS_FULL,
-                            "Using EditorInfo.targetInputMethodUser requires"
-                                    + " INTERACT_ACROSS_USERS_FULL.");
-                    userId = attribute.targetInputMethodUser.getIdentifier();
-                    if (!mUserManagerInternal.isUserRunning(userId)) {
-                        // There is a chance that we hit here because of race condition. Let's just
-                        // return an error code instead of crashing the caller process, which at
-                        // least has INTERACT_ACROSS_USERS_FULL permission thus is likely to be an
-                        // important process.
-                        Slog.e(TAG, "User #" + userId + " is not running.");
-                        return InputBindResult.INVALID_USER;
-                    }
-                } else {
-                    userId = callingUserId;
-                }
-                final InputBindResult result;
-                synchronized (mMethodMap) {
-                    final long ident = Binder.clearCallingIdentity();
-                    try {
-                        result = startInputOrWindowGainedFocusInternalLocked(startInputReason,
-                                client, windowToken, startInputFlags, softInputMode, windowFlags,
-                                attribute, inputContext, missingMethods, unverifiedTargetSdkVersion,
-                                userId);
-                    } finally {
-                        Binder.restoreCallingIdentity(ident);
-                    }
-                }
-                if (result == null) {
-                    // This must never happen, but just in case.
-                    Slog.wtf(TAG, "InputBindResult is @NonNull. startInputReason="
-                            + InputMethodDebug.startInputReasonToString(startInputReason)
-                            + " windowFlags=#" + Integer.toHexString(windowFlags)
-                            + " editorInfo=" + attribute);
-                    return InputBindResult.NULL;
-                }
 
-                return result;
-            } finally {
-                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
-            }
-        });
+            return result;
+        } finally {
+            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+        }
     }
 
     @NonNull
@@ -4437,7 +4476,7 @@
                     ((IInputMethod) args.arg1).showSoftInput(
                             (IBinder) args.arg3, msg.arg1, (ResultReceiver) args.arg2);
                     mSoftInputShowHideHistory.addEntry(new SoftInputShowHideHistory.Entry(
-                            mCurClient, mCurAttribute,
+                            mCurFocusedWindowClient, mCurAttribute,
                             mWindowManagerInternal.getWindowName(mCurFocusedWindow),
                             mCurFocusedWindowSoftInputMode, reason, mInFullscreenMode,
                             mWindowManagerInternal.getWindowName(
@@ -4460,7 +4499,7 @@
                     ((IInputMethod)args.arg1).hideSoftInput(
                             (IBinder) args.arg3, 0, (ResultReceiver)args.arg2);
                     mSoftInputShowHideHistory.addEntry(new SoftInputShowHideHistory.Entry(
-                            mCurClient, mCurAttribute,
+                            mCurFocusedWindowClient, mCurAttribute,
                             mWindowManagerInternal.getWindowName(mCurFocusedWindow),
                             mCurFocusedWindowSoftInputMode, reason, mInFullscreenMode,
                             mWindowManagerInternal.getWindowName(
@@ -4537,6 +4576,12 @@
                 }
                 return true;
             }
+            case MSG_UPDATE_IME_WINDOW_STATUS: {
+                synchronized (mMethodMap) {
+                    updateSystemUiLocked();
+                }
+                return true;
+            }
             // ---------------------------------------------------------
 
             case MSG_START_INPUT: {
@@ -5202,6 +5247,12 @@
         public void removeImeSurface() {
             mService.mHandler.sendMessage(mService.mHandler.obtainMessage(MSG_REMOVE_IME_SURFACE));
         }
+
+        @Override
+        public void updateImeWindowStatus() {
+            mService.mHandler.sendMessage(
+                    mService.mHandler.obtainMessage(MSG_UPDATE_IME_WINDOW_STATUS));
+        }
     }
 
     @BinderThread
@@ -6006,9 +6057,8 @@
 
         @BinderThread
         @Override
-        public void reportFullscreenMode(boolean fullscreen, IVoidResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback,
-                    () -> mImms.reportFullscreenMode(mToken, fullscreen));
+        public void reportFullscreenModeAsync(boolean fullscreen) {
+            mImms.reportFullscreenMode(mToken, fullscreen);
         }
 
         @BinderThread
@@ -6039,10 +6089,8 @@
 
         @BinderThread
         @Override
-        public void updateStatusIcon(String packageName, @DrawableRes int iconId,
-                IVoidResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback,
-                    () -> mImms.updateStatusIcon(mToken, packageName, iconId));
+        public void updateStatusIconAsync(String packageName, @DrawableRes int iconId) {
+            mImms.updateStatusIcon(mToken, packageName, iconId);
         }
 
         @BinderThread
@@ -6069,8 +6117,8 @@
 
         @BinderThread
         @Override
-        public void notifyUserAction(IVoidResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback, () -> mImms.notifyUserAction(mToken));
+        public void notifyUserActionAsync() {
+            mImms.notifyUserAction(mToken);
         }
 
         @BinderThread
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
index e25b03481..403187b 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
@@ -221,7 +221,6 @@
      */
     @VisibleForTesting
     public Context getSettingsContext(int displayId) {
-        // TODO(b/178462039): Cover the case when IME is moved to another ImeContainer.
         if (mSettingsContext == null || mSettingsContext.getDisplayId() != displayId) {
             final Context systemUiContext = ActivityThread.currentActivityThread()
                     .createSystemUiContext(displayId);
diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
index 885093d..69f293d 100644
--- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java
@@ -241,6 +241,10 @@
                         public void removeImeSurface() {
                             reportNotSupported();
                         }
+
+                        @Override
+                        public void updateImeWindowStatus() {
+                        }
                     });
         }
 
@@ -1517,8 +1521,8 @@
         @BinderThread
         @Override
         public void showSoftInput(
-                IInputMethodClient client, IBinder token, int flags,
-                ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+                IInputMethodClient client, IBinder token, int flags, ResultReceiver resultReceiver,
+                @SoftInputShowHideReason int reason, IBooleanResultCallback resultCallback) {
             CallbackUtils.onResult(resultCallback,
                     () -> showSoftInputInternal(client, token, flags, resultReceiver));
         }
@@ -1573,7 +1577,8 @@
         @Override
         public void hideSoftInput(
                 IInputMethodClient client, IBinder windowToken, int flags,
-                ResultReceiver resultReceiver, IBooleanResultCallback resultCallback) {
+                ResultReceiver resultReceiver, @SoftInputShowHideReason int reason,
+                IBooleanResultCallback resultCallback) {
             CallbackUtils.onResult(resultCallback,
                     () -> hideSoftInputInternal(client, windowToken, flags, resultReceiver));
 
@@ -1623,6 +1628,33 @@
 
         @BinderThread
         @Override
+        public void reportWindowGainedFocusAsync(
+                boolean nextFocusHasConnection,
+                @Nullable IInputMethodClient client,
+                @Nullable IBinder windowToken,
+                @StartInputFlags int startInputFlags,
+                @SoftInputModeFlags int softInputMode,
+                int windowFlags,
+                int unverifiedTargetSdkVersion) {
+            final int startInputReason = nextFocusHasConnection
+                    ? StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITH_CONNECTION
+                    : StartInputReason.WINDOW_FOCUS_GAIN_REPORT_WITHOUT_CONNECTION;
+            try {
+                startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
+                        startInputFlags, softInputMode, windowFlags, null /* editorInfo */,
+                        null /* inputContext */, 0 /* missingMethods */,
+                        unverifiedTargetSdkVersion);
+            } catch (Throwable t) {
+                if (client != null) {
+                    try {
+                        client.throwExceptionFromSystem(t.getMessage());
+                    } catch (RemoteException ignore) { }
+                }
+            }
+        }
+
+        @BinderThread
+        @Override
         public void startInputOrWindowGainedFocus(
                 @StartInputReason int startInputReason,
                 @Nullable IInputMethodClient client,
@@ -1637,8 +1669,8 @@
                 IInputBindResultResultCallback resultCallback) {
             CallbackUtils.onResult(resultCallback, (Supplier<InputBindResult>) () ->
                     startInputOrWindowGainedFocusInternal(startInputReason, client, windowToken,
-                            startInputFlags, softInputMode, windowFlags, editorInfo, inputContext,
-                            missingMethods, unverifiedTargetSdkVersion));
+                    startInputFlags, softInputMode, windowFlags, editorInfo, inputContext,
+                    missingMethods, unverifiedTargetSdkVersion));
         }
 
         @BinderThread
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index 42b0add..91f14de 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -46,6 +46,7 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -68,12 +69,14 @@
 
     private final class LightsManagerBinderService extends ILightsManager.Stub {
 
-        private final class Session {
+        private final class Session implements Comparable<Session> {
             final IBinder mToken;
             final SparseArray<LightState> mRequests = new SparseArray<>();
+            final int mPriority;
 
-            Session(IBinder token) {
+            Session(IBinder token, int priority) {
                 mToken = token;
+                mPriority = priority;
             }
 
             void setRequest(int lightId, LightState state) {
@@ -83,6 +86,12 @@
                     mRequests.remove(lightId);
                 }
             }
+
+            @Override
+            public int compareTo(Session otherSession) {
+                // Sort descending by priority
+                return Integer.compare(otherSession.mPriority, mPriority);
+            }
         }
 
         @GuardedBy("LightsService.this")
@@ -150,7 +159,7 @@
         }
 
         @Override
-        public void openSession(IBinder token) {
+        public void openSession(IBinder token, int priority) {
             getContext().enforceCallingOrSelfPermission(Manifest.permission.CONTROL_DEVICE_LIGHTS,
                     "openSession requires CONTROL_DEVICE_LIGHTS permission");
             Preconditions.checkNotNull(token);
@@ -159,7 +168,8 @@
                 Preconditions.checkState(getSessionLocked(token) == null, "already registered");
                 try {
                     token.linkToDeath(() -> closeSessionInternal(token), 0);
-                    mSessions.add(new Session(token));
+                    mSessions.add(new Session(token, priority));
+                    Collections.sort(mSessions);
                 } catch (RemoteException e) {
                     Slog.e(TAG, "Couldn't open session, client already died" , e);
                     throw new IllegalArgumentException("Client is already dead.");
@@ -216,10 +226,10 @@
         }
 
         private void checkRequestIsValid(int[] lightIds) {
-            for (int i = 0; i < lightIds.length; i++) {
-                final LightImpl light = mLightsById.get(lightIds[i]);
+            for (int lightId : lightIds) {
+                final LightImpl light = mLightsById.get(lightId);
                 Preconditions.checkState(light != null && !light.isSystemLight(),
-                        "Invalid lightId " + lightIds[i]);
+                        "Invalid lightId " + lightId);
             }
         }
 
diff --git a/services/core/java/com/android/server/location/geofence/GeofenceManager.java b/services/core/java/com/android/server/location/geofence/GeofenceManager.java
index 7f47805..a52c9ce 100644
--- a/services/core/java/com/android/server/location/geofence/GeofenceManager.java
+++ b/services/core/java/com/android/server/location/geofence/GeofenceManager.java
@@ -70,7 +70,7 @@
     private static final long WAKELOCK_TIMEOUT_MS = 30000;
 
     private static final int MAX_SPEED_M_S = 100;  // 360 km/hr (high speed train)
-    private static final long MAX_LOCATION_AGE_NANOS = 5 * 60 * 1000000000L; // five minutes
+    private static final long MAX_LOCATION_AGE_MS = 5 * 60 * 1000L; // five minutes
     private static final long MAX_LOCATION_INTERVAL_MS = 2 * 60 * 60 * 1000; // two hours
 
     protected final class GeofenceRegistration extends
@@ -472,7 +472,7 @@
         }
 
         if (location != null) {
-            if (location.getElapsedRealtimeAgeNanos() > MAX_LOCATION_AGE_NANOS) {
+            if (location.getElapsedRealtimeAgeMillis() > MAX_LOCATION_AGE_MS) {
                 location = null;
             }
         }
@@ -480,25 +480,25 @@
         return location;
     }
 
-    private void onUserChanged(int userId, int change) {
+    void onUserChanged(int userId, int change) {
         if (change == UserListener.CURRENT_USER_CHANGED) {
             updateRegistrations(registration -> registration.getIdentity().getUserId() == userId);
         }
     }
 
-    private void onLocationEnabledChanged(int userId) {
+    void onLocationEnabledChanged(int userId) {
         updateRegistrations(registration -> registration.getIdentity().getUserId() == userId);
     }
 
-    private void onLocationPackageBlacklistChanged(int userId) {
+    void onLocationPackageBlacklistChanged(int userId) {
         updateRegistrations(registration -> registration.getIdentity().getUserId() == userId);
     }
 
-    private void onLocationPermissionsChanged(String packageName) {
+    void onLocationPermissionsChanged(String packageName) {
         updateRegistrations(registration -> registration.onLocationPermissionsChanged(packageName));
     }
 
-    private void onLocationPermissionsChanged(int uid) {
+    void onLocationPermissionsChanged(int uid) {
         updateRegistrations(registration -> registration.onLocationPermissionsChanged(uid));
     }
 }
diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
index 1e5a15e..1cccf08 100644
--- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
@@ -603,7 +603,7 @@
             Log.d(TAG, "injectBestLocation: " + location);
         }
 
-        if (location.isFromMockProvider()) {
+        if (location.isMock()) {
             return;
         }
 
@@ -676,7 +676,7 @@
     }
 
     private void injectLocation(Location location) {
-        if (!location.isFromMockProvider()) {
+        if (!location.isMock()) {
             mGnssNative.injectLocation(location);
         }
     }
diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
index 8a2dfa8..0be325f 100644
--- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java
+++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
@@ -851,7 +851,7 @@
                     mUseWakeLock = false;
                     final int size = locationResult.size();
                     for (int i = 0; i < size; ++i) {
-                        if (!locationResult.get(i).isFromMockProvider()) {
+                        if (!locationResult.get(i).isMock()) {
                             mUseWakeLock = true;
                             break;
                         }
@@ -2302,7 +2302,7 @@
         LocationResult filtered;
         if (mPassiveManager != null) {
             filtered = locationResult.filter(location -> {
-                if (!location.isFromMockProvider()) {
+                if (!location.isMock()) {
                     if (location.getLatitude() == 0 && location.getLongitude() == 0) {
                         Log.w(TAG, "blocking 0,0 location from " + mName + " provider");
                         return false;
@@ -2539,16 +2539,16 @@
         LastLocation() {}
 
         public void clearMock() {
-            if (mFineLocation != null && mFineLocation.isFromMockProvider()) {
+            if (mFineLocation != null && mFineLocation.isMock()) {
                 mFineLocation = null;
             }
-            if (mCoarseLocation != null && mCoarseLocation.isFromMockProvider()) {
+            if (mCoarseLocation != null && mCoarseLocation.isMock()) {
                 mCoarseLocation = null;
             }
-            if (mFineBypassLocation != null && mFineBypassLocation.isFromMockProvider()) {
+            if (mFineBypassLocation != null && mFineBypassLocation.isMock()) {
                 mFineBypassLocation = null;
             }
-            if (mCoarseBypassLocation != null && mCoarseBypassLocation.isFromMockProvider()) {
+            if (mCoarseBypassLocation != null && mCoarseBypassLocation.isMock()) {
                 mCoarseBypassLocation = null;
             }
         }
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 6cded50..5b03989 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -30,6 +30,8 @@
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PIN;
 import static com.android.internal.widget.LockPatternUtils.EscrowTokenStateChangeCallback;
+import static com.android.internal.widget.LockPatternUtils.PROFILE_KEY_NAME_DECRYPT;
+import static com.android.internal.widget.LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT;
 import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_HANDLE_KEY;
 import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
 import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE;
@@ -99,6 +101,7 @@
 import android.security.keystore.recovery.KeyChainSnapshot;
 import android.security.keystore.recovery.RecoveryCertPath;
 import android.security.keystore.recovery.WrappedApplicationKey;
+import android.security.keystore2.AndroidKeyStoreLoadStoreParameter;
 import android.security.keystore2.AndroidKeyStoreProvider;
 import android.service.gatekeeper.GateKeeperResponse;
 import android.service.gatekeeper.IGateKeeperService;
@@ -155,6 +158,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -226,6 +230,7 @@
     private final SyntheticPasswordManager mSpManager;
 
     private final KeyStore mKeyStore;
+    private final java.security.KeyStore mJavaKeyStore;
     private final RecoverableKeyStoreManager mRecoverableKeyStoreManager;
     private ManagedProfilePasswordCache mManagedProfilePasswordCache;
 
@@ -535,16 +540,22 @@
             return Settings.Secure.getIntForUser(contentResolver, keyName, defaultValue, userId);
         }
 
-        public @NonNull ManagedProfilePasswordCache getManagedProfilePasswordCache() {
+        public java.security.KeyStore getJavaKeyStore() {
             try {
                 java.security.KeyStore ks = java.security.KeyStore.getInstance(
                         SyntheticPasswordCrypto.androidKeystoreProviderName());
-                ks.load(null);
-                return new ManagedProfilePasswordCache(ks, getUserManager());
+                ks.load(new AndroidKeyStoreLoadStoreParameter(
+                        SyntheticPasswordCrypto.keyNamespace()));
+                return ks;
             } catch (Exception e) {
                 throw new IllegalStateException("Cannot load keystore", e);
             }
         }
+
+        public @NonNull ManagedProfilePasswordCache getManagedProfilePasswordCache(
+                java.security.KeyStore ks) {
+            return new ManagedProfilePasswordCache(ks, getUserManager());
+        }
     }
 
     public LockSettingsService(Context context) {
@@ -556,6 +567,7 @@
         mInjector = injector;
         mContext = injector.getContext();
         mKeyStore = injector.getKeyStore();
+        mJavaKeyStore = injector.getJavaKeyStore();
         mRecoverableKeyStoreManager = injector.getRecoverableKeyStoreManager();
         mHandler = injector.getHandler(injector.getServiceThread());
         mStrongAuth = injector.getStrongAuth();
@@ -580,7 +592,7 @@
         mRandom = new SecureRandom();
 
         mSpManager = injector.getSyntheticPasswordManager(mStorage);
-        mManagedProfilePasswordCache = injector.getManagedProfilePasswordCache();
+        mManagedProfilePasswordCache = injector.getManagedProfilePasswordCache(mJavaKeyStore);
         mBiometricDeferredQueue = new BiometricDeferredQueue(mContext, mSpManager, mHandler);
 
         mRebootEscrowManager = injector.getRebootEscrowManager(new RebootEscrowCallbacks(),
@@ -955,6 +967,21 @@
             setString("migrated_wear_lockscreen_disabled", "true", 0);
             Slog.i(TAG, "Migrated lockscreen_disabled for Wear devices");
         }
+
+        if (getString("migrated_keystore_namespace", null, 0) == null) {
+            boolean success = true;
+            synchronized (mSpManager) {
+                success &= mSpManager.migrateKeyNamespace();
+            }
+            success &= migrateProfileLockKeys();
+            if (success) {
+                setString("migrated_keystore_namespace", "true", 0);
+                Slog.i(TAG, "Migrated keys to LSS namespace");
+            } else {
+                Slog.w(TAG, "Failed to migrate keys to LSS namespace");
+            }
+        }
+
     }
 
     private void migrateOldDataAfterSystemReady() {
@@ -995,6 +1022,22 @@
         }
     }
 
+    private boolean migrateProfileLockKeys() {
+        boolean success = true;
+        final List<UserInfo> users = mUserManager.getUsers();
+        final int userCount = users.size();
+        for (int i = 0; i < userCount; i++) {
+            UserInfo user = users.get(i);
+            if (user.isManagedProfile() && !getSeparateProfileChallengeEnabledInternal(user.id)) {
+                success &= SyntheticPasswordCrypto.migrateLockSettingsKey(
+                        PROFILE_KEY_NAME_ENCRYPT + user.id);
+                success &= SyntheticPasswordCrypto.migrateLockSettingsKey(
+                        PROFILE_KEY_NAME_DECRYPT + user.id);
+            }
+        }
+        return success;
+    }
+
     /**
      * Returns the lowest password quality that still presents the same UI for entering it.
      *
@@ -1268,7 +1311,7 @@
 
     private void unlockKeystore(byte[] password, int userHandle) {
         if (DEBUG) Slog.v(TAG, "Unlock keystore for user: " + userHandle);
-        Authorization.onLockScreenEvent(false, userHandle, password);
+        Authorization.onLockScreenEvent(false, userHandle, password, null);
     }
 
     @VisibleForTesting /** Note: this method is overridden in unit tests */
@@ -1286,11 +1329,8 @@
         byte[] encryptedPassword = Arrays.copyOfRange(storedData, PROFILE_KEY_IV_SIZE,
                 storedData.length);
         byte[] decryptionResult;
-        java.security.KeyStore keyStore = java.security.KeyStore.getInstance(
-                SyntheticPasswordCrypto.androidKeystoreProviderName());
-        keyStore.load(null);
-        SecretKey decryptionKey = (SecretKey) keyStore.getKey(
-                LockPatternUtils.PROFILE_KEY_NAME_DECRYPT + userId, null);
+        SecretKey decryptionKey = (SecretKey) mJavaKeyStore.getKey(
+                PROFILE_KEY_NAME_DECRYPT + userId, null);
 
         Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
                 + KeyProperties.BLOCK_MODE_GCM + "/" + KeyProperties.ENCRYPTION_PADDING_NONE);
@@ -1880,30 +1920,26 @@
             KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES);
             keyGenerator.init(new SecureRandom());
             SecretKey secretKey = keyGenerator.generateKey();
-            java.security.KeyStore keyStore = java.security.KeyStore.getInstance(
-                    SyntheticPasswordCrypto.androidKeystoreProviderName());
-            keyStore.load(null);
             try {
-                keyStore.setEntry(
-                        LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT + userId,
+                mJavaKeyStore.setEntry(
+                        PROFILE_KEY_NAME_ENCRYPT + userId,
                         new java.security.KeyStore.SecretKeyEntry(secretKey),
                         new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT)
                                 .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                                 .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                                 .build());
-                keyStore.setEntry(
-                        LockPatternUtils.PROFILE_KEY_NAME_DECRYPT + userId,
+                mJavaKeyStore.setEntry(
+                        PROFILE_KEY_NAME_DECRYPT + userId,
                         new java.security.KeyStore.SecretKeyEntry(secretKey),
                         new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
                                 .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                                 .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                                 .setUserAuthenticationRequired(true)
                                 .setUserAuthenticationValidityDurationSeconds(30)
-                                .setCriticalToDeviceEncryption(true)
                                 .build());
                 // Key imported, obtain a reference to it.
-                SecretKey keyStoreEncryptionKey = (SecretKey) keyStore.getKey(
-                        LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT + userId, null);
+                SecretKey keyStoreEncryptionKey = (SecretKey) mJavaKeyStore.getKey(
+                        PROFILE_KEY_NAME_ENCRYPT + userId, null);
                 Cipher cipher = Cipher.getInstance(
                         KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_GCM + "/"
                                 + KeyProperties.ENCRYPTION_PADDING_NONE);
@@ -1912,10 +1948,10 @@
                 iv = cipher.getIV();
             } finally {
                 // The original key can now be discarded.
-                keyStore.deleteEntry(LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT + userId);
+                mJavaKeyStore.deleteEntry(PROFILE_KEY_NAME_ENCRYPT + userId);
             }
-        } catch (CertificateException | UnrecoverableKeyException
-                | IOException | BadPaddingException | IllegalBlockSizeException | KeyStoreException
+        } catch (UnrecoverableKeyException
+                | BadPaddingException | IllegalBlockSizeException | KeyStoreException
                 | NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException e) {
             throw new IllegalStateException("Failed to encrypt key", e);
         }
@@ -2460,13 +2496,9 @@
     private void removeKeystoreProfileKey(int targetUserId) {
         Slog.i(TAG, "Remove keystore profile key for user: " + targetUserId);
         try {
-            java.security.KeyStore keyStore = java.security.KeyStore.getInstance(
-                    SyntheticPasswordCrypto.androidKeystoreProviderName());
-            keyStore.load(null);
-            keyStore.deleteEntry(LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT + targetUserId);
-            keyStore.deleteEntry(LockPatternUtils.PROFILE_KEY_NAME_DECRYPT + targetUserId);
-        } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException
-                | IOException e) {
+            mJavaKeyStore.deleteEntry(PROFILE_KEY_NAME_ENCRYPT + targetUserId);
+            mJavaKeyStore.deleteEntry(PROFILE_KEY_NAME_DECRYPT + targetUserId);
+        } catch (KeyStoreException e) {
             // We have tried our best to remove all keys
             Slog.e(TAG, "Unable to remove keystore profile key for user:" + targetUserId, e);
         }
@@ -3420,6 +3452,12 @@
         pw.println();
         pw.decreaseIndent();
 
+        pw.println("Keys in namespace:");
+        pw.increaseIndent();
+        dumpKeystoreKeys(pw);
+        pw.println();
+        pw.decreaseIndent();
+
         pw.println("Storage:");
         pw.increaseIndent();
         mStorage.dump(pw);
@@ -3441,6 +3479,18 @@
         pw.println("PasswordHandleCount: " + mGatekeeperPasswords.size());
     }
 
+    private void dumpKeystoreKeys(IndentingPrintWriter pw) {
+        try {
+            final Enumeration<String> aliases = mJavaKeyStore.aliases();
+            while (aliases.hasMoreElements()) {
+                pw.println(aliases.nextElement());
+            }
+        } catch (KeyStoreException e) {
+            pw.println("Unable to get keys: " + e.toString());
+            Slog.d(TAG, "Dump error", e);
+        }
+    }
+
     /**
      * Cryptographically disable escrow token support for the current user, if the user is not
      * managed (either user has a profile owner, or if device is managed). Do not disable
@@ -3637,11 +3687,12 @@
         }
 
         @Override
-        public void prepareRebootEscrow() {
+        public boolean prepareRebootEscrow() {
             if (!mRebootEscrowManager.prepareRebootEscrow()) {
-                return;
+                return false;
             }
             mStrongAuth.requireStrongAuth(STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE, USER_ALL);
+            return true;
         }
 
         @Override
@@ -3650,12 +3701,13 @@
         }
 
         @Override
-        public void clearRebootEscrow() {
+        public boolean clearRebootEscrow() {
             if (!mRebootEscrowManager.clearRebootEscrow()) {
-                return;
+                return false;
             }
             mStrongAuth.noLongerRequireStrongAuth(STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE,
                     USER_ALL);
+            return true;
         }
 
         @Override
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
index 6a5c2d89..a73c8e0 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
@@ -311,7 +311,7 @@
             PasswordMetrics metrics = new PasswordMetrics(
                     credential.isPattern() ? CREDENTIAL_TYPE_PATTERN : CREDENTIAL_TYPE_NONE);
             errors = PasswordMetrics.validatePasswordMetrics(
-                    requiredMetrics, requiredComplexity, false /* isPin */, metrics);
+                    requiredMetrics, requiredComplexity, metrics);
         }
         if (!errors.isEmpty()) {
             getOutPrintWriter().println(
diff --git a/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java b/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java
index fa477c8..672c3f7 100644
--- a/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java
+++ b/services/core/java/com/android/server/locksettings/ManagedProfilePasswordCache.java
@@ -23,7 +23,6 @@
 import android.security.keystore.KeyGenParameterSpec;
 import android.security.keystore.KeyProperties;
 import android.security.keystore.UserNotAuthenticatedException;
-import android.security.keystore2.AndroidKeyStoreSpi;
 import android.util.Slog;
 import android.util.SparseArray;
 
@@ -95,11 +94,12 @@
             SecretKey key;
             try {
                 generator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,
-                        AndroidKeyStoreSpi.NAME);
+                        mKeyStore.getProvider());
                 generator.init(new KeyGenParameterSpec.Builder(
                         keyName, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                         .setKeySize(KEY_LENGTH)
                         .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
+                        .setNamespace(SyntheticPasswordCrypto.keyNamespace())
                         .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                         // Generate auth-bound key to user 0 (since we the caller is user 0)
                         .setUserAuthenticationRequired(true)
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java
index 35e6489..3386408 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java
@@ -16,8 +16,12 @@
 
 package com.android.server.locksettings;
 
+import android.security.AndroidKeyStoreMaintenance;
 import android.security.keystore.KeyProperties;
 import android.security.keystore.KeyProtection;
+import android.security.keystore2.AndroidKeyStoreLoadStoreParameter;
+import android.system.keystore2.Domain;
+import android.system.keystore2.KeyDescriptor;
 import android.util.Slog;
 
 import java.io.ByteArrayOutputStream;
@@ -125,9 +129,7 @@
 
     public static byte[] decryptBlobV1(String keyAlias, byte[] blob, byte[] applicationId) {
         try {
-            KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName());
-            keyStore.load(null);
-
+            KeyStore keyStore = getKeyStore();
             SecretKey decryptionKey = (SecretKey) keyStore.getKey(keyAlias, null);
             if (decryptionKey == null) {
                 throw new IllegalStateException("SP key is missing: " + keyAlias);
@@ -144,10 +146,20 @@
         return "AndroidKeyStore";
     }
 
+    static int keyNamespace() {
+        return KeyProperties.NAMESPACE_LOCKSETTINGS;
+    }
+
+    private static KeyStore getKeyStore()
+            throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
+        KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName());
+        keyStore.load(new AndroidKeyStoreLoadStoreParameter(keyNamespace()));
+        return keyStore;
+    }
+
     public static byte[] decryptBlob(String keyAlias, byte[] blob, byte[] applicationId) {
         try {
-            KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName());
-            keyStore.load(null);
+            final KeyStore keyStore = getKeyStore();
 
             SecretKey decryptionKey = (SecretKey) keyStore.getKey(keyAlias, null);
             if (decryptionKey == null) {
@@ -170,8 +182,7 @@
             KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES);
             keyGenerator.init(AES_KEY_LENGTH * 8, new SecureRandom());
             SecretKey secretKey = keyGenerator.generateKey();
-            KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName());
-            keyStore.load(null);
+            final KeyStore keyStore = getKeyStore();
             KeyProtection.Builder builder = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
                     .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                     .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
@@ -200,8 +211,7 @@
     public static void destroyBlobKey(String keyAlias) {
         KeyStore keyStore;
         try {
-            keyStore = KeyStore.getInstance(androidKeystoreProviderName());
-            keyStore.load(null);
+            keyStore = getKeyStore();
             keyStore.deleteEntry(keyAlias);
             Slog.i(TAG, "SP key deleted: " + keyAlias);
         } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException
@@ -229,4 +239,32 @@
             throw new IllegalStateException("NoSuchAlgorithmException for SHA-512", e);
         }
     }
+
+    static boolean migrateLockSettingsKey(String alias) {
+        final KeyDescriptor legacyKey = new KeyDescriptor();
+        legacyKey.domain = Domain.APP;
+        legacyKey.nspace = KeyProperties.NAMESPACE_APPLICATION;
+        legacyKey.alias = alias;
+
+        final KeyDescriptor newKey = new KeyDescriptor();
+        newKey.domain = Domain.SELINUX;
+        newKey.nspace = SyntheticPasswordCrypto.keyNamespace();
+        newKey.alias = alias;
+        Slog.i(TAG, "Migrating key " + alias);
+        int err = AndroidKeyStoreMaintenance.migrateKeyNamespace(legacyKey, newKey);
+        if (err == 0) {
+            return true;
+        } else if (err == AndroidKeyStoreMaintenance.KEY_NOT_FOUND) {
+            Slog.i(TAG, "Key does not exist");
+            // Treat this as a success so we don't migrate again.
+            return true;
+        } else if (err == AndroidKeyStoreMaintenance.INVALID_ARGUMENT) {
+            Slog.i(TAG, "Key already exists");
+            // Treat this as a success so we don't migrate again.
+            return true;
+        } else {
+            Slog.e(TAG, String.format("Failed to migrate key: %d", err));
+            return false;
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index a5763ae..601a572 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -522,7 +522,7 @@
     public void removeUser(int userId) {
         for (long handle : mStorage.listSyntheticPasswordHandlesForUser(SP_BLOB_NAME, userId)) {
             destroyWeaverSlot(handle, userId);
-            destroySPBlobKey(getHandleName(handle));
+            destroySPBlobKey(getKeyName(handle));
         }
     }
 
@@ -958,7 +958,7 @@
         } else {
             secret = authToken.getSyntheticPassword();
         }
-        byte[] content = createSPBlob(getHandleName(handle), secret, applicationId, sid);
+        byte[] content = createSPBlob(getKeyName(handle), secret, applicationId, sid);
         byte[] blob = new byte[content.length + 1 + 1];
         /*
          * We can upgrade from v1 to v2 because that's just a change in the way that
@@ -1141,10 +1141,10 @@
         }
         final byte[] secret;
         if (version == SYNTHETIC_PASSWORD_VERSION_V1) {
-            secret = SyntheticPasswordCrypto.decryptBlobV1(getHandleName(handle),
+            secret = SyntheticPasswordCrypto.decryptBlobV1(getKeyName(handle),
                     Arrays.copyOfRange(blob, 2, blob.length), applicationId);
         } else {
-            secret = decryptSPBlob(getHandleName(handle),
+            secret = decryptSPBlob(getKeyName(handle),
                 Arrays.copyOfRange(blob, 2, blob.length), applicationId);
         }
         if (secret == null) {
@@ -1247,7 +1247,7 @@
 
     private void destroySyntheticPassword(long handle, int userId) {
         destroyState(SP_BLOB_NAME, handle, userId);
-        destroySPBlobKey(getHandleName(handle));
+        destroySPBlobKey(getKeyName(handle));
         if (hasState(WEAVER_SLOT_NAME, handle, userId)) {
             destroyWeaverSlot(handle, userId);
         }
@@ -1363,7 +1363,7 @@
         }
     }
 
-    private String getHandleName(long handle) {
+    private String getKeyName(long handle) {
         return String.format("%s%x", LockPatternUtils.SYNTHETIC_PASSWORD_KEY_PREFIX, handle);
     }
 
@@ -1424,4 +1424,19 @@
         }
         return hexBytes;
     }
+
+    /**
+     * Migrate all existing SP keystore keys from uid 1000 app domain to LSS selinux domain
+     */
+    public boolean migrateKeyNamespace() {
+        boolean success = true;
+        final Map<Integer, List<Long>> allHandles =
+                mStorage.listSyntheticPasswordHandlesForAllUsers(SP_BLOB_NAME);
+        for (List<Long> userHandles : allHandles.values()) {
+            for (long handle : userHandles) {
+                success &= SyntheticPasswordCrypto.migrateLockSettingsKey(getKeyName(handle));
+            }
+        }
+        return success;
+    }
 }
diff --git a/services/core/java/com/android/server/locksettings/TEST_MAPPING b/services/core/java/com/android/server/locksettings/TEST_MAPPING
index 4a216ca..b881b44 100644
--- a/services/core/java/com/android/server/locksettings/TEST_MAPPING
+++ b/services/core/java/com/android/server/locksettings/TEST_MAPPING
@@ -1,5 +1,5 @@
 {
-    "presubmit": [
+    "presubmit-large": [
         {
             "name": "CtsDevicePolicyManagerTestCases",
             "options": [
@@ -10,7 +10,9 @@
                     "exclude-annotation": "android.platform.test.annotations.FlakyTest"
                 }
             ]
-        },
+        }
+    ],
+    "presubmit": [
         {
             "name": "FrameworksServicesTests",
             "options": [
diff --git a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
index bb996a0..9a19031 100644
--- a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
+++ b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
@@ -195,6 +195,7 @@
         options.setTemporaryAppAllowlist(fgsAllowlistDurationMs,
                 PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
                 PowerWhitelistManager.REASON_MEDIA_BUTTON, "");
+        options.setBackgroundActivityStartsAllowed(true);
         if (mPendingIntent != null) {
             if (DEBUG_KEY_EVENT) {
                 Log.d(TAG, "Sending " + keyEvent + " to the last known PendingIntent "
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index ba1e23c..1dbc8a9 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -25,6 +25,7 @@
 
 import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
 
+import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
@@ -142,16 +143,14 @@
     ////////////////////////////////////////////////////////////////
 
     @NonNull
-    public void checkModifyAudioRoutingPermission() {
+    public void enforceMediaContentControlPermission() {
         final int pid = Binder.getCallingPid();
         final int uid = Binder.getCallingUid();
         final long token = Binder.clearCallingIdentity();
 
         try {
-            if (mContext.checkPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING, pid, uid)
-                    != PackageManager.PERMISSION_GRANTED) {
-                throw new SecurityException("Must hold the MODIFY_AUDIO_ROUTING permission.");
-            }
+            mContext.enforcePermission(Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid,
+                    "Must hold MEDIA_CONTENT_CONTROL permission.");
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -890,6 +889,9 @@
             return;
         }
 
+        mContext.enforcePermission(Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid,
+                "Must hold MEDIA_CONTENT_CONTROL permission.");
+
         UserRecord userRecord = getOrCreateUserRecordLocked(userId);
         managerRecord = new ManagerRecord(userRecord, manager, uid, pid, packageName);
         try {
diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java
index 3d19b70..384bc99 100644
--- a/services/core/java/com/android/server/media/MediaRouterService.java
+++ b/services/core/java/com/android/server/media/MediaRouterService.java
@@ -438,8 +438,8 @@
 
     // Binder call
     @Override
-    public void checkModifyAudioRoutingPermission() {
-        mService2.checkModifyAudioRoutingPermission();
+    public void enforceMediaContentControlPermission() {
+        mService2.enforceMediaContentControlPermission();
     }
 
     // Binder call
diff --git a/services/core/java/com/android/server/media/MediaSessionDeviceConfig.java b/services/core/java/com/android/server/media/MediaSessionDeviceConfig.java
index 9bb8e2e..7e747ce 100644
--- a/services/core/java/com/android/server/media/MediaSessionDeviceConfig.java
+++ b/services/core/java/com/android/server/media/MediaSessionDeviceConfig.java
@@ -46,6 +46,18 @@
     private static volatile long sMediaSessionCallbackFgsAllowlistDurationMs =
             DEFAULT_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS;
 
+    /**
+     * Denotes the duration for which an app receiving a media session callback and the FGS started
+     * there can be temporarily allowed to have while-in-use permissions such as
+     * location/camera/microphone for a duration of time.
+     */
+    private static final String KEY_MEDIA_SESSION_CALLBACK_FGS_WHILE_IN_USE_TEMP_ALLOW_DURATION_MS =
+            "media_session_callback_fgs_while_in_use_temp_allow_duration_ms";
+    private static final long DEFAULT_MEDIA_SESSION_CALLBACK_FGS_WHILE_IN_USE_TEMP_ALLOW_DURATION_MS
+            = 10_000;
+    private static volatile long sMediaSessionCallbackFgsWhileInUseTempAllowDurationMs =
+            DEFAULT_MEDIA_SESSION_CALLBACK_FGS_WHILE_IN_USE_TEMP_ALLOW_DURATION_MS;
+
     private static void refresh(DeviceConfig.Properties properties) {
         final Set<String> keys = properties.getKeyset();
         properties.getKeyset().forEach(key -> {
@@ -58,6 +70,9 @@
                     sMediaSessionCallbackFgsAllowlistDurationMs = properties.getLong(key,
                             DEFAULT_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS);
                     break;
+                case KEY_MEDIA_SESSION_CALLBACK_FGS_WHILE_IN_USE_TEMP_ALLOW_DURATION_MS:
+                    sMediaSessionCallbackFgsWhileInUseTempAllowDurationMs = properties.getLong(key,
+                            DEFAULT_MEDIA_SESSION_CALLBACK_FGS_WHILE_IN_USE_TEMP_ALLOW_DURATION_MS);
             }
         });
     }
@@ -86,6 +101,15 @@
         return sMediaSessionCallbackFgsAllowlistDurationMs;
     }
 
+    /**
+     * Return the duration for which an app receiving a media session callback and the FGS started
+     * there can be temporarily allowed to have while-in-use permissions such as
+     * location/camera/micrphone.
+     */
+    public static long getMediaSessionCallbackFgsWhileInUseTempAllowDurationMs() {
+        return sMediaSessionCallbackFgsWhileInUseTempAllowDurationMs;
+    }
+
     public static void dump(PrintWriter pw, String prefix) {
         pw.println("Media session config:");
         final String dumpFormat = prefix + "  %s: [cur: %s, def: %s]";
@@ -97,5 +121,9 @@
                 KEY_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS,
                 sMediaSessionCallbackFgsAllowlistDurationMs,
                 DEFAULT_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS));
+        pw.println(TextUtils.formatSimple(dumpFormat,
+                KEY_MEDIA_SESSION_CALLBACK_FGS_WHILE_IN_USE_TEMP_ALLOW_DURATION_MS,
+                sMediaSessionCallbackFgsWhileInUseTempAllowDurationMs,
+                DEFAULT_MEDIA_SESSION_CALLBACK_FGS_WHILE_IN_USE_TEMP_ALLOW_DURATION_MS));
     }
 }
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index b10d56b..abcf4fb 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -384,7 +384,7 @@
         if (mPlaybackState == null) {
             return false;
         }
-        return mPlaybackState.isActiveState() == expected;
+        return mPlaybackState.isActive() == expected;
     }
 
     /**
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 50cfe1f..491cd18 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -552,15 +552,30 @@
         final long token = Binder.clearCallingIdentity();
         try {
             enforcePackageName(callingPackage, callingUid);
-            if (targetUid != callingUid && mActivityManagerLocal.canStartForegroundService(
-                    callingPid, callingUid, callingPackage)) {
-                final Context userContext = mContext.createContextAsUser(
-                        UserHandle.of(UserHandle.getUserId(targetUid)), /* flags= */ 0);
-                final PowerExemptionManager powerExemptionManager = userContext.getSystemService(
-                        PowerExemptionManager.class);
-                powerExemptionManager.addToTemporaryAllowList(targetPackage,
-                        PowerExemptionManager.REASON_MEDIA_SESSION_CALLBACK, reason,
-                        MediaSessionDeviceConfig.getMediaSessionCallbackFgsAllowlistDurationMs());
+            if (targetUid != callingUid) {
+                Log.d(TAG, "tempAllowlistTargetPkgIfPossible callingPackage:"
+                        + callingPackage + " targetPackage:" + targetPackage
+                        + " reason:" + reason);
+                boolean canAllowWhileInUse = mActivityManagerLocal
+                        .canAllowWhileInUsePermissionInFgs(callingPid, callingUid, callingPackage);
+                boolean canStartFgs = canAllowWhileInUse
+                        || mActivityManagerLocal.canStartForegroundService(callingPid, callingUid,
+                        callingPackage);
+                if (canAllowWhileInUse) {
+                    mActivityManagerLocal.tempAllowWhileInUsePermissionInFgs(targetUid,
+                            MediaSessionDeviceConfig
+                                    .getMediaSessionCallbackFgsWhileInUseTempAllowDurationMs());
+                }
+                if (canStartFgs) {
+                    final Context userContext = mContext.createContextAsUser(
+                            UserHandle.of(UserHandle.getUserId(targetUid)), /* flags= */ 0);
+                    final PowerExemptionManager powerExemptionManager =
+                            userContext.getSystemService(
+                                    PowerExemptionManager.class);
+                    powerExemptionManager.addToTemporaryAllowList(targetPackage,
+                            PowerExemptionManager.REASON_MEDIA_SESSION_CALLBACK, reason,
+                            MediaSessionDeviceConfig.getMediaSessionCallbackFgsAllowlistDurationMs());
+                }
             }
         } finally {
             Binder.restoreCallingIdentity(token);
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 7e4e29e..805f395 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -1942,7 +1942,7 @@
      * Collect all ifaces from a {@link NetworkStateSnapshot} into the given set.
      */
     private static void collectIfaces(ArraySet<String> ifaces, NetworkStateSnapshot snapshot) {
-        ifaces.addAll(snapshot.linkProperties.getAllInterfaceNames());
+        ifaces.addAll(snapshot.getLinkProperties().getAllInterfaceNames());
     }
 
     /**
@@ -2023,7 +2023,7 @@
         mNetIdToSubId.clear();
         final ArrayMap<NetworkStateSnapshot, NetworkIdentity> identified = new ArrayMap<>();
         for (final NetworkStateSnapshot snapshot : snapshots) {
-            mNetIdToSubId.put(snapshot.network.getNetId(), parseSubId(snapshot));
+            mNetIdToSubId.put(snapshot.getNetwork().getNetId(), parseSubId(snapshot));
 
             // Policies matched by NPMS only match by subscriber ID or by ssid. Thus subtype
             // in the object created here is never used and its value doesn't matter, so use
@@ -2111,7 +2111,7 @@
         // One final pass to catch any metered ifaces that don't have explicitly
         // defined policies; typically Wi-Fi networks.
         for (final NetworkStateSnapshot snapshot : snapshots) {
-            if (!snapshot.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)) {
+            if (!snapshot.getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)) {
                 matchingIfaces.clear();
                 collectIfaces(matchingIfaces, snapshot);
                 for (int j = matchingIfaces.size() - 1; j >= 0; j--) {
@@ -2147,14 +2147,14 @@
         mSubscriptionOpportunisticQuota.clear();
         for (final NetworkStateSnapshot snapshot : snapshots) {
             if (!quotaEnabled) continue;
-            if (snapshot.network == null) continue;
-            final int subId = getSubIdLocked(snapshot.network);
+            if (snapshot.getNetwork() == null) continue;
+            final int subId = getSubIdLocked(snapshot.getNetwork());
             final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId);
             if (plan == null) continue;
 
             final long quotaBytes;
             final long limitBytes = plan.getDataLimitBytes();
-            if (!snapshot.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_ROAMING)) {
+            if (!snapshot.getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_ROAMING)) {
                 // Clamp to 0 when roaming
                 quotaBytes = 0;
             } else if (limitBytes == SubscriptionPlan.BYTES_UNKNOWN) {
@@ -2172,7 +2172,7 @@
                         .truncatedTo(ChronoUnit.DAYS)
                         .toInstant().toEpochMilli();
                 final long totalBytes = getTotalBytes(
-                        NetworkTemplate.buildTemplateMobileAll(snapshot.subscriberId),
+                        NetworkTemplate.buildTemplateMobileAll(snapshot.getSubscriberId()),
                         start, startOfDay);
                 final long remainingBytes = limitBytes - totalBytes;
                 // Number of remaining days including current day
@@ -5807,8 +5807,8 @@
 
     private int parseSubId(@NonNull NetworkStateSnapshot snapshot) {
         int subId = INVALID_SUBSCRIPTION_ID;
-        if (snapshot.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
-            NetworkSpecifier spec = snapshot.networkCapabilities.getNetworkSpecifier();
+        if (snapshot.getNetworkCapabilities().hasTransport(TRANSPORT_CELLULAR)) {
+            NetworkSpecifier spec = snapshot.getNetworkCapabilities().getNetworkSpecifier();
             if (spec instanceof TelephonyNetworkSpecifier) {
                 subId = ((TelephonyNetworkSpecifier) spec).getSubscriptionId();
             }
diff --git a/services/core/java/com/android/server/net/NetworkStatsAccess.java b/services/core/java/com/android/server/net/NetworkStatsAccess.java
index 7cdc4cc..d25eae4 100644
--- a/services/core/java/com/android/server/net/NetworkStatsAccess.java
+++ b/services/core/java/com/android/server/net/NetworkStatsAccess.java
@@ -27,6 +27,7 @@
 import android.app.admin.DevicePolicyManagerInternal;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.Binder;
 import android.os.Process;
 import android.os.UserHandle;
 import android.telephony.TelephonyManager;
@@ -108,9 +109,16 @@
                 DevicePolicyManagerInternal.class);
         final TelephonyManager tm = (TelephonyManager)
                 context.getSystemService(Context.TELEPHONY_SERVICE);
-        boolean hasCarrierPrivileges = tm != null &&
-                tm.checkCarrierPrivilegesForPackageAnyPhone(callingPackage) ==
-                        TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+        boolean hasCarrierPrivileges;
+        final long token = Binder.clearCallingIdentity();
+        try {
+            hasCarrierPrivileges = tm != null
+                    && tm.checkCarrierPrivilegesForPackageAnyPhone(callingPackage)
+                            == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+
         final boolean isDeviceOwner = dpmi != null && dpmi.isActiveDeviceOwner(callingUid);
         final int appId = UserHandle.getAppId(callingUid);
         if (hasCarrierPrivileges || isDeviceOwner
diff --git a/services/core/java/com/android/server/net/NetworkStatsFactory.java b/services/core/java/com/android/server/net/NetworkStatsFactory.java
index d042b88..431b009 100644
--- a/services/core/java/com/android/server/net/NetworkStatsFactory.java
+++ b/services/core/java/com/android/server/net/NetworkStatsFactory.java
@@ -382,8 +382,8 @@
 
         // Migrate data usage over a VPN to the TUN network.
         for (UnderlyingNetworkInfo info : vpnArray) {
-            delta.migrateTun(info.ownerUid, info.iface,
-                    info.underlyingIfaces.toArray(new String[0]));
+            delta.migrateTun(info.getOwnerUid(), info.getInterface(),
+                    info.getUnderlyingInterfaces());
             // Filter out debug entries as that may lead to over counting.
             delta.filterDebugEntries();
         }
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 19f5e3c..3c14440 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -24,7 +24,6 @@
 import static android.content.Intent.ACTION_USER_REMOVED;
 import static android.content.Intent.EXTRA_UID;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.net.NetworkIdentity.SUBTYPE_COMBINED;
 import static android.net.NetworkStack.checkNetworkStackPermission;
 import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
@@ -97,12 +96,12 @@
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.NetworkIdentity;
+import android.net.NetworkSpecifier;
 import android.net.NetworkStack;
 import android.net.NetworkStateSnapshot;
 import android.net.NetworkStats;
 import android.net.NetworkStats.NonMonotonicObserver;
 import android.net.NetworkStatsHistory;
-import android.net.NetworkSpecifier;
 import android.net.NetworkTemplate;
 import android.net.TelephonyNetworkSpecifier;
 import android.net.TrafficStats;
@@ -1296,9 +1295,9 @@
         final ArraySet<String> mobileIfaces = new ArraySet<>();
         for (NetworkStateSnapshot snapshot : snapshots) {
             final int displayTransport =
-                    getDisplayTransport(snapshot.networkCapabilities.getTransportTypes());
+                    getDisplayTransport(snapshot.getNetworkCapabilities().getTransportTypes());
             final boolean isMobile = (NetworkCapabilities.TRANSPORT_CELLULAR == displayTransport);
-            final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, snapshot.network);
+            final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, snapshot.getNetwork());
             final int subType = combineSubtypeEnabled ? SUBTYPE_COMBINED
                     : getSubTypeForStateSnapshot(snapshot);
             final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, snapshot,
@@ -1306,7 +1305,7 @@
 
             // Traffic occurring on the base interface is always counted for
             // both total usage and UID details.
-            final String baseIface = snapshot.linkProperties.getInterfaceName();
+            final String baseIface = snapshot.getLinkProperties().getInterfaceName();
             if (baseIface != null) {
                 findOrCreateNetworkIdentitySet(mActiveIfaces, baseIface).add(ident);
                 findOrCreateNetworkIdentitySet(mActiveUidIfaces, baseIface).add(ident);
@@ -1316,7 +1315,7 @@
                 // If IMS is metered, then the IMS network usage has already included VT usage.
                 // VT is considered always metered in framework's layer. If VT is not metered
                 // per carrier's policy, modem will report 0 usage for VT calls.
-                if (snapshot.networkCapabilities.hasCapability(
+                if (snapshot.getNetworkCapabilities().hasCapability(
                         NetworkCapabilities.NET_CAPABILITY_IMS) && !ident.getMetered()) {
 
                     // Copy the identify from IMS one but mark it as metered.
@@ -1364,7 +1363,7 @@
             // accounting is explicitly bypassed for traffic from the clat uid.
             //
             // TODO: This code might be combined to above code.
-            for (String iface : snapshot.linkProperties.getAllInterfaceNames()) {
+            for (String iface : snapshot.getLinkProperties().getAllInterfaceNames()) {
                 // baseIface has been handled, so ignore it.
                 if (TextUtils.equals(baseIface, iface)) continue;
                 if (iface != null) {
@@ -1383,11 +1382,11 @@
     }
 
     private static int getSubIdForMobile(@NonNull NetworkStateSnapshot state) {
-        if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+        if (!state.getNetworkCapabilities().hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
             throw new IllegalArgumentException("Mobile state need capability TRANSPORT_CELLULAR");
         }
 
-        final NetworkSpecifier spec = state.networkCapabilities.getNetworkSpecifier();
+        final NetworkSpecifier spec = state.getNetworkCapabilities().getNetworkSpecifier();
         if (spec instanceof TelephonyNetworkSpecifier) {
              return ((TelephonyNetworkSpecifier) spec).getSubscriptionId();
         } else {
@@ -1402,11 +1401,11 @@
      * transport types do not actually fill this value.
      */
     private int getSubTypeForStateSnapshot(@NonNull NetworkStateSnapshot state) {
-        if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+        if (!state.getNetworkCapabilities().hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
             return 0;
         }
 
-        return mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(state.subscriberId);
+        return mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(state.getSubscriberId());
     }
 
     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 fd92c4c..2caad50 100644
--- a/services/core/java/com/android/server/notification/BubbleExtractor.java
+++ b/services/core/java/com/android/server/notification/BubbleExtractor.java
@@ -71,37 +71,38 @@
             return null;
         }
 
-        int bubblePreference =
-                mConfig.getBubblePreference(
-                        record.getSbn().getPackageName(), record.getSbn().getUid());
-        NotificationChannel recordChannel = record.getChannel();
-        boolean canPresentAsBubble = canPresentAsBubble(record)
+        boolean notifCanPresentAsBubble = canPresentAsBubble(record)
                 && !mActivityManager.isLowRamDevice()
                 && record.isConversation()
                 && record.getShortcutInfo() != null
                 && (record.getNotification().flags & FLAG_FOREGROUND_SERVICE) == 0;
 
-        if (!mConfig.bubblesEnabled()
-                || bubblePreference == BUBBLE_PREFERENCE_NONE
-                || !canPresentAsBubble) {
+        boolean userEnabledBubbles = mConfig.bubblesEnabled(record.getUser());
+        int appPreference =
+                mConfig.getBubblePreference(
+                        record.getSbn().getPackageName(), record.getSbn().getUid());
+        NotificationChannel recordChannel = record.getChannel();
+        if (!userEnabledBubbles
+                || appPreference == BUBBLE_PREFERENCE_NONE
+                || !notifCanPresentAsBubble) {
             record.setAllowBubble(false);
-            if (!canPresentAsBubble) {
+            if (!notifCanPresentAsBubble) {
                 // clear out bubble metadata since it can't be used
                 record.getNotification().setBubbleMetadata(null);
             }
         } else if (recordChannel == null) {
             // the app is allowed but there's no channel to check
             record.setAllowBubble(true);
-        } else if (bubblePreference == BUBBLE_PREFERENCE_ALL) {
+        } else if (appPreference == BUBBLE_PREFERENCE_ALL) {
             record.setAllowBubble(recordChannel.getAllowBubbles() != ALLOW_BUBBLE_OFF);
-        } else if (bubblePreference == BUBBLE_PREFERENCE_SELECTED) {
+        } else if (appPreference == BUBBLE_PREFERENCE_SELECTED) {
             record.setAllowBubble(recordChannel.canBubble());
         }
         if (DBG) {
             Slog.d(TAG, "record: " + record.getKey()
-                    + " appPref: " + bubblePreference
+                    + " appPref: " + appPreference
                     + " canBubble: " + record.canBubble()
-                    + " canPresentAsBubble: " + canPresentAsBubble
+                    + " canPresentAsBubble: " + notifCanPresentAsBubble
                     + " flagRemoved: " + record.isFlagBubbleRemoved());
         }
 
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 5d61fef..202b315 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -1769,17 +1769,10 @@
             UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
             if (userManager != null) {
                 int currentUserId = ActivityManager.getCurrentUser();
-                List<UserInfo> unlockedProfiles = new ArrayList<>();
-                for (UserInfo user : userManager.getProfiles(currentUserId)) {
-                    // Dependencies throw if we call APIs on a locked user. Only include
-                    // unlocked users.
-                    if (userManager.isUserUnlocked(user.id)) {
-                        unlockedProfiles.add(user);
-                    }
-                }
+                List<UserInfo> profiles = userManager.getProfiles(currentUserId);
                 synchronized (mCurrentProfiles) {
                     mCurrentProfiles.clear();
-                    for (UserInfo user : unlockedProfiles) {
+                    for (UserInfo user : profiles) {
                         mCurrentProfiles.put(user.id, user);
                     }
                 }
diff --git a/services/core/java/com/android/server/notification/NotificationComparator.java b/services/core/java/com/android/server/notification/NotificationComparator.java
index 29b5e81..78219bc 100644
--- a/services/core/java/com/android/server/notification/NotificationComparator.java
+++ b/services/core/java/com/android/server/notification/NotificationComparator.java
@@ -147,15 +147,16 @@
     }
 
     private boolean isImportantOngoing(NotificationRecord record) {
-        if (!isOngoing(record)) {
-            return false;
-        }
-
         if (record.getImportance() < NotificationManager.IMPORTANCE_LOW) {
             return false;
         }
-
-        return isCall(record) || isMediaNotification(record);
+        if (isCallStyle(record)) {
+            return true;
+        }
+        if (!isOngoing(record)) {
+            return false;
+        }
+        return isCallCategory(record) || isMediaNotification(record);
     }
 
     protected boolean isImportantPeople(NotificationRecord record) {
@@ -181,11 +182,16 @@
         return record.getNotification().hasMediaSession();
     }
 
-    private boolean isCall(NotificationRecord record) {
+    private boolean isCallCategory(NotificationRecord record) {
         return record.isCategory(Notification.CATEGORY_CALL)
                 && isDefaultPhoneApp(record.getSbn().getPackageName());
     }
 
+    private boolean isCallStyle(NotificationRecord record) {
+        return "android.app.Notification$CallStyle".equals(
+                record.getNotification().extras.getString(Notification.EXTRA_TEMPLATE));
+    }
+
     private boolean isDefaultPhoneApp(String pkg) {
         if (mDefaultPhoneApp == null) {
             final TelecomManager telecomm =
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 52a5dc1..08a7d9e 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -695,14 +695,15 @@
         // Remove notifications with the specified user & channel ID.
         public void removeChannelNotifications(String pkg, @UserIdInt int userId,
                 String channelId) {
-            for (int i = 0; i < mBuffer.size(); i++) {
-                final Pair<StatusBarNotification, Integer> pair = mBuffer.get(i);
+            Iterator<Pair<StatusBarNotification, Integer>> bufferIter = mBuffer.iterator();
+            while (bufferIter.hasNext()) {
+                final Pair<StatusBarNotification, Integer> pair = bufferIter.next();
                 if (pair.first != null
                         && userId == pair.first.getNormalizedUserId()
                         && pkg != null && pkg.equals(pair.first.getPackageName())
                         && pair.first.getNotification() != null
                         && Objects.equals(channelId, pair.first.getNotification().getChannelId())) {
-                    mBuffer.remove(i);
+                    bufferIter.remove();
                 }
             }
         }
@@ -1783,8 +1784,6 @@
                 }
             } else if (action.equals(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) {
                 int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
-                // Work profile user may now be locked. Refresh cache.
-                mUserProfiles.updateCache(context);
                 if (userHandle >= 0) {
                     cancelAllNotificationsInt(MY_UID, MY_PID, null, null, 0, 0, true, userHandle,
                             REASON_PROFILE_TURNED_OFF, null);
@@ -1879,7 +1878,7 @@
         private final Uri NOTIFICATION_BADGING_URI
                 = Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_BADGING);
         private final Uri NOTIFICATION_BUBBLES_URI
-                = Settings.Global.getUriFor(Settings.Global.NOTIFICATION_BUBBLES);
+                = Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_BUBBLES);
         private final Uri NOTIFICATION_LIGHT_PULSE_URI
                 = Settings.System.getUriFor(Settings.System.NOTIFICATION_LIGHT_PULSE);
         private final Uri NOTIFICATION_RATE_LIMIT_URI
@@ -3024,18 +3023,21 @@
                     getRealUserId(r.getSbn().getUserId()));
             Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "notifHistoryAddItem");
             try {
-                mHistoryManager.addNotification(new HistoricalNotification.Builder()
-                        .setPackage(r.getSbn().getPackageName())
-                        .setUid(r.getSbn().getUid())
-                        .setUserId(r.getSbn().getNormalizedUserId())
-                        .setChannelId(r.getChannel().getId())
-                        .setChannelName(r.getChannel().getName().toString())
-                        .setPostedTimeMs(System.currentTimeMillis())
-                        .setTitle(getHistoryTitle(r.getNotification()))
-                        .setText(getHistoryText(
-                                r.getSbn().getPackageContext(getContext()), r.getNotification()))
-                        .setIcon(r.getNotification().getSmallIcon())
-                        .build());
+                if (r.getNotification().getSmallIcon() != null) {
+                    mHistoryManager.addNotification(new HistoricalNotification.Builder()
+                            .setPackage(r.getSbn().getPackageName())
+                            .setUid(r.getSbn().getUid())
+                            .setUserId(r.getSbn().getNormalizedUserId())
+                            .setChannelId(r.getChannel().getId())
+                            .setChannelName(r.getChannel().getName().toString())
+                            .setPostedTimeMs(System.currentTimeMillis())
+                            .setTitle(getHistoryTitle(r.getNotification()))
+                            .setText(getHistoryText(
+                                    r.getSbn().getPackageContext(getContext()),
+                                    r.getNotification()))
+                            .setIcon(r.getNotification().getSmallIcon())
+                            .build());
+                }
             } finally {
                 Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
             }
@@ -3472,8 +3474,7 @@
                         android.Manifest.permission.INTERACT_ACROSS_USERS,
                         "areBubblesEnabled for user " + user.getIdentifier());
             }
-            // TODO: incorporate uid / per-user prefs once settings moves off global table.
-            return mPreferencesHelper.bubblesEnabled();
+            return mPreferencesHelper.bubblesEnabled(user);
         }
 
         @Override
@@ -5180,8 +5181,13 @@
         }
 
         @Override
-        public void resetDefaultNotificationAssistant(boolean loadFromConfig) {
+        public void setNASMigrationDoneAndResetDefault(int userId, boolean loadFromConfig) {
             checkCallerIsSystem();
+            setNASMigrationDone(userId);
+            cancelNotificationInternal(getContext().getPackageName(),
+                    getContext().getOpPackageName(), Binder.getCallingUid(),
+                    Binder.getCallingPid(), TAG,
+                    SystemMessageProto.SystemMessage.NOTE_NAS_UPGRADE, userId);
             if (loadFromConfig) {
                 mAssistants.resetDefaultFromConfig();
             } else {
@@ -5680,9 +5686,11 @@
                 summaryNotification.extras.putAll(extras);
                 Intent appIntent = getContext().getPackageManager().getLaunchIntentForPackage(pkg);
                 if (appIntent != null) {
-                    summaryNotification.contentIntent = PendingIntent.getActivityAsUser(
-                            getContext(), 0, appIntent, PendingIntent.FLAG_IMMUTABLE, null,
-                            UserHandle.of(userId));
+                    final ActivityManagerInternal ami = LocalServices
+                            .getService(ActivityManagerInternal.class);
+                    summaryNotification.contentIntent = ami.getPendingIntentActivityAsApp(
+                            0, appIntent, PendingIntent.FLAG_IMMUTABLE, null,
+                            pkg, appInfo.uid);
                 }
                 final StatusBarNotification summarySbn =
                         new StatusBarNotification(adjustedSbn.getPackageName(),
@@ -6566,6 +6574,17 @@
             }
         }
 
+        if ("android.app.Notification$CallStyle".equals(
+                n.extras.getString(Notification.EXTRA_TEMPLATE))) {
+            boolean isForegroundService = (n.flags & FLAG_FOREGROUND_SERVICE) != 0;
+            boolean hasFullScreenIntent = n.fullScreenIntent != null;
+            if (!isForegroundService && !hasFullScreenIntent) {
+                throw new IllegalArgumentException(r.getKey() + " Not posted."
+                        + " CallStyle notifications must either be for a foreground Service or"
+                        + " use a fullScreenIntent.");
+            }
+        }
+
         // snoozed apps
         if (mSnoozeHelper.isSnoozed(userId, pkg, r.getKey())) {
             MetricsLogger.action(r.getLogMaker()
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index dc3b78a..55a0949 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -139,7 +139,7 @@
     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;
+    static final boolean DEFAULT_BUBBLES_ENABLED = true;
     @VisibleForTesting
     static final int DEFAULT_BUBBLE_PREFERENCE = BUBBLE_PREFERENCE_NONE;
     static final boolean DEFAULT_MEDIA_NOTIFICATION_FILTERING = true;
@@ -173,9 +173,9 @@
     private final AppOpsManager mAppOps;
 
     private SparseBooleanArray mBadgingEnabled;
+    private SparseBooleanArray mBubblesEnabled;
     private SparseBooleanArray mLockScreenShowNotifications;
     private SparseBooleanArray mLockScreenPrivateNotifications;
-    private boolean mBubblesEnabledGlobally = DEFAULT_GLOBAL_ALLOW_BUBBLE;
     private boolean mIsMediaNotificationFilteringEnabled = DEFAULT_MEDIA_NOTIFICATION_FILTERING;
     private boolean mAreChannelsBypassingDnd;
     private boolean mHideSilentStatusBarIcons = DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS;
@@ -2372,20 +2372,6 @@
                 .setPackageName(pkg);
     }
 
-    public void updateBubblesEnabled() {
-        final boolean newValue = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.NOTIFICATION_BUBBLES,
-                DEFAULT_GLOBAL_ALLOW_BUBBLE ? 1 : 0) == 1;
-        if (newValue != mBubblesEnabledGlobally) {
-            mBubblesEnabledGlobally = newValue;
-            updateConfig();
-        }
-    }
-
-    public boolean bubblesEnabled() {
-        return mBubblesEnabledGlobally;
-    }
-
     /** Requests check of the feature setting for showing media notifications in quick settings. */
     public void updateMediaNotificationFilteringEnabled() {
         final boolean newValue = Settings.Global.getInt(mContext.getContentResolver(),
@@ -2435,6 +2421,42 @@
         return mBadgingEnabled.get(userId, DEFAULT_SHOW_BADGE);
     }
 
+    /** Updates whether bubbles are enabled for this user. */
+    public void updateBubblesEnabled() {
+        if (mBubblesEnabled == null) {
+            mBubblesEnabled = new SparseBooleanArray();
+        }
+        boolean changed = false;
+        // update the cached values
+        for (int index = 0; index < mBubblesEnabled.size(); index++) {
+            int userId = mBubblesEnabled.keyAt(index);
+            final boolean oldValue = mBubblesEnabled.get(userId);
+            final boolean newValue = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                    Settings.Secure.NOTIFICATION_BUBBLES,
+                    DEFAULT_BUBBLES_ENABLED ? 1 : 0, userId) != 0;
+            mBubblesEnabled.put(userId, newValue);
+            changed |= oldValue != newValue;
+        }
+        if (changed) {
+            updateConfig();
+        }
+    }
+
+    /** Returns true if bubbles are enabled for this user. */
+    public boolean bubblesEnabled(UserHandle userHandle) {
+        int userId = userHandle.getIdentifier();
+        if (userId == UserHandle.USER_ALL) {
+            return false;
+        }
+        if (mBubblesEnabled.indexOfKey(userId) < 0) {
+            mBubblesEnabled.put(userId,
+                    Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                            Settings.Secure.NOTIFICATION_BUBBLES,
+                            DEFAULT_BUBBLES_ENABLED ? 1 : 0, userId) != 0);
+        }
+        return mBubblesEnabled.get(userId, DEFAULT_BUBBLES_ENABLED);
+    }
+
     public void updateLockScreenPrivateNotifications() {
         if (mLockScreenPrivateNotifications == null) {
             mLockScreenPrivateNotifications = new SparseBooleanArray();
diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java
index 8991ced..b1d6546 100644
--- a/services/core/java/com/android/server/notification/RankingConfig.java
+++ b/services/core/java/com/android/server/notification/RankingConfig.java
@@ -30,7 +30,8 @@
     boolean canShowBadge(String packageName, int uid);
     boolean badgingEnabled(UserHandle userHandle);
     int getBubblePreference(String packageName, int uid);
-    boolean bubblesEnabled();
+    /** Returns true when the bubbles feature is enabled for this user. */
+    boolean bubblesEnabled(UserHandle userHandle);
     /** Returns true when feature is enabled that shows media notifications in quick settings. */
     boolean isMediaNotificationFilteringEnabled();
     boolean isGroupBlocked(String packageName, int uid, String groupId);
diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
index 4ff75fa..293c59d 100644
--- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
+++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
@@ -145,10 +145,15 @@
         }
         // For carrier privileges, this can include user-installed apps. This is essentially a
         // function of the current active SIM(s) in the device to let carrier apps through.
-        if (checkCarrierPrivileges
-                && mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(callingPackage)
-                        == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
-            return;
+        final long token = Binder.clearCallingIdentity();
+        try {
+            if (checkCarrierPrivileges
+                    && mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(callingPackage)
+                            == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
+                return;
+            }
+        } finally {
+            Binder.restoreCallingIdentity(token);
         }
 
         String message =
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index 4f527f2..cd352b5 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -35,6 +35,7 @@
 import android.content.pm.parsing.component.ParsedIntentInfo;
 import android.content.pm.parsing.component.ParsedMainComponent;
 import android.content.pm.parsing.component.ParsedProvider;
+import android.os.Binder;
 import android.os.Process;
 import android.os.Trace;
 import android.os.UserHandle;
@@ -51,6 +52,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.function.QuadFunction;
 import com.android.server.FgThread;
 import com.android.server.compat.CompatChange;
 import com.android.server.om.OverlayReferenceMapper;
@@ -69,7 +71,6 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.concurrent.Executor;
-import java.util.function.Function;
 
 /**
  * The entity responsible for filtering visibility between apps based on declarations in their
@@ -1447,14 +1448,20 @@
 
     public void dumpQueries(
             PrintWriter pw, @Nullable Integer filteringAppId, DumpState dumpState, int[] users,
-            Function<Integer, String[]> getPackagesForUid) {
+            QuadFunction<Integer, Integer, Integer, Boolean, String[]> getPackagesForUid) {
         final SparseArray<String> cache = new SparseArray<>();
         ToString<Integer> expandPackages = input -> {
             String cachedValue = cache.get(input);
             if (cachedValue == null) {
-                final String[] packagesForUid = getPackagesForUid.apply(input);
+                final int callingUid = Binder.getCallingUid();
+                final int appId = UserHandle.getAppId(input);
+                String[] packagesForUid = null;
+                for (int i = 0, size = users.length; packagesForUid == null && i < size; i++) {
+                    packagesForUid = getPackagesForUid.apply(callingUid, users[i], appId,
+                            false /*isCallerInstantApp*/);
+                }
                 if (packagesForUid == null) {
-                    cachedValue = "[unknown app id " + input + "]";
+                    cachedValue = "[app id " + input + " not installed]";
                 } else {
                     cachedValue = packagesForUid.length == 1 ? packagesForUid[0]
                             : "[" + TextUtils.join(",", packagesForUid) + "]";
diff --git a/services/core/java/com/android/server/pm/IncrementalStates.java b/services/core/java/com/android/server/pm/IncrementalStates.java
index 4fd360b..7627281 100644
--- a/services/core/java/com/android/server/pm/IncrementalStates.java
+++ b/services/core/java/com/android/server/pm/IncrementalStates.java
@@ -16,13 +16,7 @@
 
 package com.android.server.pm;
 
-import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_OK;
-import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_UNHEALTHY;
-import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_STORAGE;
-import static android.os.incremental.IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_TRANSPORT;
-
 import android.content.pm.IncrementalStatesInfo;
-import android.content.pm.PackageManager;
 import android.os.Handler;
 import android.util.Slog;
 
@@ -30,17 +24,13 @@
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.function.pooled.PooledLambda;
 
-import java.util.function.Consumer;
-
 /**
  * Manages state transitions of a package installed on Incremental File System. Currently manages:
- * 1. startable state (whether a package is allowed to be launched), and
- * 2. loading state (whether a package is still loading or has been fully loaded).
+ * 1. loading state (whether a package is still loading or has been fully loaded).
  *
  * The following events might change the states of a package:
  * 1. Installation commit
- * 2. Incremental storage health changes
- * 4. Loading progress changes
+ * 2. Loading progress changes
  *
  * @hide
  */
@@ -50,41 +40,24 @@
     private final Handler mHandler = BackgroundThread.getHandler();
     private final Object mLock = new Object();
     @GuardedBy("mLock")
-    private int mStorageHealthStatus = HEALTH_STATUS_OK;
-    @GuardedBy("mLock")
     private final LoadingState mLoadingState;
     @GuardedBy("mLock")
-    private StartableState mStartableState;
-    @GuardedBy("mLock")
     private Callback mCallback = null;
-    private final Consumer<Integer> mStatusConsumer;
 
     public IncrementalStates() {
-        // By default the package is not startable and not fully loaded (i.e., is loading)
-        this(false, true, 0);
+        // By default the package is not fully loaded (i.e., is loading)
+        this(true, 0);
     }
 
-    public IncrementalStates(boolean isStartable, boolean isLoading, float loadingProgress) {
-        mStartableState = new StartableState(isStartable);
+    public IncrementalStates(boolean isLoading, float loadingProgress) {
         mLoadingState = new LoadingState(isLoading, loadingProgress);
-        mStatusConsumer = new StatusConsumer();
     }
 
     /**
-     * Callback interface to report that the startable state of this package has changed.
+     * Callback interface to report that the loading state of this package has changed.
      */
     public interface Callback {
         /**
-         * Reports that the package is now unstartable and the unstartable reason.
-         */
-        void onPackageUnstartable(int reason);
-
-        /**
-         * Reports that the package is now startable.
-         */
-        void onPackageStartable();
-
-        /**
          * Reports that package is fully loaded.
          */
         void onPackageFullyLoaded();
@@ -92,7 +65,7 @@
 
     /**
      * By calling this method, the caller indicates that package installation has just been
-     * committed. The package becomes startable. Set the initial loading state after the package
+     * committed. Set the initial loading state after the package
      * is committed. Incremental packages are by-default loading; non-Incremental packages are not.
      *
      * @param isIncremental whether a package is installed on Incremental or not.
@@ -101,66 +74,11 @@
         if (DEBUG) {
             Slog.i(TAG, "received package commit event");
         }
-        final boolean startableStateChanged;
-        synchronized (mLock) {
-            startableStateChanged = mStartableState.adoptNewStartableStateLocked(true);
-            if (!isIncremental) {
-                updateProgressLocked(1);
-            }
-        }
-        if (startableStateChanged) {
-            onStartableStateChanged();
-        }
         if (!isIncremental) {
-            onLoadingStateChanged();
-        }
-    }
-
-    /**
-     * Change the startable state if the app has crashed or ANR'd during loading.
-     * If the app is not loading (i.e., fully loaded), this event doesn't change startable state.
-     */
-    public void onCrashOrAnr() {
-        if (DEBUG) {
-            Slog.i(TAG, "received package crash or ANR event");
-        }
-        final boolean startableStateChanged;
-        synchronized (mLock) {
-            if (mStartableState.isStartable() && mLoadingState.isLoading()) {
-                // Changing from startable -> unstartable only if app is still loading.
-                startableStateChanged = mStartableState.adoptNewStartableStateLocked(false);
-            } else {
-                // If the app is fully loaded, the crash or ANR is caused by the app itself, so
-                // we do not change the startable state.
-                startableStateChanged = false;
+            synchronized (mLock) {
+                updateProgressLocked(1.0f);
             }
-        }
-        if (startableStateChanged) {
-            onStartableStateChanged();
-        }
-    }
-
-    private void onStartableStateChanged() {
-        // Disable startable state broadcasts
-        // TODO(b/171920377): completely remove unstartable state.
-    }
-
-    private void reportStartableState() {
-        final Callback callback;
-        final boolean startable;
-        final int reason;
-        synchronized (mLock) {
-            callback = mCallback;
-            startable = mStartableState.isStartable();
-            reason = mStartableState.getUnstartableReason();
-        }
-        if (callback == null) {
-            return;
-        }
-        if (startable) {
-            callback.onPackageStartable();
-        } else {
-            callback.onPackageUnstartable(reason);
+            onLoadingStateChanged();
         }
     }
 
@@ -180,38 +98,6 @@
         }
     }
 
-    private class StatusConsumer implements Consumer<Integer> {
-        @Override
-        public void accept(Integer storageStatus) {
-            final boolean startableStateChanged;
-            synchronized (mLock) {
-                if (!mLoadingState.isLoading()) {
-                    // Do nothing if the package is already fully loaded
-                    return;
-                }
-                mStorageHealthStatus = storageStatus;
-                startableStateChanged = updateStartableStateLocked();
-            }
-            if (startableStateChanged) {
-                onStartableStateChanged();
-            }
-        }
-    }
-
-    /**
-     * By calling this method, the caller indicates that there issues with the Incremental
-     * Storage,
-     * on which the package is installed. The state will change according to the status
-     * code defined in {@code IStorageHealthListener}.
-     */
-    public void onStorageHealthStatusChanged(int storageHealthStatus) {
-        if (DEBUG) {
-            Slog.i(TAG, "received storage health status changed event : storageHealthStatus="
-                    + storageHealthStatus);
-        }
-        mStatusConsumer.accept(storageHealthStatus);
-    }
-
     /**
      * Use the specified callback to report state changing events.
      *
@@ -227,25 +113,19 @@
     }
 
     /**
-     * Update the package loading progress to specified value. This might change startable state.
+     * Update the package loading progress to specified value.
      *
      * @param progress Value between [0, 1].
      */
     public void setProgress(float progress) {
         final boolean newLoadingState;
-        final boolean oldStartableState, newStartableState;
         synchronized (mLock) {
-            oldStartableState = mStartableState.isStartable();
             updateProgressLocked(progress);
             newLoadingState = mLoadingState.isLoading();
-            newStartableState = mStartableState.isStartable();
         }
         if (!newLoadingState) {
             onLoadingStateChanged();
         }
-        if (newStartableState != oldStartableState) {
-            onStartableStateChanged();
-        }
     }
 
     /**
@@ -253,41 +133,12 @@
      */
     public IncrementalStatesInfo getIncrementalStatesInfo() {
         synchronized (mLock) {
-            return new IncrementalStatesInfo(mStartableState.isStartable(),
+            return new IncrementalStatesInfo(
                     mLoadingState.isLoading(),
                     mLoadingState.getProgress());
         }
     }
 
-    /**
-     * Determine the next state based on the current state, current stream status and storage
-     * health
-     * status. If the next state is different from the current state, proceed with state
-     * change.
-     * @return True if the new startable state is different from the old one.
-     */
-    private boolean updateStartableStateLocked() {
-        final boolean currentState = mStartableState.isStartable();
-        boolean nextState = currentState;
-        if (!currentState) {
-            if (mStorageHealthStatus == HEALTH_STATUS_OK) {
-                // change from unstartable -> startable
-                nextState = true;
-            }
-        } else {
-            if (mStorageHealthStatus == HEALTH_STATUS_UNHEALTHY
-                    || mStorageHealthStatus == HEALTH_STATUS_UNHEALTHY_STORAGE
-                    || mStorageHealthStatus == HEALTH_STATUS_UNHEALTHY_TRANSPORT) {
-                // change from startable -> unstartable
-                nextState = false;
-            }
-        }
-        if (nextState == currentState) {
-            return false;
-        }
-        return mStartableState.adoptNewStartableStateLocked(nextState);
-    }
-
     private void updateProgressLocked(float progress) {
         if (DEBUG) {
             Slog.i(TAG, "received progress update: " + progress);
@@ -301,85 +152,6 @@
             if (mLoadingState.isLoading()) {
                 mLoadingState.adoptNewLoadingStateLocked(false);
             }
-            // Also updates startable state if necessary
-            if (!mStartableState.isStartable()) {
-                mStartableState.adoptNewStartableStateLocked(true);
-            }
-        }
-    }
-
-    private class StartableState {
-        private boolean mIsStartable;
-        private int mUnstartableReason = PackageManager.UNSTARTABLE_REASON_UNKNOWN;
-
-        StartableState(boolean isStartable) {
-            mIsStartable = isStartable;
-        }
-
-        public boolean isStartable() {
-            return mIsStartable;
-        }
-
-        public int getUnstartableReason() {
-            return mUnstartableReason;
-        }
-
-        /**
-         * Adopt new startable state if it is different from the current state.
-         * @param nextState True if startable, false if unstartable.
-         * @return True if the state has changed, false otherwise.
-         */
-        public boolean adoptNewStartableStateLocked(boolean nextState) {
-            if (mIsStartable == nextState) {
-                return false;
-            }
-            if (!nextState) {
-                // Do nothing if the next state is "unstartable"; keep package always startable.
-                // TODO(b/171920377): completely remove unstartable state.
-                if (DEBUG) {
-                    Slog.i(TAG, "Attempting to set startable state to false. Abort.");
-                }
-                return false;
-            }
-            if (DEBUG) {
-                Slog.i(TAG,
-                        "startable state changed from " + mIsStartable + " to " + nextState);
-            }
-            mIsStartable = nextState;
-            mUnstartableReason = getUnstartableReasonLocked();
-            return true;
-        }
-
-        private int getUnstartableReasonLocked() {
-            if (mIsStartable) {
-                return PackageManager.UNSTARTABLE_REASON_UNKNOWN;
-            }
-            // Translate stream status to reason for unstartable state
-            switch (mStorageHealthStatus) {
-                case HEALTH_STATUS_UNHEALTHY_STORAGE:
-                    return PackageManager.UNSTARTABLE_REASON_INSUFFICIENT_STORAGE;
-                case HEALTH_STATUS_UNHEALTHY_TRANSPORT:
-                    return PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR;
-                default:
-                    return PackageManager.UNSTARTABLE_REASON_UNKNOWN;
-            }
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (!(o instanceof StartableState)) {
-                return false;
-            }
-            StartableState l = (StartableState) o;
-            return l.mIsStartable == mIsStartable;
-        }
-
-        @Override
-        public int hashCode() {
-            return Boolean.hashCode(mIsStartable);
         }
     }
 
@@ -443,16 +215,11 @@
             return false;
         }
         IncrementalStates l = (IncrementalStates) o;
-        return l.mStorageHealthStatus == mStorageHealthStatus
-                && l.mStartableState.equals(mStartableState)
-                && l.mLoadingState.equals(mLoadingState);
+        return l.mLoadingState.equals(mLoadingState);
     }
 
     @Override
     public int hashCode() {
-        int hashCode = mStartableState.hashCode();
-        hashCode = 31 * hashCode + mLoadingState.hashCode();
-        hashCode = 31 * hashCode + mStorageHealthStatus;
-        return hashCode;
+        return mLoadingState.hashCode();
     }
 }
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index edd43af..47d1629 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -37,9 +37,11 @@
 import android.app.admin.DevicePolicyManager;
 import android.app.usage.UsageStatsManagerInternal;
 import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.IntentSender;
 import android.content.LocusId;
 import android.content.pm.ActivityInfo;
@@ -95,6 +97,7 @@
 import com.android.server.wm.ActivityTaskManagerInternal;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -146,10 +149,13 @@
         private final ActivityManagerInternal mActivityManagerInternal;
         private final ActivityTaskManagerInternal mActivityTaskManagerInternal;
         private final ShortcutServiceInternal mShortcutServiceInternal;
+        private final PackageManagerInternal mPackageManagerInternal;
         private final PackageCallbackList<IOnAppsChangedListener> mListeners
                 = new PackageCallbackList<IOnAppsChangedListener>();
         private final DevicePolicyManager mDpm;
 
+        private final PackageRemovedListener mPackageRemovedListener =
+                new PackageRemovedListener();
         private final MyPackageMonitor mPackageMonitor = new MyPackageMonitor();
 
         @GuardedBy("mListeners")
@@ -175,6 +181,8 @@
                     LocalServices.getService(ActivityTaskManagerInternal.class));
             mShortcutServiceInternal = Objects.requireNonNull(
                     LocalServices.getService(ShortcutServiceInternal.class));
+            mPackageManagerInternal = Objects.requireNonNull(
+                    LocalServices.getService(PackageManagerInternal.class));
             mShortcutServiceInternal.addListener(mPackageMonitor);
             mShortcutChangeHandler = new ShortcutChangeHandler(mUserManagerInternal);
             mShortcutServiceInternal.addShortcutChangeCallback(mShortcutChangeHandler);
@@ -294,6 +302,11 @@
          */
         private void startWatchingPackageBroadcasts() {
             if (!mIsWatchingPackageBroadcasts) {
+                final IntentFilter filter = new IntentFilter();
+                filter.addAction(Intent.ACTION_PACKAGE_REMOVED_INTERNAL);
+                filter.addDataScheme("package");
+                mContext.registerReceiverAsUser(mPackageRemovedListener, UserHandle.ALL, filter,
+                        /* broadcastPermission= */ null, mCallbackHandler);
                 mPackageMonitor.register(mContext, UserHandle.ALL, true, mCallbackHandler);
                 mIsWatchingPackageBroadcasts = true;
             }
@@ -307,6 +320,7 @@
                 Log.d(TAG, "Stopped watching for packages");
             }
             if (mIsWatchingPackageBroadcasts) {
+                mContext.unregisterReceiver(mPackageRemovedListener);
                 mPackageMonitor.unregister();
                 mIsWatchingPackageBroadcasts = false;
             }
@@ -395,9 +409,8 @@
             if (!canAccessProfile(user.getIdentifier(), "cannot get shouldHideFromSuggestions")) {
                 return false;
             }
-            final PackageManagerInternal pmi = LocalServices.getService(
-                    PackageManagerInternal.class);
-            int flags = pmi.getDistractingPackageRestrictions(packageName, user.getIdentifier());
+            final int flags = mPackageManagerInternal.getDistractingPackageRestrictions(packageName,
+                    user.getIdentifier());
             return (flags & PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS) != 0;
         }
 
@@ -433,16 +446,14 @@
 
                 final ArrayList<LauncherActivityInfoInternal> result = new ArrayList<>(
                         launcherActivities.getList());
-                final PackageManagerInternal pmInt =
-                        LocalServices.getService(PackageManagerInternal.class);
                 if (packageName != null) {
                     // If this hidden app should not be shown, return the original list.
                     // Otherwise, inject hidden activity that forwards user to app details page.
                     if (result.size() > 0) {
                         return launcherActivities;
                     }
-                    ApplicationInfo appInfo = pmInt.getApplicationInfo(packageName, /*flags*/ 0,
-                            callingUid, user.getIdentifier());
+                    final ApplicationInfo appInfo = mPackageManagerInternal.getApplicationInfo(
+                            packageName, /* flags= */ 0, callingUid, user.getIdentifier());
                     if (shouldShowSyntheticActivity(user, appInfo)) {
                         LauncherActivityInfoInternal info = getHiddenAppActivityInfo(packageName,
                                 callingUid, user);
@@ -456,8 +467,9 @@
                 for (LauncherActivityInfoInternal info : result) {
                     visiblePackages.add(info.getActivityInfo().packageName);
                 }
-                List<ApplicationInfo> installedPackages = pmInt.getInstalledApplications(0,
-                        user.getIdentifier(), callingUid);
+                final List<ApplicationInfo> installedPackages =
+                        mPackageManagerInternal.getInstalledApplications(/* flags= */ 0,
+                                user.getIdentifier(), callingUid);
                 for (ApplicationInfo applicationInfo : installedPackages) {
                     if (!visiblePackages.contains(applicationInfo.packageName)) {
                         if (!shouldShowSyntheticActivity(user, applicationInfo)) {
@@ -483,9 +495,7 @@
             if (isManagedProfileAdmin(user, appInfo.packageName)) {
                 return false;
             }
-            final PackageManagerInternal pmInt =
-                    LocalServices.getService(PackageManagerInternal.class);
-            final AndroidPackage pkg = pmInt.getPackage(appInfo.packageName);
+            final AndroidPackage pkg = mPackageManagerInternal.getPackage(appInfo.packageName);
             if (pkg == null) {
                 // Should not happen, but we shouldn't be failing if it does
                 return false;
@@ -501,13 +511,11 @@
         }
 
         private boolean hasDefaultEnableLauncherActivity(@NonNull String packageName) {
-            final PackageManagerInternal pmInt =
-                    LocalServices.getService(PackageManagerInternal.class);
             final Intent matchIntent = new Intent(Intent.ACTION_MAIN);
             matchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
             matchIntent.setPackage(packageName);
-            final List<ResolveInfo> infoList = pmInt.queryIntentActivities(matchIntent,
-                    matchIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
+            final List<ResolveInfo> infoList = mPackageManagerInternal.queryIntentActivities(
+                    matchIntent, matchIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
                     PackageManager.MATCH_DISABLED_COMPONENTS, Binder.getCallingUid(),
                     getCallingUserId());
             final int size = infoList.size();
@@ -548,9 +556,7 @@
             final int callingUid = injectBinderCallingUid();
             final long ident = Binder.clearCallingIdentity();
             try {
-                final PackageManagerInternal pmInt =
-                        LocalServices.getService(PackageManagerInternal.class);
-                final ActivityInfo activityInfo = pmInt.getActivityInfo(component,
+                final ActivityInfo activityInfo = mPackageManagerInternal.getActivityInfo(component,
                         PackageManager.MATCH_DIRECT_BOOT_AWARE
                                 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                         callingUid, user.getIdentifier());
@@ -561,8 +567,9 @@
                     // should not happen
                     return null;
                 }
-                final IncrementalStatesInfo incrementalStatesInfo = pmInt.getIncrementalStatesInfo(
-                            component.getPackageName(), callingUid, user.getIdentifier());
+                final IncrementalStatesInfo incrementalStatesInfo =
+                        mPackageManagerInternal.getIncrementalStatesInfo(component.getPackageName(),
+                                callingUid, user.getIdentifier());
                 if (incrementalStatesInfo == null) {
                     // package does not exist; should not happen
                     return null;
@@ -598,9 +605,7 @@
 
         private List<LauncherActivityInfoInternal> queryIntentLauncherActivities(
                 Intent intent, int callingUid, UserHandle user) {
-            final PackageManagerInternal pmInt =
-                    LocalServices.getService(PackageManagerInternal.class);
-            List<ResolveInfo> apps = pmInt.queryIntentActivities(intent,
+            final List<ResolveInfo> apps = mPackageManagerInternal.queryIntentActivities(intent,
                     intent.resolveTypeIfNeeded(mContext.getContentResolver()),
                     PackageManager.MATCH_DIRECT_BOOT_AWARE
                             | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
@@ -614,8 +619,9 @@
                     // should not happen
                     continue;
                 }
-                final IncrementalStatesInfo incrementalStatesInfo = pmInt.getIncrementalStatesInfo(
-                        packageName, callingUid, user.getIdentifier());
+                final IncrementalStatesInfo incrementalStatesInfo =
+                        mPackageManagerInternal.getIncrementalStatesInfo(packageName, callingUid,
+                                user.getIdentifier());
                 if (incrementalStatesInfo == null) {
                     // package doesn't exist any more; should not happen
                     continue;
@@ -639,15 +645,14 @@
             final int callingUid = injectBinderCallingUid();
             final long identity = Binder.clearCallingIdentity();
             try {
-                final PackageManagerInternal pmInt =
-                        LocalServices.getService(PackageManagerInternal.class);
                 Intent packageIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT)
                         .setPackage(component.getPackageName());
-                List<ResolveInfo> apps = pmInt.queryIntentActivities(packageIntent,
-                        packageIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
-                        PackageManager.MATCH_DIRECT_BOOT_AWARE
-                                | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
-                        callingUid, user.getIdentifier());
+                List<ResolveInfo> apps =
+                        mPackageManagerInternal.queryIntentActivities(packageIntent,
+                                packageIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
+                                PackageManager.MATCH_DIRECT_BOOT_AWARE
+                                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+                                callingUid, user.getIdentifier());
                 // ensure that the component is present in the list
                 if (!apps.stream().anyMatch(
                         ri -> component.getClassName().equals(ri.activityInfo.name))) {
@@ -712,9 +717,7 @@
             final int callingUid = injectBinderCallingUid();
             final long ident = Binder.clearCallingIdentity();
             try {
-                final PackageManagerInternal pmInt =
-                        LocalServices.getService(PackageManagerInternal.class);
-                PackageInfo info = pmInt.getPackageInfo(packageName,
+                final PackageInfo info = mPackageManagerInternal.getPackageInfo(packageName,
                         PackageManager.MATCH_DIRECT_BOOT_AWARE
                                 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                         callingUid, user.getIdentifier());
@@ -730,9 +733,8 @@
             if (!canAccessProfile(user.getIdentifier(), "Cannot get launcher extras")) {
                 return null;
             }
-            final PackageManagerInternal pmi =
-                    LocalServices.getService(PackageManagerInternal.class);
-            return pmi.getSuspendedPackageLauncherExtras(packageName, user.getIdentifier());
+            return mPackageManagerInternal.getSuspendedPackageLauncherExtras(packageName,
+                    user.getIdentifier());
         }
 
         @Override
@@ -746,10 +748,8 @@
             final int callingUid = injectBinderCallingUid();
             final long ident = Binder.clearCallingIdentity();
             try {
-                final PackageManagerInternal pmInt =
-                        LocalServices.getService(PackageManagerInternal.class);
-                ApplicationInfo info = pmInt.getApplicationInfo(packageName, flags,
-                        callingUid, user.getIdentifier());
+                final ApplicationInfo info = mPackageManagerInternal.getApplicationInfo(packageName,
+                        flags, callingUid, user.getIdentifier());
                 return info;
             } finally {
                 Binder.restoreCallingIdentity(ident);
@@ -1043,11 +1043,9 @@
                 return false;
             }
 
-            final PackageManagerInternal pmInt =
-                    LocalServices.getService(PackageManagerInternal.class);
             final int callingUid = injectBinderCallingUid();
-            final int state = pmInt.getComponentEnabledSetting(component, callingUid,
-                    user.getIdentifier());
+            final int state = mPackageManagerInternal.getComponentEnabledSetting(component,
+                    callingUid, user.getIdentifier());
             switch (state) {
                 case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT:
                     break; // Need to check the manifest's enabled state.
@@ -1061,7 +1059,7 @@
 
             final long ident = Binder.clearCallingIdentity();
             try {
-                ActivityInfo info = pmInt.getActivityInfo(component,
+                final ActivityInfo info = mPackageManagerInternal.getActivityInfo(component,
                         PackageManager.MATCH_DIRECT_BOOT_AWARE
                                 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                         callingUid, user.getIdentifier());
@@ -1160,12 +1158,11 @@
             final int callingUid = injectBinderCallingUid();
             final long ident = Binder.clearCallingIdentity();
             try {
-                final PackageManagerInternal pmInt =
-                        LocalServices.getService(PackageManagerInternal.class);
                 // Check that the component actually has Intent.CATEGORY_LAUCNCHER
                 // as calling startActivityAsUser ignores the category and just
                 // resolves based on the component if present.
-                List<ResolveInfo> apps = pmInt.queryIntentActivities(launchIntent,
+                final List<ResolveInfo> apps = mPackageManagerInternal.queryIntentActivities(
+                        launchIntent,
                         launchIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
                         PackageManager.MATCH_DIRECT_BOOT_AWARE
                                 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
@@ -1229,6 +1226,31 @@
                     user.getIdentifier(), debugMsg, false);
         }
 
+        /** Returns whether or not the result to the listener should be filtered. */
+        private boolean isPackageVisibleToListener(String packageName, BroadcastCookie cookie) {
+            return !mPackageManagerInternal.filterAppAccess(packageName, cookie.callingUid,
+                    cookie.user.getIdentifier());
+        }
+
+        /** Returns whether or not the given UID is in allow list */
+        private static boolean isCallingUidAllowed(int[] allowList, int callingUid) {
+            if (allowList == null) {
+                return true;
+            }
+            return Arrays.binarySearch(allowList, callingUid) > -1;
+        }
+
+        private String[] getFilteredPackageNames(String[] packageNames, BroadcastCookie cookie) {
+            final List<String> filteredPackageNames = new ArrayList<>();
+            for (String packageName : packageNames) {
+                if (!isPackageVisibleToListener(packageName, cookie)) {
+                    continue;
+                }
+                filteredPackageNames.add(packageName);
+            }
+            return filteredPackageNames.toArray(new String[filteredPackageNames.size()]);
+        }
+
         private int toShortcutsCacheFlags(int cacheFlags) {
             int ret = 0;
             if (cacheFlags == FLAG_CACHE_NOTIFICATION_SHORTCUTS) {
@@ -1253,19 +1275,17 @@
          * loaded, register loading progress listener.
          */
         void registerLoadingProgressForIncrementalApps() {
-            final PackageManagerInternal pmInt =
-                    LocalServices.getService(PackageManagerInternal.class);
             final List<UserHandle> users = mUm.getUserProfiles();
             if (users == null) {
                 return;
             }
             for (UserHandle user : users) {
-                pmInt.forEachInstalledPackage(pkg -> {
+                mPackageManagerInternal.forEachInstalledPackage(pkg -> {
                     final String packageName = pkg.getPackageName();
-                    if (pmInt.getIncrementalStatesInfo(packageName, Process.myUid(),
-                            user.getIdentifier()).isLoading()) {
-                        pmInt.registerInstalledLoadingProgressCallback(packageName,
-                                new PackageLoadingProgressCallback(packageName, user),
+                    if (mPackageManagerInternal.getIncrementalStatesInfo(packageName,
+                            Process.myUid(), user.getIdentifier()).isLoading()) {
+                        mPackageManagerInternal.registerInstalledLoadingProgressCallback(
+                                packageName, new PackageLoadingProgressCallback(packageName, user),
                                 user.getIdentifier());
                     }
                 }, user.getIdentifier());
@@ -1398,6 +1418,59 @@
             }
         }
 
+        private class PackageRemovedListener extends BroadcastReceiver {
+
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
+                        UserHandle.USER_NULL);
+                if (userId == UserHandle.USER_NULL) {
+                    Slog.w(TAG, "Intent broadcast does not contain user handle: " + intent);
+                    return;
+                }
+                final String action = intent.getAction();
+                // Handle onPackageRemoved.
+                if (Intent.ACTION_PACKAGE_REMOVED_INTERNAL.equals(action)) {
+                    final String packageName = getPackageName(intent);
+                    final int[] allowList =
+                            intent.getIntArrayExtra(Intent.EXTRA_VISIBILITY_ALLOW_LIST);
+                    // If {@link #EXTRA_REPLACING} is true, that will be onPackageChanged case.
+                    if (packageName != null && !intent.getBooleanExtra(
+                            Intent.EXTRA_REPLACING, /* defaultValue= */ false)) {
+                        final UserHandle user = new UserHandle(userId);
+                        final int n = mListeners.beginBroadcast();
+                        try {
+                            for (int i = 0; i < n; i++) {
+                                final IOnAppsChangedListener listener =
+                                        mListeners.getBroadcastItem(i);
+                                final BroadcastCookie cookie =
+                                        (BroadcastCookie) mListeners.getBroadcastCookie(i);
+                                if (!isEnabledProfileOf(cookie.user, user, "onPackageRemoved")) {
+                                    continue;
+                                }
+                                if (!isCallingUidAllowed(allowList, cookie.callingUid)) {
+                                    continue;
+                                }
+                                try {
+                                    listener.onPackageRemoved(user, packageName);
+                                } catch (RemoteException re) {
+                                    Slog.d(TAG, "Callback failed ", re);
+                                }
+                            }
+                        } finally {
+                            mListeners.finishBroadcast();
+                        }
+                    }
+                }
+            }
+
+            private String getPackageName(Intent intent) {
+                final Uri uri = intent.getData();
+                final String pkg = uri != null ? uri.getSchemeSpecificPart() : null;
+                return pkg;
+            }
+        }
+
         private class MyPackageMonitor extends PackageMonitor implements ShortcutChangeListener {
 
             // TODO Simplify with lambdas.
@@ -1410,7 +1483,12 @@
                     for (int i = 0; i < n; i++) {
                         IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                         BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onPackageAdded")) continue;
+                        if (!isEnabledProfileOf(cookie.user, user, "onPackageAdded")) {
+                            continue;
+                        }
+                        if (!isPackageVisibleToListener(packageName, cookie)) {
+                            continue;
+                        }
                         try {
                             listener.onPackageAdded(user, packageName);
                         } catch (RemoteException re) {
@@ -1421,35 +1499,12 @@
                     mListeners.finishBroadcast();
                 }
                 super.onPackageAdded(packageName, uid);
-                PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
-                pmi.registerInstalledLoadingProgressCallback(packageName,
+                mPackageManagerInternal.registerInstalledLoadingProgressCallback(packageName,
                         new PackageLoadingProgressCallback(packageName, user),
                         user.getIdentifier());
             }
 
             @Override
-            public void onPackageRemoved(String packageName, int uid) {
-                UserHandle user = new UserHandle(getChangingUserId());
-                final int n = mListeners.beginBroadcast();
-                try {
-                    for (int i = 0; i < n; i++) {
-                        IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
-                        BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onPackageRemoved")) continue;
-                        try {
-                            listener.onPackageRemoved(user, packageName);
-                        } catch (RemoteException re) {
-                            Slog.d(TAG, "Callback failed ", re);
-                        }
-                    }
-                } finally {
-                    mListeners.finishBroadcast();
-                }
-
-                super.onPackageRemoved(packageName, uid);
-            }
-
-            @Override
             public void onPackageModified(String packageName) {
                 onPackageChanged(packageName);
                 super.onPackageModified(packageName);
@@ -1462,7 +1517,12 @@
                     for (int i = 0; i < n; i++) {
                         IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                         BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onPackageModified")) continue;
+                        if (!isEnabledProfileOf(cookie.user, user, "onPackageModified")) {
+                            continue;
+                        }
+                        if (!isPackageVisibleToListener(packageName, cookie)) {
+                            continue;
+                        }
                         try {
                             listener.onPackageChanged(user, packageName);
                         } catch (RemoteException re) {
@@ -1482,9 +1542,16 @@
                     for (int i = 0; i < n; i++) {
                         IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                         BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesAvailable")) continue;
+                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesAvailable")) {
+                            continue;
+                        }
+                        final String[] filteredPackages = getFilteredPackageNames(packages, cookie);
+                        // If all packages are filtered, skip notifying listener.
+                        if (ArrayUtils.isEmpty(filteredPackages)) {
+                            continue;
+                        }
                         try {
-                            listener.onPackagesAvailable(user, packages, isReplacing());
+                            listener.onPackagesAvailable(user, filteredPackages, isReplacing());
                         } catch (RemoteException re) {
                             Slog.d(TAG, "Callback failed ", re);
                         }
@@ -1504,9 +1571,16 @@
                     for (int i = 0; i < n; i++) {
                         IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                         BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesUnavailable")) continue;
+                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesUnavailable")) {
+                            continue;
+                        }
+                        final String[] filteredPackages = getFilteredPackageNames(packages, cookie);
+                        // If all packages are filtered, skip notifying listener.
+                        if (ArrayUtils.isEmpty(filteredPackages)) {
+                            continue;
+                        }
                         try {
-                            listener.onPackagesUnavailable(user, packages, isReplacing());
+                            listener.onPackagesUnavailable(user, filteredPackages, isReplacing());
                         } catch (RemoteException re) {
                             Slog.d(TAG, "Callback failed ", re);
                         }
@@ -1521,12 +1595,12 @@
             @Override
             public void onPackagesSuspended(String[] packages) {
                 UserHandle user = new UserHandle(getChangingUserId());
-                PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
                 final ArrayList<Pair<String, Bundle>> packagesWithExtras = new ArrayList<>();
                 final ArrayList<String> packagesWithoutExtras = new ArrayList<>();
                 for (String pkg : packages) {
-                    final Bundle launcherExtras = pmi.getSuspendedPackageLauncherExtras(pkg,
-                            user.getIdentifier());
+                    final Bundle launcherExtras =
+                            mPackageManagerInternal.getSuspendedPackageLauncherExtras(pkg,
+                                    user.getIdentifier());
                     if (launcherExtras != null) {
                         packagesWithExtras.add(new Pair<>(pkg, launcherExtras));
                     } else {
@@ -1540,11 +1614,23 @@
                     for (int i = 0; i < n; i++) {
                         IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                         BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesSuspended")) continue;
+                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesSuspended")) {
+                            continue;
+                        }
+                        final String[] filteredPackagesWithoutExtras =
+                                getFilteredPackageNames(packages, cookie);
+                        // If all packages are filtered, skip notifying listener.
+                        if (ArrayUtils.isEmpty(filteredPackagesWithoutExtras)) {
+                            continue;
+                        }
                         try {
-                            listener.onPackagesSuspended(user, packagesNullExtras, null);
+                            listener.onPackagesSuspended(user, filteredPackagesWithoutExtras,
+                                    /* launcherExtras= */ null);
                             for (int idx = 0; idx < packagesWithExtras.size(); idx++) {
                                 Pair<String, Bundle> packageExtraPair = packagesWithExtras.get(idx);
+                                if (!isPackageVisibleToListener(packageExtraPair.first, cookie)) {
+                                    continue;
+                                }
                                 listener.onPackagesSuspended(user,
                                         new String[]{packageExtraPair.first},
                                         packageExtraPair.second);
@@ -1566,9 +1652,16 @@
                     for (int i = 0; i < n; i++) {
                         IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                         BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesUnsuspended")) continue;
+                        if (!isEnabledProfileOf(cookie.user, user, "onPackagesUnsuspended")) {
+                            continue;
+                        }
+                        final String[] filteredPackages = getFilteredPackageNames(packages, cookie);
+                        // If all packages are filtered, skip notifying listener.
+                        if (ArrayUtils.isEmpty(filteredPackages)) {
+                            continue;
+                        }
                         try {
-                            listener.onPackagesUnsuspended(user, packages);
+                            listener.onPackagesUnsuspended(user, filteredPackages);
                         } catch (RemoteException re) {
                             Slog.d(TAG, "Callback failed ", re);
                         }
@@ -1595,8 +1688,12 @@
                     for (int i = 0; i < n; i++) {
                         IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
                         BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
-                        if (!isEnabledProfileOf(cookie.user, user, "onShortcutChanged")) continue;
-
+                        if (!isEnabledProfileOf(cookie.user, user, "onShortcutChanged")) {
+                            continue;
+                        }
+                        if (!isPackageVisibleToListener(packageName, cookie)) {
+                            continue;
+                        }
                         final int launcherUserId = cookie.user.getIdentifier();
 
                         // Make sure the caller has the permission.
@@ -1668,6 +1765,9 @@
                         if (!isEnabledProfileOf(cookie.user, mUser, "onLoadingProgressChanged")) {
                             continue;
                         }
+                        if (!isPackageVisibleToListener(mPackageName, cookie)) {
+                            continue;
+                        }
                         try {
                             listener.onPackageLoadingProgressChanged(mUser, mPackageName, progress);
                         } catch (RemoteException re) {
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index fa126a4..131539e 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -80,6 +80,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 
 /**
  * Helper class for running dexopt command on packages.
@@ -104,6 +105,8 @@
 
     private final ArtStatsLogger mArtStatsLogger = new ArtStatsLogger();
 
+    private static final Random sRandom = new Random();
+
     PackageDexOptimizer(Installer installer, Object installLock, Context context,
             String wakeLockTag) {
         this.mInstaller = installer;
@@ -262,7 +265,7 @@
                 if (packageStats != null) {
                     Trace.traceBegin(Trace.TRACE_TAG_PACKAGE_MANAGER, "dex2oat-metrics");
                     try {
-                        long sessionId = Math.randomLongInternal();
+                        long sessionId = sRandom.nextLong();
                         ArtStatsLogUtils.writeStatsLog(
                                 mArtStatsLogger,
                                 sessionId,
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 27077b6..656f347 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -584,12 +584,16 @@
 
             params.installFlags &= ~PackageManager.INSTALL_FROM_ADB;
             params.installFlags &= ~PackageManager.INSTALL_ALL_USERS;
-            params.installFlags &= ~PackageManager.INSTALL_ALLOW_TEST;
             params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
             if ((params.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0
                     && !mPm.isCallerVerifier(callingUid)) {
                 params.installFlags &= ~PackageManager.INSTALL_VIRTUAL_PRELOAD;
             }
+            if (mContext.checkCallingOrSelfPermission(
+                    Manifest.permission.INSTALL_TEST_ONLY_PACKAGE)
+                    != PackageManager.PERMISSION_GRANTED) {
+                params.installFlags &= ~PackageManager.INSTALL_ALLOW_TEST;
+            }
         }
 
         String originatingPackageName = null;
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index b6a65dd..bf114d8 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -883,6 +883,14 @@
         return isDataLoaderInstallation() && params.dataLoaderParams.getType() == INCREMENTAL;
     }
 
+    private boolean isSystemDataLoaderInstallation() {
+        if (!isDataLoaderInstallation()) {
+            return false;
+        }
+        return SYSTEM_DATA_LOADER_PACKAGE.equals(
+                this.params.dataLoaderParams.getComponentName().getPackageName());
+    }
+
     /**
      * @return {@code true} iff the installing is app an device owner or affiliated profile owner.
      */
@@ -928,7 +936,7 @@
 
         final boolean forcePermissionPrompt =
                 (params.installFlags & PackageManager.INSTALL_FORCE_PERMISSION_PROMPT) != 0
-                        || params.requireUserAction == SessionInfo.USER_ACTION_REQUIRED;
+                        || params.requireUserAction == SessionParams.USER_ACTION_REQUIRED;
         if (forcePermissionPrompt) {
             return USER_ACTION_REQUIRED;
         }
@@ -977,7 +985,7 @@
             return USER_ACTION_REQUIRED;
         }
 
-        if (params.requireUserAction == SessionInfo.USER_ACTION_NOT_REQUIRED
+        if (params.requireUserAction == SessionParams.USER_ACTION_NOT_REQUIRED
                 && isUpdateWithoutUserActionPermissionGranted
                 && (isInstallerOfRecord || isSelfUpdate)) {
             return USER_ACTION_PENDING_APK_PARSING;
@@ -1058,9 +1066,7 @@
                         "DataLoader installation of APEX modules is not allowed.");
             }
 
-            boolean systemDataLoader = SYSTEM_DATA_LOADER_PACKAGE.equals(
-                    this.params.dataLoaderParams.getComponentName().getPackageName());
-            if (systemDataLoader && mContext.checkCallingOrSelfPermission(
+            if (isSystemDataLoaderInstallation() && mContext.checkCallingOrSelfPermission(
                     Manifest.permission.USE_SYSTEM_DATA_LOADERS)
                     != PackageManager.PERMISSION_GRANTED) {
                 throw new SecurityException("You need the "
@@ -2107,6 +2113,23 @@
         dispatchSessionFinished(error, detailedMessage, null);
     }
 
+    private void onSystemDataLoaderUnrecoverable() {
+        final PackageManagerService packageManagerService = mPm;
+        final String packageName = mPackageName;
+        if (TextUtils.isEmpty(packageName)) {
+            // The package has not been installed.
+            return;
+        }
+        mHandler.post(() -> {
+            if (packageManagerService.deletePackageX(packageName,
+                    PackageManager.VERSION_CODE_HIGHEST, UserHandle.USER_SYSTEM,
+                    PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/)
+                    != PackageManager.DELETE_SUCCEEDED) {
+                Slog.e(TAG, "Failed to uninstall package with failed dataloader: " + packageName);
+            }
+        });
+    }
+
     /**
      * If session should be sealed, then it's sealed to prevent further modification.
      * If the session can't be sealed then it's destroyed.
@@ -3740,6 +3763,7 @@
 
         final DataLoaderParams params = this.params.dataLoaderParams;
         final boolean manualStartAndDestroy = !isIncrementalInstallation();
+        final boolean systemDataLoader = isSystemDataLoaderInstallation();
         final IDataLoaderStatusListener statusListener = new IDataLoaderStatusListener.Stub() {
             @Override
             public void onStatusChanged(int dataLoaderId, int status) {
@@ -3751,10 +3775,15 @@
                 }
 
                 if (mDestroyed || mDataLoaderFinished) {
-                    // No need to worry about post installation
+                    switch (status) {
+                        case IDataLoaderStatusListener.DATA_LOADER_UNRECOVERABLE:
+                            if (systemDataLoader) {
+                                onSystemDataLoaderUnrecoverable();
+                            }
+                            return;
+                    }
                     return;
                 }
-
                 try {
                     IDataLoader dataLoader = dataLoaderManager.getDataLoader(dataLoaderId);
                     if (dataLoader == null) {
@@ -3838,13 +3867,6 @@
                     sendPendingStreaming(mContext, statusReceiver, sessionId, e.getMessage());
                 }
             }
-            @Override
-            public void reportStreamHealth(int dataLoaderId, int streamStatus) {
-                // Currently the stream status is not used during package installation. It is
-                // technically possible for the data loader to report stream status via this
-                // callback, but if something is wrong with the streaming, it is more likely that
-                // prepareDataLoaderLocked will return false and the installation will be aborted.
-            }
         };
 
         if (!manualStartAndDestroy) {
@@ -3855,14 +3877,18 @@
             healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS;
             healthCheckParams.unhealthyMonitoringMs = INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS;
 
-            final boolean systemDataLoader = SYSTEM_DATA_LOADER_PACKAGE.equals(
-                    params.getComponentName().getPackageName());
-
             final IStorageHealthListener healthListener = new IStorageHealthListener.Stub() {
                 @Override
                 public void onHealthStatus(int storageId, int status) {
                     if (mDestroyed || mDataLoaderFinished) {
-                        // No need to worry about post installation
+                        // App's installed.
+                        switch (status) {
+                            case IStorageHealthListener.HEALTH_STATUS_UNHEALTHY:
+                                if (systemDataLoader) {
+                                    onSystemDataLoaderUnrecoverable();
+                                }
+                                return;
+                        }
                         return;
                     }
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3c4a304..9a3fe82 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -287,11 +287,9 @@
 import android.os.Trace;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.os.incremental.IStorageHealthListener;
 import android.os.incremental.IncrementalManager;
 import android.os.incremental.IncrementalStorage;
 import android.os.incremental.PerUidReadTimeouts;
-import android.os.incremental.StorageHealthCheckParams;
 import android.os.storage.DiskInfo;
 import android.os.storage.IStorageManager;
 import android.os.storage.StorageEventListener;
@@ -818,14 +816,6 @@
 
     private static final String RANDOM_DIR_PREFIX = "~~";
 
-    /**
-     * Timeout configurations for incremental storage health monitor.
-     * See {@link IStorageHealthListener}
-     */
-    private static final int INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS = 2000;
-    private static final int INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS = 7000;
-    private static final int INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS = 60000;
-
     final Handler mHandler;
 
     private final ProcessLoggingHandler mProcessLoggingHandler;
@@ -4629,7 +4619,7 @@
                     Integer filteringAppId = setting == null ? null : setting.appId;
                     mAppsFilter.dumpQueries(
                             pw, filteringAppId, dumpState, mUserManager.getUserIds(),
-                            this::getPackagesForUid);
+                            this::getPackagesForUidInternalBody);
                     break;
                 }
 
@@ -4893,6 +4883,11 @@
                 return super.filterAppAccess(packageName, callingUid, userId);
             }
         }
+        public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
+            synchronized (mLock) {
+                super.dump(type, fd, pw, dumpState);
+            }
+        }
     }
 
 
@@ -11647,15 +11642,7 @@
         }
         if (mIncrementalManager != null && isIncrementalPath(parsedPackage.getPath())) {
             if (pkgSetting != null && pkgSetting.isPackageLoading()) {
-                final StorageHealthCheckParams healthCheckParams = new StorageHealthCheckParams();
-                healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS;
-                healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS;
-                healthCheckParams.unhealthyMonitoringMs =
-                        INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS;
-                // Continue monitoring health and loading progress of active incremental packages
-                mIncrementalManager.registerHealthListener(parsedPackage.getPath(),
-                        healthCheckParams,
-                        new IncrementalHealthListener(parsedPackage.getPackageName()));
+                // Continue monitoring loading progress of active incremental packages
                 final IncrementalStatesCallback incrementalStatesCallback =
                         new IncrementalStatesCallback(parsedPackage.getPackageName(),
                                 UserHandle.getUid(UserHandle.USER_ALL, pkgSetting.appId),
@@ -15051,6 +15038,9 @@
                 uid = UserHandle.getUid(id, UserHandle.getAppId(uid));
                 intent.putExtra(Intent.EXTRA_UID, uid);
             }
+            if (broadcastAllowList != null && PLATFORM_PACKAGE_NAME.equals(targetPkg)) {
+                intent.putExtra(Intent.EXTRA_VISIBILITY_ALLOW_LIST, broadcastAllowList.get(id));
+            }
             intent.putExtra(Intent.EXTRA_USER_HANDLE, id);
             intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT | flags);
             if (DEBUG_BROADCASTS) {
@@ -18480,16 +18470,6 @@
                     ps.setIncrementalStatesCallback(incrementalStatesCallback);
                     mIncrementalManager.registerLoadingProgressCallback(codePath,
                             new IncrementalProgressListener(ps.name));
-                    final IncrementalHealthListener incrementalHealthListener =
-                            new IncrementalHealthListener(ps.name);
-                    final StorageHealthCheckParams healthCheckParams =
-                            new StorageHealthCheckParams();
-                    healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS;
-                    healthCheckParams.unhealthyTimeoutMs = INCREMENTAL_STORAGE_UNHEALTHY_TIMEOUT_MS;
-                    healthCheckParams.unhealthyMonitoringMs =
-                            INCREMENTAL_STORAGE_UNHEALTHY_MONITORING_MS;
-                    mIncrementalManager.registerHealthListener(codePath, healthCheckParams,
-                            incrementalHealthListener);
                 }
 
                 // Ensure that the uninstall reason is UNKNOWN for users with the package installed.
@@ -19481,65 +19461,11 @@
                         ps, mInstalledUserIds, mSettings.getPackagesLocked());
                 codePath = ps.getPathString();
             }
-            Bundle extras = new Bundle();
-            extras.putInt(Intent.EXTRA_UID, mUid);
-            extras.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
-            sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_LOADED, mPackageName,
-                    extras, 0 /*flags*/,
-                    null /*targetPackage*/, null /*finishedReceiver*/,
-                    mInstalledUserIds, null /* instantUserIds */, newBroadcastAllowList, null);
             // Unregister progress listener
             mIncrementalManager.unregisterLoadingProgressCallbacks(codePath);
-            // Unregister health listener as it will always be healthy from now
-            mIncrementalManager.unregisterHealthListener(codePath);
             // Make sure the information is preserved
             scheduleWriteSettingsLocked();
         }
-
-        @Override
-        public void onPackageUnstartable(int reason) {
-            final SparseArray<int[]> newBroadcastAllowList;
-            synchronized (mLock) {
-                final PackageSetting ps = mSettings.getPackageLPr(mPackageName);
-                if (ps == null) {
-                    return;
-                }
-                newBroadcastAllowList = mAppsFilter.getVisibilityAllowList(
-                        ps, mInstalledUserIds, mSettings.getPackagesLocked());
-            }
-            Bundle extras = new Bundle();
-            extras.putInt(Intent.EXTRA_UID, mUid);
-            extras.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
-            extras.putInt(Intent.EXTRA_UNSTARTABLE_REASON, reason);
-            // send broadcast to users with this app installed
-            sendPackageBroadcast(Intent.ACTION_PACKAGE_UNSTARTABLE, mPackageName,
-                    extras, 0 /*flags*/,
-                    null /*targetPackage*/, null /*finishedReceiver*/,
-                    mInstalledUserIds, null /* instantUserIds */,
-                    newBroadcastAllowList, null);
-        }
-
-        @Override
-        public void onPackageStartable() {
-            final SparseArray<int[]> newBroadcastAllowList;
-            synchronized (mLock) {
-                final PackageSetting ps = mSettings.getPackageLPr(mPackageName);
-                if (ps == null) {
-                    return;
-                }
-                newBroadcastAllowList = mAppsFilter.getVisibilityAllowList(
-                        ps, mInstalledUserIds, mSettings.getPackagesLocked());
-            }
-            Bundle extras = new Bundle();
-            extras.putInt(Intent.EXTRA_UID, mUid);
-            extras.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
-            // send broadcast to users with this app installed
-            sendPackageBroadcast(Intent.ACTION_PACKAGE_STARTABLE, mPackageName,
-                    extras, 0 /*flags*/,
-                    null /*targetPackage*/, null /*finishedReceiver*/,
-                    mInstalledUserIds, null /* instantUserIds */,
-                    newBroadcastAllowList, null);
-        }
     }
 
     /**
@@ -19564,29 +19490,6 @@
         }
     }
 
-    /**
-     * Incremental storage health status callback, used to listen for monitoring changes and update
-     * package setting.
-     */
-    private class IncrementalHealthListener extends IStorageHealthListener.Stub {
-        private final String mPackageName;
-        IncrementalHealthListener(String packageName) {
-            mPackageName = packageName;
-        }
-
-        @Override
-        public void onHealthStatus(int storageId, int status) throws RemoteException {
-            final PackageSetting ps;
-            synchronized (mLock) {
-                ps = mSettings.getPackageLPr(mPackageName);
-            }
-            if (ps == null) {
-                return;
-            }
-            ps.setStorageHealthStatus(status);
-        }
-    }
-
     @Nullable PackageSetting getPackageSettingForUser(String packageName, int callingUid,
             int userId) {
         final PackageSetting ps;
@@ -21106,6 +21009,10 @@
                             removedPackage, extras, 0 /*flags*/,
                             installerPackageName, null, broadcastUsers, instantUserIds, null, null);
                 }
+                packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED_INTERNAL,
+                        removedPackage, extras, 0 /*flags*/, PLATFORM_PACKAGE_NAME,
+                        null /*finishedReceiver*/, broadcastUsers, instantUserIds,
+                        broadcastAllowList, null /*bOptions*/);
                 if (dataRemoved && !isRemovedPackageSystemUpdate) {
                     packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_REMOVED,
                             removedPackage, extras, Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, null,
@@ -21725,7 +21632,8 @@
                     null /*disabledComponents*/,
                     PackageManager.INSTALL_REASON_UNKNOWN,
                     PackageManager.UNINSTALL_REASON_UNKNOWN,
-                    null /*harmfulAppWarning*/);
+                    null /*harmfulAppWarning*/,
+                    null /*splashScreenTheme*/);
         }
         mSettings.writeKernelMappingLPr(ps);
     }
@@ -23456,7 +23364,7 @@
         // writer
         synchronized (mLock) {
             final PackageSetting ps = mSettings.getPackageLPr(packageName);
-            if (ps.getStopped(userId) && !stopped) {
+            if (ps != null && ps.getStopped(userId) && !stopped) {
                 shouldUnhibernate = true;
             }
             if (!shouldFilterApplicationLocked(ps, callingUid, userId)
@@ -26116,7 +26024,11 @@
 
         @Override
         public String[] getNamesForUids(int[] uids) throws RemoteException {
-            final String[] results = PackageManagerService.this.getNamesForUids(uids);
+            if (uids == null || uids.length == 0) {
+                return null;
+            }
+            final String[] names = PackageManagerService.this.getNamesForUids(uids);
+            final String[] results = (names != null) ? names : new String[uids.length];
             // massage results so they can be parsed by the native binder
             for (int i = results.length - 1; i >= 0; --i) {
                 if (results[i] == null) {
@@ -27317,20 +27229,6 @@
         }
 
         @Override
-        public void notifyPackageCrashOrAnr(@NonNull String packageName) {
-            final PackageSetting ps;
-            synchronized (mLock) {
-                ps = mSettings.getPackageLPr(packageName);
-                if (ps == null) {
-                    Slog.w(TAG, "Failed notifyPackageCrash. Package " + packageName
-                            + " is not installed");
-                    return;
-                }
-            }
-            ps.setStatesOnCrashOrAnr();
-        }
-
-        @Override
         public void requestChecksums(@NonNull String packageName, boolean includeSplits,
                 @Checksum.Type int optional, @Checksum.Type int required,
                 @Nullable List trustedInstallers,
@@ -27809,6 +27707,23 @@
         return mSettings.getPackageLPr(packageName).getMimeGroup(mimeGroup);
     }
 
+    @Override
+    public void setSplashScreenTheme(@NonNull String packageName, @Nullable String themeId,
+            int userId) {
+        int callingUid = Binder.getCallingUid();
+        PackageSetting packageSetting = getPackageSettingForUser(packageName, callingUid, userId);
+        if (packageSetting != null) {
+            packageSetting.setSplashScreenTheme(userId, themeId);
+        }
+    }
+
+    @Override
+    public String getSplashScreenTheme(@NonNull String packageName, int userId) {
+        int callingUid = Binder.getCallingUid();
+        PackageSetting packageSetting = getPackageSettingForUser(packageName, callingUid, userId);
+        return packageSetting != null ? packageSetting.getSplashScreenTheme(userId) : null;
+    }
+
     /**
      * Temporary method that wraps mSettings.writeLPr() and calls mPermissionManager's
      * writeLegacyPermissionsTEMP() beforehand.
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index ca5d2b4..81ea465 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -344,7 +344,6 @@
                     installSource.originatingPackageName);
             proto.end(sourceToken);
         }
-        proto.write(PackageProto.StatesProto.IS_STARTABLE, isPackageStartable());
         proto.write(PackageProto.StatesProto.IS_LOADING, isPackageLoading());
         writeUsersInfoToProto(proto, PackageProto.USERS);
         writePackageUserPermissionsProto(proto, PackageProto.USER_PERMISSIONS, users, dataProvider);
diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java
index 38e100e..731d41c 100644
--- a/services/core/java/com/android/server/pm/PackageSettingBase.java
+++ b/services/core/java/com/android/server/pm/PackageSettingBase.java
@@ -493,7 +493,8 @@
             ArrayMap<String, PackageUserState.SuspendParams> suspendParams, boolean instantApp,
             boolean virtualPreload, String lastDisableAppCaller,
             ArraySet<String> enabledComponents, ArraySet<String> disabledComponents,
-            int installReason, int uninstallReason, String harmfulAppWarning) {
+            int installReason, int uninstallReason, String harmfulAppWarning,
+            String splashScreenTheme) {
         PackageUserState state = modifyUserState(userId);
         state.ceDataInode = ceDataInode;
         state.enabled = enabled;
@@ -512,6 +513,7 @@
         state.instantApp = instantApp;
         state.virtualPreload = virtualPreload;
         state.harmfulAppWarning = harmfulAppWarning;
+        state.splashScreenTheme = splashScreenTheme;
         onChanged();
     }
 
@@ -522,7 +524,8 @@
                 otherState.instantApp,
                 otherState.virtualPreload, otherState.lastDisableAppCaller,
                 otherState.enabledComponents, otherState.disabledComponents,
-                otherState.installReason, otherState.uninstallReason, otherState.harmfulAppWarning);
+                otherState.installReason, otherState.uninstallReason, otherState.harmfulAppWarning,
+                otherState.splashScreenTheme);
     }
 
     ArraySet<String> getEnabledComponents(int userId) {
@@ -723,10 +726,23 @@
     }
 
     /**
-     * @return True if package is startable, false otherwise.
+     * @param userId    the specified user to modify the theme for
+     * @param themeName the theme name to persist
+     * @see android.window.SplashScreen#setSplashScreenTheme(int)
      */
-    public boolean isPackageStartable() {
-        return getIncrementalStates().isStartable();
+    public void setSplashScreenTheme(@UserIdInt int userId, @Nullable String themeName) {
+        modifyUserState(userId).splashScreenTheme = themeName;
+    }
+
+    /**
+     * @param userId the specified user to get the theme setting from
+     * @return the theme name previously persisted for the user or null
+     * if no splashscreen theme is persisted.
+     * @see android.window.SplashScreen#setSplashScreenTheme(int)
+     */
+    @Nullable
+    public String getSplashScreenTheme(@UserIdInt int userId) {
+        return readUserState(userId).splashScreenTheme;
     }
 
     /**
@@ -745,8 +761,8 @@
 
     /**
      * Called to indicate that the package installation has been committed. This will create a
-     * new startable state and a new loading state with default values. By default, the package is
-     * startable after commit. For a package installed on Incremental, the loading state is true.
+     * new loading state with default values.
+     * For a package installed on Incremental, the loading state is true.
      * For non-Incremental packages, the loading state is false.
      */
     public void setStatesOnCommit() {
@@ -754,15 +770,7 @@
     }
 
     /**
-     * Called to indicate that the running app has crashed or ANR'd. This might change the startable
-     * state of the package, depending on whether the package is fully loaded.
-     */
-    public void setStatesOnCrashOrAnr() {
-        incrementalStates.onCrashOrAnr();
-    }
-
-    /**
-     * Called to set the callback to listen for startable state changes.
+     * Called to set the callback to listen for loading state changes.
      */
     public void setIncrementalStatesCallback(IncrementalStates.Callback callback) {
         incrementalStates.setCallback(callback);
@@ -776,13 +784,6 @@
         incrementalStates.setProgress(progress);
     }
 
-    /**
-     * @see IncrementalStates#onStorageHealthStatusChanged(int)
-     */
-    public void setStorageHealthStatus(int status) {
-        incrementalStates.onStorageHealthStatusChanged(status);
-    }
-
     public long getFirstInstallTime() {
         return firstInstallTime;
     }
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 24f3930..b6d4a5b 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -340,6 +340,7 @@
     private static final String ATTR_INSTANT_APP = "instant-app";
     private static final String ATTR_VIRTUAL_PRELOAD = "virtual-preload";
     private static final String ATTR_HARMFUL_APP_WARNING = "harmful-app-warning";
+    private static final String ATTR_SPLASH_SCREEN_THEME = "splash-screen-theme";
 
     private static final String ATTR_PACKAGE_NAME = "packageName";
     private static final String ATTR_FINGERPRINT = "fingerprint";
@@ -939,7 +940,9 @@
                                 null /*disabledComponents*/,
                                 PackageManager.INSTALL_REASON_UNKNOWN,
                                 PackageManager.UNINSTALL_REASON_UNKNOWN,
-                                null /*harmfulAppWarning*/);
+                                null, /*harmfulAppWarning*/
+                                null /*splashscreenTheme*/
+                        );
                     }
                 }
             }
@@ -1578,7 +1581,8 @@
                                 null /*disabledComponents*/,
                                 PackageManager.INSTALL_REASON_UNKNOWN,
                                 PackageManager.UNINSTALL_REASON_UNKNOWN,
-                                null /*harmfulAppWarning*/);
+                                null /*harmfulAppWarning*/,
+                                null /* splashScreenTheme*/);
                     }
                     return;
                 }
@@ -1666,6 +1670,8 @@
                             PackageManager.INSTALL_REASON_UNKNOWN);
                     final int uninstallReason = parser.getAttributeInt(null, ATTR_UNINSTALL_REASON,
                             PackageManager.UNINSTALL_REASON_UNKNOWN);
+                    final String splashScreenTheme = parser.getAttributeValue(null,
+                            ATTR_SPLASH_SCREEN_THEME);
 
                     ArraySet<String> enabledComponents = null;
                     ArraySet<String> disabledComponents = null;
@@ -1738,7 +1744,8 @@
                     ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
                             hidden, distractionFlags, suspended, suspendParamsMap,
                             instantApp, virtualPreload, enabledCaller, enabledComponents,
-                            disabledComponents, installReason, uninstallReason, harmfulAppWarning);
+                            disabledComponents, installReason, uninstallReason, harmfulAppWarning,
+                            splashScreenTheme);
 
                     mDomainVerificationManager.setLegacyUserState(name, userId, verifState);
                 } else if (tagName.equals("preferred-activities")) {
@@ -1995,6 +2002,10 @@
                     serializer.attribute(null, ATTR_HARMFUL_APP_WARNING,
                             ustate.harmfulAppWarning);
                 }
+                if (ustate.splashScreenTheme != null) {
+                    serializer.attribute(null, ATTR_SPLASH_SCREEN_THEME,
+                            ustate.splashScreenTheme);
+                }
                 if (ustate.suspended) {
                     for (int i = 0; i < ustate.suspendParams.size(); i++) {
                         final String suspendingPackage = ustate.suspendParams.keyAt(i);
@@ -2698,9 +2709,6 @@
         if (pkg.forceQueryableOverride) {
             serializer.attributeBoolean(null, "forceQueryable", true);
         }
-        if (pkg.isPackageStartable()) {
-            serializer.attributeBoolean(null, "isStartable", true);
-        }
         if (pkg.isPackageLoading()) {
             serializer.attributeBoolean(null, "isLoading", true);
         }
@@ -3459,7 +3467,6 @@
         PackageSetting packageSetting = null;
         long versionCode = 0;
         boolean installedForceQueryable = false;
-        boolean isStartable = false;
         boolean isLoading = false;
         float loadingProgress = 0;
         UUID domainSetId;
@@ -3479,7 +3486,6 @@
             cpuAbiOverrideString = parser.getAttributeValue(null, "cpuAbiOverride");
             updateAvailable = parser.getAttributeBoolean(null, "updateAvailable", false);
             installedForceQueryable = parser.getAttributeBoolean(null, "forceQueryable", false);
-            isStartable = parser.getAttributeBoolean(null, "isStartable", false);
             isLoading = parser.getAttributeBoolean(null, "isLoading", false);
             loadingProgress = parser.getAttributeFloat(null, "loadingProgress", 0);
 
@@ -3638,8 +3644,7 @@
             packageSetting.secondaryCpuAbiString = secondaryCpuAbiString;
             packageSetting.updateAvailable = updateAvailable;
             packageSetting.forceQueryableOverride = installedForceQueryable;
-            packageSetting.incrementalStates = new IncrementalStates(isStartable, isLoading,
-                    loadingProgress);
+            packageSetting.incrementalStates = new IncrementalStates(isLoading, loadingProgress);
             // Handle legacy string here for single-user mode
             final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
             if (enabledStr != null) {
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 464477d..3dfb835e 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -23,10 +23,10 @@
 import android.app.appsearch.AppSearchResult;
 import android.app.appsearch.AppSearchSession;
 import android.app.appsearch.GenericDocument;
-import android.app.appsearch.GetByUriRequest;
+import android.app.appsearch.GetByDocumentIdRequest;
 import android.app.appsearch.PackageIdentifier;
 import android.app.appsearch.PutDocumentsRequest;
-import android.app.appsearch.RemoveByUriRequest;
+import android.app.appsearch.RemoveByDocumentIdRequest;
 import android.app.appsearch.ReportUsageRequest;
 import android.app.appsearch.SearchResult;
 import android.app.appsearch.SearchResults;
@@ -158,6 +158,8 @@
     private static final String KEY_BITMAPS = "bitmaps";
     private static final String KEY_BITMAP_BYTES = "bitmapBytes";
 
+    private final Object mLock = new Object();
+
     /**
      * An temp in-memory copy of shortcuts for this package that was loaded from xml, keyed on IDs.
      */
@@ -169,6 +171,11 @@
     private final ArrayList<ShareTargetInfo> mShareTargets = new ArrayList<>(0);
 
     /**
+     * All external packages that have gained access to the shortcuts from this package
+     */
+    private final Map<String, PackageIdentifier> mPackageIdentifiers = new ArrayMap<>(0);
+
+    /**
      * # of times the package has called rate-limited APIs.
      */
     private int mApiCallCount;
@@ -182,15 +189,12 @@
 
     private long mLastKnownForegroundElapsedTime;
 
-    private final Object mLock = new Object();
-
-    /**
-     * All external packages that have gained access to the shortcuts from this package
-     */
-    private final Map<String, PackageIdentifier> mPackageIdentifiers = new ArrayMap<>(0);
-
     private boolean mIsInitilized;
 
+    private boolean mRescanRequired;
+    private boolean mIsNewApp;
+    private List<ShortcutInfo> mManifestShortcuts;
+
     private ShortcutPackage(ShortcutUser shortcutUser,
             int packageUserId, String packageName, ShortcutPackageInfo spi) {
         super(shortcutUser, packageUserId, packageName,
@@ -219,10 +223,12 @@
                 getPackageName(), getPackageUserId());
     }
 
+    private boolean isAppSearchEnabled() {
+        return mShortcutUser.mService.isAppSearchEnabled();
+    }
+
     public int getShortcutCount() {
-        final int[] count = new int[1];
-        forEachShortcut(si -> count[0]++);
-        return count[0];
+        return mShortcuts.size();
     }
 
     @Override
@@ -442,15 +448,18 @@
         }
 
         forceReplaceShortcutInner(newShortcut);
-        mShortcutUser.mService.injectPostToHandler(() -> awaitInAppSearch("reportUsage",
-                session -> {
-                    final AndroidFuture<Boolean> future = new AndroidFuture<>();
-                    session.reportUsage(
-                            new ReportUsageRequest.Builder(getPackageName())
-                                    .setUri(newShortcut.getId()).build(),
-                            mShortcutUser.mExecutor, result -> future.complete(result.isSuccess()));
-                    return future;
-                }));
+        if (isAppSearchEnabled()) {
+            mShortcutUser.mService.injectPostToHandler(() -> awaitInAppSearch("reportUsage",
+                    session -> {
+                        final AndroidFuture<Boolean> future = new AndroidFuture<>();
+                        session.reportUsage(
+                                new ReportUsageRequest.Builder(
+                                        getPackageName(), newShortcut.getId()).build(),
+                                mShortcutUser.mExecutor,
+                                result -> future.complete(result.isSuccess()));
+                        return future;
+                    }));
+        }
         return deleted;
     }
 
@@ -960,7 +969,7 @@
      * the app's Xml resource.
      */
     int getSharingShortcutCount() {
-        if (getShortcutCount() == 0 || mShareTargets.isEmpty()) {
+        if (mShareTargets.isEmpty()) {
             return 0;
         }
 
@@ -1119,8 +1128,22 @@
                     (isNewApp ? "added" : "updated"),
                     getPackageInfo().getVersionCode(), pi.getLongVersionCode()));
         }
-
         getPackageInfo().updateFromPackageInfo(pi);
+        if (isAppSearchEnabled()) {
+            // Save the states in memory and resume package rescan when needed
+            mRescanRequired = true;
+            mIsNewApp = isNewApp;
+            mManifestShortcuts = newManifestShortcutList;
+        } else {
+            rescanPackage(isNewApp, newManifestShortcutList);
+        }
+        return true; // true means changed.
+    }
+
+    private void rescanPackage(
+            final boolean isNewApp, @NonNull final List<ShortcutInfo> newManifestShortcutList) {
+        final ShortcutService s = mShortcutUser.mService;
+
         final long newVersionCode = getPackageInfo().getVersionCode();
 
         // See if there are any shortcuts that were prevented restoring because the app was of a
@@ -1199,7 +1222,7 @@
         // This will send a notification to the launcher, and also save .
         // TODO: List changed and removed manifest shortcuts and pass to packageShortcutsChanged()
         s.packageShortcutsChanged(getPackageName(), getPackageUserId(), null, null);
-        return true; // true means changed.
+        mManifestShortcuts = null;
     }
 
     private boolean publishManifestShortcuts(List<ShortcutInfo> newManifestShortcutList) {
@@ -1694,13 +1717,25 @@
         return result;
     }
 
+    private boolean hasNoShortcut() {
+        if (!isAppSearchEnabled()) {
+            return getShortcutCount() == 0;
+        }
+        final boolean[] hasAnyShortcut = new boolean[1];
+        forEachShortcutStopWhen(si -> {
+            hasAnyShortcut[0] = true;
+            return true;
+        });
+        return !hasAnyShortcut[0];
+    }
+
     @Override
     public void saveToXml(@NonNull TypedXmlSerializer out, boolean forBackup)
             throws IOException, XmlPullParserException {
         final int size = mShortcuts.size();
         final int shareTargetSize = mShareTargets.size();
 
-        if (size == 0 && shareTargetSize == 0 && mApiCallCount == 0 && getShortcutCount() == 0) {
+        if (hasNoShortcut() && shareTargetSize == 0 && mApiCallCount == 0) {
             return; // nothing to write.
         }
 
@@ -2254,6 +2289,9 @@
     }
 
     void updateVisibility(String packageName, byte[] certificate, boolean visible) {
+        if (!isAppSearchEnabled()) {
+            return;
+        }
         if (visible) {
             mPackageIdentifiers.put(packageName, new PackageIdentifier(packageName, certificate));
         } else {
@@ -2287,6 +2325,14 @@
 
     private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) {
         Objects.requireNonNull(shortcuts);
+        if (!isAppSearchEnabled()) {
+            // If AppSearch isn't enabled, save it in memory and we are done.
+            for (ShortcutInfo si : shortcuts) {
+                mShortcuts.put(si.getId(), si);
+            }
+            return;
+        }
+        // Otherwise, save pinned shortcuts in memory.
         shortcuts.forEach(si -> {
             if (si.isPinned()) {
                 mShortcuts.put(si.getId(), si);
@@ -2294,12 +2340,13 @@
                 mShortcuts.remove(si.getId());
             }
         });
+        // Then proceed to app search.
         saveToAppSearch(shortcuts);
     }
 
     private void saveToAppSearch(@NonNull final Collection<ShortcutInfo> shortcuts) {
         Objects.requireNonNull(shortcuts);
-        if (shortcuts.isEmpty()) {
+        if (!isAppSearchEnabled() || shortcuts.isEmpty()) {
             // No need to invoke AppSearch when there's nothing to save.
             return;
         }
@@ -2335,6 +2382,9 @@
      * Removes shortcuts from AppSearch.
      */
     void removeShortcuts() {
+        if (!isAppSearchEnabled()) {
+            return;
+        }
         awaitInAppSearch("Removing all shortcuts from " + getPackageName(), session -> {
             final AndroidFuture<Boolean> future = new AndroidFuture<>();
             session.remove("", getSearchSpec(), mShortcutUser.mExecutor, result -> {
@@ -2352,9 +2402,13 @@
     private void removeShortcut(@NonNull final String id) {
         Objects.requireNonNull(id);
         mShortcuts.remove(id);
+        if (!isAppSearchEnabled()) {
+            return;
+        }
         awaitInAppSearch("Removing shortcut with id=" + id, session -> {
             final AndroidFuture<Boolean> future = new AndroidFuture<>();
-            session.remove(new RemoveByUriRequest.Builder(getPackageName()).addUris(id).build(),
+            session.remove(
+                    new RemoveByDocumentIdRequest.Builder(getPackageName()).addIds(id).build(),
                     mShortcutUser.mExecutor, result -> {
                         if (!result.isSuccess()) {
                             final Map<String, AppSearchResult<Void>> failures =
@@ -2381,14 +2435,25 @@
                 shortcutIds.add(id);
             }
         }
+        if (!isAppSearchEnabled()) {
+            final List<ShortcutInfo> ret = new ArrayList<>(1);
+            for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+                ShortcutInfo si = mShortcuts.valueAt(i);
+                if (shortcutIds.contains(si.getId())) {
+                    ret.add(si);
+                }
+            }
+            return ret;
+        }
         if (ShortcutService.DEBUG_REBOOT) {
             Slog.d(TAG, "Getting shortcuts for user=" + mShortcutUser.getUserId()
                     + " pkg=" + getPackageName() + " ids: [" + String.join(",", ids) + "]");
         }
         return awaitInAppSearch("Getting shortcut by id", session -> {
             final AndroidFuture<List<ShortcutInfo>> future = new AndroidFuture<>();
-            session.getByUri(
-                    new GetByUriRequest.Builder(getPackageName()).addUris(shortcutIds).build(),
+            session.getByDocumentId(
+                    new GetByDocumentIdRequest.Builder(getPackageName())
+                            .addIds(shortcutIds).build(),
                     mShortcutUser.mExecutor,
                     results -> {
                         final List<ShortcutInfo> ret = new ArrayList<>(1);
@@ -2429,6 +2494,13 @@
 
     private void forEachShortcutMutateIf(@NonNull final String query,
             @NonNull final Function<ShortcutInfo, Boolean> cb) {
+        if (!isAppSearchEnabled()) {
+            for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+                ShortcutInfo si = mShortcuts.valueAt(i);
+                cb.apply(si);
+            }
+            return;
+        }
         if (ShortcutService.DEBUG_REBOOT) {
             Slog.d(TAG, "Changing shortcuts for user=" + mShortcutUser.getUserId()
                     + " pkg=" + getPackageName());
@@ -2454,6 +2526,15 @@
 
     private void forEachShortcutStopWhen(
             @NonNull final String query, @NonNull final Function<ShortcutInfo, Boolean> cb) {
+        if (!isAppSearchEnabled()) {
+            for (int i = mShortcuts.size() - 1; i >= 0; i--) {
+                final ShortcutInfo si = mShortcuts.valueAt(i);
+                if (cb.apply(si)) {
+                    return;
+                }
+            }
+            return;
+        }
         if (ShortcutService.DEBUG_REBOOT) {
             Slog.d(TAG, "Iterating shortcuts for user=" + mShortcutUser.getUserId()
                     + " pkg=" + getPackageName());
@@ -2517,6 +2598,10 @@
             final boolean forceReset,
             @NonNull final String description,
             @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) {
+        if (!isAppSearchEnabled()) {
+            throw new IllegalStateException(
+                    "awaitInAppSearch called when app search integration is disabled");
+        }
         synchronized (mLock) {
             final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
             final long callingIdentity = Binder.clearCallingIdentity();
@@ -2537,6 +2622,10 @@
                 if (!wasInitialized) {
                     restoreParsedShortcuts(false);
                 }
+                if (mRescanRequired) {
+                    mRescanRequired = false;
+                    rescanPackage(mIsNewApp, mManifestShortcuts);
+                }
                 return ConcurrentUtils.waitForFutureNoInterrupt(cb.apply(session), description);
             } catch (Exception e) {
                 Slog.e(TAG, "Failed to initiate app search for shortcut package "
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 8d03fce..7f18c4b 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -15,6 +15,8 @@
  */
 package com.android.server.pm;
 
+import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI;
+
 import android.Manifest.permission;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
@@ -85,6 +87,7 @@
 import android.os.ShellCommand;
 import android.os.SystemClock;
 import android.os.UserHandle;
+import android.provider.DeviceConfig;
 import android.text.TextUtils;
 import android.text.format.TimeMigrationUtils;
 import android.util.ArraySet;
@@ -104,6 +107,7 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.internal.infra.AndroidFuture;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.os.BackgroundThread;
@@ -164,7 +168,7 @@
     static final boolean DEBUG = false; // STOPSHIP if true
     static final boolean DEBUG_LOAD = false; // STOPSHIP if true
     static final boolean DEBUG_PROCSTATE = false; // STOPSHIP if true
-    static final boolean DEBUG_REBOOT = true;
+    static final boolean DEBUG_REBOOT = false; // STOPSHIP if true
 
     @VisibleForTesting
     static final long DEFAULT_RESET_INTERVAL_SEC = 24 * 60 * 60; // 1 day
@@ -447,6 +451,8 @@
     @GuardedBy("mLock")
     private final MetricsLogger mMetricsLogger = new MetricsLogger();
 
+    private final boolean mIsAppSearchEnabled;
+
     static class InvalidFileFormatException extends Exception {
         public InvalidFileFormatException(String message, Throwable cause) {
             super(message, cause);
@@ -481,6 +487,8 @@
         mShortcutRequestPinProcessor = new ShortcutRequestPinProcessor(this, mLock);
         mShortcutBitmapSaver = new ShortcutBitmapSaver(this);
         mShortcutDumpFiles = new ShortcutDumpFiles(this);
+        mIsAppSearchEnabled = DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.SHORTCUT_APPSEARCH_INTEGRATION, false);
 
         if (onlyForPackageManagerApis) {
             return; // Don't do anything further.  For unit tests only.
@@ -518,6 +526,10 @@
         injectRegisterRoleHoldersListener(mOnRoleHoldersChangedListener);
     }
 
+    boolean isAppSearchEnabled() {
+        return mIsAppSearchEnabled;
+    }
+
     long getStatStartTime() {
         return mStatLogger.getTime();
     }
@@ -1307,7 +1319,7 @@
             mUsers.put(userId, userPackages);
 
             // Also when a user's data is first accessed, scan all packages.
-            injectPostToHandler(() -> checkPackageChanges(userId));
+            checkPackageChanges(userId);
         }
         return userPackages;
     }
@@ -1680,6 +1692,17 @@
                 "Ephemeral apps can't use ShortcutManager");
     }
 
+    private boolean verifyCaller(@NonNull String packageName, @UserIdInt int userId,
+            @NonNull AndroidFuture ret) {
+        try {
+            verifyCaller(packageName, userId);
+        } catch (Exception e) {
+            ret.completeExceptionally(e);
+            return false;
+        }
+        return true;
+    }
+
     private void verifyShortcutInfoPackage(String callerPackage, ShortcutInfo si) {
         if (si == null) {
             return;
@@ -1707,6 +1730,11 @@
         new Thread(r).start();
     }
 
+    void injectPostToHandlerIfAppSearch(Runnable r) {
+        // TODO: move to background thread when app search is enabled.
+        r.run();
+    }
+
     /**
      * @throws IllegalArgumentException if {@code numShortcuts} is bigger than
      *                                  {@link #getMaxActivityShortcuts()}.
@@ -1892,351 +1920,403 @@
     // === APIs ===
 
     @Override
-    public void setDynamicShortcuts(String packageName, ParceledListSlice shortcutInfoList,
-            @UserIdInt int userId, @NonNull AndroidFuture callback) {
-        try {
-            verifyCaller(packageName, userId);
-
-            final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
-            verifyShortcutInfoPackages(packageName, newShortcuts);
-            final int size = newShortcuts.size();
-
-            final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
-                    injectBinderCallingPid(), injectBinderCallingUid());
-
-            List<ShortcutInfo> changedShortcuts = null;
-            List<ShortcutInfo> removedShortcuts = null;
-
-            synchronized (mLock) {
-                throwIfUserLockedL(userId);
-
-                final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
-                        userId);
-
-                ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true);
-                ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts);
-
-                fillInDefaultActivity(newShortcuts);
-
-                ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_SET);
-
-                // Throttling.
-                if (!ps.tryApiCall(unlimited)) {
-                    callback.complete(false);
-                    return;
-                }
-
-                // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
-                ps.clearAllImplicitRanks();
-                assignImplicitRanks(newShortcuts);
-
-                for (int i = 0; i < size; i++) {
-                    fixUpIncomingShortcutInfo(newShortcuts.get(i), /* forUpdate= */ false);
-                }
-
-                ArrayList<ShortcutInfo> cachedOrPinned = new ArrayList<>();
-                ps.findAll(cachedOrPinned, AppSearchShortcutInfo.QUERY_IS_VISIBLE_CACHED_OR_PINNED,
-                        (ShortcutInfo si) -> si.isVisibleToPublisher()
-                                && si.isDynamic() && (si.isCached() || si.isPinned()),
-                        ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
-
-                // First, remove all un-pinned and non-cached; dynamic shortcuts
-                removedShortcuts = ps.deleteAllDynamicShortcuts(/*ignoreInvisible=*/ true);
-
-                // Then, add/update all.  We need to make sure to take over "pinned" flag.
-                for (int i = 0; i < size; i++) {
-                    final ShortcutInfo newShortcut = newShortcuts.get(i);
-                    ps.addOrReplaceDynamicShortcut(newShortcut);
-                }
-
-                // Lastly, adjust the ranks.
-                ps.adjustRanks();
-
-                changedShortcuts = prepareChangedShortcuts(
-                        cachedOrPinned, newShortcuts, removedShortcuts, ps);
-            }
-
-            packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
-
-            verifyStates();
-
-            callback.complete(true);
-        } catch (Exception e) {
-            callback.completeExceptionally(e);
+    public AndroidFuture setDynamicShortcuts(String packageName, ParceledListSlice shortcutInfoList,
+            @UserIdInt int userId) {
+        final AndroidFuture<Boolean> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
+                injectBinderCallingPid(), injectBinderCallingUid());
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                final List<ShortcutInfo> newShortcuts =
+                        (List<ShortcutInfo>) shortcutInfoList.getList();
+                verifyShortcutInfoPackages(packageName, newShortcuts);
+                final int size = newShortcuts.size();
+
+                List<ShortcutInfo> changedShortcuts = null;
+                List<ShortcutInfo> removedShortcuts = null;
+
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
+
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true);
+                    ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts);
+
+                    fillInDefaultActivity(newShortcuts);
+
+                    ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_SET);
+
+                    // Throttling.
+                    if (!ps.tryApiCall(unlimited)) {
+                        ret.complete(false);
+                        return;
+                    }
+
+                    // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
+                    ps.clearAllImplicitRanks();
+                    assignImplicitRanks(newShortcuts);
+
+                    for (int i = 0; i < size; i++) {
+                        fixUpIncomingShortcutInfo(newShortcuts.get(i), /* forUpdate= */ false);
+                    }
+
+                    ArrayList<ShortcutInfo> cachedOrPinned = new ArrayList<>();
+                    ps.findAll(cachedOrPinned,
+                            AppSearchShortcutInfo.QUERY_IS_VISIBLE_CACHED_OR_PINNED,
+                            (ShortcutInfo si) -> si.isVisibleToPublisher()
+                                    && si.isDynamic() && (si.isCached() || si.isPinned()),
+                            ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
+
+                    // First, remove all un-pinned and non-cached; dynamic shortcuts
+                    removedShortcuts = ps.deleteAllDynamicShortcuts(/*ignoreInvisible=*/ true);
+
+                    // Then, add/update all.  We need to make sure to take over "pinned" flag.
+                    for (int i = 0; i < size; i++) {
+                        final ShortcutInfo newShortcut = newShortcuts.get(i);
+                        ps.addOrReplaceDynamicShortcut(newShortcut);
+                    }
+
+                    // Lastly, adjust the ranks.
+                    ps.adjustRanks();
+
+                    changedShortcuts = prepareChangedShortcuts(
+                            cachedOrPinned, newShortcuts, removedShortcuts, ps);
+                }
+
+
+                packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+
+                verifyStates();
+
+                ret.complete(true);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
-    public void updateShortcuts(String packageName, ParceledListSlice shortcutInfoList,
-            @UserIdInt int userId, AndroidFuture callback) {
-        try {
-            verifyCaller(packageName, userId);
-
-            final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
-            verifyShortcutInfoPackages(packageName, newShortcuts);
-            final int size = newShortcuts.size();
-
-            final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
-                    injectBinderCallingPid(), injectBinderCallingUid());
-
-            final List<ShortcutInfo> changedShortcuts = new ArrayList<>(1);
-
-            synchronized (mLock) {
-                throwIfUserLockedL(userId);
-
-                final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
-                        userId);
-
-                ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true);
-                ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts);
-
-                // For update, don't fill in the default activity.  Having null activity means
-                // "don't update the activity" here.
-
-                ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_UPDATE);
-
-                // Throttling.
-                if (!ps.tryApiCall(unlimited)) {
-                    callback.complete(false);
-                    return;
-                }
-
-                // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
-                ps.clearAllImplicitRanks();
-                assignImplicitRanks(newShortcuts);
-
-                for (int i = 0; i < size; i++) {
-                    final ShortcutInfo source = newShortcuts.get(i);
-                    fixUpIncomingShortcutInfo(source, /* forUpdate= */ true);
-
-                    ps.mutateShortcut(source.getId(), null, target -> {
-                        // Invisible shortcuts can't be updated.
-                        if (target == null || !target.isVisibleToPublisher()) {
-                            return;
-                        }
-
-                        if (target.isEnabled() != source.isEnabled()) {
-                            Slog.w(TAG, "ShortcutInfo.enabled cannot be changed with"
-                                    + " updateShortcuts()");
-                        }
-
-                        if (target.isLongLived() != source.isLongLived()) {
-                            Slog.w(TAG,
-                                    "ShortcutInfo.longLived cannot be changed with"
-                                    + " updateShortcuts()");
-                        }
-
-                        // When updating the rank, we need to insert between existing ranks, so set
-                        // this setRankChanged, and also copy the implicit rank fo adjustRanks().
-                        if (source.hasRank()) {
-                            target.setRankChanged();
-                            target.setImplicitRank(source.getImplicitRank());
-                        }
-
-                        final boolean replacingIcon = (source.getIcon() != null);
-                        if (replacingIcon) {
-                            removeIconLocked(target);
-                        }
-
-                        // Note copyNonNullFieldsFrom() does the "updatable with?" check too.
-                        target.copyNonNullFieldsFrom(source);
-                        target.setTimestamp(injectCurrentTimeMillis());
-
-                        if (replacingIcon) {
-                            saveIconAndFixUpShortcutLocked(target);
-                        }
-
-                        // When we're updating any resource related fields, re-extract the res
-                        // names and the values.
-                        if (replacingIcon || source.hasStringResources()) {
-                            fixUpShortcutResourceNamesAndValues(target);
-                        }
-
-                        changedShortcuts.add(target);
-                    });
-                }
-
-                // Lastly, adjust the ranks.
-                ps.adjustRanks();
-            }
-            packageShortcutsChanged(packageName, userId,
-                    changedShortcuts.isEmpty() ? null : changedShortcuts, null);
-
-            verifyStates();
-
-            callback.complete(true);
-        } catch (Exception e) {
-            callback.completeExceptionally(e);
+    public AndroidFuture updateShortcuts(String packageName, ParceledListSlice shortcutInfoList,
+            @UserIdInt int userId) {
+        final AndroidFuture<Boolean> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
+                injectBinderCallingPid(), injectBinderCallingUid());
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                final List<ShortcutInfo> newShortcuts =
+                        (List<ShortcutInfo>) shortcutInfoList.getList();
+                verifyShortcutInfoPackages(packageName, newShortcuts);
+                final int size = newShortcuts.size();
+
+                final List<ShortcutInfo> changedShortcuts = new ArrayList<>(1);
+
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
+
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true);
+                    ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts);
+
+                    // For update, don't fill in the default activity.  Having null activity means
+                    // "don't update the activity" here.
+
+                    ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_UPDATE);
+
+                    // Throttling.
+                    if (!ps.tryApiCall(unlimited)) {
+                        ret.complete(false);
+                        return;
+                    }
+
+                    // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
+                    ps.clearAllImplicitRanks();
+                    assignImplicitRanks(newShortcuts);
+
+                    for (int i = 0; i < size; i++) {
+                        final ShortcutInfo source = newShortcuts.get(i);
+                        fixUpIncomingShortcutInfo(source, /* forUpdate= */ true);
+
+                        ps.mutateShortcut(source.getId(), null, target -> {
+                            // Invisible shortcuts can't be updated.
+                            if (target == null || !target.isVisibleToPublisher()) {
+                                return;
+                            }
+
+                            if (target.isEnabled() != source.isEnabled()) {
+                                Slog.w(TAG, "ShortcutInfo.enabled cannot be changed with"
+                                        + " updateShortcuts()");
+                            }
+
+                            if (target.isLongLived() != source.isLongLived()) {
+                                Slog.w(TAG,
+                                        "ShortcutInfo.longLived cannot be changed with"
+                                        + " updateShortcuts()");
+                            }
+
+                            // When updating the rank, we need to insert between existing ranks,
+                            // so set this setRankChanged, and also copy the implicit rank fo
+                            // adjustRanks().
+                            if (source.hasRank()) {
+                                target.setRankChanged();
+                                target.setImplicitRank(source.getImplicitRank());
+                            }
+
+                            final boolean replacingIcon = (source.getIcon() != null);
+                            if (replacingIcon) {
+                                removeIconLocked(target);
+                            }
+
+                            // Note copyNonNullFieldsFrom() does the "updatable with?" check too.
+                            target.copyNonNullFieldsFrom(source);
+                            target.setTimestamp(injectCurrentTimeMillis());
+
+                            if (replacingIcon) {
+                                saveIconAndFixUpShortcutLocked(target);
+                            }
+
+                            // When we're updating any resource related fields, re-extract the res
+                            // names and the values.
+                            if (replacingIcon || source.hasStringResources()) {
+                                fixUpShortcutResourceNamesAndValues(target);
+                            }
+
+                            changedShortcuts.add(target);
+                        });
+                    }
+
+                    // Lastly, adjust the ranks.
+                    ps.adjustRanks();
+                }
+                packageShortcutsChanged(packageName, userId,
+                        changedShortcuts.isEmpty() ? null : changedShortcuts, null);
+
+                verifyStates();
+
+                ret.complete(true);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
-    public void addDynamicShortcuts(String packageName, ParceledListSlice shortcutInfoList,
-            @UserIdInt int userId, AndroidFuture callback) {
-        try {
-            verifyCaller(packageName, userId);
+    public AndroidFuture addDynamicShortcuts(String packageName, ParceledListSlice shortcutInfoList,
+            @UserIdInt int userId) {
+        final AndroidFuture<Boolean> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
+        }
+        final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
+                injectBinderCallingPid(), injectBinderCallingUid());
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                final List<ShortcutInfo> newShortcuts =
+                        (List<ShortcutInfo>) shortcutInfoList.getList();
+                verifyShortcutInfoPackages(packageName, newShortcuts);
+                final int size = newShortcuts.size();
 
-            final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
-            verifyShortcutInfoPackages(packageName, newShortcuts);
-            final int size = newShortcuts.size();
+                List<ShortcutInfo> changedShortcuts = null;
 
-            final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
-                    injectBinderCallingPid(), injectBinderCallingUid());
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
 
-            List<ShortcutInfo> changedShortcuts = null;
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
 
-            synchronized (mLock) {
-                throwIfUserLockedL(userId);
+                    ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true);
+                    ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts);
 
-                final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
-                        userId);
+                    fillInDefaultActivity(newShortcuts);
 
-                ps.ensureImmutableShortcutsNotIncluded(newShortcuts, /*ignoreInvisible=*/ true);
-                ps.ensureNoBitmapIconIfShortcutIsLongLived(newShortcuts);
+                    ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_ADD);
 
-                fillInDefaultActivity(newShortcuts);
+                    // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
+                    ps.clearAllImplicitRanks();
+                    assignImplicitRanks(newShortcuts);
 
-                ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_ADD);
+                    // Throttling.
+                    if (!ps.tryApiCall(unlimited)) {
+                        ret.complete(false);
+                        return;
+                    }
+                    for (int i = 0; i < size; i++) {
+                        final ShortcutInfo newShortcut = newShortcuts.get(i);
 
-                // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
-                ps.clearAllImplicitRanks();
-                assignImplicitRanks(newShortcuts);
+                        // Validate the shortcut.
+                        fixUpIncomingShortcutInfo(newShortcut, /* forUpdate= */ false);
 
-                // Throttling.
-                if (!ps.tryApiCall(unlimited)) {
-                    callback.complete(false);
-                    return;
+                        // When ranks are changing, we need to insert between ranks, so set the
+                        // "rank changed" flag.
+                        newShortcut.setRankChanged();
+
+                        // Add it.
+                        ps.addOrReplaceDynamicShortcut(newShortcut);
+
+                        if (changedShortcuts == null) {
+                            changedShortcuts = new ArrayList<>(1);
+                        }
+                        changedShortcuts.add(newShortcut);
+                    }
+
+                    // Lastly, adjust the ranks.
+                    ps.adjustRanks();
                 }
-                for (int i = 0; i < size; i++) {
-                    final ShortcutInfo newShortcut = newShortcuts.get(i);
+                packageShortcutsChanged(packageName, userId, changedShortcuts, null);
+
+                verifyStates();
+
+                ret.complete(true);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
+    }
+
+    @Override
+    public AndroidFuture pushDynamicShortcut(String packageName, ShortcutInfo shortcut,
+            @UserIdInt int userId) {
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
+        }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                verifyShortcutInfoPackage(packageName, shortcut);
+
+                List<ShortcutInfo> changedShortcuts = new ArrayList<>();
+                List<ShortcutInfo> removedShortcuts = null;
+
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
+
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    ps.ensureNotImmutable(shortcut.getId(), /*ignoreInvisible=*/ true);
+                    fillInDefaultActivity(Arrays.asList(shortcut));
+
+                    if (!shortcut.hasRank()) {
+                        shortcut.setRank(0);
+                    }
+                    // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
+                    ps.clearAllImplicitRanks();
+                    shortcut.setImplicitRank(0);
 
                     // Validate the shortcut.
-                    fixUpIncomingShortcutInfo(newShortcut, /* forUpdate= */ false);
+                    fixUpIncomingShortcutInfo(shortcut, /* forUpdate= */ false);
 
                     // When ranks are changing, we need to insert between ranks, so set the
                     // "rank changed" flag.
-                    newShortcut.setRankChanged();
+                    shortcut.setRankChanged();
 
-                    // Add it.
-                    ps.addOrReplaceDynamicShortcut(newShortcut);
+                    // Push it.
+                    boolean deleted = ps.pushDynamicShortcut(shortcut, changedShortcuts);
 
-                    if (changedShortcuts == null) {
-                        changedShortcuts = new ArrayList<>(1);
+                    if (deleted) {
+                        if (changedShortcuts.isEmpty()) {
+                            ret.complete(null);
+                            return;  // Failed to push.
+                        }
+                        removedShortcuts = Collections.singletonList(changedShortcuts.get(0));
+                        changedShortcuts.clear();
                     }
-                    changedShortcuts.add(newShortcut);
+                    changedShortcuts.add(shortcut);
+
+                    // Lastly, adjust the ranks.
+                    ps.adjustRanks();
                 }
 
-                // Lastly, adjust the ranks.
-                ps.adjustRanks();
+                packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+
+                reportShortcutUsedInternal(packageName, shortcut.getId(), userId);
+
+                verifyStates();
+
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
             }
-            packageShortcutsChanged(packageName, userId, changedShortcuts, null);
-
-            verifyStates();
-
-            callback.complete(true);
-        } catch (Exception e) {
-            callback.completeExceptionally(e);
-        }
+        });
+        return ret;
     }
 
     @Override
-    public void pushDynamicShortcut(String packageName, ShortcutInfo shortcut,
-            @UserIdInt int userId) {
-        verifyCaller(packageName, userId);
-        verifyShortcutInfoPackage(packageName, shortcut);
-
-        List<ShortcutInfo> changedShortcuts = new ArrayList<>();
-        List<ShortcutInfo> removedShortcuts = null;
-
-        synchronized (mLock) {
-            throwIfUserLockedL(userId);
-
-            final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
-
-            ps.ensureNotImmutable(shortcut.getId(), /*ignoreInvisible=*/ true);
-            fillInDefaultActivity(Arrays.asList(shortcut));
-
-            if (!shortcut.hasRank()) {
-                shortcut.setRank(0);
-            }
-            // Initialize the implicit ranks for ShortcutPackage.adjustRanks().
-            ps.clearAllImplicitRanks();
-            shortcut.setImplicitRank(0);
-
-            // Validate the shortcut.
-            fixUpIncomingShortcutInfo(shortcut, /* forUpdate= */ false);
-
-            // When ranks are changing, we need to insert between ranks, so set the
-            // "rank changed" flag.
-            shortcut.setRankChanged();
-
-            // Push it.
-            boolean deleted = ps.pushDynamicShortcut(shortcut, changedShortcuts);
-
-            if (deleted) {
-                if (changedShortcuts.isEmpty()) {
-                    return;  // Failed to push.
+    public AndroidFuture updateShortcutVisibility(String callingPkg, String packageName,
+            byte[] certificate, boolean visible, int userId) {
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                synchronized (mLock) {
+                    getPackageShortcutsForPublisherLocked(callingPkg, userId)
+                            .updateVisibility(packageName, certificate, visible);
                 }
-                removedShortcuts = Collections.singletonList(changedShortcuts.get(0));
-                changedShortcuts.clear();
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
             }
-            changedShortcuts.add(shortcut);
-
-            // Lastly, adjust the ranks.
-            ps.adjustRanks();
-        }
-
-        packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
-
-        verifyStates();
+        });
+        return ret;
     }
 
     @Override
-    public void updateShortcutVisibility(String callingPkg, String packageName, byte[] certificate,
-            boolean visible, int userId) {
-        synchronized (mLock) {
-            getPackageShortcutsForPublisherLocked(callingPkg, userId)
-                    .updateVisibility(packageName, certificate, visible);
-        }
-    }
-
-    @Override
-    public void requestPinShortcut(String packageName, ShortcutInfo shortcut,
-            IntentSender resultIntent, int userId, AndroidFuture callback) {
-        try {
-            Objects.requireNonNull(shortcut);
-            Objects.requireNonNull(callback);
-            Preconditions.checkArgument(shortcut.isEnabled(), "Shortcut must be enabled");
-            callback.complete(
-                    requestPinItem(packageName, userId, shortcut, null, null, resultIntent));
-        } catch (Exception e) {
-            callback.completeExceptionally(e);
-        }
-    }
-
-    @Override
-    public void createShortcutResultIntent(String packageName, ShortcutInfo shortcut, int userId,
-            AndroidFuture callback)
-            throws RemoteException {
-        try {
-            Objects.requireNonNull(shortcut);
-            Preconditions.checkArgument(shortcut.isEnabled(), "Shortcut must be enabled");
-            verifyCaller(packageName, userId);
-            verifyShortcutInfoPackage(packageName, shortcut);
-
-            final Intent ret;
-            synchronized (mLock) {
-                throwIfUserLockedL(userId);
-
-                // Send request to the launcher, if supported.
-                ret = mShortcutRequestPinProcessor.createShortcutResultIntent(shortcut, userId);
+    public AndroidFuture requestPinShortcut(String packageName, ShortcutInfo shortcut,
+            IntentSender resultIntent, int userId) {
+        final AndroidFuture<Boolean> ret = new AndroidFuture<>();
+        final int callingPid = injectBinderCallingPid();
+        final int callingUid = injectBinderCallingUid();
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                ret.complete(
+                        requestPinItem(packageName, userId, shortcut, null, null, resultIntent,
+                                callingPid, callingUid));
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
             }
+        });
+        return ret;
+    }
 
-            verifyStates();
-            callback.complete(ret);
-        } catch (Exception e) {
-            callback.completeExceptionally(e);
+    @Override
+    public AndroidFuture createShortcutResultIntent(
+            String packageName, ShortcutInfo shortcut, int userId) throws RemoteException {
+        final AndroidFuture<Intent> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                Objects.requireNonNull(shortcut);
+                Preconditions.checkArgument(shortcut.isEnabled(), "Shortcut must be enabled");
+                verifyShortcutInfoPackage(packageName, shortcut);
+                final Intent intent;
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
+
+                    // Send request to the launcher, if supported.
+                    intent = mShortcutRequestPinProcessor.createShortcutResultIntent(shortcut,
+                            userId);
+                }
+
+                verifyStates();
+                ret.complete(intent);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     /**
@@ -2246,9 +2326,16 @@
      */
     private boolean requestPinItem(String callingPackage, int userId, ShortcutInfo shortcut,
             AppWidgetProviderInfo appWidget, Bundle extras, IntentSender resultIntent) {
+        return requestPinItem(callingPackage, userId, shortcut, appWidget, extras, resultIntent,
+                injectBinderCallingPid(), injectBinderCallingUid());
+    }
+
+    private boolean requestPinItem(String callingPackage, int userId, ShortcutInfo shortcut,
+            AppWidgetProviderInfo appWidget, Bundle extras, IntentSender resultIntent,
+            int callingPid, int callingUid) {
         verifyCaller(callingPackage, userId);
         if (shortcut == null || !injectHasAccessShortcutsPermission(
-                injectBinderCallingPid(), injectBinderCallingUid())) {
+                callingPid, callingUid)) {
             // Verify if caller is the shortcut owner, only if caller doesn't have ACCESS_SHORTCUTS.
             verifyShortcutInfoPackage(callingPackage, shortcut);
         }
@@ -2257,7 +2344,7 @@
         synchronized (mLock) {
             throwIfUserLockedL(userId);
 
-            Preconditions.checkState(isUidForegroundLocked(injectBinderCallingUid()),
+            Preconditions.checkState(isUidForegroundLocked(callingUid),
                     "Calling application must have a foreground activity or a foreground service");
 
             // If it's a pin shortcut request, and there's already a shortcut with the same ID
@@ -2289,247 +2376,327 @@
     }
 
     @Override
-    public void disableShortcuts(String packageName, List shortcutIds,
+    public AndroidFuture disableShortcuts(String packageName, List shortcutIds,
             CharSequence disabledMessage, int disabledMessageResId, @UserIdInt int userId) {
-        verifyCaller(packageName, userId);
-        Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
-
-        List<ShortcutInfo> changedShortcuts = null;
-        List<ShortcutInfo> removedShortcuts = null;
-
-        synchronized (mLock) {
-            throwIfUserLockedL(userId);
-
-            final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
-
-            ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
-                    /*ignoreInvisible=*/ true);
-
-            final String disabledMessageString =
-                    (disabledMessage == null) ? null : disabledMessage.toString();
-
-            for (int i = shortcutIds.size() - 1; i >= 0; i--) {
-                final String id = Preconditions.checkStringNotEmpty((String) shortcutIds.get(i));
-                if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
-                    continue;
-                }
-
-                final ShortcutInfo deleted = ps.disableWithId(id,
-                        disabledMessageString, disabledMessageResId,
-                        /* overrideImmutable=*/ false, /*ignoreInvisible=*/ true,
-                        ShortcutInfo.DISABLED_REASON_BY_APP);
-
-                if (deleted == null) {
-                    if (changedShortcuts == null) {
-                        changedShortcuts = new ArrayList<>(1);
-                    }
-                    changedShortcuts.add(ps.findShortcutById(id));
-                } else {
-                    if (removedShortcuts == null) {
-                        removedShortcuts = new ArrayList<>(1);
-                    }
-                    removedShortcuts.add(deleted);
-                }
-            }
-
-            // We may have removed dynamic shortcuts which may have left a gap, so adjust the ranks.
-            ps.adjustRanks();
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
+                List<ShortcutInfo> changedShortcuts = null;
+                List<ShortcutInfo> removedShortcuts = null;
 
-        packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
 
-        verifyStates();
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
+                            /*ignoreInvisible=*/ true);
+
+                    final String disabledMessageString =
+                            (disabledMessage == null) ? null : disabledMessage.toString();
+
+                    for (int i = shortcutIds.size() - 1; i >= 0; i--) {
+                        final String id = Preconditions.checkStringNotEmpty(
+                                (String) shortcutIds.get(i));
+                        if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
+                            continue;
+                        }
+
+                        final ShortcutInfo deleted = ps.disableWithId(id,
+                                disabledMessageString, disabledMessageResId,
+                                /* overrideImmutable=*/ false, /*ignoreInvisible=*/ true,
+                                ShortcutInfo.DISABLED_REASON_BY_APP);
+
+                        if (deleted == null) {
+                            if (changedShortcuts == null) {
+                                changedShortcuts = new ArrayList<>(1);
+                            }
+                            changedShortcuts.add(ps.findShortcutById(id));
+                        } else {
+                            if (removedShortcuts == null) {
+                                removedShortcuts = new ArrayList<>(1);
+                            }
+                            removedShortcuts.add(deleted);
+                        }
+                    }
+
+                    // We may have removed dynamic shortcuts which may have left a gap,
+                    // so adjust the ranks.
+                    ps.adjustRanks();
+                }
+
+                packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+
+                verifyStates();
+
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
-    public void enableShortcuts(String packageName, List shortcutIds, @UserIdInt int userId) {
-        verifyCaller(packageName, userId);
-        Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
-
-        List<ShortcutInfo> changedShortcuts = null;
-
-        synchronized (mLock) {
-            throwIfUserLockedL(userId);
-
-            final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
-
-            ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
-                    /*ignoreInvisible=*/ true);
-
-            for (int i = shortcutIds.size() - 1; i >= 0; i--) {
-                final String id = Preconditions.checkStringNotEmpty((String) shortcutIds.get(i));
-                if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
-                    continue;
-                }
-                ps.enableWithId(id);
-
-                if (changedShortcuts == null) {
-                    changedShortcuts = new ArrayList<>(1);
-                }
-                changedShortcuts.add(ps.findShortcutById(id));
-            }
+    public AndroidFuture enableShortcuts(
+            String packageName, List shortcutIds, @UserIdInt int userId) {
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
+                List<ShortcutInfo> changedShortcuts = null;
 
-        packageShortcutsChanged(packageName, userId, changedShortcuts, null);
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
 
-        verifyStates();
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
+                            /*ignoreInvisible=*/ true);
+
+                    for (int i = shortcutIds.size() - 1; i >= 0; i--) {
+                        final String id = Preconditions.checkStringNotEmpty(
+                                (String) shortcutIds.get(i));
+                        if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
+                            continue;
+                        }
+                        ps.enableWithId(id);
+
+                        if (changedShortcuts == null) {
+                            changedShortcuts = new ArrayList<>(1);
+                        }
+                        changedShortcuts.add(ps.findShortcutById(id));
+                    }
+                }
+
+                packageShortcutsChanged(packageName, userId, changedShortcuts, null);
+
+                verifyStates();
+
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
-    public void removeDynamicShortcuts(String packageName, List shortcutIds,
+    public AndroidFuture removeDynamicShortcuts(String packageName, List shortcutIds,
             @UserIdInt int userId) {
-        verifyCaller(packageName, userId);
-        Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
+        }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
+                List<ShortcutInfo> changedShortcuts = null;
+                List<ShortcutInfo> removedShortcuts = null;
 
-        List<ShortcutInfo> changedShortcuts = null;
-        List<ShortcutInfo> removedShortcuts = null;
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
 
-        synchronized (mLock) {
-            throwIfUserLockedL(userId);
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
 
-            final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
+                    ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
+                            /*ignoreInvisible=*/ true);
 
-            ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
-                    /*ignoreInvisible=*/ true);
+                    for (int i = shortcutIds.size() - 1; i >= 0; i--) {
+                        final String id = Preconditions.checkStringNotEmpty(
+                                (String) shortcutIds.get(i));
+                        if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
+                            continue;
+                        }
 
-            for (int i = shortcutIds.size() - 1; i >= 0; i--) {
-                final String id = Preconditions.checkStringNotEmpty((String) shortcutIds.get(i));
-                if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
-                    continue;
-                }
-
-                ShortcutInfo removed = ps.deleteDynamicWithId(id, /*ignoreInvisible=*/ true);
-                if (removed == null) {
-                    if (changedShortcuts == null) {
-                        changedShortcuts = new ArrayList<>(1);
+                        ShortcutInfo removed = ps.deleteDynamicWithId(id, /*ignoreInvisible=*/
+                                true);
+                        if (removed == null) {
+                            if (changedShortcuts == null) {
+                                changedShortcuts = new ArrayList<>(1);
+                            }
+                            changedShortcuts.add(ps.findShortcutById(id));
+                        } else {
+                            if (removedShortcuts == null) {
+                                removedShortcuts = new ArrayList<>(1);
+                            }
+                            removedShortcuts.add(removed);
+                        }
                     }
-                    changedShortcuts.add(ps.findShortcutById(id));
-                } else {
-                    if (removedShortcuts == null) {
-                        removedShortcuts = new ArrayList<>(1);
-                    }
-                    removedShortcuts.add(removed);
+
+                    // We may have removed dynamic shortcuts which may have left a gap,
+                    // so adjust the ranks.
+                    ps.adjustRanks();
                 }
+                packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+
+                verifyStates();
+
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
             }
-
-            // We may have removed dynamic shortcuts which may have left a gap, so adjust the ranks.
-            ps.adjustRanks();
-        }
-        packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
-
-        verifyStates();
+        });
+        return ret;
     }
 
     @Override
-    public void removeAllDynamicShortcuts(String packageName, @UserIdInt int userId) {
-        verifyCaller(packageName, userId);
-
-        List<ShortcutInfo> changedShortcuts = new ArrayList<>();
-        List<ShortcutInfo> removedShortcuts = null;
-
-        synchronized (mLock) {
-            throwIfUserLockedL(userId);
-
-            final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
-
-            // Dynamic shortcuts that are either cached or pinned will not get deleted.
-            ps.findAll(changedShortcuts, AppSearchShortcutInfo.QUERY_IS_VISIBLE_CACHED_OR_PINNED,
-                    (ShortcutInfo si) -> si.isVisibleToPublisher()
-                            && si.isDynamic() && (si.isCached() || si.isPinned()),
-                    ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
-
-            removedShortcuts = ps.deleteAllDynamicShortcuts(/*ignoreInvisible=*/ true);
-            changedShortcuts = prepareChangedShortcuts(
-                    changedShortcuts, null, removedShortcuts, ps);
+    public AndroidFuture removeAllDynamicShortcuts(String packageName, @UserIdInt int userId) {
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                List<ShortcutInfo> changedShortcuts = new ArrayList<>();
+                List<ShortcutInfo> removedShortcuts = null;
 
-        packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
 
-        verifyStates();
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    // Dynamic shortcuts that are either cached or pinned will not get deleted.
+                    ps.findAll(changedShortcuts,
+                            AppSearchShortcutInfo.QUERY_IS_VISIBLE_CACHED_OR_PINNED,
+                            (ShortcutInfo si) -> si.isVisibleToPublisher()
+                                    && si.isDynamic() && (si.isCached() || si.isPinned()),
+                            ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
+
+                    removedShortcuts = ps.deleteAllDynamicShortcuts(/*ignoreInvisible=*/ true);
+                    changedShortcuts = prepareChangedShortcuts(
+                            changedShortcuts, null, removedShortcuts, ps);
+                }
+
+                packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+
+                verifyStates();
+
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
-    public void removeLongLivedShortcuts(String packageName, List shortcutIds,
+    public AndroidFuture removeLongLivedShortcuts(String packageName, List shortcutIds,
             @UserIdInt int userId) {
-        verifyCaller(packageName, userId);
-        Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
-
-        List<ShortcutInfo> changedShortcuts = null;
-        List<ShortcutInfo> removedShortcuts = null;
-
-        synchronized (mLock) {
-            throwIfUserLockedL(userId);
-
-            final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
-
-            ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
-                    /*ignoreInvisible=*/ true);
-
-            for (int i = shortcutIds.size() - 1; i >= 0; i--) {
-                final String id = Preconditions.checkStringNotEmpty((String) shortcutIds.get(i));
-                if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
-                    continue;
-                }
-
-                ShortcutInfo removed = ps.deleteLongLivedWithId(id, /*ignoreInvisible=*/ true);
-                if (removed != null) {
-                    if (removedShortcuts == null) {
-                        removedShortcuts = new ArrayList<>(1);
-                    }
-                    removedShortcuts.add(removed);
-                } else {
-                    if (changedShortcuts == null) {
-                        changedShortcuts = new ArrayList<>(1);
-                    }
-                    changedShortcuts.add(ps.findShortcutById(id));
-                }
-            }
-
-            // We may have removed dynamic shortcuts which may have left a gap, so adjust the ranks.
-            ps.adjustRanks();
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
-        packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                Objects.requireNonNull(shortcutIds, "shortcutIds must be provided");
+                List<ShortcutInfo> changedShortcuts = null;
+                List<ShortcutInfo> removedShortcuts = null;
 
-        verifyStates();
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
+
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    ps.ensureImmutableShortcutsNotIncludedWithIds((List<String>) shortcutIds,
+                            /*ignoreInvisible=*/ true);
+
+                    for (int i = shortcutIds.size() - 1; i >= 0; i--) {
+                        final String id = Preconditions.checkStringNotEmpty(
+                                (String) shortcutIds.get(i));
+                        if (!ps.isShortcutExistsAndVisibleToPublisher(id)) {
+                            continue;
+                        }
+
+                        ShortcutInfo removed = ps.deleteLongLivedWithId(id, /*ignoreInvisible=*/
+                                true);
+                        if (removed != null) {
+                            if (removedShortcuts == null) {
+                                removedShortcuts = new ArrayList<>(1);
+                            }
+                            removedShortcuts.add(removed);
+                        } else {
+                            if (changedShortcuts == null) {
+                                changedShortcuts = new ArrayList<>(1);
+                            }
+                            changedShortcuts.add(ps.findShortcutById(id));
+                        }
+                    }
+
+                    // We may have removed dynamic shortcuts which may have left a gap,
+                    // so adjust the ranks.
+                    ps.adjustRanks();
+                }
+                packageShortcutsChanged(packageName, userId, changedShortcuts, removedShortcuts);
+
+                verifyStates();
+
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
-    public void getShortcuts(String packageName,
-            @ShortcutManager.ShortcutMatchFlags int matchFlags, @UserIdInt int userId,
-            AndroidFuture<ParceledListSlice<ShortcutInfo>> callback) {
-        try {
-            verifyCaller(packageName, userId);
-
-            synchronized (mLock) {
-                throwIfUserLockedL(userId);
-
-                final boolean matchDynamic = (matchFlags & ShortcutManager.FLAG_MATCH_DYNAMIC) != 0;
-                final boolean matchPinned = (matchFlags & ShortcutManager.FLAG_MATCH_PINNED) != 0;
-                final boolean matchManifest =
-                        (matchFlags & ShortcutManager.FLAG_MATCH_MANIFEST) != 0;
-                final boolean matchCached = (matchFlags & ShortcutManager.FLAG_MATCH_CACHED) != 0;
-
-                final int shortcutFlags = (matchDynamic ? ShortcutInfo.FLAG_DYNAMIC : 0)
-                        | (matchPinned ? ShortcutInfo.FLAG_PINNED : 0)
-                        | (matchManifest ? ShortcutInfo.FLAG_MANIFEST : 0)
-                        | (matchCached ? ShortcutInfo.FLAG_CACHED_ALL : 0);
-
-                final String query = AppSearchShortcutInfo.QUERY_IS_VISIBLE_TO_PUBLISHER + " "
-                        + createQuery(matchDynamic, matchPinned, matchManifest, matchCached);
-
-                callback.complete(getShortcutsWithQueryLocked(
-                        packageName, userId, ShortcutInfo.CLONE_REMOVE_FOR_CREATOR, query,
-                        (ShortcutInfo si) ->
-                                si.isVisibleToPublisher() && (si.getFlags() & shortcutFlags) != 0));
-            }
-        } catch (Exception e) {
-            callback.completeExceptionally(e);
+    public AndroidFuture<ParceledListSlice> getShortcuts(String packageName,
+            @ShortcutManager.ShortcutMatchFlags int matchFlags, @UserIdInt int userId) {
+        final AndroidFuture<ParceledListSlice> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
+
+                    final boolean matchDynamic =
+                            (matchFlags & ShortcutManager.FLAG_MATCH_DYNAMIC) != 0;
+                    final boolean matchPinned =
+                            (matchFlags & ShortcutManager.FLAG_MATCH_PINNED) != 0;
+                    final boolean matchManifest =
+                            (matchFlags & ShortcutManager.FLAG_MATCH_MANIFEST) != 0;
+                    final boolean matchCached =
+                            (matchFlags & ShortcutManager.FLAG_MATCH_CACHED) != 0;
+
+                    final int shortcutFlags = (matchDynamic ? ShortcutInfo.FLAG_DYNAMIC : 0)
+                            | (matchPinned ? ShortcutInfo.FLAG_PINNED : 0)
+                            | (matchManifest ? ShortcutInfo.FLAG_MANIFEST : 0)
+                            | (matchCached ? ShortcutInfo.FLAG_CACHED_ALL : 0);
+
+                    final String query = AppSearchShortcutInfo.QUERY_IS_VISIBLE_TO_PUBLISHER + " "
+                            + createQuery(matchDynamic, matchPinned, matchManifest, matchCached);
+
+                    ret.complete(getShortcutsWithQueryLocked(
+                            packageName, userId, ShortcutInfo.CLONE_REMOVE_FOR_CREATOR, query,
+                            (ShortcutInfo si) ->
+                                    si.isVisibleToPublisher()
+                                            && (si.getFlags() & shortcutFlags) != 0));
+                }
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
-    public void getShareTargets(String packageName, IntentFilter filter, @UserIdInt int userId,
-            AndroidFuture<ParceledListSlice> callback) {
+    public AndroidFuture<ParceledListSlice> getShareTargets(
+            String packageName, IntentFilter filter, @UserIdInt int userId) {
+        final AndroidFuture<ParceledListSlice> ret = new AndroidFuture<>();
         try {
             Preconditions.checkStringNotEmpty(packageName, "packageName");
             Objects.requireNonNull(filter, "intentFilter");
@@ -2537,21 +2704,29 @@
             verifyCaller(packageName, userId);
             enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_APP_PREDICTIONS,
                     "getShareTargets");
-
-            synchronized (mLock) {
-                throwIfUserLockedL(userId);
-
-                final List<ShortcutManager.ShareShortcutInfo> shortcutInfoList = new ArrayList<>();
-
-                final ShortcutUser user = getUserShortcutsLocked(userId);
-                user.forAllPackages(
-                        p -> shortcutInfoList.addAll(p.getMatchingShareTargets(filter)));
-
-                callback.complete(new ParceledListSlice<>(shortcutInfoList));
-            }
         } catch (Exception e) {
-            callback.completeExceptionally(e);
+            ret.completeExceptionally(e);
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
+
+                    final List<ShortcutManager.ShareShortcutInfo> shortcutInfoList =
+                            new ArrayList<>();
+
+                    final ShortcutUser user = getUserShortcutsLocked(userId);
+                    user.forAllPackages(
+                            p -> shortcutInfoList.addAll(p.getMatchingShareTargets(filter)));
+
+                    ret.complete(new ParceledListSlice<>(shortcutInfoList));
+                }
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     @Override
@@ -2648,28 +2823,46 @@
     }
 
     @Override
-    public void reportShortcutUsed(String packageName, String shortcutId, int userId) {
-        verifyCaller(packageName, userId);
-
-        Objects.requireNonNull(shortcutId);
-
-        if (DEBUG) {
-            Slog.d(TAG, String.format("reportShortcutUsed: Shortcut %s package %s used on user %d",
-                    shortcutId, packageName, userId));
+    public AndroidFuture reportShortcutUsed(String packageName, String shortcutId, int userId) {
+        final AndroidFuture<Boolean> ret = new AndroidFuture<>();
+        if (!verifyCaller(packageName, userId, ret)) {
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                Objects.requireNonNull(shortcutId);
 
-        synchronized (mLock) {
-            throwIfUserLockedL(userId);
+                if (DEBUG) {
+                    Slog.d(TAG, String.format(
+                            "reportShortcutUsed: Shortcut %s package %s used on user %d",
+                            shortcutId, packageName, userId));
+                }
 
-            final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
+                synchronized (mLock) {
+                    throwIfUserLockedL(userId);
 
-            if (ps.findShortcutById(shortcutId) == null) {
-                Log.w(TAG, String.format("reportShortcutUsed: package %s doesn't have shortcut %s",
-                        packageName, shortcutId));
-                return;
+                    final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName,
+                            userId);
+
+                    if (ps.findShortcutById(shortcutId) == null) {
+                        Log.w(TAG, String.format(
+                                "reportShortcutUsed: package %s doesn't have shortcut %s",
+                                packageName, shortcutId));
+                        ret.complete(false);
+                        return;
+                    }
+                }
+
+                reportShortcutUsedInternal(packageName, shortcutId, userId);
+                ret.complete(true);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
             }
-        }
+        });
+        return ret;
+    }
 
+    private void reportShortcutUsedInternal(String packageName, String shortcutId, int userId) {
         final long token = injectClearCallingIdentity();
         try {
             mUsageStatsManagerInternal.reportShortcutUsage(packageName, shortcutId, userId);
@@ -2722,22 +2915,36 @@
     }
 
     @Override
-    public void onApplicationActive(String packageName, int userId) {
+    public AndroidFuture onApplicationActive(String packageName, int userId) {
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
         if (DEBUG) {
             Slog.d(TAG, "onApplicationActive: package=" + packageName + "  userid=" + userId);
         }
-        enforceResetThrottlingPermission();
-
-        synchronized (mLock) {
-            if (!isUserUnlockedL(userId)) {
-                // This is called by system UI, so no need to throw.  Just ignore.
-                return;
-            }
-
-            getPackageShortcutsLocked(packageName, userId)
-                    .resetRateLimitingForCommandLineNoSaving();
-            saveUserLocked(userId);
+        try {
+            enforceResetThrottlingPermission();
+        } catch (Exception e) {
+            ret.completeExceptionally(e);
+            return ret;
         }
+        injectPostToHandlerIfAppSearch(() -> {
+            try {
+                synchronized (mLock) {
+                    if (!isUserUnlockedL(userId)) {
+                        // This is called by system UI, so no need to throw.  Just ignore.
+                        ret.complete(null);
+                        return;
+                    }
+
+                    getPackageShortcutsLocked(packageName, userId)
+                            .resetRateLimitingForCommandLineNoSaving();
+                    saveUserLocked(userId);
+                }
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     // We override this method in unit tests to do a simpler check.
@@ -3191,9 +3398,8 @@
         @Override
         public List<ShortcutManager.ShareShortcutInfo> getShareTargets(
                 @NonNull String callingPackage, @NonNull IntentFilter intentFilter, int userId) {
-            final AndroidFuture<ParceledListSlice> future = new AndroidFuture<>();
-            ShortcutService.this.getShareTargets(
-                    callingPackage, intentFilter, userId, future);
+            final AndroidFuture<ParceledListSlice> future = ShortcutService.this.getShareTargets(
+                    callingPackage, intentFilter, userId);
             try {
                 return future.get().getList();
             } catch (InterruptedException | ExecutionException e) {
@@ -4319,56 +4525,72 @@
     }
 
     @Override
-    public void applyRestore(byte[] payload, @UserIdInt int userId) {
-        enforceSystem();
-        if (DEBUG || DEBUG_REBOOT) {
-            Slog.d(TAG, "Restoring user " + userId);
+    public AndroidFuture applyRestore(byte[] payload, @UserIdInt int userId) {
+        final AndroidFuture<Void> ret = new AndroidFuture<>();
+        try {
+            enforceSystem();
+        } catch (Exception e) {
+            ret.completeExceptionally(e);
+            return ret;
         }
-        synchronized (mLock) {
-            if (!isUserUnlockedL(userId)) {
-                wtf("Can't restore: user " + userId + " is locked or not running");
-                return;
-            }
-
-            // Note we print the file timestamps in dumpsys too, but also printing the timestamp
-            // in the files anyway.
-            mShortcutDumpFiles.save("restore-0-start.txt", pw -> {
-                pw.print("Start time: ");
-                dumpCurrentTime(pw);
-                pw.println();
-            });
-            mShortcutDumpFiles.save("restore-1-payload.xml", payload);
-
-            // Actually do restore.
-            final ShortcutUser restored;
-            final ByteArrayInputStream is = new ByteArrayInputStream(payload);
+        injectPostToHandler(() -> {
             try {
-                restored = loadUserInternal(userId, is, /* fromBackup */ true);
-            } catch (XmlPullParserException | IOException | InvalidFileFormatException e) {
-                Slog.w(TAG, "Restoration failed.", e);
-                return;
-            }
-            mShortcutDumpFiles.save("restore-2.txt", this::dumpInner);
+                if (DEBUG || DEBUG_REBOOT) {
+                    Slog.d(TAG, "Restoring user " + userId);
+                }
+                synchronized (mLock) {
+                    if (!isUserUnlockedL(userId)) {
+                        wtf("Can't restore: user " + userId + " is locked or not running");
+                        ret.complete(null);
+                        return;
+                    }
 
-            getUserShortcutsLocked(userId).mergeRestoredFile(restored);
+                    // Note we print the file timestamps in dumpsys too, but also printing the
+                    // timestamp in the files anyway.
+                    mShortcutDumpFiles.save("restore-0-start.txt", pw -> {
+                        pw.print("Start time: ");
+                        dumpCurrentTime(pw);
+                        pw.println();
+                    });
+                    mShortcutDumpFiles.save("restore-1-payload.xml", payload);
 
-            mShortcutDumpFiles.save("restore-3.txt", this::dumpInner);
+                    // Actually do restore.
+                    final ShortcutUser restored;
+                    final ByteArrayInputStream is = new ByteArrayInputStream(payload);
+                    try {
+                        restored = loadUserInternal(userId, is, /* fromBackup */ true);
+                    } catch (XmlPullParserException | IOException | InvalidFileFormatException e) {
+                        Slog.w(TAG, "Restoration failed.", e);
+                        ret.complete(null);
+                        return;
+                    }
+                    mShortcutDumpFiles.save("restore-2.txt", this::dumpInner);
 
-            // Rescan all packages to re-publish manifest shortcuts and do other checks.
-            rescanUpdatedPackagesLocked(userId,
-                    0 // lastScanTime = 0; rescan all packages.
+                    getUserShortcutsLocked(userId).mergeRestoredFile(restored);
+
+                    mShortcutDumpFiles.save("restore-3.txt", this::dumpInner);
+
+                    // Rescan all packages to re-publish manifest shortcuts and do other checks.
+                    rescanUpdatedPackagesLocked(userId,
+                            0 // lastScanTime = 0; rescan all packages.
                     );
 
-            mShortcutDumpFiles.save("restore-4.txt", this::dumpInner);
+                    mShortcutDumpFiles.save("restore-4.txt", this::dumpInner);
 
-            mShortcutDumpFiles.save("restore-5-finish.txt", pw -> {
-                pw.print("Finish time: ");
-                dumpCurrentTime(pw);
-                pw.println();
-            });
+                    mShortcutDumpFiles.save("restore-5-finish.txt", pw -> {
+                        pw.print("Finish time: ");
+                        dumpCurrentTime(pw);
+                        pw.println();
+                    });
 
-            saveUserLocked(userId);
-        }
+                    saveUserLocked(userId);
+                }
+                ret.complete(null);
+            } catch (Exception e) {
+                ret.completeExceptionally(e);
+            }
+        });
+        return ret;
     }
 
     // === Dump ===
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index 81cfbf7..90a3c58 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -105,10 +105,9 @@
         }
       ]
     },
-    // TODO(b/157425108): Re-enable the test after the bug is fixed.
-    // {
-    //   "name": "CtsAppSecurityHostTestCases"
-    // },
+    {
+      "name": "CtsAppSecurityHostTestCases"
+    },
     {
       "name": "PackageManagerServiceHostTests"
     },
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 2a0257d..cf18156 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1516,13 +1516,13 @@
     }
 
     @Override
-    public boolean sharesMediaWithParent(@UserIdInt int userId) {
+    public boolean isMediaSharedWithParent(@UserIdInt int userId) {
         checkManageOrInteractPermissionIfCallerInOtherProfileGroup(userId,
-                "sharesMediaWithParent");
+                "isMediaSharedWithParent");
         synchronized (mUsersLock) {
             UserTypeDetails userTypeDetails = getUserTypeDetailsNoChecks(userId);
             return userTypeDetails != null ? userTypeDetails.isProfile()
-                    && userTypeDetails.sharesMediaWithParent() : false;
+                    && userTypeDetails.isMediaSharedWithParent() : false;
         }
     }
 
diff --git a/services/core/java/com/android/server/pm/UserTypeDetails.java b/services/core/java/com/android/server/pm/UserTypeDetails.java
index 6824f7d..92ec31b 100644
--- a/services/core/java/com/android/server/pm/UserTypeDetails.java
+++ b/services/core/java/com/android/server/pm/UserTypeDetails.java
@@ -154,7 +154,7 @@
      *
      * <p> Default value is false
      */
-    private final boolean mSharesMediaWithParent;
+    private final boolean mIsMediaSharedWithParent;
 
     private UserTypeDetails(@NonNull String name, boolean enabled, int maxAllowed,
             @UserInfoFlag int baseType, @UserInfoFlag int defaultUserInfoPropertyFlags, int label,
@@ -166,7 +166,7 @@
             @Nullable Bundle defaultSystemSettings,
             @Nullable Bundle defaultSecureSettings,
             @Nullable List<DefaultCrossProfileIntentFilter> defaultCrossProfileIntentFilters,
-            boolean sharesMediaWithParent) {
+            boolean isMediaSharedWithParent) {
         this.mName = name;
         this.mEnabled = enabled;
         this.mMaxAllowed = maxAllowed;
@@ -185,7 +185,7 @@
         this.mBadgeLabels = badgeLabels;
         this.mBadgeColors = badgeColors;
         this.mDarkThemeBadgeColors = darkThemeBadgeColors;
-        this.mSharesMediaWithParent = sharesMediaWithParent;
+        this.mIsMediaSharedWithParent = isMediaSharedWithParent;
     }
 
     /**
@@ -303,8 +303,8 @@
     /**
      * Returns true if the user has shared media with parent user or false otherwise.
      */
-    public boolean sharesMediaWithParent() {
-        return mSharesMediaWithParent;
+    public boolean isMediaSharedWithParent() {
+        return mIsMediaSharedWithParent;
     }
 
     /** Returns a {@link Bundle} representing the default user restrictions. */
@@ -398,7 +398,7 @@
         private @DrawableRes int mIconBadge = Resources.ID_NULL;
         private @DrawableRes int mBadgePlain = Resources.ID_NULL;
         private @DrawableRes int mBadgeNoBackground = Resources.ID_NULL;
-        private boolean mSharesMediaWithParent = false;
+        private boolean mIsMediaSharedWithParent = false;
 
         public Builder setName(String name) {
             mName = name;
@@ -491,10 +491,10 @@
 
         /**
          * Sets shared media property for the user.
-         * @param sharesMediaWithParent the value to be set, true or false
+         * @param isMediaSharedWithParent the value to be set, true or false
          */
-        public Builder setSharesMediaWithParent(boolean sharesMediaWithParent) {
-            mSharesMediaWithParent = sharesMediaWithParent;
+        public Builder setIsMediaSharedWithParent(boolean isMediaSharedWithParent) {
+            mIsMediaSharedWithParent = isMediaSharedWithParent;
             return this;
         }
 
@@ -527,7 +527,7 @@
                     mIconBadge, mBadgePlain, mBadgeNoBackground, mBadgeLabels, mBadgeColors,
                     mDarkThemeBadgeColors == null ? mBadgeColors : mDarkThemeBadgeColors,
                     mDefaultRestrictions, mDefaultSystemSettings, mDefaultSecureSettings,
-                    mDefaultCrossProfileIntentFilters, mSharesMediaWithParent);
+                    mDefaultCrossProfileIntentFilters, mIsMediaSharedWithParent);
         }
 
         private boolean hasBadge() {
diff --git a/services/core/java/com/android/server/pm/UserTypeFactory.java b/services/core/java/com/android/server/pm/UserTypeFactory.java
index e8421a5..30cb40c 100644
--- a/services/core/java/com/android/server/pm/UserTypeFactory.java
+++ b/services/core/java/com/android/server/pm/UserTypeFactory.java
@@ -121,7 +121,7 @@
                 .setMaxAllowedPerParent(1)
                 .setLabel(0)
                 .setDefaultRestrictions(null)
-                .setSharesMediaWithParent(true);
+                .setIsMediaSharedWithParent(true);
     }
 
     /**
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 34003c7..50f958f 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -211,6 +211,7 @@
         NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_ADVERTISE);
         NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_CONNECT);
         NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_SCAN);
+        NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.UWB_RANGING);
     }
 
     private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
@@ -422,19 +423,24 @@
             grantRuntimePermissionsForSystemPackage(pm, userId, pkg);
         }
 
-        // Grant READ_PHONE_STATE to all system apps that have READ_PRIVILEGED_PHONE_STATE
+        // Re-grant READ_PHONE_STATE as non-fixed to all system apps that have
+        // READ_PRIVILEGED_PHONE_STATE and READ_PHONE_STATE granted -- this is to undo the fixed
+        // grant from R.
         for (PackageInfo pkg : packages) {
             if (pkg == null
                     || !doesPackageSupportRuntimePermissions(pkg)
                     || ArrayUtils.isEmpty(pkg.requestedPermissions)
                     || !pm.isGranted(Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
-                            pkg, UserHandle.of(userId))) {
+                            pkg, UserHandle.of(userId))
+                    || !pm.isGranted(Manifest.permission.READ_PHONE_STATE, pkg,
+                            UserHandle.of(userId))) {
                 continue;
             }
-            grantRuntimePermissions(pm, pkg,
-                    Collections.singleton(Manifest.permission.READ_PHONE_STATE),
-                    true, // systemFixed
-                    userId);
+
+            pm.updatePermissionFlags(Manifest.permission.READ_PHONE_STATE, pkg,
+                    PackageManager.FLAG_PERMISSION_SYSTEM_FIXED,
+                    0,
+                    UserHandle.of(userId));
         }
 
     }
@@ -1723,7 +1729,7 @@
                 int flagMask, int flagValues, @NonNull UserHandle user) {
             PermissionState state = getPermissionState(permission, pkg, user);
             state.initFlags();
-            state.newFlags |= flagValues & flagMask;
+            state.newFlags = (state.newFlags & ~flagMask) | (flagValues & flagMask);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java
index fd9aa3e..b1676d0 100644
--- a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java
@@ -21,9 +21,11 @@
 import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.os.Binder;
+import android.os.Build;
 import android.os.Process;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -87,19 +89,7 @@
     @Override
     public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message,
             @Nullable String callingFeatureId, int pid, int uid) {
-        // If the check is being requested by an app then only allow the app to query its own
-        // access status.
-        int callingUid = mInjector.getCallingUid();
-        int callingPid = mInjector.getCallingPid();
-        if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID && (callingUid != uid
-                || callingPid != pid)) {
-            String response = String.format(
-                    "Calling uid %d, pid %d cannot check device identifier access for package %s "
-                            + "(uid=%d, pid=%d)",
-                    callingUid, callingPid, packageName, uid, pid);
-            Log.w(TAG, response);
-            throw new SecurityException(response);
-        }
+        verifyCallerCanCheckAccess(packageName, message, pid, uid);
         // Allow system and root access to the device identifiers.
         final int appId = UserHandle.getAppId(uid);
         if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) {
@@ -138,6 +128,110 @@
     }
 
     @Override
+    public int checkPhoneNumberAccess(@Nullable String packageName, @Nullable String message,
+            @Nullable String callingFeatureId, int pid, int uid) {
+        verifyCallerCanCheckAccess(packageName, message, pid, uid);
+        if (mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid,
+                uid) == PackageManager.PERMISSION_GRANTED) {
+            // Skip checking for runtime permission since caller has privileged permission
+            return PackageManager.PERMISSION_GRANTED;
+        }
+        // if the packageName is null then just return now as the rest of the checks require a
+        // valid package name.
+        if (packageName == null) {
+            return PackageManager.PERMISSION_DENIED;
+        }
+        // If the target SDK version is below R then also check for READ_PHONE_STATE; prior to R
+        // the phone number was accessible with the READ_PHONE_STATE permission granted.
+        boolean preR = false;
+        int result = PackageManager.PERMISSION_DENIED;
+        try {
+            ApplicationInfo info = mInjector.getApplicationInfo(packageName, uid);
+            preR = info.targetSdkVersion <= Build.VERSION_CODES.Q;
+        } catch (PackageManager.NameNotFoundException nameNotFoundException) {
+        }
+        if (preR) {
+            // For target SDK < R if the READ_PHONE_STATE permission is granted but the appop
+            // is not granted then the caller should receive null / empty data instead of a
+            // potentially crashing SecurityException. Save the result of the READ_PHONE_STATE
+            // permission / appop check; if both do not pass then first check if the app meets
+            // any of the other requirements for access, if not then return the result of this
+            // check.
+            result = checkPermissionAndAppop(packageName,
+                    android.Manifest.permission.READ_PHONE_STATE,
+                    AppOpsManager.OPSTR_READ_PHONE_STATE, callingFeatureId, message, pid, uid);
+            if (result == PackageManager.PERMISSION_GRANTED) {
+                return result;
+            }
+        }
+        // Default SMS app can always read it.
+        if (checkPermissionAndAppop(packageName, null, AppOpsManager.OPSTR_WRITE_SMS,
+                callingFeatureId, message, pid, uid) == PackageManager.PERMISSION_GRANTED) {
+            return PackageManager.PERMISSION_GRANTED;
+        }
+        // Can be read with READ_PHONE_NUMBERS too.
+        if (checkPermissionAndAppop(packageName, android.Manifest.permission.READ_PHONE_NUMBERS,
+                AppOpsManager.OPSTR_READ_PHONE_NUMBERS, callingFeatureId, message, pid, uid)
+                == PackageManager.PERMISSION_GRANTED) {
+            return PackageManager.PERMISSION_GRANTED;
+        }
+        // Can be read with READ_SMS too.
+        if (checkPermissionAndAppop(packageName, android.Manifest.permission.READ_SMS,
+                AppOpsManager.OPSTR_READ_SMS, callingFeatureId, message, pid, uid)
+                == PackageManager.PERMISSION_GRANTED) {
+            return PackageManager.PERMISSION_GRANTED;
+        }
+        return result;
+    }
+
+    private void verifyCallerCanCheckAccess(String packageName, String message, int pid, int uid) {
+        // If the check is being requested by an app then only allow the app to query its own
+        // access status.
+        int callingUid = mInjector.getCallingUid();
+        int callingPid = mInjector.getCallingPid();
+        if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID && (callingUid != uid
+                || callingPid != pid)) {
+            String response = String.format(
+                    "Calling uid %d, pid %d cannot access for package %s (uid=%d, pid=%d): %s",
+                    callingUid, callingPid, packageName, uid, pid, message);
+            Log.w(TAG, response);
+            throw new SecurityException(response);
+        }
+    }
+
+    /**
+     * Returns whether the specified {@code packageName} with {@code pid} and {@code uid} has been
+     * granted the provided {@code permission} and {@code appop}, using the {@code callingFeatureId}
+     * and {@code message} for the {@link
+     * AppOpsManager#noteOpNoThrow(int, int, String, String, String)} call.
+
+     * @return <ul>
+     *     <li>{@link PackageManager#PERMISSION_GRANTED} if both the permission and the appop
+     *     are granted to the package</li>
+     *     <li>{@link android.app.AppOpsManager#MODE_IGNORED} if the permission is granted to the
+     *     package but the appop is not</li>
+     *     <li>{@link PackageManager#PERMISSION_DENIED} if the permission is not granted to the
+     *     package</li>
+     * </ul>
+     */
+    private int checkPermissionAndAppop(String packageName, String permission, String appop,
+            String callingFeatureId, String message, int pid, int uid) {
+        if (permission != null) {
+            if (mInjector.checkPermission(permission, pid, uid)
+                    != PackageManager.PERMISSION_GRANTED) {
+                return PackageManager.PERMISSION_DENIED;
+            }
+        }
+        AppOpsManager appOpsManager = (AppOpsManager) mInjector.getSystemService(
+                Context.APP_OPS_SERVICE);
+        if (appOpsManager.noteOpNoThrow(appop, uid, packageName, callingFeatureId, message)
+                != AppOpsManager.MODE_ALLOWED) {
+            return AppOpsManager.MODE_IGNORED;
+        }
+        return PackageManager.PERMISSION_GRANTED;
+    }
+
+    @Override
     public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
         final int callingUid = Binder.getCallingUid();
         PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
@@ -348,5 +442,16 @@
         public Object getSystemService(@NonNull String name) {
             return mContext.getSystemService(name);
         }
+
+        /**
+         * Returns the {@link ApplicationInfo} for the specified {@code packageName} under the
+         * provided {@code uid}.
+         */
+        public ApplicationInfo getApplicationInfo(@Nullable String packageName, int uid)
+                throws PackageManager.NameNotFoundException {
+
+            return mContext.getPackageManager().getApplicationInfoAsUser(packageName, 0,
+                    UserHandle.getUserHandleForUid(uid));
+        }
     }
 }
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java
index a8a6a72..a5ba82f 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationCollector.java
@@ -17,6 +17,7 @@
 package com.android.server.pm.verify.domain;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledSince;
 import android.content.Intent;
@@ -33,6 +34,8 @@
 import com.android.server.pm.parsing.pkg.AndroidPackage;
 
 import java.util.List;
+import java.util.Objects;
+import java.util.function.BiFunction;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -44,6 +47,12 @@
 
     private static final int MAX_DOMAINS_BYTE_SIZE = 1024 * 1024;
 
+    private static final BiFunction<ArraySet<String>, String, Boolean> ARRAY_SET_COLLECTOR =
+            (set, domain) -> {
+                set.add(domain);
+                return null;
+            };
+
     @NonNull
     private final PlatformCompat mPlatformCompat;
 
@@ -105,27 +114,62 @@
         return collectDomains(pkg, true /* checkAutoVerify */, false /* valid */);
     }
 
+    public boolean containsWebDomain(@NonNull AndroidPackage pkg, @NonNull String targetDomain) {
+        return collectDomains(pkg, false /* checkAutoVerify */, true /* valid */, null,
+                (BiFunction<Void, String, Boolean>) (unused, domain) -> {
+                    if (Objects.equals(targetDomain, domain)) {
+                        return true;
+                    }
+                    return null;
+                }) != null;
+    }
+
+    public boolean containsAutoVerifyDomain(@NonNull AndroidPackage pkg,
+            @NonNull String targetDomain) {
+        return collectDomains(pkg, true /* checkAutoVerify */, true /* valid */, null,
+                (BiFunction<Void, String, Boolean>) (unused, domain) -> {
+                    if (Objects.equals(targetDomain, domain)) {
+                        return true;
+                    }
+                    return null;
+                }) != null;
+    }
+
     @NonNull
     private ArraySet<String> collectDomains(@NonNull AndroidPackage pkg,
             boolean checkAutoVerify, boolean valid) {
+        ArraySet<String> domains = new ArraySet<>();
+        collectDomains(pkg, checkAutoVerify, valid, domains, ARRAY_SET_COLLECTOR);
+        return domains;
+    }
+
+    @NonNull
+    private <InitialValue, ReturnValue> ReturnValue collectDomains(@NonNull AndroidPackage pkg,
+            boolean checkAutoVerify, boolean valid, @Nullable InitialValue initialValue,
+            @NonNull BiFunction<InitialValue, String, ReturnValue> domainCollector) {
         boolean restrictDomains =
                 DomainVerificationUtils.isChangeEnabled(mPlatformCompat, pkg, RESTRICT_DOMAINS);
 
         if (restrictDomains) {
-            return collectDomainsInternal(pkg, checkAutoVerify, valid);
+            return collectDomainsInternal(pkg, checkAutoVerify, valid, initialValue,
+                    domainCollector);
         } else {
-            return collectDomainsLegacy(pkg, checkAutoVerify, valid);
+            return collectDomainsLegacy(pkg, checkAutoVerify, valid, initialValue, domainCollector);
         }
     }
 
     /**
      * @see #RESTRICT_DOMAINS
      */
-    private ArraySet<String> collectDomainsLegacy(@NonNull AndroidPackage pkg,
-            boolean checkAutoVerify, boolean valid) {
+    @Nullable
+    private <InitialValue, ReturnValue> ReturnValue collectDomainsLegacy(
+            @NonNull AndroidPackage pkg, boolean checkAutoVerify, boolean valid,
+            @Nullable InitialValue initialValue,
+            @NonNull BiFunction<InitialValue, String, ReturnValue> domainCollector) {
         if (!checkAutoVerify) {
             // Per-domain user selection state doesn't have a V1 equivalent on S, so just use V2
-            return collectDomainsInternal(pkg, false /* checkAutoVerify */, true /* valid */);
+            return collectDomainsInternal(pkg, false /* checkAutoVerify */, true /* valid */,
+                    initialValue, domainCollector);
         }
 
         List<ParsedActivity> activities = pkg.getActivities();
@@ -148,11 +192,10 @@
             }
 
             if (!needsAutoVerify) {
-                return new ArraySet<>();
+                return null;
             }
         }
 
-        ArraySet<String> domains = new ArraySet<>();
         int totalSize = 0;
         boolean underMaxSize = true;
         for (int activityIndex = 0; activityIndex < activitiesSize && underMaxSize;
@@ -169,22 +212,30 @@
                         if (isValidHost(host) == valid) {
                             totalSize += byteSizeOf(host);
                             underMaxSize = totalSize < MAX_DOMAINS_BYTE_SIZE;
-                            domains.add(host);
+                            ReturnValue returnValue = domainCollector.apply(initialValue, host);
+                            if (returnValue != null) {
+                                return returnValue;
+                            }
                         }
                     }
                 }
             }
         }
 
-        return domains;
+        return null;
     }
 
     /**
      * @see #RESTRICT_DOMAINS
+     * @param domainCollector Function to call with initialValue and a valid host. Should return
+     *                        a non-null value if the function should return immediately
+     *                        after the currently processed host.
      */
-    private ArraySet<String> collectDomainsInternal(@NonNull AndroidPackage pkg,
-            boolean checkAutoVerify, boolean valid) {
-        ArraySet<String> domains = new ArraySet<>();
+    @Nullable
+    private <InitialValue, ReturnValue> ReturnValue collectDomainsInternal(
+            @NonNull AndroidPackage pkg, boolean checkAutoVerify, boolean valid,
+            @Nullable InitialValue initialValue,
+            @NonNull BiFunction<InitialValue, String, ReturnValue> domainCollector) {
         int totalSize = 0;
         boolean underMaxSize = true;
 
@@ -226,13 +277,16 @@
                     if (isValidHost(host) == valid) {
                         totalSize += byteSizeOf(host);
                         underMaxSize = totalSize < MAX_DOMAINS_BYTE_SIZE;
-                        domains.add(host);
+                        ReturnValue returnValue = domainCollector.apply(initialValue, host);
+                        if (returnValue != null) {
+                            return returnValue;
+                        }
                     }
                 }
             }
         }
 
-        return domains;
+        return null;
     }
 
     /**
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java
index 39ed488..adf8f0d 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java
@@ -37,6 +37,7 @@
 import com.android.server.pm.verify.domain.models.DomainVerificationStateMap;
 
 import java.util.Arrays;
+import java.util.List;
 import java.util.function.Function;
 
 @SuppressWarnings("PointlessBooleanExpression")
@@ -100,6 +101,70 @@
         }
     }
 
+    /**
+     * @param userIdToApprovalLevelToOwners Mapping of user ID to approval level to domain owners.
+     */
+    public void printOwners(@NonNull IndentingPrintWriter writer, @NonNull String domain,
+            SparseArray<SparseArray<List<String>>> userIdToApprovalLevelToOwners) {
+        writer.println(domain + ":");
+        writer.increaseIndent();
+
+        if (userIdToApprovalLevelToOwners.size() == 0) {
+            writer.println("none");
+            writer.decreaseIndent();
+            return;
+        }
+
+        int usersSize = userIdToApprovalLevelToOwners.size();
+        for (int userIndex = 0; userIndex < usersSize; userIndex++) {
+            int userId = userIdToApprovalLevelToOwners.keyAt(userIndex);
+            SparseArray<List<String>> approvalLevelToOwners =
+                    userIdToApprovalLevelToOwners.valueAt(userIndex);
+
+            if (approvalLevelToOwners.size() == 0) {
+                continue;
+            }
+
+            boolean printedUserHeader = false;
+            int approvalsSize = approvalLevelToOwners.size();
+            for (int approvalIndex = 0; approvalIndex < approvalsSize; approvalIndex++) {
+                int approvalLevel = approvalLevelToOwners.keyAt(approvalIndex);
+                if (approvalLevel < DomainVerificationManagerInternal.APPROVAL_LEVEL_UNVERIFIED) {
+                    continue;
+                }
+
+                if (!printedUserHeader) {
+                    writer.println("User " + userId + ":");
+                    writer.increaseIndent();
+                    printedUserHeader = true;
+                }
+
+                String approvalString =
+                        DomainVerificationManagerInternal.approvalLevelToDebugString(approvalLevel);
+                List<String> owners = approvalLevelToOwners.valueAt(approvalIndex);
+                writer.println(approvalString + "[" + approvalLevel + "]" + ":");
+                writer.increaseIndent();
+
+                if (owners.size() == 0) {
+                    writer.println("none");
+                    writer.decreaseIndent();
+                    continue;
+                }
+
+                int ownersSize = owners.size();
+                for (int ownersIndex = 0; ownersIndex < ownersSize; ownersIndex++) {
+                    writer.println(owners.get(ownersIndex));
+                }
+                writer.decreaseIndent();
+            }
+
+            if (printedUserHeader) {
+                writer.decreaseIndent();
+            }
+        }
+        writer.decreaseIndent();
+    }
+
     boolean printState(@NonNull IndentingPrintWriter writer,
             @NonNull DomainVerificationPkgState pkgState, @NonNull AndroidPackage pkg,
             @NonNull ArrayMap<String, Integer> reusedMap, boolean wasHeaderPrinted) {
@@ -120,7 +185,7 @@
                 Signature[] signatures = pkg.getSigningDetails().signatures;
                 String signaturesDigest = signatures == null ? null : Arrays.toString(
                         PackageUtils.computeSignaturesSha256Digests(
-                                pkg.getSigningDetails().signatures));
+                                pkg.getSigningDetails().signatures, ":"));
 
                 writer.println(pkgState.getPackageName() + ":");
                 writer.increaseIndent();
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
index 0f99e19..5aed367 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java
@@ -57,6 +57,28 @@
     UUID DISABLED_ID = new UUID(0, 0);
 
     /**
+     * The app was not installed for the user.
+     */
+    int APPROVAL_LEVEL_NOT_INSTALLED = -4;
+
+    /**
+     * The app was not enabled for the user.
+     */
+    int APPROVAL_LEVEL_DISABLED = -3;
+
+    /**
+     * The app has not declared this domain in a valid web intent-filter in their manifest, and so
+     * would never be able to be approved for this domain.
+     */
+    int APPROVAL_LEVEL_UNDECLARED = -2;
+
+    /**
+     * The app has declared this domain as a valid autoVerify domain, but it failed or has not
+     * succeeded verification.
+     */
+    int APPROVAL_LEVEL_UNVERIFIED = -1;
+
+    /**
      * The app has not been approved for this domain and should never be able to open it through
      * an implicit web intent.
      */
@@ -117,10 +139,14 @@
      * by approval priority. A higher numerical value means the package should override all lower
      * values. This means that comparison using less/greater than IS valid.
      *
-     * Negative values are possible, although not implemented, reserved if explicit disable of a
-     * package for a domain needs to be tracked.
+     * Negative values are possible, used for tracking specific reasons for why an app doesn't have
+     * approval.
      */
     @IntDef({
+            APPROVAL_LEVEL_NOT_INSTALLED,
+            APPROVAL_LEVEL_DISABLED,
+            APPROVAL_LEVEL_UNDECLARED,
+            APPROVAL_LEVEL_UNVERIFIED,
             APPROVAL_LEVEL_NONE,
             APPROVAL_LEVEL_LEGACY_ASK,
             APPROVAL_LEVEL_LEGACY_ALWAYS,
@@ -131,6 +157,33 @@
     @interface ApprovalLevel {
     }
 
+    static String approvalLevelToDebugString(@ApprovalLevel int level) {
+        switch (level) {
+            case APPROVAL_LEVEL_NOT_INSTALLED:
+                return "NOT_INSTALLED";
+            case APPROVAL_LEVEL_DISABLED:
+                return "DISABLED";
+            case APPROVAL_LEVEL_UNDECLARED:
+                return "UNDECLARED";
+            case APPROVAL_LEVEL_UNVERIFIED:
+                return "UNVERIFIED";
+            case APPROVAL_LEVEL_NONE:
+                return "NONE";
+            case APPROVAL_LEVEL_LEGACY_ASK:
+                return "LEGACY_ASK";
+            case APPROVAL_LEVEL_LEGACY_ALWAYS:
+                return "LEGACY_ALWAYS";
+            case APPROVAL_LEVEL_SELECTION:
+                return "USER_SELECTION";
+            case APPROVAL_LEVEL_VERIFIED:
+                return "VERIFIED";
+            case APPROVAL_LEVEL_INSTANT_APP:
+                return "INSTANT_APP";
+            default:
+                return "UNKNOWN";
+        }
+    }
+
     /** @see DomainVerificationManager#getDomainVerificationInfo(String) */
     @Nullable
     @RequiresPermission(anyOf = {
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
index a3e1a9c..3a4b849 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java
@@ -741,62 +741,21 @@
         });
     }
 
+    @NonNull
     public List<DomainOwner> getOwnersForDomain(@NonNull String domain, @UserIdInt int userId) {
         Objects.requireNonNull(domain);
         mEnforcer.assertOwnerQuerent(mConnection.getCallingUid(), mConnection.getCallingUserId(),
                 userId);
 
-        SparseArray<List<String>> levelToPackages = new SparseArray<>();
         return mConnection.withPackageSettingsReturningThrowing(pkgSettings -> {
-            // First, collect the raw approval level values
-            synchronized (mLock) {
-                final int size = mAttachedPkgStates.size();
-                for (int index = 0; index < size; index++) {
-                    DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
-                    String packageName = pkgState.getPackageName();
-                    PackageSetting pkgSetting = pkgSettings.apply(packageName);
-                    if (pkgSetting == null) {
-                        continue;
-                    }
-
-                    int level = approvalLevelForDomain(pkgSetting, domain, userId, domain);
-                    if (level <= APPROVAL_LEVEL_NONE) {
-                        continue;
-                    }
-                    List<String> list = levelToPackages.get(level);
-                    if (list == null) {
-                        list = new ArrayList<>();
-                        levelToPackages.put(level, list);
-                    }
-                    list.add(packageName);
-                }
-            }
-
-            final int size = levelToPackages.size();
-            if (size == 0) {
+            SparseArray<List<String>> levelToPackages = getOwnersForDomainInternal(domain, false,
+                    userId, pkgSettings);
+            if (levelToPackages.size() == 0) {
                 return emptyList();
             }
 
-            // Then sort them ascending by first installed time, with package name as tie breaker
-            for (int index = 0; index < size; index++) {
-                levelToPackages.valueAt(index).sort((first, second) -> {
-                    PackageSetting firstPkgSetting = pkgSettings.apply(first);
-                    PackageSetting secondPkgSetting = pkgSettings.apply(second);
-
-                    long firstInstallTime =
-                            firstPkgSetting == null ? -1L : firstPkgSetting.getFirstInstallTime();
-                    long secondInstallTime =
-                            secondPkgSetting == null ? -1L : secondPkgSetting.getFirstInstallTime();
-
-                    if (firstInstallTime != secondInstallTime) {
-                        return (int) (firstInstallTime - secondInstallTime);
-                    }
-
-                    return first.compareToIgnoreCase(second);
-                });
-            }
-
             List<DomainOwner> owners = new ArrayList<>();
+            int size = levelToPackages.size();
             for (int index = 0; index < size; index++) {
                 int level = levelToPackages.keyAt(index);
                 boolean overrideable = level <= APPROVAL_LEVEL_SELECTION;
@@ -811,6 +770,69 @@
         });
     }
 
+    /**
+     * @param includeNegative See {@link #approvalLevelForDomain(PackageSetting, String, boolean,
+     *                        int, Object)}.
+     * @return Mapping of approval level to packages; packages are sorted by firstInstallTime. Null
+     * if no owners were found.
+     */
+    @NonNull
+    private SparseArray<List<String>> getOwnersForDomainInternal(@NonNull String domain,
+            boolean includeNegative, @UserIdInt int userId,
+            @NonNull Function<String, PackageSetting> pkgSettingFunction) {
+        SparseArray<List<String>> levelToPackages = new SparseArray<>();
+        // First, collect the raw approval level values
+        synchronized (mLock) {
+            final int size = mAttachedPkgStates.size();
+            for (int index = 0; index < size; index++) {
+                DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index);
+                String packageName = pkgState.getPackageName();
+                PackageSetting pkgSetting = pkgSettingFunction.apply(packageName);
+                if (pkgSetting == null) {
+                    continue;
+                }
+
+                int level = approvalLevelForDomain(pkgSetting, domain, includeNegative, userId,
+                        domain);
+                if (!includeNegative && level <= APPROVAL_LEVEL_NONE) {
+                    continue;
+                }
+                List<String> list = levelToPackages.get(level);
+                if (list == null) {
+                    list = new ArrayList<>();
+                    levelToPackages.put(level, list);
+                }
+                list.add(packageName);
+            }
+        }
+
+        final int size = levelToPackages.size();
+        if (size == 0) {
+            return levelToPackages;
+        }
+
+        // Then sort them ascending by first installed time, with package name as tie breaker
+        for (int index = 0; index < size; index++) {
+            levelToPackages.valueAt(index).sort((first, second) -> {
+                PackageSetting firstPkgSetting = pkgSettingFunction.apply(first);
+                PackageSetting secondPkgSetting = pkgSettingFunction.apply(second);
+
+                long firstInstallTime =
+                        firstPkgSetting == null ? -1L : firstPkgSetting.getFirstInstallTime();
+                long secondInstallTime =
+                        secondPkgSetting == null ? -1L : secondPkgSetting.getFirstInstallTime();
+
+                if (firstInstallTime != secondInstallTime) {
+                    return (int) (firstInstallTime - secondInstallTime);
+                }
+
+                return first.compareToIgnoreCase(second);
+            });
+        }
+
+        return levelToPackages;
+    }
+
     @NonNull
     @Override
     public UUID generateNewId() {
@@ -1153,6 +1175,88 @@
         }
     }
 
+    @Override
+    public void printOwnersForPackage(@NonNull IndentingPrintWriter writer,
+            @Nullable String packageName, @Nullable @UserIdInt Integer userId)
+            throws NameNotFoundException {
+        mConnection.withPackageSettingsThrowing(pkgSettings -> {
+            synchronized (mLock) {
+                if (packageName == null) {
+                    int size = mAttachedPkgStates.size();
+                    for (int index = 0; index < size; index++) {
+                        try {
+                            printOwnersForPackage(writer,
+                                    mAttachedPkgStates.valueAt(index).getPackageName(), userId,
+                                    pkgSettings);
+                        } catch (NameNotFoundException ignored) {
+                            // When iterating packages, if one doesn't exist somehow, ignore
+                        }
+                    }
+                } else {
+                    printOwnersForPackage(writer, packageName, userId, pkgSettings);
+                }
+            }
+        });
+    }
+
+    private void printOwnersForPackage(@NonNull IndentingPrintWriter writer,
+            @NonNull String packageName, @Nullable @UserIdInt Integer userId,
+            @NonNull Function<String, PackageSetting> pkgSettingFunction)
+            throws NameNotFoundException {
+        PackageSetting pkgSetting = pkgSettingFunction.apply(packageName);
+        AndroidPackage pkg = pkgSetting == null ? null : pkgSetting.getPkg();
+        if (pkg == null) {
+            throw DomainVerificationUtils.throwPackageUnavailable(packageName);
+        }
+
+        ArraySet<String> domains = mCollector.collectAllWebDomains(pkg);
+        int size = domains.size();
+        if (size == 0) {
+            return;
+        }
+
+        writer.println(packageName + ":");
+        writer.increaseIndent();
+
+        for (int index = 0; index < size; index++) {
+            printOwnersForDomain(writer, domains.valueAt(index), userId, pkgSettingFunction);
+        }
+
+        writer.decreaseIndent();
+    }
+
+    @Override
+    public void printOwnersForDomains(@NonNull IndentingPrintWriter writer,
+            @NonNull List<String> domains, @Nullable @UserIdInt Integer userId) {
+        mConnection.withPackageSettings(pkgSettings -> {
+            synchronized (mLock) {
+                int size = domains.size();
+                for (int index = 0; index < size; index++) {
+                    printOwnersForDomain(writer, domains.get(index), userId, pkgSettings);
+                }
+            }
+        });
+    }
+
+    private void printOwnersForDomain(@NonNull IndentingPrintWriter writer, @NonNull String domain,
+            @Nullable @UserIdInt Integer userId,
+            @NonNull Function<String, PackageSetting> pkgSettingFunction) {
+        SparseArray<SparseArray<List<String>>> userIdToApprovalLevelToOwners =
+                new SparseArray<>();
+
+        if (userId == null || userId == UserHandle.USER_ALL) {
+            for (int aUserId : mConnection.getAllUserIds()) {
+                userIdToApprovalLevelToOwners.put(aUserId,
+                        getOwnersForDomainInternal(domain, true, aUserId, pkgSettingFunction));
+            }
+        } else {
+            userIdToApprovalLevelToOwners.put(userId,
+                    getOwnersForDomainInternal(domain, true, userId, pkgSettingFunction));
+        }
+
+        mDebug.printOwners(writer, domain, userIdToApprovalLevelToOwners);
+    }
+
     @NonNull
     @Override
     public DomainVerificationShell getShell() {
@@ -1427,7 +1531,7 @@
         // Find all approval levels
         int highestApproval = fillMapWithApprovalLevels(infoApprovals, domain, userId,
                 pkgSettingFunction);
-        if (highestApproval == APPROVAL_LEVEL_NONE) {
+        if (highestApproval <= APPROVAL_LEVEL_NONE) {
             return Pair.create(emptyList(), highestApproval);
         }
 
@@ -1484,7 +1588,7 @@
                 fillInfoMapForSamePackage(inputMap, packageName, APPROVAL_LEVEL_NONE);
                 continue;
             }
-            int approval = approvalLevelForDomain(pkgSetting, domain, userId, domain);
+            int approval = approvalLevelForDomain(pkgSetting, domain, false, userId, domain);
             highestApproval = Math.max(highestApproval, approval);
             fillInfoMapForSamePackage(inputMap, packageName, approval);
         }
@@ -1600,18 +1704,53 @@
             return APPROVAL_LEVEL_NONE;
         }
 
-        return approvalLevelForDomain(pkgSetting, intent.getData().getHost(), userId, intent);
+        return approvalLevelForDomain(pkgSetting, intent.getData().getHost(), false, userId,
+                intent);
     }
 
     /**
-     * @param debugObject Should be an {@link Intent} if checking for resolution or a {@link String}
-     *                    otherwise.
+     * @param includeNegative Whether to include negative values, which requires an expensive
+     *                          domain comparison operation.
+     * @param debugObject       Should be an {@link Intent} if checking for resolution or a
+     *                          {@link String} otherwise.
      */
     private int approvalLevelForDomain(@NonNull PackageSetting pkgSetting, @NonNull String host,
-            @UserIdInt int userId, @NonNull Object debugObject) {
+            boolean includeNegative, @UserIdInt int userId, @NonNull Object debugObject) {
+        int approvalLevel = approvalLevelForDomainInternal(pkgSetting, host, includeNegative,
+                userId, debugObject);
+        if (includeNegative && approvalLevel == APPROVAL_LEVEL_NONE) {
+            PackageUserState pkgUserState = pkgSetting.readUserState(userId);
+            if (!pkgUserState.installed) {
+                return APPROVAL_LEVEL_NOT_INSTALLED;
+            }
+
+            AndroidPackage pkg = pkgSetting.getPkg();
+            if (pkg != null) {
+                if (!pkgUserState.isPackageEnabled(pkg)) {
+                    return APPROVAL_LEVEL_DISABLED;
+                } else if (mCollector.containsAutoVerifyDomain(pkgSetting.getPkg(), host)) {
+                    return APPROVAL_LEVEL_UNVERIFIED;
+                }
+            }
+        }
+
+        return approvalLevel;
+    }
+
+    private int approvalLevelForDomainInternal(@NonNull PackageSetting pkgSetting,
+            @NonNull String host, boolean includeNegative, @UserIdInt int userId,
+            @NonNull Object debugObject) {
         String packageName = pkgSetting.getName();
         final AndroidPackage pkg = pkgSetting.getPkg();
 
+        if (pkg != null && includeNegative && !mCollector.containsWebDomain(pkg, host)) {
+            if (DEBUG_APPROVAL) {
+                debugApproval(packageName, debugObject, userId, false,
+                        "domain not declared");
+            }
+            return APPROVAL_LEVEL_UNDECLARED;
+        }
+
         final PackageUserState pkgUserState = pkgSetting.readUserState(userId);
         if (pkgUserState == null) {
             if (DEBUG_APPROVAL) {
@@ -1749,6 +1888,7 @@
     private Pair<List<String>, Integer> getApprovedPackagesLocked(@NonNull String domain,
             @UserIdInt int userId, int minimumApproval,
             @NonNull Function<String, PackageSetting> pkgSettingFunction) {
+        boolean includeNegative = minimumApproval < APPROVAL_LEVEL_NONE;
         int highestApproval = minimumApproval;
         List<String> approvedPackages = emptyList();
 
@@ -1762,7 +1902,8 @@
                     continue;
                 }
 
-                int level = approvalLevelForDomain(pkgSetting, domain, userId, domain);
+                int level = approvalLevelForDomain(pkgSetting, domain, includeNegative, userId,
+                        domain);
                 if (level < minimumApproval) {
                     continue;
                 }
diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java
index ea71b28..da2d162 100644
--- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java
+++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java
@@ -110,6 +110,13 @@
         pw.println("        packages will be reset if no one package is specified.");
         pw.println("      <ALLOWED>: true to allow the package to open auto verified links, false");
         pw.println("        to disable");
+        pw.println("  get-app-link-owners [--user <USER_ID>] [--package <PACKAGE>] [<DOMAINS>]");
+        pw.println("    Print the owners for a specific domain for a given user in low to high");
+        pw.println("    priority order.");
+        pw.println("      --user <USER_ID>: the user to query for");
+        pw.println("      --package <PACKAGE>: optionally also print for all web domains declared");
+        pw.println("        by a package, or \"all\" to print all packages");
+        pw.println("      --<DOMAINS>: space separated list of domains to query for");
     }
 
     /**
@@ -132,6 +139,8 @@
                 return runSetAppLinksUserState(commandHandler);
             case "set-app-links-allowed":
                 return runSetAppLinksAllowed(commandHandler);
+            case "get-app-link-owners":
+                return runGetAppLinkOwners(commandHandler);
         }
 
         return null;
@@ -420,6 +429,67 @@
         return true;
     }
 
+    // pm get-app-link-owners [--user <USER_ID>] [--package <PACKAGE>] [<DOMAINS>]
+    private boolean runGetAppLinkOwners(@NonNull BasicShellCommandHandler commandHandler) {
+        String packageName = null;
+        Integer userId = null;
+        String option;
+        while ((option = commandHandler.getNextOption()) != null) {
+            switch (option) {
+                case "--user":
+                    userId = UserHandle.parseUserArg(commandHandler.getNextArgRequired());
+                    break;
+                case "--package":
+                    packageName = commandHandler.getNextArgRequired();
+                    if (TextUtils.isEmpty(packageName)) {
+                        commandHandler.getErrPrintWriter().println("Error: no package specified");
+                        return false;
+                    }
+                    break;
+                default:
+                    commandHandler.getErrPrintWriter().println(
+                            "Error: unexpected option: " + option);
+                    return false;
+            }
+        }
+
+        ArrayList<String> domains = getRemainingArgs(commandHandler);
+        if (domains.isEmpty() && TextUtils.isEmpty(packageName)) {
+            commandHandler.getErrPrintWriter()
+                    .println("Error: no package name or domain specified");
+            return false;
+        }
+
+        if (userId != null) {
+            userId = translateUserId(userId, "runSetAppLinksAllowed");
+        }
+
+        try (IndentingPrintWriter writer = new IndentingPrintWriter(
+                commandHandler.getOutPrintWriter(), /* singleIndent */ "  ", /* wrapLength */
+                120)) {
+            writer.increaseIndent();
+            if (packageName != null) {
+                if (packageName.equals("all")) {
+                    packageName = null;
+                }
+
+                try {
+                    mCallback.printOwnersForPackage(writer, packageName, userId);
+                } catch (NameNotFoundException e) {
+                    commandHandler.getErrPrintWriter()
+                            .println("Error: package not found: " + packageName);
+                    return false;
+                }
+            }
+            if (!domains.isEmpty()) {
+                mCallback.printOwnersForDomains(writer, domains, userId);
+            }
+            writer.decreaseIndent();
+            return true;
+        }
+    }
+
+    @NonNull
     private ArrayList<String> getRemainingArgs(@NonNull BasicShellCommandHandler commandHandler) {
         ArrayList<String> args = new ArrayList<>();
         String arg;
@@ -534,5 +604,18 @@
          */
         void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName,
                 @Nullable @UserIdInt Integer userId) throws NameNotFoundException;
+
+        /**
+         * Print the owners for all domains in a given package.
+         */
+        void printOwnersForPackage(@NonNull IndentingPrintWriter writer,
+                @Nullable String packageName, @Nullable @UserIdInt Integer userId)
+                throws NameNotFoundException;
+
+        /**
+         * Print the owners for the given domains.
+         */
+        void printOwnersForDomains(@NonNull IndentingPrintWriter writer,
+                @NonNull List<String> domains, @Nullable @UserIdInt Integer userId);
     }
 }
diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java
index ca7406b..3a097a7 100644
--- a/services/core/java/com/android/server/policy/AppOpsPolicy.java
+++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java
@@ -37,11 +37,11 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Log;
-import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.function.HeptFunction;
 import com.android.internal.util.function.HexFunction;
+import com.android.internal.util.function.NonaFunction;
 import com.android.internal.util.function.OctFunction;
 import com.android.internal.util.function.QuadFunction;
 import com.android.internal.util.function.TriFunction;
@@ -166,7 +166,7 @@
             boolean shouldCollectAsyncNotedOp, @Nullable String message,
             boolean shouldCollectMessage, boolean skipProxyOperation, @NonNull HexFunction<Integer,
                     AttributionSource, Boolean, String, Boolean, Boolean,
-            SyncNotedAppOp> superImpl) {
+                    SyncNotedAppOp> superImpl) {
         return superImpl.apply(resolveDatasourceOp(code, attributionSource.getUid(),
                 attributionSource.getPackageName(), attributionSource.getAttributionTag()),
                 attributionSource, shouldCollectAsyncNotedOp, message, shouldCollectMessage,
@@ -174,6 +174,17 @@
     }
 
     @Override
+    public SyncNotedAppOp startOperation(IBinder token, int code, int uid,
+            @Nullable String packageName, @Nullable String attributionTag,
+            boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, String message,
+            boolean shouldCollectMessage, @NonNull NonaFunction<IBinder, Integer, Integer, String,
+                    String, Boolean, Boolean, String, Boolean, SyncNotedAppOp> superImpl) {
+        return superImpl.apply(token, resolveDatasourceOp(code, uid, packageName, attributionTag),
+                uid, packageName, attributionTag, startIfModeDefault, shouldCollectAsyncNotedOp,
+                message, shouldCollectMessage);
+    }
+
+    @Override
     public SyncNotedAppOp startProxyOperation(IBinder token, int code,
             @NonNull AttributionSource attributionSource, boolean startIfModeDefault,
             boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
@@ -269,14 +280,15 @@
     private static void updateAllowListedTagsForPackageLocked(int uid, String packageName,
             Set<String> allowListedTags, ConcurrentHashMap<Integer, ArrayMap<String,
             ArraySet<String>>> datastore) {
+        final int appId = UserHandle.getAppId(uid);
         // We make a copy of the per UID state to limit our mutation to one
         // operation in the underlying concurrent data structure.
-        ArrayMap<String, ArraySet<String>> uidTags = datastore.get(uid);
-        if (uidTags != null) {
-            uidTags = new ArrayMap<>(uidTags);
+        ArrayMap<String, ArraySet<String>> appIdTags = datastore.get(appId);
+        if (appIdTags != null) {
+            appIdTags = new ArrayMap<>(appIdTags);
         }
 
-        ArraySet<String> packageTags = (uidTags != null) ? uidTags.get(packageName) : null;
+        ArraySet<String> packageTags = (appIdTags != null) ? appIdTags.get(packageName) : null;
         if (packageTags != null) {
             packageTags = new ArraySet<>(packageTags);
         }
@@ -288,17 +300,17 @@
             } else {
                 packageTags = new ArraySet<>(allowListedTags);
             }
-            if (uidTags == null) {
-                uidTags = new ArrayMap<>();
+            if (appIdTags == null) {
+                appIdTags = new ArrayMap<>();
             }
-            uidTags.put(packageName, packageTags);
-            datastore.put(uid, uidTags);
-        } else if (uidTags != null) {
-            uidTags.remove(packageName);
-            if (!uidTags.isEmpty()) {
-                datastore.put(uid, uidTags);
+            appIdTags.put(packageName, packageTags);
+            datastore.put(appId, appIdTags);
+        } else if (appIdTags != null) {
+            appIdTags.remove(packageName);
+            if (!appIdTags.isEmpty()) {
+                datastore.put(appId, appIdTags);
             } else {
-                datastore.remove(uid);
+                datastore.remove(appId);
             }
         }
     }
@@ -307,9 +319,10 @@
             @NonNull String attributionTag, @NonNull Map<Integer, ArrayMap<String,
             ArraySet<String>>> mappedOps) {
         // Only a single lookup from the underlying concurrent data structure
-        final ArrayMap<String, ArraySet<String>> uidTags = mappedOps.get(uid);
-        if (uidTags != null) {
-            final ArraySet<String> packageTags = uidTags.get(packageName);
+        final int appId = UserHandle.getAppId(uid);
+        final ArrayMap<String, ArraySet<String>> appIdTags = mappedOps.get(appId);
+        if (appIdTags != null) {
+            final ArraySet<String> packageTags = appIdTags.get(packageName);
             if (packageTags != null && packageTags.contains(attributionTag)) {
                 return true;
             }
diff --git a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
index 6f6bdac..edd5f5f 100644
--- a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
+++ b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
@@ -83,6 +83,7 @@
     private static final String TAG = "DeviceStateProviderImpl";
 
     private static final BooleanSupplier TRUE_BOOLEAN_SUPPLIER = () -> true;
+    private static final BooleanSupplier FALSE_BOOLEAN_SUPPLIER = () -> false;
 
     @VisibleForTesting
     static final DeviceState DEFAULT_DEVICE_STATE = new DeviceState(MINIMUM_DEVICE_STATE,
@@ -152,7 +153,7 @@
     private final DeviceState[] mOrderedStates;
     // Map of state identifier to a boolean supplier that returns true when all required conditions
     // are met for the device to be in the state.
-    private final SparseArray<BooleanSupplier> mStateConditions;
+    private final SparseArray<BooleanSupplier> mStateConditions = new SparseArray<>();
 
     @Nullable
     @GuardedBy("mLock")
@@ -177,6 +178,11 @@
         Arrays.sort(orderedStates, Comparator.comparingInt(DeviceState::getIdentifier));
         mOrderedStates = orderedStates;
 
+        setStateConditions(deviceStates, stateConditions);
+    }
+
+    private void setStateConditions(@NonNull List<DeviceState> deviceStates,
+            @NonNull List<Conditions> stateConditions) {
         // Whether or not this instance should register to receive lid switch notifications from
         // InputManagerInternal. If there are no device state conditions that are based on the lid
         // switch there is no need to register for a callback.
@@ -185,7 +191,6 @@
         // The set of Sensor(s) that this instance should register to receive SensorEvent(s) from.
         final ArraySet<Sensor> sensorsToListenTo = new ArraySet<>();
 
-        mStateConditions = new SparseArray<>();
         for (int i = 0; i < stateConditions.size(); i++) {
             final int state = deviceStates.get(i).getIdentifier();
             final Conditions conditions = stateConditions.get(i);
@@ -194,12 +199,20 @@
                 continue;
             }
 
+            // Whether or not all the required hardware components could be found that match the
+            // requirements from the config.
+            boolean allRequiredComponentsFound = true;
+            // Whether or not this condition requires the lid switch.
+            boolean lidSwitchRequired = false;
+            // Set of sensors required for this condition.
+            ArraySet<Sensor> sensorsRequired = new ArraySet<>();
+
             List<BooleanSupplier> suppliers = new ArrayList<>();
 
             LidSwitchCondition lidSwitchCondition = conditions.getLidSwitch();
             if (lidSwitchCondition != null) {
                 suppliers.add(new LidSwitchBooleanSupplier(lidSwitchCondition.getOpen()));
-                shouldListenToLidSwitch = true;
+                lidSwitchRequired = true;
             }
 
             List<SensorCondition> sensorConditions = conditions.getSensor();
@@ -210,22 +223,33 @@
 
                 final Sensor foundSensor = findSensor(expectedSensorType, expectedSensorName);
                 if (foundSensor == null) {
-                    throw new IllegalStateException("Failed to find Sensor with type: "
-                            + expectedSensorType + " and name: " + expectedSensorName);
+                    Slog.e(TAG, "Failed to find Sensor with type: " + expectedSensorType
+                            + " and name: " + expectedSensorName);
+                    allRequiredComponentsFound = false;
+                    break;
                 }
 
                 suppliers.add(new SensorBooleanSupplier(foundSensor, sensorCondition.getValue()));
-                sensorsToListenTo.add(foundSensor);
+                sensorsRequired.add(foundSensor);
             }
 
-            if (suppliers.size() > 1) {
-                mStateConditions.put(state, new AndBooleanSupplier(suppliers));
-            } else if (suppliers.size() > 0) {
-                // No need to wrap with an AND supplier if there is only 1.
-                mStateConditions.put(state, suppliers.get(0));
+            if (allRequiredComponentsFound) {
+                shouldListenToLidSwitch |= lidSwitchRequired;
+                sensorsToListenTo.addAll(sensorsRequired);
+
+                if (suppliers.size() > 1) {
+                    mStateConditions.put(state, new AndBooleanSupplier(suppliers));
+                } else if (suppliers.size() > 0) {
+                    // No need to wrap with an AND supplier if there is only 1.
+                    mStateConditions.put(state, suppliers.get(0));
+                } else {
+                    // There are no conditions for this state. Default to always true.
+                    mStateConditions.put(state, TRUE_BOOLEAN_SUPPLIER);
+                }
             } else {
-                // There are no conditions for this state. Default to always true.
-                mStateConditions.put(state, TRUE_BOOLEAN_SUPPLIER);
+                // Failed to setup this condition. This can happen if a sensor is missing. Default
+                // this state to always false.
+                mStateConditions.put(state, FALSE_BOOLEAN_SUPPLIER);
             }
         }
 
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
index 81a51e2..24337f3 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
@@ -554,11 +554,15 @@
             case ROR_NEED_PREPARATION:
                 final long origId = Binder.clearCallingIdentity();
                 try {
-                    mInjector.getLockSettingsService().prepareRebootEscrow();
+                    boolean result = mInjector.getLockSettingsService().prepareRebootEscrow();
+                    // Clear the RoR preparation state if lock settings reports an failure.
+                    if (!result) {
+                        clearRoRPreparationState();
+                    }
+                    return result;
                 } finally {
                     Binder.restoreCallingIdentity(origId);
                 }
-                return true;
             default:
                 throw new IllegalStateException("Unsupported action type on new request " + action);
         }
@@ -670,11 +674,10 @@
             case ROR_REQUESTED_NEED_CLEAR:
                 final long origId = Binder.clearCallingIdentity();
                 try {
-                    mInjector.getLockSettingsService().clearRebootEscrow();
+                    return mInjector.getLockSettingsService().clearRebootEscrow();
                 } finally {
                     Binder.restoreCallingIdentity(origId);
                 }
-                return true;
             default:
                 throw new IllegalStateException("Unsupported action type on clear " + action);
         }
@@ -820,6 +823,11 @@
                 lskfCapturedCount);
     }
 
+    private synchronized void clearRoRPreparationState() {
+        mCallerPendingRequest.clear();
+        mCallerPreparedForReboot.clear();
+    }
+
     private void clearRoRPreparationStateOnRebootFailure(RebootPreparationError escrowError) {
         if (!FATAL_ARM_ESCROW_ERRORS.contains(escrowError.mProviderErrorCode)) {
             return;
@@ -827,10 +835,7 @@
 
         Slog.w(TAG, "Clearing resume on reboot states for all clients on arm escrow error: "
                 + escrowError.mProviderErrorCode);
-        synchronized (this) {
-            mCallerPendingRequest.clear();
-            mCallerPreparedForReboot.clear();
-        }
+        clearRoRPreparationState();
     }
 
     private @ResumeOnRebootRebootErrorCode int rebootWithLskfImpl(String packageName, String reason,
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 a7e2d1d..a82c91e 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 The Android Open Source Project
+ * 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.
@@ -432,6 +432,7 @@
         mContext = context;
     }
 
+    private native void initializeNativePullers();
     /**
      * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would
      * get if we used lambdas.
@@ -713,6 +714,7 @@
         super.onBootPhase(phase);
         if (phase == PHASE_SYSTEM_SERVICES_READY) {
             BackgroundThread.getHandler().post(() -> {
+                initializeNativePullers(); // Initialize pullers that need JNI.
                 initializePullersState();
                 registerPullers();
                 registerEventListeners();
diff --git a/services/core/java/com/android/server/storage/StorageSessionController.java b/services/core/java/com/android/server/storage/StorageSessionController.java
index 5f5e6a3..8d79a81 100644
--- a/services/core/java/com/android/server/storage/StorageSessionController.java
+++ b/services/core/java/com/android/server/storage/StorageSessionController.java
@@ -80,11 +80,11 @@
     public int getConnectionUserIdForVolume(VolumeInfo vol) {
         final Context volumeUserContext = mContext.createContextAsUser(
                 UserHandle.of(vol.mountUserId), 0);
-        boolean sharesMediaWithParent = volumeUserContext.getSystemService(
-                UserManager.class).sharesMediaWithParent();
+        boolean isMediaSharedWithParent = volumeUserContext.getSystemService(
+                UserManager.class).isMediaSharedWithParent();
 
         UserInfo userInfo = mUserManager.getUserInfo(vol.mountUserId);
-        if (userInfo != null && sharesMediaWithParent) {
+        if (userInfo != null && isMediaSharedWithParent) {
             // Clones use the same connection as their parent
             return userInfo.profileGroupId;
         } else {
diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
index 52236a8..8b2b8b1 100644
--- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java
+++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
@@ -284,6 +284,9 @@
     private class TestHarnessModeShellCommand extends ShellCommand {
         @Override
         public int onCommand(String cmd) {
+            if (cmd == null) {
+                return handleDefaultCommands(cmd);
+            }
             switch (cmd) {
                 case "enable":
                 case "restore":
diff --git a/services/core/java/com/android/server/timedetector/ServiceConfigAccessor.java b/services/core/java/com/android/server/timedetector/ServiceConfigAccessor.java
index dac8a0a..7f7d01c 100644
--- a/services/core/java/com/android/server/timedetector/ServiceConfigAccessor.java
+++ b/services/core/java/com/android/server/timedetector/ServiceConfigAccessor.java
@@ -64,6 +64,7 @@
     private static final Instant TIME_LOWER_BOUND_DEFAULT = Instant.ofEpochMilli(
             Long.max(android.os.Environment.getRootDirectory().lastModified(), Build.TIME));
 
+    /** Device config keys that affect the {@link TimeDetectorService}. */
     private static final Set<String> SERVER_FLAGS_KEYS_TO_WATCH = Collections.unmodifiableSet(
             new ArraySet<>(new String[] {
                     KEY_TIME_DETECTOR_LOWER_BOUND_MILLIS_OVERRIDE,
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorShellCommand.java b/services/core/java/com/android/server/timedetector/TimeDetectorShellCommand.java
index 233cc57..721986b 100644
--- a/services/core/java/com/android/server/timedetector/TimeDetectorShellCommand.java
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorShellCommand.java
@@ -16,6 +16,7 @@
 package com.android.server.timedetector;
 
 import static android.app.timedetector.TimeDetector.SHELL_COMMAND_IS_AUTO_DETECTION_ENABLED;
+import static android.app.timedetector.TimeDetector.SHELL_COMMAND_SERVICE_NAME;
 import static android.provider.DeviceConfig.NAMESPACE_SYSTEM_TIME;
 
 import static com.android.server.timedetector.ServerFlags.KEY_TIME_DETECTOR_LOWER_BOUND_MILLIS_OVERRIDE;
@@ -61,26 +62,22 @@
     @Override
     public void onHelp() {
         final PrintWriter pw = getOutPrintWriter();
-        pw.println("Time Detector (time_detector) commands:");
-        pw.println("  help");
-        pw.println("    Print this help text.");
+        pw.printf("Time Detector (%s) commands:\n", SHELL_COMMAND_SERVICE_NAME);
+        pw.printf("  help\n");
+        pw.printf("    Print this help text.\n");
         pw.printf("  %s\n", SHELL_COMMAND_IS_AUTO_DETECTION_ENABLED);
-        pw.println("    Prints true/false according to the automatic time detection setting");
+        pw.printf("    Prints true/false according to the automatic time detection setting.\n");
         pw.println();
         pw.printf("This service is also affected by the following device_config flags in the"
                 + " %s namespace:\n", NAMESPACE_SYSTEM_TIME);
-        pw.printf("    %s - the lower bound used to validate time suggestions when they are"
-                        + " received.\n", KEY_TIME_DETECTOR_LOWER_BOUND_MILLIS_OVERRIDE);
-        pw.println("         Specified in milliseconds since the start of the Unix epoch.");
-        pw.printf("    %s - [default=null], a comma separated list of origins. See"
-                + " TimeDetectorStrategy for details\n",
-                KEY_TIME_DETECTOR_ORIGIN_PRIORITIES_OVERRIDE);
+        pw.printf("  %s\n", KEY_TIME_DETECTOR_LOWER_BOUND_MILLIS_OVERRIDE);
+        pw.printf("    The lower bound used to validate time suggestions when they are received."
+                + "\n");
+        pw.printf("    Specified in milliseconds since the start of the Unix epoch.\n");
+        pw.printf("  %s\n", KEY_TIME_DETECTOR_ORIGIN_PRIORITIES_OVERRIDE);
+        pw.printf("    A comma separated list of origins. See TimeDetectorStrategy for details.\n");
         pw.println();
-        pw.println("Example:");
-        pw.printf("    $ adb shell cmd device_config put %s %s %s\n",
-                NAMESPACE_SYSTEM_TIME, KEY_TIME_DETECTOR_ORIGIN_PRIORITIES_OVERRIDE,
-                "external");
-        pw.println("See adb shell cmd device_config for more information.");
+        pw.printf("See \"adb shell cmd device_config\" for more information on setting flags.\n");
         pw.println();
     }
 }
diff --git a/services/core/java/com/android/server/timezonedetector/ConfigurationInternal.java b/services/core/java/com/android/server/timezonedetector/ConfigurationInternal.java
index b4aa201..22814b3 100644
--- a/services/core/java/com/android/server/timezonedetector/ConfigurationInternal.java
+++ b/services/core/java/com/android/server/timezonedetector/ConfigurationInternal.java
@@ -148,11 +148,12 @@
         builder.setConfigureAutoDetectionEnabledCapability(configureAutoDetectionEnabledCapability);
 
         boolean deviceHasLocationTimeZoneDetection = isGeoDetectionSupported();
+        // Note: allowConfigDateTime does not restrict the ability to change location time zone
+        // detection enabled. This is intentional as it has user privacy implications and so it
+        // makes sense to leave this under a user's control.
         final int configureGeolocationDetectionEnabledCapability;
         if (!deviceHasLocationTimeZoneDetection) {
             configureGeolocationDetectionEnabledCapability = CAPABILITY_NOT_SUPPORTED;
-        } else if (!allowConfigDateTime) {
-            configureGeolocationDetectionEnabledCapability = CAPABILITY_NOT_ALLOWED;
         } else if (!mAutoDetectionEnabled || !isLocationEnabled()) {
             configureGeolocationDetectionEnabledCapability = CAPABILITY_NOT_APPLICABLE;
         } else {
diff --git a/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessor.java b/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessor.java
index dddb11b..4a1d9c4 100644
--- a/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessor.java
+++ b/services/core/java/com/android/server/timezonedetector/ServiceConfigAccessor.java
@@ -70,6 +70,10 @@
      */
     public static final @ProviderMode String PROVIDER_MODE_ENABLED = "enabled";
 
+    /**
+     * Device config keys that affect the {@link TimeZoneDetectorService} service and {@link
+     * com.android.server.timezonedetector.location.LocationTimeZoneManagerService}.
+     */
     private static final Set<String> SERVER_FLAGS_KEYS_TO_WATCH = Collections.unmodifiableSet(
             new ArraySet<>(new String[] {
                     ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_FEATURE_SUPPORTED,
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java
index 8c529c4..9899b44 100644
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorShellCommand.java
@@ -18,12 +18,19 @@
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_IS_AUTO_DETECTION_ENABLED;
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_IS_GEO_DETECTION_ENABLED;
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_IS_GEO_DETECTION_SUPPORTED;
+import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SERVICE_NAME;
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SET_AUTO_DETECTION_ENABLED;
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SET_GEO_DETECTION_ENABLED;
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SUGGEST_GEO_LOCATION_TIME_ZONE;
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SUGGEST_MANUAL_TIME_ZONE;
 import static android.app.timezonedetector.TimeZoneDetector.SHELL_COMMAND_SUGGEST_TELEPHONY_TIME_ZONE;
+import static android.provider.DeviceConfig.NAMESPACE_SYSTEM_TIME;
 
+import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_FEATURE_SUPPORTED;
+import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT;
+import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_OVERRIDE;
+
+import android.app.time.LocationTimeZoneManager;
 import android.app.time.TimeZoneConfiguration;
 import android.app.timezonedetector.ManualTimeZoneSuggestion;
 import android.app.timezonedetector.TelephonyTimeZoneSuggestion;
@@ -155,20 +162,21 @@
     @Override
     public void onHelp() {
         final PrintWriter pw = getOutPrintWriter();
-        pw.println("Time Zone Detector (time_zone_detector) commands:");
-        pw.println("  help");
-        pw.println("    Print this help text.");
+        pw.printf("Time Zone Detector (%s) commands:\n", SHELL_COMMAND_SERVICE_NAME);
+        pw.printf("  help\n");
+        pw.printf("    Print this help text.\n");
         pw.printf("  %s\n", SHELL_COMMAND_IS_AUTO_DETECTION_ENABLED);
-        pw.println("    Prints true/false according to the automatic tz detection setting");
+        pw.printf("    Prints true/false according to the automatic time zone detection setting\n");
         pw.printf("  %s true|false\n", SHELL_COMMAND_SET_AUTO_DETECTION_ENABLED);
-        pw.println("    Sets the automatic tz detection setting.");
+        pw.printf("    Sets the automatic time zone detection setting.\n");
         pw.printf("  %s\n", SHELL_COMMAND_IS_GEO_DETECTION_SUPPORTED);
-        pw.println("    Prints true/false according to whether geolocation time zone detection is"
-                + " supported on this device");
+        pw.printf("    Prints true/false according to whether geolocation time zone detection is"
+                + " supported on this device.\n");
         pw.printf("  %s\n", SHELL_COMMAND_IS_GEO_DETECTION_ENABLED);
-        pw.println("    Prints true/false according to the geolocation tz detection setting");
+        pw.printf("    Prints true/false according to the geolocation time zone detection setting."
+                + "\n");
         pw.printf("  %s true|false\n", SHELL_COMMAND_SET_GEO_DETECTION_ENABLED);
-        pw.println("    Sets the geolocation tz detection setting.");
+        pw.printf("    Sets the geolocation time zone detection enabled setting.\n");
         pw.printf("  %s <geolocation suggestion opts>\n",
                 SHELL_COMMAND_SUGGEST_GEO_LOCATION_TIME_ZONE);
         pw.printf("  %s <manual suggestion opts>\n",
@@ -182,5 +190,27 @@
         pw.println();
         TelephonyTimeZoneSuggestion.printCommandLineOpts(pw);
         pw.println();
+        pw.printf("This service is also affected by the following device_config flags in the"
+                + " %s namespace:\n", NAMESPACE_SYSTEM_TIME);
+        pw.printf("  %s\n", KEY_LOCATION_TIME_ZONE_DETECTION_FEATURE_SUPPORTED);
+        pw.printf("    Only observed if the geolocation time zone detection feature is enabled in"
+                + " config.\n");
+        pw.printf("    Set this to false to disable the feature.\n");
+        pw.printf("  %s\n", KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT);
+        pw.printf("    Only used if the device does not have an explicit 'geolocation time zone"
+                + " detection enabled' setting stored [*].\n");
+        pw.printf("    The default is when unset is false.\n");
+        pw.printf("  %s\n", KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_OVERRIDE);
+        pw.printf("    Used to override the device's 'geolocation time zone detection enabled'"
+                + " setting [*].\n");
+        pw.println();
+        pw.printf("[*] To be enabled, the user must still have location = on / auto time zone"
+                + " detection = on.\n");
+        pw.println();
+        pw.printf("See \"adb shell cmd device_config\" for more information on setting flags.\n");
+        pw.println();
+        pw.printf("Also see \"adb shell cmd %s help\" for lower-level location time zone"
+                        + " commands / settings.\n", LocationTimeZoneManager.SERVICE_NAME);
+        pw.println();
     }
 }
diff --git a/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerShellCommand.java b/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerShellCommand.java
index c6df624..0f0de50 100644
--- a/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerShellCommand.java
+++ b/services/core/java/com/android/server/timezonedetector/location/LocationTimeZoneManagerShellCommand.java
@@ -24,9 +24,6 @@
 import static android.app.time.LocationTimeZoneManager.SHELL_COMMAND_STOP;
 import static android.provider.DeviceConfig.NAMESPACE_SYSTEM_TIME;
 
-import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_FEATURE_SUPPORTED;
-import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT;
-import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_OVERRIDE;
 import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_DETECTION_UNCERTAINTY_DELAY_MILLIS;
 import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_PROVIDER_INITIALIZATION_TIMEOUT_FUZZ_MILLIS;
 import static com.android.server.timedetector.ServerFlags.KEY_LOCATION_TIME_ZONE_PROVIDER_INITIALIZATION_TIMEOUT_MILLIS;
@@ -48,6 +45,7 @@
 import android.app.time.LocationTimeZoneManagerProto;
 import android.app.time.LocationTimeZoneManagerServiceStateProto;
 import android.app.time.TimeZoneProviderStateProto;
+import android.app.timezonedetector.TimeZoneDetector;
 import android.os.Bundle;
 import android.os.ShellCommand;
 import android.util.IndentingPrintWriter;
@@ -103,84 +101,68 @@
     public void onHelp() {
         final PrintWriter pw = getOutPrintWriter();
         pw.printf("Location Time Zone Manager (%s) commands for tests:\n", SERVICE_NAME);
-        pw.println("  help");
-        pw.println("    Print this help text.");
+        pw.printf("  help\n");
+        pw.printf("    Print this help text.\n");
         pw.printf("  %s\n", SHELL_COMMAND_START);
-        pw.println("    Starts the location_time_zone_manager, creating time zone providers.");
+        pw.printf("    Starts the service, creating location time zone providers.\n");
         pw.printf("  %s\n", SHELL_COMMAND_STOP);
-        pw.println("    Stops the location_time_zone_manager, destroying time zone providers.");
+        pw.printf("    Stops the service, destroying location time zone providers.\n");
         pw.printf("  %s (true|false)\n", SHELL_COMMAND_RECORD_PROVIDER_STATES);
         pw.printf("    Enables / disables provider state recording mode. See also %s. The default"
                 + " state is always \"false\".\n", SHELL_COMMAND_DUMP_STATE);
-        pw.println("    Note: When enabled, this mode consumes memory and it is only intended for"
-                + " testing.");
-        pw.println("     It should be disabled after use, or the device can be rebooted to"
-                + " reset the mode to disabled.");
-        pw.println("     Disabling (or enabling repeatedly) clears any existing stored states.");
+        pw.printf("    Note: When enabled, this mode consumes memory and it is only intended for"
+                + " testing.\n");
+        pw.printf("    It should be disabled after use, or the device can be rebooted to"
+                + " reset the mode to disabled.\n");
+        pw.printf("    Disabling (or enabling repeatedly) clears any existing stored states.\n");
         pw.printf("  %s [%s]\n", SHELL_COMMAND_DUMP_STATE, DUMP_STATE_OPTION_PROTO);
-        pw.println("    Dumps Location Time Zone Manager state for tests as text or binary proto"
-                + " form.");
-        pw.println("    See the LocationTimeZoneManagerServiceStateProto definition for details.");
+        pw.printf("    Dumps service state for tests as text or binary proto form.\n");
+        pw.printf("    See the LocationTimeZoneManagerServiceStateProto definition for details.\n");
         pw.printf("  %s <provider index> <test command>\n",
                 SHELL_COMMAND_SEND_PROVIDER_TEST_COMMAND);
-        pw.println("    Passes a test command to the named provider.");
+        pw.printf("    Passes a test command to the named provider.\n");
         pw.println();
-        pw.println("<provider index> = 0 (primary), 1 (secondary)");
+        pw.printf("<provider index> = 0 (primary), 1 (secondary)\n");
         pw.println();
         pw.printf("%s details:\n", SHELL_COMMAND_SEND_PROVIDER_TEST_COMMAND);
         pw.println();
-        pw.println("Provider <test command> encoding:");
+        pw.printf("Provider <test command> encoding:\n");
         pw.println();
         TestCommand.printShellCommandEncodingHelp(pw);
         pw.println();
-        pw.println("Simulated provider mode can be used to test the system server behavior or to"
-                + " reproduce bugs without the complexity of using real providers.");
+        pw.printf("Simulated provider mode can be used to test the system server behavior or to"
+                + " reproduce bugs without the complexity of using real providers.\n");
         pw.println();
-        pw.println("The test commands for simulated providers are:");
+        pw.printf("The test commands for simulated providers are:\n");
         SimulatedLocationTimeZoneProviderProxy.printTestCommandShellHelp(pw);
         pw.println();
-        pw.println("Test commands cannot currently be passed to real provider implementations.");
+        pw.printf("Test commands cannot currently be passed to real provider implementations.\n");
         pw.println();
         pw.printf("This service is also affected by the following device_config flags in the"
                 + " %s namespace:\n", NAMESPACE_SYSTEM_TIME);
-        pw.printf("    %s - [default=true], only observed if the feature is enabled in config,"
-                        + "set this to false to disable the feature\n",
-                KEY_LOCATION_TIME_ZONE_DETECTION_FEATURE_SUPPORTED);
-        pw.printf("    %s - [default=false]. Only used if the device does not have an explicit"
-                        + " 'location time zone detection enabled' setting configured [*].\n",
-                KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT);
-        pw.printf("    %s - [default=<unset>]. Used to override the device's 'location time zone"
-                        + " detection enabled' setting [*]\n",
-                KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_OVERRIDE);
-        pw.printf("    %s - Overrides the mode of the primary provider. Values=%s|%s|%s\n",
-                KEY_PRIMARY_LOCATION_TIME_ZONE_PROVIDER_MODE_OVERRIDE,
+        pw.printf("  %s\n", KEY_PRIMARY_LOCATION_TIME_ZONE_PROVIDER_MODE_OVERRIDE);
+        pw.printf("    Overrides the mode of the primary provider. Values=%s|%s|%s\n",
                 PROVIDER_MODE_DISABLED, PROVIDER_MODE_ENABLED, PROVIDER_MODE_SIMULATED);
-        pw.printf("    %s - Overrides the mode of the secondary provider. Values=%s|%s|%s\n",
-                KEY_SECONDARY_LOCATION_TIME_ZONE_PROVIDER_MODE_OVERRIDE,
+        pw.printf("  %s\n", KEY_SECONDARY_LOCATION_TIME_ZONE_PROVIDER_MODE_OVERRIDE);
+        pw.printf("    Overrides the mode of the secondary provider. Values=%s|%s|%s\n",
                 PROVIDER_MODE_DISABLED, PROVIDER_MODE_ENABLED, PROVIDER_MODE_SIMULATED);
-        pw.printf("    %s - \n",
-                KEY_SECONDARY_LOCATION_TIME_ZONE_PROVIDER_MODE_OVERRIDE);
-        pw.printf("    %s - Sets the amount of time the service waits when uncertain before making"
-                        + " an 'uncertain' suggestion to the time zone detector.\n",
-                KEY_LOCATION_TIME_ZONE_DETECTION_UNCERTAINTY_DELAY_MILLIS);
-        pw.printf("    %s - Sets the initialization time passed to the location time zone providers"
-                        + "\n",
-                KEY_LOCATION_TIME_ZONE_PROVIDER_INITIALIZATION_TIMEOUT_MILLIS);
-        pw.printf("    %s - Sets the amount of extra time added to the location time zone providers"
-                        + " initialization time\n",
-                KEY_LOCATION_TIME_ZONE_PROVIDER_INITIALIZATION_TIMEOUT_FUZZ_MILLIS);
-        pw.println();
-        pw.println("[*] The user must still have location = on / auto time zone detection = on");
+        pw.printf("  %s\n", KEY_LOCATION_TIME_ZONE_DETECTION_UNCERTAINTY_DELAY_MILLIS);
+        pw.printf("    Sets the amount of time the service waits when uncertain before making an"
+                + " 'uncertain' suggestion to the time zone detector.\n");
+        pw.printf("  %s\n", KEY_LOCATION_TIME_ZONE_PROVIDER_INITIALIZATION_TIMEOUT_MILLIS);
+        pw.printf("    Sets the initialization time passed to the providers.\n");
+        pw.printf("  %s\n", KEY_LOCATION_TIME_ZONE_PROVIDER_INITIALIZATION_TIMEOUT_FUZZ_MILLIS);
+        pw.printf("    Sets the amount of extra time added to the providers' initialization time."
+                + "\n");
         pw.println();
         pw.printf("Typically, use '%s' to stop the service before setting individual"
                 + " flags and '%s' after to restart it.\n",
                 SHELL_COMMAND_STOP, SHELL_COMMAND_START);
         pw.println();
-        pw.println("Example:");
-        pw.printf("    $ adb shell cmd device_config put %s %s %s\n",
-                NAMESPACE_SYSTEM_TIME, KEY_LOCATION_TIME_ZONE_DETECTION_SETTING_ENABLED_DEFAULT,
-                "true");
-        pw.println("See adb shell cmd device_config for more information.");
+        pw.printf("See \"adb shell cmd device_config\" for more information on setting flags.\n");
+        pw.println();
+        pw.printf("Also see \"adb shell cmd %s help\" for higher-level location time zone"
+                + " commands / settings.\n", TimeZoneDetector.SHELL_COMMAND_SERVICE_NAME);
         pw.println();
     }
 
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index f014b07..4b71742 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -41,6 +41,7 @@
 import android.content.res.XmlResourceParser;
 import android.database.ContentObserver;
 import android.graphics.drawable.Drawable;
+import android.hardware.biometrics.BiometricManager;
 import android.hardware.biometrics.BiometricSourceType;
 import android.net.Uri;
 import android.os.Binder;
@@ -188,8 +189,6 @@
     private boolean mTrustAgentsCanRun = false;
     private int mCurrentUser = UserHandle.USER_SYSTEM;
 
-    private Authorization mAuthorizationService;
-
     public TrustManagerService(Context context) {
         super(context);
         mContext = context;
@@ -199,7 +198,6 @@
         mStrongAuthTracker = new StrongAuthTracker(context);
         mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
         mSettingsObserver = new SettingsObserver(mHandler);
-        mAuthorizationService = new Authorization();
     }
 
     @Override
@@ -701,13 +699,14 @@
         }
         if (changed) {
             dispatchDeviceLocked(userId, locked);
-
-            Authorization.onLockScreenEvent(locked, userId, null);
+            Authorization.onLockScreenEvent(locked, userId, null,
+                    getBiometricSids(userId));
             // Also update the user's profiles who have unified challenge, since they
             // share the same unlocked state (see {@link #isDeviceLocked(int)})
             for (int profileHandle : mUserManager.getEnabledProfileIds(userId)) {
                 if (mLockPatternUtils.isManagedProfileWithUnifiedChallenge(profileHandle)) {
-                    mAuthorizationService.onLockScreenEvent(locked, profileHandle, null);
+                    Authorization.onLockScreenEvent(locked, profileHandle, null,
+                            getBiometricSids(profileHandle));
                 }
             }
         }
@@ -1047,6 +1046,14 @@
         }
     }
 
+    private long[] getBiometricSids(int userId) {
+        BiometricManager biometricManager = mContext.getSystemService(BiometricManager.class);
+        if (biometricManager == null) {
+            return null;
+        }
+        return biometricManager.getAuthenticatorIds(userId);
+    }
+
     // User lifecycle
 
     @Override
@@ -1258,7 +1265,8 @@
                         mDeviceLockedForUser.put(userId, locked);
                     }
 
-                    Authorization.onLockScreenEvent(locked, userId, null);
+                    Authorization.onLockScreenEvent(locked, userId, null,
+                            getBiometricSids(userId));
 
                     if (locked) {
                         try {
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index e728ab0..49170f3 100755
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -24,7 +24,6 @@
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
 import android.app.ActivityManager;
-import android.app.ActivityManager.RunningAppProcessInfo;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -109,6 +108,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
 import java.util.regex.Matcher;
@@ -511,11 +511,21 @@
                 sessionStatesToRelease.add(sessionState);
             }
         }
+        boolean notifyInfoUpdated = false;
         for (SessionState sessionState : sessionStatesToRelease) {
             try {
                 sessionState.session.release();
+                sessionState.currentChannel = null;
+                if (sessionState.isCurrent) {
+                    sessionState.isCurrent = false;
+                    notifyInfoUpdated = true;
+                }
             } catch (RemoteException e) {
                 Slog.e(TAG, "error in release", e);
+            } finally {
+                if (notifyInfoUpdated) {
+                    notifyCurrentChannelInfosUpdatedLocked(userState);
+                }
             }
             clearSessionAndNotifyClientLocked(sessionState);
         }
@@ -576,12 +586,22 @@
                 return;
             }
             // Release all created sessions.
+            boolean notifyInfoUpdated = false;
             for (SessionState state : userState.sessionStateMap.values()) {
                 if (state.session != null) {
                     try {
                         state.session.release();
+                        state.currentChannel = null;
+                        if (state.isCurrent) {
+                            state.isCurrent = false;
+                            notifyInfoUpdated = true;
+                        }
                     } catch (RemoteException e) {
                         Slog.e(TAG, "error in release", e);
+                    } finally {
+                        if (notifyInfoUpdated) {
+                            notifyCurrentChannelInfosUpdatedLocked(userState);
+                        }
                     }
                 }
             }
@@ -826,9 +846,11 @@
                 sessionState.session.asBinder().unlinkToDeath(sessionState, 0);
                 sessionState.session.release();
             }
-            sessionState.isCurrent = false;
             sessionState.currentChannel = null;
-            notifyCurrentChannelInfosUpdatedLocked(userState);
+            if (sessionState.isCurrent) {
+                sessionState.isCurrent = false;
+                notifyCurrentChannelInfosUpdatedLocked(userState);
+            }
         } catch (RemoteException | SessionNotFoundException e) {
             Slog.e(TAG, "error in releaseSession", e);
         } finally {
@@ -898,6 +920,11 @@
             }
             ITvInputSession session = getSessionLocked(sessionState);
             session.setMain(isMain);
+            if (sessionState.isMainSession != isMain) {
+                UserState userState = getUserStateLocked(userId);
+                sessionState.isMainSession = isMain;
+                notifyCurrentChannelInfosUpdatedLocked(userState);
+            }
         } catch (RemoteException | SessionNotFoundException e) {
             Slog.e(TAG, "error in setMain", e);
         }
@@ -987,6 +1014,10 @@
             try {
                 ITvInputManagerCallback callback = userState.mCallbacks.getBroadcastItem(i);
                 Pair<Integer, Integer> pidUid = userState.callbackPidUidMap.get(callback);
+                if (mContext.checkPermission(android.Manifest.permission.ACCESS_TUNED_INFO,
+                        pidUid.first, pidUid.second) != PackageManager.PERMISSION_GRANTED) {
+                    continue;
+                }
                 List<TunedInfo> infos = getCurrentTunedInfosInternalLocked(
                         userState, pidUid.first, pidUid.second);
                 callback.onCurrentTunedInfosUpdated(infos);
@@ -1517,6 +1548,11 @@
                             getSessionLocked(sessionState.hardwareSessionToken,
                                     Process.SYSTEM_UID, resolvedUserId).setSurface(surface);
                         }
+                        boolean isVisible = (surface == null);
+                        if (sessionState.isVisible != isVisible) {
+                            sessionState.isVisible = isVisible;
+                            notifyCurrentChannelInfosUpdatedLocked(userState);
+                        }
                     } catch (RemoteException | SessionNotFoundException e) {
                         Slog.e(TAG, "error in setSurface", e);
                     }
@@ -1609,9 +1645,12 @@
                         UserState userState = getOrCreateUserStateLocked(resolvedUserId);
                         SessionState sessionState = getSessionStateLocked(sessionToken, callingUid,
                                 userState);
-                        sessionState.isCurrent = true;
-                        sessionState.currentChannel = channelUri;
-                        notifyCurrentChannelInfosUpdatedLocked(userState);
+                        if (!sessionState.isCurrent
+                                || !Objects.equals(sessionState.currentChannel, channelUri)) {
+                            sessionState.isCurrent = true;
+                            sessionState.currentChannel = channelUri;
+                            notifyCurrentChannelInfosUpdatedLocked(userState);
+                        }
                         if (TvContract.isChannelUriForPassthroughInput(channelUri)) {
                             // Do not log the watch history for passthrough inputs.
                             return;
@@ -2309,6 +2348,11 @@
 
         @Override
         public List<TunedInfo> getCurrentTunedInfos(@UserIdInt int userId) {
+            if (mContext.checkCallingPermission(android.Manifest.permission.ACCESS_TUNED_INFO)
+                    != PackageManager.PERMISSION_GRANTED) {
+                throw new SecurityException(
+                        "The caller does not have access tuned info permission");
+            }
             int callingPid = Binder.getCallingPid();
             int callingUid = Binder.getCallingUid();
             final int resolvedUserId = resolveCallingUserId(callingPid, callingUid, userId,
@@ -2524,7 +2568,8 @@
                         state.inputId,
                         watchedProgramsAccess ? state.currentChannel : null,
                         state.isRecordingSession,
-                        isForeground(state.callingPid),
+                        state.isVisible,
+                        state.isMainSession,
                         appType,
                         appTag));
             }
@@ -2532,23 +2577,6 @@
         return channelInfos;
     }
 
-    private boolean isForeground(int pid) {
-        if (mActivityManager == null) {
-            return false;
-        }
-        List<RunningAppProcessInfo> appProcesses = mActivityManager.getRunningAppProcesses();
-        if (appProcesses == null) {
-            return false;
-        }
-        for (RunningAppProcessInfo appProcess : appProcesses) {
-            if (appProcess.pid == pid
-                    && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     private boolean hasAccessWatchedProgramsPermission(int callingPid, int callingUid) {
         return mContext.checkPermission(PERMISSION_ACCESS_WATCHED_PROGRAMS, callingPid, callingUid)
                 == PackageManager.PERMISSION_GRANTED;
@@ -2788,6 +2816,8 @@
 
         private boolean isCurrent = false;
         private Uri currentChannel = null;
+        private boolean isVisible = false;
+        private boolean isMainSession = false;
 
         private SessionState(IBinder sessionToken, String inputId, ComponentName componentName,
                 boolean isRecordingSession, ITvInputClient client, int seq, int callingUid,
@@ -3039,16 +3069,19 @@
                 if (mSessionState.session == null || mSessionState.client == null) {
                     return;
                 }
-                mSessionState.isCurrent = true;
-                mSessionState.currentChannel = channelUri;
-                UserState userState = getOrCreateUserStateLocked(mSessionState.userId);
-                notifyCurrentChannelInfosUpdatedLocked(userState);
                 try {
                     // TODO: Consider adding this channel change in the watch log. When we do
                     // that, how we can protect the watch log from malicious tv inputs should
                     // be addressed. e.g. add a field which represents where the channel change
                     // originated from.
                     mSessionState.client.onChannelRetuned(channelUri, mSessionState.seq);
+                    if (!mSessionState.isCurrent
+                            || !Objects.equals(mSessionState.currentChannel, channelUri)) {
+                        UserState userState = getOrCreateUserStateLocked(mSessionState.userId);
+                        mSessionState.isCurrent = true;
+                        mSessionState.currentChannel = channelUri;
+                        notifyCurrentChannelInfosUpdatedLocked(userState);
+                    }
                 } catch (RemoteException e) {
                     Slog.e(TAG, "error in onChannelRetuned", e);
                 }
diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
index 38f5dd6..08a1b7e 100644
--- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
+++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java
@@ -61,10 +61,10 @@
 import android.net.ipsec.ike.IkeSessionCallback;
 import android.net.ipsec.ike.IkeSessionConfiguration;
 import android.net.ipsec.ike.IkeSessionParams;
+import android.net.ipsec.ike.IkeTunnelConnectionParams;
 import android.net.ipsec.ike.exceptions.IkeException;
 import android.net.ipsec.ike.exceptions.IkeInternalException;
 import android.net.ipsec.ike.exceptions.IkeProtocolException;
-import android.net.vcn.VcnControlPlaneIkeConfig;
 import android.net.vcn.VcnGatewayConnectionConfig;
 import android.net.vcn.VcnTransportInfo;
 import android.net.wifi.WifiInfo;
@@ -1558,8 +1558,22 @@
                                 teardownAsynchronously();
                             } /* networkUnwantedCallback */,
                             (status) -> {
-                                if (status == NetworkAgent.VALIDATION_STATUS_VALID) {
-                                    clearFailedAttemptCounterAndSafeModeAlarm();
+                                switch (status) {
+                                    case NetworkAgent.VALIDATION_STATUS_VALID:
+                                        clearFailedAttemptCounterAndSafeModeAlarm();
+                                        break;
+                                    case NetworkAgent.VALIDATION_STATUS_NOT_VALID:
+                                        // Will only set a new alarm if no safe mode alarm is
+                                        // currently scheduled.
+                                        setSafeModeAlarm();
+                                        break;
+                                    default:
+                                        Slog.wtf(
+                                                TAG,
+                                                "Unknown validation status "
+                                                        + status
+                                                        + "; ignoring");
+                                        break;
                                 }
                             } /* validationStatusCallback */);
 
@@ -1923,8 +1937,8 @@
             @NonNull IpSecTunnelInterface tunnelIface,
             @NonNull VcnChildSessionConfiguration childConfig,
             @Nullable UnderlyingNetworkRecord underlying) {
-        final VcnControlPlaneIkeConfig controlPlaneConfig =
-                (VcnControlPlaneIkeConfig) gatewayConnectionConfig.getControlPlaneConfig();
+        final IkeTunnelConnectionParams ikeTunnelParams =
+                gatewayConnectionConfig.getTunnelConnectionParams();
         final LinkProperties lp = new LinkProperties();
 
         lp.setInterfaceName(tunnelIface.getInterfaceName());
@@ -1943,7 +1957,7 @@
         final int underlyingMtu = (underlying == null) ? 0 : underlying.linkProperties.getMtu();
         lp.setMtu(
                 MtuUtils.getMtu(
-                        controlPlaneConfig.getChildSessionParams().getSaProposals(),
+                        ikeTunnelParams.getTunnelModeChildSessionParams().getSaProposals(),
                         gatewayConnectionConfig.getMaxMtu(),
                         underlyingMtu));
 
@@ -2046,7 +2060,11 @@
         pw.println("VcnGatewayConnection (" + mConnectionConfig.getGatewayConnectionName() + "):");
         pw.increaseIndent();
 
-        pw.println("Current state: " + getCurrentState().getClass().getSimpleName());
+        pw.println(
+                "Current state: "
+                        + (getCurrentState() == null
+                                ? null
+                                : getCurrentState().getClass().getSimpleName()));
         pw.println("mIsQuitting: " + mIsQuitting);
         pw.println("mIsInSafeMode: " + mIsInSafeMode);
         pw.println("mCurrentToken: " + mCurrentToken);
@@ -2057,7 +2075,11 @@
 
         pw.println("mUnderlying:");
         pw.increaseIndent();
-        mUnderlying.dump(pw);
+        if (mUnderlying != null) {
+            mUnderlying.dump(pw);
+        } else {
+            pw.println("null");
+        }
         pw.decreaseIndent();
         pw.println();
 
@@ -2123,19 +2145,16 @@
     }
 
     private IkeSessionParams buildIkeParams(@NonNull Network network) {
-        final VcnControlPlaneIkeConfig controlPlaneConfig =
-                (VcnControlPlaneIkeConfig) mConnectionConfig.getControlPlaneConfig();
+        final IkeTunnelConnectionParams ikeTunnelConnectionParams =
+                mConnectionConfig.getTunnelConnectionParams();
         final IkeSessionParams.Builder builder =
-                new IkeSessionParams.Builder(controlPlaneConfig.getIkeSessionParams());
+                new IkeSessionParams.Builder(ikeTunnelConnectionParams.getIkeSessionParams());
         builder.setNetwork(network);
-
         return builder.build();
     }
 
     private ChildSessionParams buildChildParams() {
-        final VcnControlPlaneIkeConfig controlPlaneConfig =
-                (VcnControlPlaneIkeConfig) mConnectionConfig.getControlPlaneConfig();
-        return controlPlaneConfig.getChildSessionParams();
+        return mConnectionConfig.getTunnelConnectionParams().getTunnelModeChildSessionParams();
     }
 
     @VisibleForTesting(visibility = Visibility.PRIVATE)
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 9acbdcc..c888e54 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -2384,17 +2384,19 @@
     public void notifyWakingUp(int x, int y, @NonNull Bundle extras) {
         synchronized (mLock) {
             final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
-            data.connection.forEachDisplayConnector(
-                    displayConnector -> {
-                        if (displayConnector.mEngine != null) {
-                            try {
-                                displayConnector.mEngine.dispatchWallpaperCommand(
-                                        WallpaperManager.COMMAND_WAKING_UP, x, y, -1, extras);
-                            } catch (RemoteException e) {
-                                e.printStackTrace();
+            if (data != null && data.connection != null) {
+                data.connection.forEachDisplayConnector(
+                        displayConnector -> {
+                            if (displayConnector.mEngine != null) {
+                                try {
+                                    displayConnector.mEngine.dispatchWallpaperCommand(
+                                            WallpaperManager.COMMAND_WAKING_UP, x, y, -1, extras);
+                                } catch (RemoteException e) {
+                                    e.printStackTrace();
+                                }
                             }
-                        }
-                    });
+                        });
+            }
         }
     }
 
@@ -2404,17 +2406,20 @@
     public void notifyGoingToSleep(int x, int y, @NonNull Bundle extras) {
         synchronized (mLock) {
             final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
-            data.connection.forEachDisplayConnector(
-                    displayConnector -> {
-                        if (displayConnector.mEngine != null) {
-                            try {
-                                displayConnector.mEngine.dispatchWallpaperCommand(
-                                        WallpaperManager.COMMAND_GOING_TO_SLEEP, x, y, -1, extras);
-                            } catch (RemoteException e) {
-                                e.printStackTrace();
+            if (data != null && data.connection != null) {
+                data.connection.forEachDisplayConnector(
+                        displayConnector -> {
+                            if (displayConnector.mEngine != null) {
+                                try {
+                                    displayConnector.mEngine.dispatchWallpaperCommand(
+                                            WallpaperManager.COMMAND_GOING_TO_SLEEP, x, y, -1,
+                                            extras);
+                                } catch (RemoteException e) {
+                                    e.printStackTrace();
+                                }
                             }
-                        }
-                    });
+                        });
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index d23579a..a97c080 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -22,6 +22,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
 import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
+import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
 
 import static com.android.server.accessibility.AccessibilityTraceFileProto.ENTRY;
 import static com.android.server.accessibility.AccessibilityTraceFileProto.MAGIC_NUMBER;
@@ -47,6 +48,7 @@
 import android.app.Application;
 import android.content.Context;
 import android.content.pm.PackageManagerInternal;
+import android.graphics.BLASTBufferQueue;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Matrix;
@@ -59,6 +61,7 @@
 import android.graphics.RectF;
 import android.graphics.Region;
 import android.os.Binder;
+import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.IBinder;
@@ -188,22 +191,28 @@
         }
 
         if (callback != null) {
+            WindowsForAccessibilityObserver observer =
+                    mWindowsForAccessibilityObserver.get(displayId);
             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.
                 // This happened when accessibility window observer is disabled and enabled again.
-                if (mWindowsForAccessibilityObserver.get(displayId) == null) {
+                if (observer == null) {
                     handleWindowObserverOfEmbeddedDisplay(displayId, dc.getParentWindow());
                 }
                 return false;
-            } else if (mWindowsForAccessibilityObserver.get(displayId) != null) {
-                throw new IllegalStateException(
-                        "Windows for accessibility callback of display "
-                                + displayId + " already set!");
+            } else if (observer != null) {
+                final String errorMessage = "Windows for accessibility callback of display "
+                        + displayId + " already set!";
+                Slog.e(TAG, errorMessage);
+                if (Build.IS_DEBUGGABLE) {
+                    throw new IllegalStateException(errorMessage);
+                }
+                removeObserverOfEmbeddedDisplay(observer);
+                mWindowsForAccessibilityObserver.remove(displayId);
             }
-            final WindowsForAccessibilityObserver observer =
-                    new WindowsForAccessibilityObserver(mService, displayId, callback);
+            observer = new WindowsForAccessibilityObserver(mService, displayId, callback);
             mWindowsForAccessibilityObserver.put(displayId, observer);
             mAllObserversInitialized &= observer.mInitialized;
         } else {
@@ -218,9 +227,12 @@
             final WindowsForAccessibilityObserver windowsForA11yObserver =
                     mWindowsForAccessibilityObserver.get(displayId);
             if (windowsForA11yObserver == null) {
-                throw new IllegalStateException(
-                        "Windows for accessibility callback of display " + displayId
-                                + " already cleared!");
+                final String errorMessage = "Windows for accessibility callback of display "
+                        + displayId + " already cleared!";
+                Slog.e(TAG, errorMessage);
+                if (Build.IS_DEBUGGABLE) {
+                    throw new IllegalStateException(errorMessage);
+                }
             }
             removeObserverOfEmbeddedDisplay(windowsForA11yObserver);
             mWindowsForAccessibilityObserver.remove(displayId);
@@ -928,8 +940,7 @@
                 for (int i = visibleWindowCount - 1; i >= 0; i--) {
                     WindowState windowState = visibleWindows.valueAt(i);
                     final int windowType = windowState.mAttrs.type;
-                    if ((windowType == TYPE_MAGNIFICATION_OVERLAY
-                            || windowType == TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY)
+                    if (isExcludedWindowType(windowType)
                             || ((windowState.mAttrs.privateFlags
                             & PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY) != 0)) {
                         continue;
@@ -974,7 +985,7 @@
                     }
 
                     // Count letterbox into nonMagnifiedBounds
-                    if (windowState.isLetterboxedForDisplayCutout()) {
+                    if (windowState.isLetterboxedAppWindow()) {
                         Region letterboxBounds = getLetterboxBounds(windowState);
                         nonMagnifiedBounds.op(letterboxBounds, Region.Op.UNION);
                         availableBounds.op(letterboxBounds, Region.Op.DIFFERENCE);
@@ -1030,23 +1041,15 @@
                 }
             }
 
-            private Region getLetterboxBounds(WindowState windowState) {
-                final ActivityRecord appToken = windowState.mActivityRecord;
-                if (appToken == null) {
-                    return new Region();
-                }
-
-                mDisplay.getRealSize(mTempPoint);
-                final Rect letterboxInsets = appToken.getLetterboxInsets();
-                final int screenWidth = mTempPoint.x;
-                final int screenHeight = mTempPoint.y;
-                final Rect nonLetterboxRect = mTempRect1;
-                final Region letterboxBounds = mTempRegion3;
-                nonLetterboxRect.set(0, 0, screenWidth, screenHeight);
-                nonLetterboxRect.inset(letterboxInsets);
-                letterboxBounds.set(0, 0, screenWidth, screenHeight);
-                letterboxBounds.op(nonLetterboxRect, Region.Op.DIFFERENCE);
-                return letterboxBounds;
+            private boolean isExcludedWindowType(int windowType) {
+                return windowType == TYPE_MAGNIFICATION_OVERLAY
+                        // Omit the touch region to avoid the cut out of the magnification
+                        // bounds because nav bar panel is unmagnifiable.
+                        || windowType == TYPE_NAVIGATION_BAR_PANEL
+                        // Omit the touch region of window magnification to avoid the cut out of the
+                        // magnification and the magnified center of window magnification could be
+                        // in the bounds
+                        || windowType == TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
             }
 
             void onRotationChanged(SurfaceControl.Transaction t) {
@@ -1121,7 +1124,8 @@
                 private final Paint mPaint = new Paint();
 
                 private final SurfaceControl mSurfaceControl;
-                private final Surface mSurface = mService.mSurfaceFactory.get();
+                private final BLASTBufferQueue mBlastBufferQueue;
+                private final Surface mSurface;
 
                 private final AnimationController mAnimationController;
 
@@ -1133,11 +1137,10 @@
                 ViewportWindow(Context context) {
                     SurfaceControl surfaceControl = null;
                     try {
-                        mDisplay.getRealSize(mTempPoint);
                         surfaceControl = mDisplayContent
                                 .makeOverlay()
                                 .setName(SURFACE_TITLE)
-                                .setBufferSize(mTempPoint.x, mTempPoint.y) // not a typo
+                                .setBLASTLayer()
                                 .setFormat(PixelFormat.TRANSLUCENT)
                                 .setCallsite("ViewportWindow")
                                 .build();
@@ -1145,6 +1148,9 @@
                         /* ignore */
                     }
                     mSurfaceControl = surfaceControl;
+                    mDisplay.getRealSize(mTempPoint);
+                    mBlastBufferQueue = new BLASTBufferQueue(SURFACE_TITLE, mSurfaceControl,
+                            mTempPoint.x, mTempPoint.y, PixelFormat.RGBA_8888);
 
                     final SurfaceControl.Transaction t = mService.mTransactionFactory.get();
                     final int layer =
@@ -1154,8 +1160,7 @@
                     InputMonitor.setTrustedOverlayInputInfo(mSurfaceControl, t,
                             mDisplayContent.getDisplayId(), "Magnification Overlay");
                     t.apply();
-
-                    mSurface.copyFrom(mSurfaceControl);
+                    mSurface = mBlastBufferQueue.createSurface();
 
                     mAnimationController = new AnimationController(context,
                             mService.mH.getLooper());
@@ -1280,6 +1285,9 @@
                 }
 
                 void releaseSurface() {
+                    if (mBlastBufferQueue != null) {
+                        mBlastBufferQueue.destroy();
+                    }
                     mService.mTransactionFactory.get().remove(mSurfaceControl).apply();
                     mSurface.release();
                 }
@@ -1430,6 +1438,20 @@
         return source != null ? source.getFrame() : EMPTY_RECT;
     }
 
+    static Region getLetterboxBounds(WindowState windowState) {
+        final ActivityRecord appToken = windowState.mActivityRecord;
+        if (appToken == null) {
+            return new Region();
+        }
+        final Rect letterboxInsets = appToken.getLetterboxInsets();
+        final Rect nonLetterboxRect = windowState.getBounds();
+        nonLetterboxRect.inset(letterboxInsets);
+        final Region letterboxBounds = new Region();
+        letterboxBounds.set(windowState.getBounds());
+        letterboxBounds.op(nonLetterboxRect, Region.Op.DIFFERENCE);
+        return letterboxBounds;
+    }
+
     /**
      * This class encapsulates the functionality related to computing the windows
      * reported for accessibility purposes. These windows are all windows a sighted
@@ -1734,6 +1756,12 @@
                         unaccountedSpace.setEmpty();
                     }
                 }
+
+                // Account for the space of letterbox.
+                if (windowState.isLetterboxedAppWindow()) {
+                    unaccountedSpace.op(getLetterboxBounds(windowState), unaccountedSpace,
+                            Region.Op.REVERSE_DIFFERENCE);
+                }
             }
         }
 
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index c5115b2..efee0a1 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -45,8 +45,10 @@
 import android.app.IActivityClientController;
 import android.app.IRequestFinishCallback;
 import android.app.PictureInPictureParams;
+import android.app.PictureInPictureUiState;
 import android.app.servertransaction.ClientTransaction;
 import android.app.servertransaction.EnterPipRequestedItem;
+import android.app.servertransaction.PipStateTransactionItem;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -779,6 +781,26 @@
         }
     }
 
+    /**
+     * Alert the client that the Picture-in-Picture state has changed.
+     */
+    void onPictureInPictureStateChanged(@NonNull ActivityRecord r,
+            PictureInPictureUiState pipState) {
+        if (!r.inPinnedWindowingMode()) {
+            throw new IllegalStateException("Activity is not in PIP mode");
+        }
+
+        try {
+            final ClientTransaction transaction = ClientTransaction.obtain(
+                    r.app.getThread(), r.token);
+            transaction.addCallback(PipStateTransactionItem.obtain(pipState));
+            mService.getLifecycleManager().scheduleTransaction(transaction);
+        } catch (Exception e) {
+            Slog.w(TAG, "Failed to send pip state transaction item: "
+                    + r.intent.getComponent(), e);
+        }
+    }
+
     @Override
     public void toggleFreeformWindowingMode(IBinder token) {
         final long ident = Binder.clearCallingIdentity();
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index c39358e..3e8bc5d 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -972,6 +972,11 @@
                 if (lastLaunchTime == 0) pw.print("0");
                 else TimeUtils.formatDuration(lastLaunchTime, now, pw);
                 pw.println();
+        if (mLaunchCookie != null) {
+            pw.print(prefix);
+            pw.print("launchCookie=");
+            pw.println(mLaunchCookie);
+        }
         pw.print(prefix); pw.print("mHaveState="); pw.print(mHaveState);
                 pw.print(" mIcicle="); pw.println(mIcicle);
         pw.print(prefix); pw.print("state="); pw.print(mState);
@@ -1090,6 +1095,8 @@
             if (info.configChanges != 0) {
                 pw.println(prefix + "configChanges=0x" + Integer.toHexString(info.configChanges));
             }
+            pw.println(prefix + "neverSandboxDisplayApis=" + info.neverSandboxDisplayApis());
+            pw.println(prefix + "alwaysSandboxDisplayApis=" + info.alwaysSandboxDisplayApis());
         }
         if (mLastParentBeforePip != null) {
             pw.println(prefix + "lastParentTaskIdBeforePip=" + mLastParentBeforePip.mTaskId);
@@ -1417,14 +1424,6 @@
         return mLetterboxUiController.isFullyTransparentBarAllowed(rect);
     }
 
-    /**
-     * @return {@code true} if there is a letterbox and any part of that letterbox overlaps with
-     * the given {@code rect}.
-     */
-    boolean isLetterboxOverlappingWith(Rect rect) {
-        return mLetterboxUiController.isLetterboxOverlappingWith(rect);
-    }
-
     static class Token extends IApplicationToken.Stub {
         private WeakReference<ActivityRecord> weakActivity;
         private final String name;
@@ -3524,7 +3523,7 @@
         }
 
         // Reset the last saved PiP snap fraction on removal.
-        mDisplayContent.mPinnedTaskControllerLocked.onActivityHidden(mActivityComponent);
+        mDisplayContent.mPinnedTaskController.onActivityHidden(mActivityComponent);
         mWmService.mEmbeddedWindowController.onActivityRemoved(this);
         mRemovingFromDisplay = false;
     }
@@ -4883,7 +4882,7 @@
         ProtoLog.v(WM_DEBUG_ADD_REMOVE, "notifyAppStopped: %s", this);
         mAppStopped = true;
         // Reset the last saved PiP snap fraction on app stop.
-        mDisplayContent.mPinnedTaskControllerLocked.onActivityHidden(mActivityComponent);
+        mDisplayContent.mPinnedTaskController.onActivityHidden(mActivityComponent);
         destroySurfaces();
         // Remove any starting window that was added for this app if they are still around.
         removeStartingWindow();
@@ -5160,6 +5159,8 @@
         // Task#ensureActivitiesVisible will bring the activity to a proper
         // active state.
         if (!isState(STARTED, RESUMED, PAUSED, STOPPED, STOPPING)
+                // TODO (b/185876784) Check could we remove the check condition
+                //  mTranslucentActivityWaiting != null here
                 || getRootTask().mTranslucentActivityWaiting != null) {
             return false;
         }
@@ -6404,8 +6405,8 @@
         }
         clearThumbnail();
         final Transaction transaction = getAnimatingContainer().getPendingTransaction();
-        mThumbnail = new WindowContainerThumbnail(mWmService.mSurfaceFactory,
-                transaction, getAnimatingContainer(), thumbnailHeader);
+        mThumbnail = new WindowContainerThumbnail(transaction, getAnimatingContainer(),
+                thumbnailHeader);
         mThumbnail.startAnimation(transaction, loadThumbnailAnimation(thumbnailHeader));
     }
 
@@ -6434,8 +6435,7 @@
             return;
         }
         final Transaction transaction = getPendingTransaction();
-        mThumbnail = new WindowContainerThumbnail(mWmService.mSurfaceFactory,
-                transaction, getTask(), thumbnail);
+        mThumbnail = new WindowContainerThumbnail(transaction, getTask(), thumbnail);
         final Animation animation =
                 getDisplayContent().mAppTransition.createCrossProfileAppsThumbnailAnimationLocked(
                         frame);
@@ -6604,6 +6604,7 @@
             return;
         }
 
+        mDisplayContent.mPinnedTaskController.onCancelFixedRotationTransform(task);
         // 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,
@@ -6899,7 +6900,8 @@
         getResolvedOverrideConfiguration().seq = mConfigurationSeq;
 
         // Sandbox max bounds by setting it to the activity bounds, if activity is letterboxed, or
-        // has or will have mCompatDisplayInsets for size compat.
+        // has or will have mCompatDisplayInsets for size compat. Also forces an activity to be
+        // sandboxed or not depending upon the configuration settings.
         if (providesMaxBounds()) {
             mTmpBounds.set(resolvedConfig.windowConfiguration.getBounds());
             if (mTmpBounds.isEmpty()) {
@@ -6909,11 +6911,15 @@
             }
             if (DEBUG_CONFIGURATION) {
                 ProtoLog.d(WM_DEBUG_CONFIGURATION, "Sandbox max bounds for uid %s to bounds %s. "
+                                + "config to never sandbox = %s, "
+                                + "config to always sandbox = %s, "
                                 + "letterboxing from mismatch with parent bounds = %s, "
                                 + "has mCompatDisplayInsets = %s, "
                                 + "should create compatDisplayInsets = %s",
                         getUid(),
                         mTmpBounds,
+                        info.neverSandboxDisplayApis(),
+                        info.alwaysSandboxDisplayApis(),
                         !matchParentBounds(),
                         mCompatDisplayInsets != null,
                         shouldCreateCompatDisplayInsets());
@@ -6990,6 +6996,11 @@
             // fixed-orientation requests.
             return;
         }
+        if (newParentConfig.windowConfiguration.getWindowingMode() == WINDOWING_MODE_PINNED) {
+            // PiP bounds have higher priority than the requested orientation. Otherwise the
+            // activity may be squeezed into a small piece.
+            return;
+        }
 
         final Rect resolvedBounds =
                 getResolvedOverrideConfiguration().windowConfiguration.getBounds();
@@ -7311,12 +7322,14 @@
         if (mDisplayContent != null && !mDisplayContent.sandboxDisplayApis()) {
             return false;
         }
-        // Max bounds should be sandboxed where an activity is letterboxed (activity bounds will be
-        // smaller than task bounds).
-        if (!matchParentBounds()) {
+        // Never apply sandboxing to an app that should be explicitly excluded from the config.
+        if (info != null && info.neverSandboxDisplayApis()) {
+            return false;
+        }
+        // Always apply sandboxing to an app that should be explicitly included from the config.
+        if (info != null && info.alwaysSandboxDisplayApis()) {
             return true;
         }
-
         // Max bounds should be sandboxed when an activity should have compatDisplayInsets, and it
         // will keep the same bounds and screen configuration when it was first launched regardless
         // how its parent window changes, so that the sandbox API will provide a consistent result.
@@ -7324,8 +7337,9 @@
             return true;
         }
 
-        // No need to sandbox for resizable apps in multi-window because resizableActivity=true
-        // indicates that they support multi-window.
+        // No need to sandbox for resizable apps in (including in multi-window) because
+        // resizableActivity=true indicates that they support multi-window. Likewise, do not sandbox
+        // for activities in letterbox since the activity has declared it can handle resizing.
         return false;
     }
 
@@ -7378,8 +7392,9 @@
             }
         }
 
+        final boolean wasInPictureInPicture = inPinnedWindowingMode();
         final DisplayContent display = mDisplayContent;
-        if (inPinnedWindowingMode() && attachedToProcess() && display != null) {
+        if (wasInPictureInPicture && attachedToProcess() && display != null) {
             // If the PIP activity is changing to fullscreen with display orientation change, the
             // fixed rotation will take effect that requires to send fixed rotation adjustments
             // before the process configuration (if the process is a configuration listener of the
@@ -7411,6 +7426,13 @@
             onMergedOverrideConfigurationChanged();
         }
 
+        // Before PiP animation is done, th windowing mode of the activity is still the previous
+        // mode (see RootWindowContainer#moveActivityToPinnedRootTask). So once the windowing mode
+        // of activity is changed, it is the signal of the last step to update the PiP states.
+        if (!wasInPictureInPicture && inPinnedWindowingMode() && task != null) {
+            mTaskSupervisor.scheduleUpdatePictureInPictureModeIfNeeded(task, task.getBounds());
+        }
+
         if (display == null) {
             return;
         }
@@ -7800,7 +7822,11 @@
             configChangeFlags = 0;
             return;
         }
-
+        // Do not waiting for translucent activity if it is going to relaunch.
+        final Task rootTask = getRootTask();
+        if (rootTask != null && rootTask.mTranslucentActivityWaiting == this) {
+            rootTask.checkTranslucentActivityWaiting(null);
+        }
         final boolean andResume = shouldBeResumed(null /*activeActivity*/);
         List<ResultInfo> pendingResults = null;
         List<ReferrerIntent> pendingNewIntents = null;
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 1158a9c..08a9f09 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1275,7 +1275,11 @@
                 || callingUidProcState == ActivityManager.PROCESS_STATE_BOUND_TOP;
         final boolean isCallingUidPersistentSystemProcess =
                 callingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI;
-        if ((appSwitchAllowed && callingUidHasAnyVisibleWindow)
+
+        // Normal apps with visible app window will be allowed to start activity if app switching
+        // is allowed, or apps like live wallpaper with non app visible window will be allowed.
+        if (((appSwitchAllowed || mService.mActiveUids.hasNonAppVisibleWindow(callingUid))
+                && callingUidHasAnyVisibleWindow)
                 || isCallingUidPersistentSystemProcess) {
             if (DEBUG_ACTIVITY_STARTS) {
                 Slog.d(TAG, "Activity start allowed: callingUidHasAnyVisibleWindow = " + callingUid
@@ -2639,6 +2643,11 @@
             intentTask.setWindowingMode(mPreferredWindowingMode);
         }
 
+        // Update the target's launch cookie to those specified in the options if set
+        if (mStartActivity.mLaunchCookie != null) {
+            intentActivity.mLaunchCookie = mStartActivity.mLaunchCookie;
+        }
+
         // Need to update mTargetRootTask because if task was moved out of it, the original root
         // task may be destroyed.
         mTargetRootTask = intentActivity.getRootTask();
@@ -2752,8 +2761,8 @@
 
         final boolean onTop =
                 (aOptions == null || !aOptions.getAvoidMoveToFront()) && !mLaunchTaskBehind;
-        return mRootWindowContainer.getLaunchRootTask(r, aOptions, task, onTop, mLaunchParams,
-                mRequest.realCallingPid, mRequest.realCallingUid);
+        return mRootWindowContainer.getLaunchRootTask(r, aOptions, task, mSourceRootTask, onTop,
+                mLaunchParams, launchFlags, mRequest.realCallingPid, mRequest.realCallingUid);
     }
 
     private boolean isLaunchModeOneOf(int mode1, int mode2) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index aa993bf..9178a8d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -561,6 +561,14 @@
     public abstract ActivityMetricsLaunchObserverRegistry getLaunchObserverRegistry();
 
     /**
+     * Returns the URI permission owner associated with the given activity (see
+     * {@link ActivityRecord#getUriPermissionsLocked()}). If the passed-in activity token is
+     * invalid, returns null.
+     */
+    @Nullable
+    public abstract IBinder getUriPermissionOwnerForActivity(@NonNull IBinder activityToken);
+
+    /**
      * Gets bitmap snapshot of the provided task id.
      *
      * <p>Warning! this may restore the snapshot from disk so can block, don't call in a latency
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index b83945e..6198573 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -141,6 +141,7 @@
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.PictureInPictureParams;
+import android.app.PictureInPictureUiState;
 import android.app.ProfilerInfo;
 import android.app.RemoteAction;
 import android.app.WaitResult;
@@ -2103,8 +2104,16 @@
         }
     }
 
-    List<ActivityManager.RunningTaskInfo> getTasks(int maxNum) {
-        return getTasks(maxNum, false /* filterForVisibleRecents */);
+    /**
+     * Gets info of running tasks up to the given number.
+     *
+     * @param maxNum the maximum number of task info returned by this method. If the total number of
+     *               running tasks is larger than it then there is no guarantee which task will be
+     *               left out.
+     * @return a list of {@link ActivityManager.RunningTaskInfo} with up to {@code maxNum} items
+     */
+    public List<ActivityManager.RunningTaskInfo> getTasks(int maxNum) {
+        return getTasks(maxNum, false /* filterForVisibleRecents */, false /* keepIntentExtra */);
     }
 
     /**
@@ -2113,10 +2122,14 @@
      */
     @Override
     public List<ActivityManager.RunningTaskInfo> getTasks(int maxNum,
-            boolean filterOnlyVisibleRecents) {
+            boolean filterOnlyVisibleRecents, boolean keepIntentExtra) {
         final int callingUid = Binder.getCallingUid();
         final int callingPid = Binder.getCallingPid();
+
+        int flags = filterOnlyVisibleRecents ? RunningTasks.FLAG_FILTER_ONLY_VISIBLE_RECENTS : 0;
+        flags |= (keepIntentExtra ? RunningTasks.FLAG_KEEP_INTENT_EXTRA : 0);
         final boolean crossUser = isCrossUserAllowed(callingPid, callingUid);
+        flags |= (crossUser ? RunningTasks.FLAG_CROSS_USERS : 0);
         final int[] profileIds = getUserManager().getProfileIds(
                 UserHandle.getUserId(callingUid), true);
         ArraySet<Integer> callingProfileIds = new ArraySet<>();
@@ -2129,8 +2142,9 @@
             if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
 
             final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
-            mRootWindowContainer.getRunningTasks(maxNum, list, filterOnlyVisibleRecents, callingUid,
-                    allowed, crossUser, callingProfileIds);
+            flags |= (allowed ? RunningTasks.FLAG_ALLOWED : 0);
+            mRootWindowContainer.getRunningTasks(
+                    maxNum, list, flags, callingUid, callingProfileIds);
         }
 
         return list;
@@ -2828,7 +2842,7 @@
         if (packageName != null) {
             caller = packageName + " " + caller;
         }
-        if (!canCloseSystemDialogs(pid, uid, process)) {
+        if (!canCloseSystemDialogs(pid, uid)) {
             // The app can't close system dialogs, throw only if it targets S+
             if (CompatChanges.isChangeEnabled(LOCK_DOWN_CLOSE_SYSTEM_DIALOGS, uid)) {
                 throw new SecurityException(
@@ -2853,39 +2867,37 @@
         return true;
     }
 
-    private boolean canCloseSystemDialogs(int pid, int uid,
-            @Nullable WindowProcessController process) {
+    private boolean canCloseSystemDialogs(int pid, int uid) {
         if (checkPermission(Manifest.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, pid, uid)
                 == PERMISSION_GRANTED) {
             return true;
         }
-        if (process == null) {
-            synchronized (mGlobalLock) {
-                process = mProcessMap.getProcess(pid);
+        synchronized (mGlobalLock) {
+            // Check all the processes from the given uid, especially since for PendingIntents sent
+            // the pid equals -1
+            ArraySet<WindowProcessController> processes = mProcessMap.getProcesses(uid);
+            if (processes != null) {
+                for (int i = 0, n = processes.size(); i < n; i++) {
+                    WindowProcessController process = processes.valueAt(i);
+                    // Check if the instrumentation of the process has the permission. This covers
+                    // the usual test started from the shell (which has the permission) case. This
+                    // is needed for apps targeting SDK level < S but we are also allowing for
+                    // targetSdk S+ as a convenience to avoid breaking a bunch of existing tests and
+                    // asking them to adopt shell permissions to do this.
+                    int sourceUid = process.getInstrumentationSourceUid();
+                    if (process.isInstrumenting() && sourceUid != -1 && checkPermission(
+                            Manifest.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, -1, sourceUid)
+                            == PERMISSION_GRANTED) {
+                        return true;
+                    }
+                    // This is the notification trampoline use-case for example, where apps use
+                    // Intent.ACSD to close the shade prior to starting an activity.
+                    if (process.canCloseSystemDialogsByToken()) {
+                        return true;
+                    }
+                }
             }
-        }
-        if (process != null) {
-            // Check if the instrumentation of the process has the permission. This covers the
-            // usual test started from the shell (which has the permission) case. This is needed
-            // for apps targeting SDK level < S but we are also allowing for targetSdk S+ as a
-            // convenience to avoid breaking a bunch of existing tests and asking them to adopt
-            // shell permissions to do this.
-            // Note that these getters all read from volatile fields in WindowProcessController, so
-            // no need to lock.
-            int sourceUid = process.getInstrumentationSourceUid();
-            if (process.isInstrumenting() && sourceUid != -1 && checkPermission(
-                    Manifest.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, -1, sourceUid)
-                    == PERMISSION_GRANTED) {
-                return true;
-            }
-            // This is the notification trampoline use-case for example, where apps use Intent.ACSD
-            // to close the shade prior to starting an activity.
-            if (process.canCloseSystemDialogsByToken()) {
-                return true;
-            }
-        }
-        if (!CompatChanges.isChangeEnabled(LOCK_DOWN_CLOSE_SYSTEM_DIALOGS, uid)) {
-            synchronized (mGlobalLock) {
+            if (!CompatChanges.isChangeEnabled(LOCK_DOWN_CLOSE_SYSTEM_DIALOGS, uid)) {
                 // This covers the case where the app is displaying some UI on top of the
                 // notification shade and wants to start an activity. The app then sends the intent
                 // in order to move the notification shade out of the way and show the activity to
@@ -3328,11 +3340,6 @@
     }
 
     @Override
-    public boolean supportsNonResizableMultiWindow() {
-        return mSupportsNonResizableMultiWindow;
-    }
-
-    @Override
     public boolean updateConfiguration(Configuration values) {
         mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateConfiguration()");
 
@@ -3644,6 +3651,17 @@
         }
     }
 
+    @Override
+    public void onPictureInPictureStateChanged(PictureInPictureUiState pipState) {
+        enforceTaskPermission("onPictureInPictureStateChanged");
+        final Task rootPinnedStask = mRootWindowContainer.getDefaultTaskDisplayArea()
+                .getRootPinnedTask();
+        if (rootPinnedStask != null && rootPinnedStask.getTopMostActivity() != null) {
+            mWindowManager.mAtmService.mActivityClientController.onPictureInPictureStateChanged(
+                    rootPinnedStask.getTopMostActivity(), pipState);
+        }
+    }
+
     void dumpLastANRLocked(PrintWriter pw) {
         pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)");
         if (mLastANRState == null) {
@@ -5156,8 +5174,7 @@
 
         @Override
         public boolean canCloseSystemDialogs(int pid, int uid) {
-            return ActivityTaskManagerService.this.canCloseSystemDialogs(pid, uid,
-                    null /* process */);
+            return ActivityTaskManagerService.this.canCloseSystemDialogs(pid, uid);
         }
 
         @Override
@@ -5598,10 +5615,6 @@
                     mTaskSupervisor.endDeferResume();
                 }
 
-                if (wpc.isInstrumenting()) {
-                    finishInstrumentationCallback.run();
-                }
-
                 if (!restarting && hasVisibleActivities) {
                     deferWindowLayout();
                     try {
@@ -5618,6 +5631,9 @@
                     }
                 }
             }
+            if (wpc.isInstrumenting()) {
+                finishInstrumentationCallback.run();
+            }
         }
 
         @Override
@@ -6117,6 +6133,7 @@
         public boolean handleAppCrashInActivityController(String processName, int pid,
                 String shortMsg, String longMsg, long timeMillis, String stackTrace,
                 Runnable killCrashingAppCallback) {
+            Runnable targetRunnable = null;
             synchronized (mGlobalLock) {
                 if (mController == null) {
                     return false;
@@ -6125,15 +6142,18 @@
                 try {
                     if (!mController.appCrashed(processName, pid, shortMsg, longMsg, timeMillis,
                             stackTrace)) {
-                        killCrashingAppCallback.run();
-                        return true;
+                        targetRunnable = killCrashingAppCallback;
                     }
                 } catch (RemoteException e) {
                     mController = null;
                     Watchdog.getInstance().setActivityController(null);
                 }
-                return false;
             }
+            if (targetRunnable != null) {
+                targetRunnable.run();
+                return true;
+            }
+            return false;
         }
 
         @Override
@@ -6231,6 +6251,16 @@
             }
         }
 
+        @Nullable
+        @Override
+        public IBinder getUriPermissionOwnerForActivity(@NonNull IBinder activityToken) {
+            ActivityTaskManagerService.enforceNotIsolatedCaller("getUriPermissionOwnerForActivity");
+            synchronized (mGlobalLock) {
+                ActivityRecord r = ActivityRecord.isInRootTaskLocked(activityToken);
+                return (r == null) ? null : r.getUriPermissionsLocked().getExternalToken();
+            }
+        }
+
         @Override
         public TaskSnapshot getTaskSnapshotBlocking(
                 int taskId, boolean isLowResolution) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index 2b1cf39..df1fec9 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -2118,8 +2118,14 @@
     }
 
     void scheduleProcessStoppingAndFinishingActivitiesIfNeeded() {
-        if ((!mStoppingActivities.isEmpty() || !mFinishingActivities.isEmpty())
-                && !mHandler.hasMessages(PROCESS_STOPPING_AND_FINISHING_MSG)
+        if (mStoppingActivities.isEmpty() && mFinishingActivities.isEmpty()) {
+            return;
+        }
+        if (mRootWindowContainer.allResumedActivitiesIdle()) {
+            scheduleIdle();
+            return;
+        }
+        if (!mHandler.hasMessages(PROCESS_STOPPING_AND_FINISHING_MSG)
                 && mRootWindowContainer.allResumedActivitiesVisible()) {
             mHandler.sendEmptyMessage(PROCESS_STOPPING_AND_FINISHING_MSG);
         }
@@ -2248,7 +2254,7 @@
         scheduleUpdatePictureInPictureModeIfNeeded(task, rootTask.getRequestedOverrideBounds());
     }
 
-    private void scheduleUpdatePictureInPictureModeIfNeeded(Task task, Rect targetRootTaskBounds) {
+    void scheduleUpdatePictureInPictureModeIfNeeded(Task task, Rect targetRootTaskBounds) {
         final PooledConsumer c = PooledLambda.obtainConsumer(
                 ActivityTaskSupervisor::addToPipModeChangedList, this,
                 PooledLambda.__(ActivityRecord.class));
@@ -2272,16 +2278,6 @@
         mMultiWindowModeChangedActivities.remove(r);
     }
 
-    void updatePictureInPictureMode(Task task, Rect targetRootTaskBounds, boolean forceUpdate) {
-        mHandler.removeMessages(REPORT_PIP_MODE_CHANGED_MSG);
-        final PooledConsumer c = PooledLambda.obtainConsumer(
-                ActivityRecord::updatePictureInPictureMode,
-                PooledLambda.__(ActivityRecord.class), targetRootTaskBounds, forceUpdate);
-        task.getRootTask().setBounds(targetRootTaskBounds);
-        task.forAllActivities(c);
-        c.recycle();
-    }
-
     void wakeUp(String reason) {
         mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_APPLICATION,
                 "android.server.am:TURN_ON:" + reason);
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 394ae7e..43326df 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -986,24 +986,25 @@
 
         Animation a;
         if (isKeyguardGoingAwayTransitOld(transit) && enter) {
-            a = mTransitionAnimation.loadKeyguardExitAnimation(transit, mNextAppTransitionFlags);
+            a = mTransitionAnimation.loadKeyguardExitAnimation(mNextAppTransitionFlags,
+                    transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER);
         } else if (transit == TRANSIT_OLD_KEYGUARD_OCCLUDE) {
             a = null;
         } else if (transit == TRANSIT_OLD_KEYGUARD_UNOCCLUDE && !enter) {
-            a = mTransitionAnimation.loadKeyguardUnoccludeAnimation(lp);
+            a = mTransitionAnimation.loadKeyguardUnoccludeAnimation();
         } else if (transit == TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE) {
             a = null;
         } else if (isVoiceInteraction && (transit == TRANSIT_OLD_ACTIVITY_OPEN
                 || transit == TRANSIT_OLD_TASK_OPEN
                 || transit == TRANSIT_OLD_TASK_TO_FRONT)) {
-            a = mTransitionAnimation.loadVoiceActivityOpenAnimation(lp, enter);
+            a = mTransitionAnimation.loadVoiceActivityOpenAnimation(enter);
             ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
                     "applyAnimation voice: anim=%s transit=%s isEntrance=%b Callers=%s", a,
                     appTransitionOldToString(transit), enter, Debug.getCallers(3));
         } else if (isVoiceInteraction && (transit == TRANSIT_OLD_ACTIVITY_CLOSE
                 || transit == TRANSIT_OLD_TASK_CLOSE
                 || transit == TRANSIT_OLD_TASK_TO_BACK)) {
-            a = mTransitionAnimation.loadVoiceActivityExitAnimation(lp, enter);
+            a = mTransitionAnimation.loadVoiceActivityExitAnimation(enter);
             ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
                     "applyAnimation voice: anim=%s transit=%s isEntrance=%b Callers=%s", a,
                     appTransitionOldToString(transit), enter, Debug.getCallers(3));
diff --git a/services/core/java/com/android/server/wm/BlurController.java b/services/core/java/com/android/server/wm/BlurController.java
index d920267..ff10168 100644
--- a/services/core/java/com/android/server/wm/BlurController.java
+++ b/services/core/java/com/android/server/wm/BlurController.java
@@ -22,37 +22,32 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.database.ContentObserver;
 import android.net.ConnectivityManager;
 import android.os.PowerManager;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
+import android.provider.Settings;
 import android.view.ICrossWindowBlurEnabledListener;
 
-import com.android.internal.annotations.GuardedBy;
-
 /**
  * Keeps track of the different factors that determine whether cross-window blur is enabled
  * or disabled. Also keeps a list of all interested listeners and notifies them when the
  * blur enabled state changes.
  */
 final class BlurController {
-    private final PowerManager mPowerManager;
+    private final Context mContext;
     private final RemoteCallbackList<ICrossWindowBlurEnabledListener>
             mBlurEnabledListeners = new RemoteCallbackList<>();
     // We don't use the WM global lock, because the BlurController is not involved in window
     // drawing and only receives binder calls that don't need synchronization with the rest of WM
     private final Object mLock = new Object();
-    @GuardedBy("mLock")
-    boolean mBlurEnabled;
-    @GuardedBy("mLock")
-    boolean mBlurForceDisabled;
-    @GuardedBy("mLock")
-    boolean mInBatterySaverMode;
+    private volatile boolean mBlurEnabled;
+    private boolean mInPowerSaveMode;
+    private boolean mBlurDisabledSetting;
 
     BlurController(Context context, PowerManager powerManager) {
-        mPowerManager = powerManager;
-        mInBatterySaverMode = mPowerManager.isPowerSaveMode();
-        updateBlurEnabledLocked();
+        mContext = context;
 
         IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
         filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
@@ -60,18 +55,36 @@
             @Override
             public void onReceive(Context context, Intent intent) {
                 if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(intent.getAction())) {
-                    setBatterySaverEnabled(mPowerManager.isPowerSaveMode());
+                    // onReceive always gets called on the same thread, so there is no
+                    // multi-threaded execution here. Thus, we don't have to hold mLock here.
+                    mInPowerSaveMode = powerManager.isPowerSaveMode();
+                    updateBlurEnabled();
                 }
             }
         }, filter, null, null);
+        mInPowerSaveMode = powerManager.isPowerSaveMode();
+
+        context.getContentResolver().registerContentObserver(
+                Settings.Global.getUriFor(Settings.Global.DISABLE_WINDOW_BLURS), false,
+                new ContentObserver(null) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        super.onChange(selfChange);
+                        // onChange always gets called on the same thread, so there is no
+                        // multi-threaded execution here. Thus, we don't have to hold mLock here.
+                        mBlurDisabledSetting = getBlurDisabledSetting();
+                        updateBlurEnabled();
+                    }
+                });
+        mBlurDisabledSetting = getBlurDisabledSetting();
+
+        updateBlurEnabled();
     }
 
     boolean registerCrossWindowBlurEnabledListener(ICrossWindowBlurEnabledListener listener) {
         if (listener == null) return false;
         mBlurEnabledListeners.register(listener);
-        synchronized (mLock) {
-            return mBlurEnabled;
-        }
+        return getBlurEnabled();
     }
 
     void unregisterCrossWindowBlurEnabledListener(ICrossWindowBlurEnabledListener listener) {
@@ -79,31 +92,22 @@
         mBlurEnabledListeners.unregister(listener);
     }
 
-    void setForceCrossWindowBlurDisabled(boolean disable) {
-        synchronized (mLock) {
-            mBlurForceDisabled = disable;
-            updateBlurEnabledLocked();
-        }
-
+    boolean getBlurEnabled() {
+        return mBlurEnabled;
     }
 
-    void setBatterySaverEnabled(boolean enabled) {
+    private void updateBlurEnabled() {
         synchronized (mLock) {
-            mInBatterySaverMode = enabled;
-            updateBlurEnabledLocked();
+            final boolean newEnabled = CROSS_WINDOW_BLUR_SUPPORTED && !mBlurDisabledSetting
+                    && !mInPowerSaveMode;
+            if (mBlurEnabled == newEnabled) {
+                return;
+            }
+            mBlurEnabled = newEnabled;
+            notifyBlurEnabledChangedLocked(newEnabled);
         }
     }
 
-    private void updateBlurEnabledLocked() {
-        final boolean newEnabled = CROSS_WINDOW_BLUR_SUPPORTED && !mBlurForceDisabled
-                && !mInBatterySaverMode;
-        if (mBlurEnabled == newEnabled) {
-            return;
-        }
-        mBlurEnabled = newEnabled;
-        notifyBlurEnabledChangedLocked(newEnabled);
-    }
-
     private void notifyBlurEnabledChangedLocked(boolean enabled) {
         int i = mBlurEnabledListeners.beginBroadcast();
         while (i > 0) {
@@ -117,4 +121,9 @@
         }
         mBlurEnabledListeners.finishBroadcast();
     }
+
+    private boolean getBlurDisabledSetting() {
+        return Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.DISABLE_WINDOW_BLURS, 0) == 1;
+    }
 }
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c44f4e3..a108478 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -154,6 +154,8 @@
 import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.graphics.Bitmap;
+import android.graphics.ColorSpace;
+import android.graphics.GraphicBuffer;
 import android.graphics.Insets;
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -464,7 +466,7 @@
     private boolean mDeferredRemoval;
 
     final DockedTaskDividerController mDividerControllerLocked;
-    final PinnedTaskController mPinnedTaskControllerLocked;
+    final PinnedTaskController mPinnedTaskController;
 
     final ArrayList<WindowState> mTapExcludedWindows = new ArrayList<>();
     /** A collection of windows that provide tap exclude regions inside of them. */
@@ -1017,7 +1019,7 @@
         }
         mWindowCornerRadius = mDisplayPolicy.getWindowCornerRadius();
         mDividerControllerLocked = new DockedTaskDividerController(this);
-        mPinnedTaskControllerLocked = new PinnedTaskController(mWmService, this);
+        mPinnedTaskController = new PinnedTaskController(mWmService, this);
 
         final SurfaceControl.Builder b = mWmService.makeSurfaceBuilder(mSession)
                 .setOpaque(true)
@@ -1536,6 +1538,11 @@
             // to cover the activity configuration change.
             return false;
         }
+        if (r.mStartingData != null && r.mStartingData.hasImeSurface()) {
+            // Currently it is unknown that when will IME window be ready. Reject the case to
+            // avoid flickering by showing IME in inconsistent orientation.
+            return false;
+        }
         if (checkOpening) {
             if (!mAppTransition.isTransitionSet() || !mOpeningApps.contains(r)) {
                 // Apply normal rotation animation in case of the activity set different requested
@@ -1573,15 +1580,11 @@
             }
             return false;
         }
-        if (!r.getParent().matchParentBounds()) {
+        if (!r.getDisplayArea().matchParentBounds()) {
             // Because the fixed rotated configuration applies to activity directly, if its parent
             // has it own policy for bounds, the activity bounds based on parent is unknown.
             return false;
         }
-        if (mPinnedTaskControllerLocked.isPipActiveOrWindowingModeChanging()) {
-            // Use normal rotation animation because seamless PiP rotation is not supported yet.
-            return false;
-        }
 
         setFixedRotationLaunchingApp(r, rotation);
         return true;
@@ -1667,6 +1670,10 @@
         if (mFixedRotationLaunchingApp == null) {
             return;
         }
+        if (mPinnedTaskController.shouldDeferOrientationChange()) {
+            // Wait for the PiP animation to finish.
+            return;
+        }
         // Update directly because the app which will change the orientation of display is ready.
         if (mDisplayRotation.updateOrientation(getOrientation(), false /* forceUpdate */)) {
             sendNewConfiguration();
@@ -1837,6 +1844,7 @@
             forAllWindows(w -> {
                 w.seamlesslyRotateIfAllowed(transaction, oldRotation, rotation, rotateSeamlessly);
             }, true /* traverseTopToBottom */);
+            mPinnedTaskController.startSeamlessRotationIfNeeded(transaction);
         }
 
         mWmService.mDisplayManagerInternal.performTraversal(transaction);
@@ -2105,9 +2113,7 @@
             }
 
             // Check if input device can dispatch events to current display.
-            // If display type is virtual, will follow the default display.
-            if (!mWmService.mInputManager.canDispatchToDisplay(device.getId(),
-                    displayInfo.type == Display.TYPE_VIRTUAL ? DEFAULT_DISPLAY : mDisplayId)) {
+            if (!mWmService.mInputManager.canDispatchToDisplay(device.getId(), mDisplayId)) {
                 continue;
             }
 
@@ -2333,7 +2339,7 @@
     }
 
     PinnedTaskController getPinnedTaskController() {
-        return mPinnedTaskControllerLocked;
+        return mPinnedTaskController;
     }
 
     /**
@@ -2392,12 +2398,11 @@
 
     @Override
     public void onConfigurationChanged(Configuration newParentConfig) {
-        // update resources before cascade so that root docked/pinned tasks use the correct info
-        preOnConfigurationChanged();
         final int lastOrientation = getConfiguration().orientation;
         super.onConfigurationChanged(newParentConfig);
         if (mDisplayPolicy != null) {
             mDisplayPolicy.onConfigurationChanged();
+            mPinnedTaskController.onPostDisplayConfigurationChanged();
         }
 
         if (lastOrientation != getConfiguration().orientation) {
@@ -2408,19 +2413,6 @@
         }
     }
 
-    /**
-     * Updates the resources used by docked/pinned controllers. This needs to be called at the
-     * beginning of a configuration update cascade since the metrics from these resources are used
-     * for bounds calculations.
-     */
-    void preOnConfigurationChanged() {
-        final PinnedTaskController pinnedTaskController = getPinnedTaskController();
-
-        if (pinnedTaskController != null) {
-            getPinnedTaskController().onConfigurationChanged();
-        }
-    }
-
     @Override
     boolean fillsParent() {
         return true;
@@ -2962,7 +2954,7 @@
         final boolean imeVisible = imeWin != null && imeWin.isVisible()
                 && imeWin.isDisplayed();
         final int imeHeight = getInputMethodWindowVisibleHeight();
-        mPinnedTaskControllerLocked.setAdjustedForIme(imeVisible, imeHeight);
+        mPinnedTaskController.setAdjustedForIme(imeVisible, imeHeight);
     }
 
     int getInputMethodWindowVisibleHeight() {
@@ -3190,7 +3182,7 @@
         }
 
         pw.println();
-        mPinnedTaskControllerLocked.dump(prefix, pw);
+        mPinnedTaskController.dump(prefix, pw);
 
         pw.println();
         mDisplayFrames.dump(prefix, pw);
@@ -3821,7 +3813,7 @@
         final ActivityRecord activity = mImeLayeringTarget.mActivityRecord;
         final SurfaceControl imeSurface = mWmService.mSurfaceControlFactory.apply(null)
                 .setName("IME-snapshot-surface")
-                .setBufferSize(buffer.getWidth(), buffer.getHeight())
+                .setBLASTLayer()
                 .setFormat(buffer.getFormat())
                 .setParent(activity.getSurfaceControl())
                 .setCallsite("DisplayContent.attachAndShowImeScreenshotOnTarget")
@@ -3829,10 +3821,9 @@
         // Make IME snapshot as trusted overlay
         InputMonitor.setTrustedOverlayInputInfo(imeSurface, t, getDisplayId(),
                 "IME-snapshot-surface");
-        Surface surface = mWmService.mSurfaceFactory.get();
-        surface.copyFrom(imeSurface);
-        surface.attachAndQueueBufferWithColorSpace(buffer, null);
-        surface.release();
+        GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(buffer);
+        t.setBuffer(imeSurface, graphicBuffer);
+        t.setColorSpace(mSurfaceControl, ColorSpace.get(ColorSpace.Named.SRGB));
         t.setRelativeLayer(imeSurface, activity.getSurfaceControl(), 1);
         t.setPosition(imeSurface, mInputMethodWindow.getDisplayFrame().left,
                 mInputMethodWindow.getDisplayFrame().top);
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 8c54705..203214d 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -146,7 +146,6 @@
 import android.view.ViewDebug;
 import android.view.WindowInsets.Type;
 import android.view.WindowInsets.Type.InsetsType;
-import android.view.WindowInsetsController.Appearance;
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 import android.view.WindowManagerGlobal;
@@ -2495,12 +2494,10 @@
         mService.getRootTaskBounds(inSplitScreen ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
                         : WINDOWING_MODE_FULLSCREEN,
                 ACTIVITY_TYPE_UNDEFINED, mNonDockedRootTaskBounds);
-        final int fullscreenAppearance = updateLightStatusBarLw(0 /* appearance */,
-                mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState,
-                mNonDockedRootTaskBounds);
-        final int dockedAppearance = updateLightStatusBarLw(0 /* appearance */,
-                mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState,
-                mDockedRootTaskBounds);
+        final int fullscreenAppearance = getStatusBarAppearance(mTopFullscreenOpaqueWindowState,
+                mTopFullscreenOpaqueOrDimmingWindowState);
+        final int dockedAppearance = getStatusBarAppearance(mTopDockedOpaqueWindowState,
+                mTopDockedOpaqueOrDimmingWindowState);
         final int disableFlags = win.getDisableFlags();
         final int opaqueAppearance = updateSystemBarsLw(win, disableFlags);
         final WindowState navColorWin = chooseNavigationColorWindowLw(
@@ -2560,30 +2557,12 @@
         return true;
     }
 
-    private int updateLightStatusBarLw(@Appearance int appearance, WindowState opaque,
-            WindowState opaqueOrDimming, Rect rootTaskBounds) {
-        final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
-        final int statusBarHeight = mStatusBarHeightForRotation[displayRotation.getRotation()];
-        final boolean rootTaskBoundsContainStatusBar =
-                rootTaskBounds.isEmpty() ? false : rootTaskBounds.top < statusBarHeight;
+    private int getStatusBarAppearance(WindowState opaque, WindowState opaqueOrDimming) {
         final boolean onKeyguard = isKeyguardShowing() && !isKeyguardOccluded();
-        final WindowState statusColorWin = onKeyguard ? mNotificationShade : opaqueOrDimming;
-        if (rootTaskBoundsContainStatusBar && statusColorWin != null) {
-            if (statusColorWin == opaque || onKeyguard) {
-                // If the top fullscreen-or-dimming window is also the top fullscreen, respect
-                // its light flag.
-                appearance &= ~APPEARANCE_LIGHT_STATUS_BARS;
-                appearance |= statusColorWin.mAttrs.insetsFlags.appearance
-                        & APPEARANCE_LIGHT_STATUS_BARS;
-            } else if (statusColorWin.isDimming()) {
-                // Otherwise if it's dimming, clear the light flag.
-                appearance &= ~APPEARANCE_LIGHT_STATUS_BARS;
-            }
-            if (!isLightBarAllowed(statusColorWin, TYPE_STATUS_BAR)) {
-                appearance &= ~APPEARANCE_LIGHT_STATUS_BARS;
-            }
-        }
-        return appearance;
+        final WindowState colorWin = onKeyguard ? mNotificationShade : opaqueOrDimming;
+        return isLightBarAllowed(colorWin, ITYPE_STATUS_BAR) && (colorWin == opaque || onKeyguard)
+                ? (colorWin.mAttrs.insetsFlags.appearance & APPEARANCE_LIGHT_STATUS_BARS)
+                : 0;
     }
 
     @VisibleForTesting
@@ -2642,9 +2621,9 @@
                 // Clear the light flag for dimming window.
                 appearance &= ~APPEARANCE_LIGHT_NAVIGATION_BARS;
             }
-            if (!isLightBarAllowed(navColorWin, TYPE_NAVIGATION_BAR)) {
-                appearance &= ~APPEARANCE_LIGHT_NAVIGATION_BARS;
-            }
+        }
+        if (!isLightBarAllowed(navColorWin, ITYPE_NAVIGATION_BAR)) {
+            appearance &= ~APPEARANCE_LIGHT_NAVIGATION_BARS;
         }
         return appearance;
     }
@@ -2697,11 +2676,12 @@
         return appearance;
     }
 
-    private boolean isLightBarAllowed(WindowState win, int windowType) {
+    private boolean isLightBarAllowed(WindowState win, @InternalInsetsType int type) {
         if (win == null) {
-            return true;
+            return false;
         }
-        return !win.isLetterboxedOverlappingWith(getBarContentFrameForWindow(win, windowType));
+        final InsetsSource source = win.getInsetsState().peekSource(type);
+        return source != null && Rect.intersects(win.getFrame(), source.getFrame());
     }
 
     private Rect getBarContentFrameForWindow(WindowState win, int windowType) {
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index e1fc75e..0e73d79 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -254,7 +254,7 @@
 
         if (isDefaultDisplay) {
             final Handler uiHandler = UiThread.getHandler();
-            mOrientationListener = new OrientationListener(mContext, uiHandler, mService);
+            mOrientationListener = new OrientationListener(mContext, uiHandler);
             mOrientationListener.setCurrentRotation(mRotation);
             mSettingsObserver = new SettingsObserver(uiHandler);
             mSettingsObserver.observe();
@@ -1514,8 +1514,8 @@
         final SparseArray<Runnable> mRunnableCache = new SparseArray<>(5);
         boolean mEnabled;
 
-        OrientationListener(Context context, Handler handler, WindowManagerService service) {
-            super(context, handler, service);
+        OrientationListener(Context context, Handler handler) {
+            super(context, handler);
         }
 
         private class UpdateRunnable implements Runnable {
diff --git a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java
index 724747d..02a7db1 100644
--- a/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java
+++ b/services/core/java/com/android/server/wm/EmulatorDisplayOverlay.java
@@ -20,38 +20,39 @@
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
 import android.content.Context;
+import android.graphics.BLASTBufferQueue;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.PorterDuff;
-import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.view.Display;
 import android.view.Surface;
 import android.view.Surface.OutOfResourcesException;
 import android.view.SurfaceControl;
 
-import java.util.function.Supplier;
-
 class EmulatorDisplayOverlay {
     private static final String TAG = TAG_WITH_CLASS_NAME ? "EmulatorDisplayOverlay" : TAG_WM;
 
+    private static final String TITLE = "EmulatorDisplayOverlay";
+
     // Display dimensions
     private Point mScreenSize;
 
     private final SurfaceControl mSurfaceControl;
     private final Surface mSurface;
+    private final BLASTBufferQueue mBlastBufferQueue;
+
     private int mLastDW;
     private int mLastDH;
     private boolean mDrawNeeded;
-    private Drawable mOverlay;
+    private final Drawable mOverlay;
     private int mRotation;
     private boolean mVisible;
 
-    EmulatorDisplayOverlay(Supplier<Surface> surfaceFactory, Context context, DisplayContent dc,
-            int zOrder, SurfaceControl.Transaction t) {
-        mSurface = surfaceFactory.get();
+    EmulatorDisplayOverlay(Context context, DisplayContent dc, int zOrder,
+            SurfaceControl.Transaction t) {
         final Display display = dc.getDisplay();
         mScreenSize = new Point();
         display.getSize(mScreenSize);
@@ -59,24 +60,26 @@
         SurfaceControl ctrl = null;
         try {
             ctrl = dc.makeOverlay()
-                    .setName("EmulatorDisplayOverlay")
-                    .setBufferSize(mScreenSize.x, mScreenSize.y)
+                    .setName(TITLE)
+                    .setBLASTLayer()
                     .setFormat(PixelFormat.TRANSLUCENT)
-                    .setCallsite("EmulatorDisplayOverlay")
+                    .setCallsite(TITLE)
                     .build();
             t.setLayer(ctrl, zOrder);
             t.setPosition(ctrl, 0, 0);
             t.show(ctrl);
             // Ensure we aren't considered as obscuring for Input purposes.
-            InputMonitor.setTrustedOverlayInputInfo(ctrl, t,
-                    dc.getDisplayId(), "EmulatorDisplayOverlay");
-            mSurface.copyFrom(ctrl);
+            InputMonitor.setTrustedOverlayInputInfo(ctrl, t, dc.getDisplayId(), TITLE);
         } catch (OutOfResourcesException e) {
         }
         mSurfaceControl = ctrl;
         mDrawNeeded = true;
         mOverlay = context.getDrawable(
                 com.android.internal.R.drawable.emulator_circular_window_overlay);
+
+        mBlastBufferQueue = new BLASTBufferQueue(TITLE, mSurfaceControl, mScreenSize.x,
+                mScreenSize.y, PixelFormat.RGBA_8888);
+        mSurface = mBlastBufferQueue.createSurface();
     }
 
     private void drawIfNeeded(SurfaceControl.Transaction t) {
@@ -85,12 +88,10 @@
         }
         mDrawNeeded = false;
 
-        Rect dirty = new Rect(0, 0, mScreenSize.x, mScreenSize.y);
         Canvas c = null;
         try {
-            c = mSurface.lockCanvas(dirty);
-        } catch (IllegalArgumentException e) {
-        } catch (OutOfResourcesException e) {
+            c = mSurface.lockCanvas(null);
+        } catch (IllegalArgumentException | OutOfResourcesException e) {
         }
         if (c == null) {
             return;
diff --git a/services/core/java/com/android/server/wm/FadeRotationAnimationController.java b/services/core/java/com/android/server/wm/FadeRotationAnimationController.java
index b14d4a1..644256a 100644
--- a/services/core/java/com/android/server/wm/FadeRotationAnimationController.java
+++ b/services/core/java/com/android/server/wm/FadeRotationAnimationController.java
@@ -66,9 +66,14 @@
         } else {
             mNavBarToken = null;
         }
+        // Do not fade notification shade when running fixed rotation (not frozen) because it may
+        // need to animate with the launching app.
+        final WindowState notificationShade = mFrozenTimeoutRunnable == null
+                ? displayPolicy.getNotificationShade() : null;
         displayContent.forAllWindows(w -> {
             if (w.mActivityRecord == null && w.mHasSurface && !w.mForceSeamlesslyRotate
-                    && !w.mIsWallpaper && !w.mIsImWindow && w != navigationBar) {
+                    && !w.mIsWallpaper && !w.mIsImWindow && w != navigationBar
+                    && w != notificationShade) {
                 mTargetWindowTokens.add(w.mToken);
             }
         }, true /* traverseTopToBottom */);
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 510c62d..da47328 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -257,8 +257,10 @@
     void dumpDebug(ProtoOutputStream proto, long fieldId, @WindowTraceLogLevel int logLevel) {
         final long token = proto.start(fieldId);
         super.dumpDebug(proto, INSETS_SOURCE_PROVIDER, logLevel);
-        if (mImeRequester != null) {
-            mImeRequester.getWindow().dumpDebug(proto, IME_TARGET_FROM_IME, logLevel);
+        final WindowState imeRequesterWindow =
+                mImeRequester != null ? mImeRequester.getWindow() : null;
+        if (imeRequesterWindow != null) {
+            imeRequesterWindow.dumpDebug(proto, IME_TARGET_FROM_IME, logLevel);
         }
         proto.write(IS_IME_LAYOUT_DRAWN, mIsImeLayoutDrawn);
         proto.end(token);
diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java
index 84616c0..aa7e6c9 100644
--- a/services/core/java/com/android/server/wm/InputManagerCallback.java
+++ b/services/core/java/com/android/server/wm/InputManagerCallback.java
@@ -116,10 +116,8 @@
     /** Notifies that the input device configuration has changed. */
     @Override
     public void notifyConfigurationChanged() {
-        // TODO(multi-display): Notify proper displays that are associated with this input device.
-
         synchronized (mService.mGlobalLock) {
-            mService.getDefaultDisplayContentLocked().sendNewConfiguration();
+            mService.mRoot.forAllDisplays(DisplayContent::sendNewConfiguration);
         }
 
         synchronized (mInputDevicesReadyMonitor) {
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index 8ff9fba..df4f2a9 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -50,6 +50,7 @@
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.policy.IKeyguardDismissCallback;
+import com.android.server.inputmethod.InputMethodManagerInternal;
 import com.android.server.policy.WindowManagerPolicy;
 
 import java.io.PrintWriter;
@@ -191,6 +192,7 @@
         // state when evaluating visibilities.
         updateKeyguardSleepToken();
         mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
+        InputMethodManagerInternal.get().updateImeWindowStatus();
     }
 
     /**
diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java
index af82f75..3dbe79d 100644
--- a/services/core/java/com/android/server/wm/Letterbox.java
+++ b/services/core/java/com/android/server/wm/Letterbox.java
@@ -150,18 +150,6 @@
     }
 
     /**
-     * Returns true if any part of the letterbox overlaps with the given {@code rect}.
-     */
-    public boolean isOverlappingWith(Rect rect) {
-        for (LetterboxSurface surface : mSurfaces) {
-            if (surface.isOverlappingWith(rect)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
      * Hides the letterbox.
      *
      * The caller must use {@link #applySurfaceChanges} to apply the new layout to the surface.
@@ -339,17 +327,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 (!needsApplySurfaceChanges()) {
                 // Nothing changed.
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index 130f680..05728cd 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -112,14 +112,6 @@
         return mLetterbox == null || mLetterbox.notIntersectsOrFullyContains(rect);
     }
 
-    /**
-     * @return {@code true} if there is a letterbox and any part of that letterbox overlaps with
-     * the given {@code rect}.
-     */
-    boolean isLetterboxOverlappingWith(Rect rect) {
-        return mLetterbox != null && mLetterbox.isOverlappingWith(rect);
-    }
-
     void updateLetterboxSurface(WindowState winHint) {
         final WindowState w = mActivityRecord.findMainWindow();
         if (w != winHint && winHint != null && w != null) {
diff --git a/services/core/java/com/android/server/wm/PinnedTaskController.java b/services/core/java/com/android/server/wm/PinnedTaskController.java
index 15e078b..dea83f0 100644
--- a/services/core/java/com/android/server/wm/PinnedTaskController.java
+++ b/services/core/java/com/android/server/wm/PinnedTaskController.java
@@ -16,20 +16,26 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
+import android.app.PictureInPictureParams;
 import android.app.RemoteAction;
 import android.content.ComponentName;
 import android.content.pm.ParceledListSlice;
 import android.content.res.Resources;
+import android.graphics.Matrix;
+import android.graphics.Rect;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.Slog;
-import android.view.DisplayInfo;
 import android.view.IPinnedTaskListener;
+import android.view.SurfaceControl;
+import android.window.PictureInPictureSurfaceTransaction;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -54,6 +60,7 @@
 class PinnedTaskController {
 
     private static final String TAG = TAG_WITH_CLASS_NAME ? "PinnedTaskController" : TAG_WM;
+    private static final int DEFER_ORIENTATION_CHANGE_TIMEOUT_MS = 1000;
 
     private final WindowManagerService mService;
     private final DisplayContent mDisplayContent;
@@ -62,8 +69,21 @@
     private final PinnedTaskListenerDeathHandler mPinnedTaskListenerDeathHandler =
             new PinnedTaskListenerDeathHandler();
 
-    /** Whether the PiP is entering or leaving. */
-    private boolean mIsPipWindowingModeChanging;
+    /**
+     * Non-null if the entering PiP task will cause display rotation to change. The bounds are
+     * based on the new rotation.
+     */
+    private Rect mDestRotatedBounds;
+    /**
+     * Non-null if the entering PiP task from recents animation will cause display rotation to
+     * change. The transaction is based on the old rotation.
+     */
+    private PictureInPictureSurfaceTransaction mPipTransaction;
+    /** Whether to skip task configuration change once. */
+    private boolean mFreezingTaskConfig;
+    /** Defer display orientation change if the PiP task is animating across orientations. */
+    private boolean mDeferOrientationChanging;
+    private final Runnable mDeferOrientationTimeoutRunnable;
 
     private boolean mIsImeShowing;
     private int mImeHeight;
@@ -72,16 +92,10 @@
     private ArrayList<RemoteAction> mActions = new ArrayList<>();
     private float mAspectRatio = -1f;
 
-    // Used to calculate task bounds across rotations
-    private final DisplayInfo mDisplayInfo = new DisplayInfo();
-
     // The aspect ratio bounds of the PIP.
     private float mMinAspectRatio;
     private float mMaxAspectRatio;
 
-    // Temp vars for calculation
-    private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
-
     /**
      * Handler for the case where the listener dies.
      */
@@ -89,23 +103,32 @@
 
         @Override
         public void binderDied() {
-            // Clean up the state if the listener dies
-            if (mPinnedTaskListener != null) {
-                mPinnedTaskListener.asBinder().unlinkToDeath(mPinnedTaskListenerDeathHandler, 0);
+            synchronized (mService.mGlobalLock) {
+                mPinnedTaskListener = null;
+                mFreezingTaskConfig = false;
+                mDeferOrientationTimeoutRunnable.run();
             }
-            mPinnedTaskListener = null;
         }
     }
 
     PinnedTaskController(WindowManagerService service, DisplayContent displayContent) {
         mService = service;
         mDisplayContent = displayContent;
-        mDisplayInfo.copyFrom(mDisplayContent.getDisplayInfo());
+        mDeferOrientationTimeoutRunnable = () -> {
+            synchronized (mService.mGlobalLock) {
+                if (mDeferOrientationChanging) {
+                    continueOrientationChange();
+                    mService.mWindowPlacerLocked.requestTraversal();
+                }
+            }
+        };
         reloadResources();
     }
 
-    void onConfigurationChanged() {
+    /** Updates the resources used by pinned controllers.  */
+    void onPostDisplayConfigurationChanged() {
         reloadResources();
+        mFreezingTaskConfig = false;
     }
 
     /**
@@ -113,7 +136,6 @@
      */
     private void reloadResources() {
         final Resources res = mService.mContext.getResources();
-        mDisplayContent.getDisplay().getRealMetrics(mTmpMetrics);
         mMinAspectRatio = res.getFloat(
                 com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
         mMaxAspectRatio = res.getFloat(
@@ -143,18 +165,150 @@
                 && Float.compare(aspectRatio, mMaxAspectRatio) <= 0;
     }
 
-    /** Returns {@code true} if the PiP is on screen or is changing windowing mode. */
-    boolean isPipActiveOrWindowingModeChanging() {
-        if (mIsPipWindowingModeChanging) {
-            return true;
+    /**
+     * Called when a fullscreen task is entering PiP with display orientation change. This is used
+     * to avoid flickering when running PiP animation across different orientations.
+     */
+    void deferOrientationChangeForEnteringPipFromFullScreenIfNeeded() {
+        final Task topFullscreenTask = mDisplayContent.getDefaultTaskDisplayArea()
+                .getTopRootTaskInWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        final ActivityRecord topFullscreen = topFullscreenTask != null
+                ? topFullscreenTask.topRunningActivity() : null;
+        if (topFullscreen == null || topFullscreen.hasFixedRotationTransform()) {
+            return;
         }
-        final Task pinnedTask = mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask();
-        return pinnedTask != null && pinnedTask.hasChild();
+        final int rotation = mDisplayContent.rotationForActivityInDifferentOrientation(
+                topFullscreen);
+        if (rotation == ROTATION_UNDEFINED) {
+            return;
+        }
+        // If the next top activity will change the orientation of display, start fixed rotation to
+        // notify PipTaskOrganizer before it receives task appeared. And defer display orientation
+        // update until the new PiP bounds are set.
+        mDisplayContent.setFixedRotationLaunchingApp(topFullscreen, rotation);
+        mDeferOrientationChanging = true;
+        mService.mH.removeCallbacks(mDeferOrientationTimeoutRunnable);
+        final float animatorScale = Math.max(1, mService.getCurrentAnimatorScale());
+        mService.mH.postDelayed(mDeferOrientationTimeoutRunnable,
+                (int) (animatorScale * DEFER_ORIENTATION_CHANGE_TIMEOUT_MS));
     }
 
-    /** Sets whether a visible task is changing from or to pinned mode. */
-    void setPipWindowingModeChanging(boolean isPipWindowingModeChanging) {
-        mIsPipWindowingModeChanging = isPipWindowingModeChanging;
+    /** Defers orientation change while there is a top fixed rotation activity. */
+    boolean shouldDeferOrientationChange() {
+        return mDeferOrientationChanging;
+    }
+
+    /**
+     * Sets the bounds for {@link #startSeamlessRotationIfNeeded} if the orientation of display
+     * will be changed.
+     */
+    void setEnterPipBounds(Rect bounds) {
+        if (!mDeferOrientationChanging) {
+            return;
+        }
+        mFreezingTaskConfig = true;
+        mDestRotatedBounds = new Rect(bounds);
+        continueOrientationChange();
+    }
+
+    /**
+     * Sets the transaction for {@link #startSeamlessRotationIfNeeded} if the orientation of display
+     * will be changed. This is only called when finishing recents animation with pending
+     * orientation change that will be handled by
+     * {@link DisplayContent.FixedRotationTransitionListener#onFinishRecentsAnimation}.
+     */
+    void setEnterPipTransaction(PictureInPictureSurfaceTransaction tx) {
+        mFreezingTaskConfig = true;
+        mPipTransaction = tx;
+    }
+
+    /** Called when the activity in PiP task has PiP windowing mode (at the end of animation). */
+    private void continueOrientationChange() {
+        mDeferOrientationChanging = false;
+        mService.mH.removeCallbacks(mDeferOrientationTimeoutRunnable);
+        final WindowContainer<?> orientationSource = mDisplayContent.getLastOrientationSource();
+        if (orientationSource != null && !orientationSource.isAppTransitioning()) {
+            mDisplayContent.continueUpdateOrientationForDiffOrienLaunchingApp();
+        }
+    }
+
+    /**
+     * Resets rotation and applies scale and position to PiP task surface to match the current
+     * rotation of display. The final surface matrix will be replaced by PiPTaskOrganizer after it
+     * receives the callback of fixed rotation completion.
+     */
+    void startSeamlessRotationIfNeeded(SurfaceControl.Transaction t) {
+        final Rect bounds = mDestRotatedBounds;
+        final PictureInPictureSurfaceTransaction pipTx = mPipTransaction;
+        if (bounds == null && pipTx == null) {
+            return;
+        }
+        final TaskDisplayArea taskArea = mDisplayContent.getDefaultTaskDisplayArea();
+        final Task pinnedTask = taskArea.getRootPinnedTask();
+        if (pinnedTask == null) {
+            return;
+        }
+
+        mDestRotatedBounds = null;
+        mPipTransaction = null;
+        final Rect areaBounds = taskArea.getBounds();
+        if (pipTx != null) {
+            // The transaction from recents animation is in old rotation. So the position needs to
+            // be rotated.
+            float dx = pipTx.mPositionX;
+            float dy = pipTx.mPositionY;
+            if (pipTx.mRotation == 90) {
+                dx = pipTx.mPositionY;
+                dy = areaBounds.right - pipTx.mPositionX;
+            } else if (pipTx.mRotation == -90) {
+                dx = areaBounds.bottom - pipTx.mPositionY;
+                dy = pipTx.mPositionX;
+            }
+            final Matrix matrix = new Matrix();
+            matrix.setScale(pipTx.mScaleX, pipTx.mScaleY);
+            matrix.postTranslate(dx, dy);
+            t.setMatrix(pinnedTask.getSurfaceControl(), matrix, new float[9]);
+            Slog.i(TAG, "Seamless rotation PiP tx=" + pipTx + " pos=" + dx + "," + dy);
+            return;
+        }
+
+        final PictureInPictureParams params = pinnedTask.getPictureInPictureParams();
+        final Rect sourceHintRect = params != null && params.hasSourceBoundsHint()
+                ? params.getSourceRectHint()
+                : null;
+        Slog.i(TAG, "Seamless rotation PiP bounds=" + bounds + " hintRect=" + sourceHintRect);
+        final Rect contentBounds = sourceHintRect != null && areaBounds.contains(sourceHintRect)
+                ? sourceHintRect : areaBounds;
+        final int w = contentBounds.width();
+        final int h = contentBounds.height();
+        final float scale = w <= h ? (float) bounds.width() / w : (float) bounds.height() / h;
+        final int insetLeft = (int) ((contentBounds.left - areaBounds.left) * scale + .5f);
+        final int insetTop = (int) ((contentBounds.top - areaBounds.top) * scale + .5f);
+        final Matrix matrix = new Matrix();
+        matrix.setScale(scale, scale);
+        matrix.postTranslate(bounds.left - insetLeft, bounds.top - insetTop);
+        t.setMatrix(pinnedTask.getSurfaceControl(), matrix, new float[9]);
+    }
+
+    /**
+     * Returns {@code true} to skip {@link Task#onConfigurationChanged} because it is expected that
+     * there will be a orientation change and a PiP configuration change.
+     */
+    boolean isFreezingTaskConfig(Task task) {
+        return mFreezingTaskConfig
+                && task == mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask();
+    }
+
+    /** Resets the states which were used to perform fixed rotation with PiP task. */
+    void onCancelFixedRotationTransform(Task task) {
+        mFreezingTaskConfig = false;
+        mDeferOrientationChanging = false;
+        mDestRotatedBounds = null;
+        mPipTransaction = null;
+        if (!task.isOrganized()) {
+            // Force clearing Task#mForceNotOrganized because the display didn't rotate.
+            task.onConfigurationChanged(task.getParent().getConfiguration());
+        }
     }
 
     /**
@@ -272,6 +426,14 @@
 
     void dump(String prefix, PrintWriter pw) {
         pw.println(prefix + "PinnedTaskController");
+        if (mDeferOrientationChanging) pw.println(prefix + "  mDeferOrientationChanging=true");
+        if (mFreezingTaskConfig) pw.println(prefix + "  mFreezingTaskConfig=true");
+        if (mDestRotatedBounds != null) {
+            pw.println(prefix + "  mPendingBounds=" + mDestRotatedBounds);
+        }
+        if (mPipTransaction != null) {
+            pw.println(prefix + "  mPipTransaction=" + mPipTransaction);
+        }
         pw.println(prefix + "  mIsImeShowing=" + mIsImeShowing);
         pw.println(prefix + "  mImeHeight=" + mImeHeight);
         pw.println(prefix + "  mAspectRatio=" + mAspectRatio);
@@ -288,6 +450,5 @@
             }
             pw.println(prefix + "  ]");
         }
-        pw.println(prefix + "  mDisplayInfo=" + mDisplayInfo);
     }
 }
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 19c2e73..dec6460 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -36,7 +36,6 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.app.WindowConfiguration;
-import android.graphics.Matrix;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.Binder;
@@ -231,17 +230,16 @@
         }
 
         @Override
-        public void setFinishTaskBounds(int taskId, Rect destinationBounds,
+        public void setFinishTaskTransaction(int taskId,
                 PictureInPictureSurfaceTransaction finishTransaction) {
             ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
-                    "setFinishTaskBounds(%d): bounds=%s", taskId, destinationBounds);
+                    "setFinishTaskTransaction(%d): transaction=%s", taskId, finishTransaction);
             final long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mService.getWindowManagerLock()) {
                     for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
                         final TaskAnimationAdapter taskAdapter = mPendingAnimations.get(i);
                         if (taskAdapter.mTask.mTaskId == taskId) {
-                            taskAdapter.mFinishBounds.set(destinationBounds);
                             taskAdapter.mFinishTransaction = finishTransaction;
                             break;
                         }
@@ -1106,9 +1104,7 @@
         private final Rect mBounds = new Rect();
         // The bounds of the target relative to its parent.
         private final Rect mLocalBounds = new Rect();
-        // The bounds of the target when animation is finished
-        private final Rect mFinishBounds = new Rect();
-        // Bounds and transform for the final transaction.
+        // The final surface transaction when animation is finished.
         private PictureInPictureSurfaceTransaction mFinishTransaction;
 
         TaskAnimationAdapter(Task task, boolean isRecentTaskInvisible) {
@@ -1145,29 +1141,18 @@
         }
 
         void onCleanup() {
-            if (!mFinishBounds.isEmpty()) {
-                final SurfaceControl taskSurface = mTask.mSurfaceControl;
+            if (mFinishTransaction != null) {
                 final Transaction pendingTransaction = mTask.getPendingTransaction();
-                if (mFinishTransaction != null) {
-                    final Matrix matrix = new Matrix();
-                    matrix.setScale(mFinishTransaction.mScaleX, mFinishTransaction.mScaleY);
-                    if (mFinishTransaction.mRotation != 0) {
-                        matrix.postRotate(mFinishTransaction.mRotation);
-                    }
-                    pendingTransaction.setMatrix(taskSurface, matrix, new float[9])
-                            .setPosition(taskSurface,
-                                    mFinishTransaction.mPositionX, mFinishTransaction.mPositionY)
-                            .setWindowCrop(taskSurface, mFinishTransaction.getWindowCrop())
-                            .setCornerRadius(taskSurface, mFinishTransaction.mCornerRadius);
-                    mTask.mLastRecentsAnimationBounds.set(mFinishBounds);
-                    mFinishTransaction = null;
-                } else {
-                    pendingTransaction
-                            .setPosition(taskSurface, mFinishBounds.left, mFinishBounds.top)
-                            .setWindowCrop(taskSurface, mFinishBounds);
+                PictureInPictureSurfaceTransaction.apply(mFinishTransaction,
+                        mTask.mSurfaceControl, pendingTransaction);
+                mTask.setLastRecentsAnimationTransaction(mFinishTransaction);
+                if (mDisplayContent.isFixedRotationLaunchingApp(mTargetActivityRecord)) {
+                    // The transaction is needed for position when rotating the display.
+                    mDisplayContent.mPinnedTaskController.setEnterPipTransaction(
+                            mFinishTransaction);
                 }
+                mFinishTransaction = null;
                 pendingTransaction.apply();
-                mFinishBounds.setEmpty();
             } else if (!mTask.isAttached()) {
                 // Apply the task's pending transaction in case it is detached and its transaction
                 // is not reachable.
@@ -1220,7 +1205,7 @@
             }
             pw.println("mIsRecentTaskInvisible=" + mIsRecentTaskInvisible);
             pw.println("mLocalBounds=" + mLocalBounds);
-            pw.println("mFinishBounds=" + mFinishBounds);
+            pw.println("mFinishTransaction=" + mFinishTransaction);
             pw.println("mBounds=" + mBounds);
             pw.println("mIsRecentTaskInvisible=" + mIsRecentTaskInvisible);
         }
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index 67bc7af..1a429f8 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -55,7 +55,7 @@
 class RemoteAnimationController implements DeathRecipient {
     private static final String TAG = TAG_WITH_CLASS_NAME
                     ? "RemoteAnimationController" : TAG_WM;
-    private static final long TIMEOUT_MS = 2000;
+    private static final long TIMEOUT_MS = 10000;
 
     private final WindowManagerService mService;
     private final DisplayContent mDisplayContent;
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index b9fc8b1..dc07988 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -1686,6 +1686,11 @@
             return false;
         }
 
+        if (!taskDisplayArea.canHostHomeTask()) {
+            // Can't launch home on a TaskDisplayArea that does not support root home task
+            return false;
+        }
+
         if (taskDisplayArea.getDisplayId() != DEFAULT_DISPLAY && !mService.mSupportsMultiDisplay) {
             // Can't launch home on secondary display if device does not support multi-display.
             return false;
@@ -2132,9 +2137,12 @@
                 rootTask.setLastNonFullscreenBounds(task.mLastNonFullscreenBounds);
                 rootTask.setBounds(task.getBounds());
 
-                // Move reparent bounds from original task to the new one.
-                rootTask.mLastRecentsAnimationBounds.set(task.mLastRecentsAnimationBounds);
-                task.mLastRecentsAnimationBounds.setEmpty();
+                // Move the last recents animation transaction from original task to the new one.
+                if (task.mLastRecentsAnimationTransaction != null) {
+                    rootTask.setLastRecentsAnimationTransaction(
+                            task.mLastRecentsAnimationTransaction);
+                    task.clearLastRecentsAnimationTransaction();
+                }
 
                 // There are multiple activities in the task and moving the top activity should
                 // reveal/leave the other activities in their original task.
@@ -2143,7 +2151,7 @@
                 r.reparent(rootTask, MAX_VALUE, reason);
 
                 // Ensure the leash of new task is in sync with its current bounds after reparent.
-                rootTask.maybeApplyLastRecentsAnimationBounds();
+                rootTask.maybeApplyLastRecentsAnimationTransaction();
 
                 // In the case of this activity entering PIP due to it being moved to the back,
                 // the old activity would have a TRANSIT_TASK_TO_BACK transition that needs to be
@@ -2649,9 +2657,12 @@
     }
 
     void addStartingWindowsForVisibleActivities() {
+        final ArrayList<Task> addedTasks = new ArrayList<>();
         forAllActivities((r) -> {
-            if (r.mVisibleRequested) {
+            final Task task = r.getTask();
+            if (r.mVisibleRequested && r.mStartingData == null && !addedTasks.contains(task)) {
                 r.showStartingWindow(true /*taskSwitch*/);
+                addedTasks.add(task);
             }
         });
     }
@@ -2802,10 +2813,11 @@
         return false;
     }
 
-    Task getLaunchRootTask(@Nullable ActivityRecord r,
-            @Nullable ActivityOptions options, @Nullable Task candidateTask, boolean onTop) {
-        return getLaunchRootTask(r, options, candidateTask, onTop, null /* launchParams */,
-                -1 /* no realCallingPid */, -1 /* no realCallingUid */);
+    Task getLaunchRootTask(@Nullable ActivityRecord r, @Nullable ActivityOptions options,
+            @Nullable Task candidateTask, boolean onTop) {
+        return getLaunchRootTask(r, options, candidateTask, null /* sourceTask */, onTop,
+                null /* launchParams */, 0 /* launchFlags */, -1 /* no realCallingPid */,
+                -1 /* no realCallingUid */);
     }
 
     /**
@@ -2814,15 +2826,18 @@
      * @param r              The activity we are trying to launch. Can be null.
      * @param options        The activity options used to the launch. Can be null.
      * @param candidateTask  The possible task the activity might be launched in. Can be null.
+     * @param sourceTask     The task requesting to start activity. Can be null.
      * @param launchParams   The resolved launch params to use.
+     * @param launchFlags    The launch flags for this launch.
      * @param realCallingPid The pid from {@link ActivityStarter#setRealCallingPid}
      * @param realCallingUid The uid from {@link ActivityStarter#setRealCallingUid}
      * @return The root task to use for the launch or INVALID_TASK_ID.
      */
     Task getLaunchRootTask(@Nullable ActivityRecord r,
-            @Nullable ActivityOptions options, @Nullable Task candidateTask, boolean onTop,
-            @Nullable LaunchParamsController.LaunchParams launchParams, int realCallingPid,
-            int realCallingUid) {
+            @Nullable ActivityOptions options, @Nullable Task candidateTask,
+            @Nullable Task sourceTask, boolean onTop,
+            @Nullable LaunchParamsController.LaunchParams launchParams, int launchFlags,
+            int realCallingPid, int realCallingUid) {
         int taskId = INVALID_TASK_ID;
         int displayId = INVALID_DISPLAY;
         TaskDisplayArea taskDisplayArea = null;
@@ -2886,7 +2901,7 @@
                 // Falling back to default task container
                 taskDisplayArea = taskDisplayArea.mDisplayContent.getDefaultTaskDisplayArea();
                 rootTask = taskDisplayArea.getOrCreateRootTask(r, options, candidateTask,
-                        launchParams, activityType, onTop);
+                        sourceTask, launchParams, launchFlags, activityType, onTop);
                 if (rootTask != null) {
                     return rootTask;
                 }
@@ -2941,8 +2956,8 @@
             }
         }
 
-        return container.getOrCreateRootTask(
-                r, options, candidateTask, launchParams, activityType, onTop);
+        return container.getOrCreateRootTask(r, options, candidateTask, sourceTask, launchParams,
+                launchFlags, activityType, onTop);
     }
 
     /** @return true if activity record is null or can be launched on provided display. */
@@ -3474,10 +3489,9 @@
 
     @VisibleForTesting
     void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list,
-            boolean filterOnlyVisibleRecents, int callingUid, boolean allowed, boolean crossUser,
-            ArraySet<Integer> profileIds) {
-        mTaskSupervisor.getRunningTasks().getTasks(maxNum, list, filterOnlyVisibleRecents, this,
-                callingUid, allowed, crossUser, profileIds);
+            int flags, int callingUid, ArraySet<Integer> profileIds) {
+        mTaskSupervisor.getRunningTasks().getTasks(maxNum, list, flags, this, callingUid,
+                profileIds);
     }
 
     void startPowerModeLaunchIfNeeded(boolean forceSend, ActivityRecord targetActivity) {
diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java
index e8c1c8d..7ba772c 100644
--- a/services/core/java/com/android/server/wm/RunningTasks.java
+++ b/services/core/java/com/android/server/wm/RunningTasks.java
@@ -36,6 +36,11 @@
  */
 class RunningTasks {
 
+    static final int FLAG_FILTER_ONLY_VISIBLE_RECENTS = 1;
+    static final int FLAG_ALLOWED = 1 << 1;
+    static final int FLAG_CROSS_USERS = 1 << 2;
+    static final int FLAG_KEEP_INTENT_EXTRA = 1 << 3;
+
     // Comparator to sort by last active time (descending)
     private static final Comparator<Task> LAST_ACTIVE_TIME_COMPARATOR =
             (o1, o2) -> Long.signum(o2.lastActiveTime - o1.lastActiveTime);
@@ -50,10 +55,10 @@
     private boolean mFilterOnlyVisibleRecents;
     private Task mTopDisplayFocusRootTask;
     private RecentTasks mRecentTasks;
+    private boolean mKeepIntentExtra;
 
-    void getTasks(int maxNum, List<RunningTaskInfo> list, boolean filterOnlyVisibleRecents,
-            RootWindowContainer root, int callingUid, boolean allowed, boolean crossUser,
-            ArraySet<Integer> profileIds) {
+    void getTasks(int maxNum, List<RunningTaskInfo> list, int flags,
+            RootWindowContainer root, int callingUid, ArraySet<Integer> profileIds) {
         // Return early if there are no tasks to fetch
         if (maxNum <= 0) {
             return;
@@ -63,12 +68,14 @@
         mTmpSortedSet.clear();
         mCallingUid = callingUid;
         mUserId = UserHandle.getUserId(callingUid);
-        mCrossUser = crossUser;
+        mCrossUser = (flags & FLAG_CROSS_USERS) == FLAG_CROSS_USERS;
         mProfileIds = profileIds;
-        mAllowed = allowed;
-        mFilterOnlyVisibleRecents = filterOnlyVisibleRecents;
+        mAllowed = (flags & FLAG_ALLOWED) == FLAG_ALLOWED;
+        mFilterOnlyVisibleRecents =
+                (flags & FLAG_FILTER_ONLY_VISIBLE_RECENTS) == FLAG_FILTER_ONLY_VISIBLE_RECENTS;
         mTopDisplayFocusRootTask = root.getTopDisplayFocusedRootTask();
         mRecentTasks = root.mService.getRecentTasks();
+        mKeepIntentExtra = (flags & FLAG_KEEP_INTENT_EXTRA) == FLAG_KEEP_INTENT_EXTRA;
 
         final PooledConsumer c = PooledLambda.obtainConsumer(RunningTasks::processTask, this,
                 PooledLambda.__(Task.class));
@@ -126,7 +133,8 @@
 
     /** Constructs a {@link RunningTaskInfo} from a given {@param task}. */
     private RunningTaskInfo createRunningTaskInfo(Task task) {
-        final RunningTaskInfo rti = task.getTaskInfo();
+        final RunningTaskInfo rti = new RunningTaskInfo();
+        task.fillTaskInfo(rti, !mKeepIntentExtra);
         // Fill in some deprecated values
         rti.id = rti.taskId;
         return rti;
diff --git a/services/core/java/com/android/server/wm/ShellRoot.java b/services/core/java/com/android/server/wm/ShellRoot.java
index 0902948..b56e76d 100644
--- a/services/core/java/com/android/server/wm/ShellRoot.java
+++ b/services/core/java/com/android/server/wm/ShellRoot.java
@@ -76,8 +76,11 @@
                 throw new IllegalArgumentException(shellRootLayer
                         + " is not an acceptable shell root layer.");
         }
-        mToken = new WindowToken(
-                dc.mWmService, client.asBinder(), windowType, true, dc, true, false);
+        mToken = new WindowToken.Builder(dc.mWmService, client.asBinder(), windowType)
+                .setDisplayContent(dc)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .build();
         mSurfaceControl = mToken.makeChildSurface(null)
                 .setContainerLayer()
                 .setName("Shell Root Leash " + dc.getDisplayId())
diff --git a/services/core/java/com/android/server/wm/SnapshotStartingData.java b/services/core/java/com/android/server/wm/SnapshotStartingData.java
index 2124ed6..66ae0eb 100644
--- a/services/core/java/com/android/server/wm/SnapshotStartingData.java
+++ b/services/core/java/com/android/server/wm/SnapshotStartingData.java
@@ -39,4 +39,9 @@
         return mService.mStartingSurfaceController.createTaskSnapshotSurface(activity,
                 mSnapshot);
     }
+
+    @Override
+    boolean hasImeSurface() {
+        return mSnapshot.hasImeSurface();
+    }
 }
diff --git a/services/core/java/com/android/server/wm/StartingData.java b/services/core/java/com/android/server/wm/StartingData.java
index a5bd797..59de43a 100644
--- a/services/core/java/com/android/server/wm/StartingData.java
+++ b/services/core/java/com/android/server/wm/StartingData.java
@@ -40,4 +40,9 @@
      *         {@link StartingSurface#remove}
      */
     abstract StartingSurface createStartingSurface(ActivityRecord activity);
+
+    /** @see android.window.TaskSnapshot#hasImeSurface() */
+    boolean hasImeSurface() {
+        return false;
+    }
 }
diff --git a/services/core/java/com/android/server/wm/StartingSurfaceController.java b/services/core/java/com/android/server/wm/StartingSurfaceController.java
index a9b06ca..c3815c1 100644
--- a/services/core/java/com/android/server/wm/StartingSurfaceController.java
+++ b/services/core/java/com/android/server/wm/StartingSurfaceController.java
@@ -118,7 +118,9 @@
                 return null;
             }
             if (topFullscreenActivity.getWindowConfiguration().getRotation()
-                    != taskSnapshot.getRotation()) {
+                    != taskSnapshot.getRotation()
+                    // Use normal rotation to avoid flickering of IME window in old orientation.
+                    && !taskSnapshot.hasImeSurface()) {
                 // The snapshot should have been checked by ActivityRecord#isSnapshotCompatible
                 // that the activity will be updated to the same rotation as the snapshot. Since
                 // the transition is not started yet, fixed rotation transform needs to be applied
diff --git a/services/core/java/com/android/server/wm/StrictModeFlash.java b/services/core/java/com/android/server/wm/StrictModeFlash.java
index 39ac16a..48a7bde 100644
--- a/services/core/java/com/android/server/wm/StrictModeFlash.java
+++ b/services/core/java/com/android/server/wm/StrictModeFlash.java
@@ -19,6 +19,7 @@
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
+import android.graphics.BLASTBufferQueue;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
@@ -27,28 +28,27 @@
 import android.view.Surface.OutOfResourcesException;
 import android.view.SurfaceControl;
 
-import java.util.function.Supplier;
-
 class StrictModeFlash {
     private static final String TAG = TAG_WITH_CLASS_NAME ? "StrictModeFlash" : TAG_WM;
+    private static final String TITLE = "StrictModeFlash";
 
     private final SurfaceControl mSurfaceControl;
     private final Surface mSurface;
+    private final BLASTBufferQueue mBlastBufferQueue;
+
     private int mLastDW;
     private int mLastDH;
     private boolean mDrawNeeded;
     private final int mThickness = 20;
 
-    StrictModeFlash(Supplier<Surface> surfaceFactory, DisplayContent dc,
-            SurfaceControl.Transaction t) {
-        mSurface = surfaceFactory.get();
+    StrictModeFlash(DisplayContent dc, SurfaceControl.Transaction t) {
         SurfaceControl ctrl = null;
         try {
             ctrl = dc.makeOverlay()
-                    .setName("StrictModeFlash")
-                    .setBufferSize(1, 1)
+                    .setName(TITLE)
+                    .setBLASTLayer()
                     .setFormat(PixelFormat.TRANSLUCENT)
-                    .setCallsite("StrictModeFlash")
+                    .setCallsite(TITLE)
                     .build();
 
             // one more than Watermark? arbitrary.
@@ -56,14 +56,15 @@
             t.setPosition(ctrl, 0, 0);
             t.show(ctrl);
             // Ensure we aren't considered as obscuring for Input purposes.
-            InputMonitor.setTrustedOverlayInputInfo(ctrl, t, dc.getDisplayId(),
-                    "StrictModeFlash");
-
-            mSurface.copyFrom(ctrl);
+            InputMonitor.setTrustedOverlayInputInfo(ctrl, t, dc.getDisplayId(), TITLE);
         } catch (OutOfResourcesException e) {
         }
         mSurfaceControl = ctrl;
         mDrawNeeded = true;
+
+        mBlastBufferQueue = new BLASTBufferQueue(TITLE, mSurfaceControl, 1 /* width */,
+                1 /* height */, PixelFormat.RGBA_8888);
+        mSurface = mBlastBufferQueue.createSurface();
     }
 
     private void drawIfNeeded() {
@@ -73,13 +74,12 @@
         mDrawNeeded = false;
         final int dw = mLastDW;
         final int dh = mLastDH;
+        mBlastBufferQueue.update(mSurfaceControl, dw, dh, PixelFormat.RGBA_8888);
 
-        Rect dirty = new Rect(0, 0, dw, dh);
         Canvas c = null;
         try {
-            c = mSurface.lockCanvas(dirty);
-        } catch (IllegalArgumentException e) {
-        } catch (Surface.OutOfResourcesException e) {
+            c = mSurface.lockCanvas(null);
+        } catch (IllegalArgumentException | OutOfResourcesException e) {
         }
         if (c == null) {
             return;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 858d9f3..9fad7da 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -176,12 +176,15 @@
 import android.app.servertransaction.PauseActivityItem;
 import android.app.servertransaction.ResumeActivityItem;
 import android.content.ComponentName;
+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.PackageManager;
 import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Matrix;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.Binder;
@@ -211,6 +214,7 @@
 import android.view.WindowManager;
 import android.view.WindowManager.TransitionOldType;
 import android.window.ITaskOrganizer;
+import android.window.PictureInPictureSurfaceTransaction;
 import android.window.StartingWindowInfo;
 import android.window.TaskSnapshot;
 import android.window.WindowContainerToken;
@@ -470,14 +474,14 @@
     int mMinWidth;
     int mMinHeight;
 
-    // The bounds of the target when recents animation is finished.
+    // The surface transition of the target when recents animation is finished.
     // This is originally introduced to carry out the current surface control position and window
     // crop when a multi-activity task enters pip with autoEnterPip enabled. In such case,
     // the surface control of the task will be animated in Launcher and then the top activity is
     // reparented to pinned root task.
-    // Do not forget to reset this to null after reparenting.
+    // Do not forget to reset this after reparenting.
     // TODO: remove this once the recents animation is moved to the Shell
-    final Rect mLastRecentsAnimationBounds = new Rect();
+    PictureInPictureSurfaceTransaction mLastRecentsAnimationTransaction;
 
     static final int LAYER_RANK_INVISIBLE = -1;
     // Ranking (from top) of this task among all visible tasks. (-1 means it's not visible)
@@ -2265,7 +2269,6 @@
         }
 
         if (pipChanging) {
-            mDisplayContent.getPinnedTaskController().setPipWindowingModeChanging(true);
             // If the top activity is using fixed rotation, it should be changing from PiP to
             // fullscreen with display orientation change. Do not notify fullscreen task organizer
             // because the restoration of task surface and the transformation of activity surface
@@ -2274,29 +2277,15 @@
             if (r != null && mDisplayContent.isFixedRotationLaunchingApp(r)) {
                 mForceNotOrganized = true;
             }
-        } else if (mForceNotOrganized) {
+        } else {
             // If the display orientation change is done, let the corresponding task organizer take
             // back the control of this task.
-            final ActivityRecord r = topRunningActivity();
-            if (r == null || !mDisplayContent.isFixedRotationLaunchingApp(r)) {
-                mForceNotOrganized = false;
-            }
+            mForceNotOrganized = false;
         }
-        try {
-            // We have 2 reasons why we need to report orientation change here.
-            // 1. In some cases (e.g. freeform -> fullscreen) we don't have other ways of reporting.
-            // 2. Report orientation as soon as possible so that the display can freeze earlier if
-            // the display orientation will be changed. Because the surface bounds of activity
-            // may have been set to fullscreen but the activity hasn't redrawn its content yet,
-            // the rotation animation needs to capture snapshot earlier to avoid animating from
-            // an intermediate state.
-            if (oldOrientation != getOrientation()) {
-                onDescendantOrientationChanged(this);
-            }
-        } finally {
-            if (pipChanging) {
-                mDisplayContent.getPinnedTaskController().setPipWindowingModeChanging(false);
-            }
+
+        // Report orientation change such as changing from freeform to fullscreen.
+        if (oldOrientation != getOrientation()) {
+            onDescendantOrientationChanged(this);
         }
 
         saveLaunchingStateIfNeeded();
@@ -2319,6 +2308,15 @@
 
     @Override
     public void onConfigurationChanged(Configuration newParentConfig) {
+        if (mDisplayContent != null
+                && mDisplayContent.mPinnedTaskController.isFreezingTaskConfig(this)) {
+            // It happens when animating from fullscreen to PiP with orientation change. Because
+            // the activity in this pinned task is in fullscreen windowing mode (see
+            // RootWindowContainer#moveActivityToPinnedRootTask) and the activity will be set to
+            // pinned mode after the animation is done, the configuration change by orientation
+            // change is just an intermediate state that should be ignored to avoid flickering.
+            return;
+        }
         // Calling Task#onConfigurationChanged() for leaf task since the ops in this method are
         // particularly for root tasks, like preventing bounds changes when inheriting certain
         // windowing mode.
@@ -4081,6 +4079,7 @@
         info.lastActiveTime = lastActiveTime;
         info.taskDescription = new ActivityManager.TaskDescription(getTaskDescription());
         info.supportsSplitScreenMultiWindow = supportsSplitScreenWindowingMode();
+        info.supportsMultiWindow = supportsMultiWindow();
         info.configuration.setTo(getConfiguration());
         // Update to the task's current activity type and windowing mode which may differ from the
         // window configuration
@@ -4469,10 +4468,10 @@
         pw.print(" mSupportsPictureInPicture="); pw.print(mSupportsPictureInPicture);
         pw.print(" isResizeable="); pw.println(isResizeable());
         pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime);
+        pw.println(" (inactive for " + (getInactiveDuration() / 1000) + "s)");
         if (mForceNotOrganized) {
             pw.print(prefix); pw.println("mForceNotOrganized=true");
         }
-        pw.println(" (inactive for " + (getInactiveDuration() / 1000) + "s)");
     }
 
     @Override
@@ -5435,6 +5434,13 @@
                 // Nothing else to do if we don't have a window container yet. E.g. call from ctor.
                 return;
             }
+
+            // From fullscreen to PiP.
+            if (topActivity != null && currentMode == WINDOWING_MODE_FULLSCREEN
+                    && windowingMode == WINDOWING_MODE_PINNED) {
+                mDisplayContent.mPinnedTaskController
+                        .deferOrientationChangeForEnteringPipFromFullScreenIfNeeded();
+            }
         } finally {
             mAtmService.continueWindowLayout();
         }
@@ -6674,8 +6680,30 @@
                         prev = null;
                     }
                 }
-                final int splashScreenThemeResId = options != null
+
+                // TODO(185200798): Persist theme name instead of theme if
+                int splashScreenThemeResId = options != null
                         ? options.getSplashScreenThemeResId() : 0;
+
+                // User can override the splashscreen theme. The theme name is used to persist
+                // the setting, so if no theme is set in the ActivityOptions, we check if has
+                // been persisted here.
+                if (splashScreenThemeResId == 0) {
+                    try {
+                        String themeName = mAtmService.getPackageManager()
+                                .getSplashScreenTheme(r.packageName, r.mUserId);
+                        if (themeName != null) {
+                            Context packageContext = mAtmService.mContext
+                                    .createPackageContext(r.packageName, 0);
+                            splashScreenThemeResId = packageContext.getResources()
+                                    .getIdentifier(themeName, null, null);
+                        }
+                    } catch (RemoteException | PackageManager.NameNotFoundException
+                            | Resources.NotFoundException ignore) {
+                        // Just use the default theme
+                    }
+                }
+
                 r.showStartingWindow(prev, newTask, isTaskSwitch(r, focusedTopActivity),
                         splashScreenThemeResId, samePackage);
             }
@@ -7665,14 +7693,22 @@
         reparent(newParent, onTop ? POSITION_TOP : POSITION_BOTTOM);
     }
 
-    void maybeApplyLastRecentsAnimationBounds() {
-        if (!mLastRecentsAnimationBounds.isEmpty()) {
-            getPendingTransaction()
-                    .setPosition(mSurfaceControl, mLastRecentsAnimationBounds.left,
-                            mLastRecentsAnimationBounds.top)
-                    .setWindowCrop(mSurfaceControl, mLastRecentsAnimationBounds.width(),
-                            mLastRecentsAnimationBounds.height());
-            mLastRecentsAnimationBounds.setEmpty();
+    void setLastRecentsAnimationTransaction(
+            @NonNull PictureInPictureSurfaceTransaction transaction) {
+        mLastRecentsAnimationTransaction = new PictureInPictureSurfaceTransaction(transaction);
+    }
+
+    void clearLastRecentsAnimationTransaction() {
+        mLastRecentsAnimationTransaction = null;
+        // reset also the transform introduced by mLastRecentsAnimationTransaction
+        getPendingTransaction().setMatrix(mSurfaceControl, Matrix.IDENTITY_MATRIX, new float[9]);
+    }
+
+    void maybeApplyLastRecentsAnimationTransaction() {
+        if (mLastRecentsAnimationTransaction != null) {
+            PictureInPictureSurfaceTransaction.apply(mLastRecentsAnimationTransaction,
+                    mSurfaceControl, getPendingTransaction());
+            mLastRecentsAnimationTransaction = null;
         }
     }
 
@@ -7917,6 +7953,17 @@
         private boolean mHasBeenVisible;
         private boolean mRemoveWithTaskOrganizer;
 
+        /**
+         * Records the source task that requesting to build a new task, used to determine which of
+         * the adjacent roots should be launch root of the new task.
+         */
+        private Task mSourceTask;
+
+        /**
+         * Records launch flags to apply when launching new task.
+         */
+        private int mLaunchFlags;
+
         Builder(ActivityTaskManagerService atm) {
             mAtmService = atm;
         }
@@ -7926,6 +7973,16 @@
             return this;
         }
 
+        Builder setSourceTask(Task sourceTask) {
+            mSourceTask = sourceTask;
+            return this;
+        }
+
+        Builder setLaunchFlags(int launchFlags) {
+            mLaunchFlags = launchFlags;
+            return this;
+        }
+
         Builder setTaskId(int taskId) {
             mTaskId = taskId;
             return this;
@@ -8180,9 +8237,14 @@
                 tda.getRootPinnedTask().dismissPip();
             }
 
+            if (mIntent != null) {
+                mLaunchFlags |= mIntent.getFlags();
+            }
+
             // Task created by organizer are added as root.
             final Task launchRootTask = mCreatedByOrganizer
-                    ? null : tda.getLaunchRootTask(mWindowingMode, mActivityType, mActivityOptions);
+                    ? null : tda.getLaunchRootTask(mWindowingMode, mActivityType, mActivityOptions,
+                    mSourceTask, mLaunchFlags);
             if (launchRootTask != null) {
                 // Since this task will be put into a root task, its windowingMode will be
                 // inherited.
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 3799067..cda8c4b 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -27,6 +27,7 @@
 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.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -43,7 +44,6 @@
 import android.annotation.Nullable;
 import android.app.ActivityOptions;
 import android.app.WindowConfiguration;
-import android.content.Intent;
 import android.os.UserHandle;
 import android.util.IntArray;
 import android.util.Slog;
@@ -133,6 +133,11 @@
     private final ArrayList<LaunchRootTaskDef> mLaunchRootTasks = new ArrayList<>();
 
     /**
+     * A launch root task for activity launching with {@link FLAG_ACTIVITY_LAUNCH_ADJACENT} flag.
+     */
+    private Task mLaunchAdjacentFlagRootTask;
+
+    /**
      * A focusable root task that is purposely to be positioned at the top. Although the root
      * task may not have the topmost index, it is used as a preferred candidate to prevent being
      * unable to resume target root task properly when there are other focusable always-on-top
@@ -172,18 +177,33 @@
      */
     final boolean mCreatedByOrganizer;
 
+    /**
+     * True if this TaskDisplayArea can have a home task
+     * {@link WindowConfiguration#ACTIVITY_TYPE_HOME}
+     */
+    private final boolean mCanHostHomeTask;
+
     TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name,
-            int displayAreaFeature) {
-        this(displayContent, service, name, displayAreaFeature, false /* createdByOrganizer */);
+                    int displayAreaFeature) {
+        this(displayContent, service, name, displayAreaFeature, false /* createdByOrganizer */,
+                true /* canHostHomeTask */);
     }
 
     TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name,
-            int displayAreaFeature, boolean createdByOrganizer) {
+                    int displayAreaFeature, boolean createdByOrganizer) {
+        this(displayContent, service, name, displayAreaFeature, createdByOrganizer,
+                true /* canHostHomeTask */);
+    }
+
+    TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name,
+                    int displayAreaFeature, boolean createdByOrganizer,
+                    boolean canHostHomeTask) {
         super(service, Type.ANY, name, displayAreaFeature);
         mDisplayContent = displayContent;
         mRootWindowContainer = service.mRoot;
         mAtmService = service.mAtmService;
         mCreatedByOrganizer = createdByOrganizer;
+        mCanHostHomeTask = canHostHomeTask;
     }
 
     /**
@@ -998,6 +1018,9 @@
         if (mPreferredTopFocusableRootTask == rootTask) {
             mPreferredTopFocusableRootTask = null;
         }
+        if (mLaunchAdjacentFlagRootTask == rootTask) {
+            mLaunchAdjacentFlagRootTask = null;
+        }
         mDisplayContent.releaseSelfIfNeeded();
         onRootTaskOrderChanged(rootTask);
     }
@@ -1032,11 +1055,11 @@
      * Returns an existing root task compatible with the windowing mode and activity type or
      * creates one if a compatible root task doesn't exist.
      *
-     * @see #getOrCreateRootTask(int, int, boolean, Intent, Task, ActivityOptions)
+     * @see #getOrCreateRootTask(int, int, boolean, Task, Task, ActivityOptions, int)
      */
     Task getOrCreateRootTask(int windowingMode, int activityType, boolean onTop) {
-        return getOrCreateRootTask(windowingMode, activityType, onTop, null /* intent */,
-                null /* candidateTask */, null /* options */);
+        return getOrCreateRootTask(windowingMode, activityType, onTop, null /* candidateTask */,
+                null /* sourceTask */, null /* options */, 0 /* intent */);
     }
 
     /**
@@ -1045,11 +1068,21 @@
      * For one level task, the candidate task would be reused to also be the root task or create
      * a new root task if no candidate task.
      *
+     * @param windowingMode The windowing mode the root task should be created in.
+     * @param activityType  The activityType the root task should be created in.
+     * @param onTop         If true the root task will be created at the top of the display,
+     *                      else at the bottom.
+     * @param candidateTask The possible task the activity might be launched in. Can be null.
+     * @param sourceTask    The task requesting to start activity. Used to determine which of the
+     *                      adjacent roots should be launch root of the new task. Can be null.
+     * @param options       The activity options used to the launch. Can be null.
+     * @param launchFlags   The launch flags for this launch.
+     * @return The root task to use for the launch.
      * @see #getRootTask(int, int)
-     * @see #createRootTask(int, int, boolean)
      */
     Task getOrCreateRootTask(int windowingMode, int activityType, boolean onTop,
-            Intent intent, Task candidateTask, ActivityOptions options) {
+            @Nullable Task candidateTask, @Nullable Task sourceTask,
+            @Nullable ActivityOptions options, int launchFlags) {
         // Need to pass in a determined windowing mode to see if a new root task should be created,
         // so use its parent's windowing mode if it is undefined.
         if (!alwaysCreateRootTask(
@@ -1062,7 +1095,8 @@
         } else if (candidateTask != null) {
             final Task rootTask = candidateTask;
             final int position = onTop ? POSITION_TOP : POSITION_BOTTOM;
-            final Task launchRootTask = getLaunchRootTask(windowingMode, activityType, options);
+            final Task launchRootTask = getLaunchRootTask(windowingMode, activityType, options,
+                    sourceTask, launchFlags);
 
             if (launchRootTask != null) {
                 if (rootTask.getParent() == null) {
@@ -1088,8 +1122,9 @@
                 .setActivityType(activityType)
                 .setOnTop(onTop)
                 .setParent(this)
-                .setIntent(intent)
+                .setSourceTask(sourceTask)
                 .setActivityOptions(options)
+                .setLaunchFlags(launchFlags)
                 .build();
     }
 
@@ -1099,9 +1134,9 @@
      *
      * @see #getOrCreateRootTask(int, int, boolean)
      */
-    Task getOrCreateRootTask(@Nullable ActivityRecord r,
-            @Nullable ActivityOptions options, @Nullable Task candidateTask,
-            @Nullable LaunchParams launchParams, int activityType, boolean onTop) {
+    Task getOrCreateRootTask(@Nullable ActivityRecord r, @Nullable ActivityOptions options,
+            @Nullable Task candidateTask, @Nullable Task sourceTask,
+            @Nullable LaunchParams launchParams, int launchFlags, int activityType, boolean onTop) {
         int windowingMode = WINDOWING_MODE_UNDEFINED;
         if (launchParams != null) {
             // If launchParams isn't null, windowing mode is already resolved.
@@ -1115,8 +1150,8 @@
         // UNDEFINED windowing mode is a valid result and means that the new root task will inherit
         // it's display's windowing mode.
         windowingMode = validateWindowingMode(windowingMode, r, candidateTask, activityType);
-        return getOrCreateRootTask(windowingMode, activityType, onTop, null /* intent */,
-                candidateTask, options);
+        return getOrCreateRootTask(windowingMode, activityType, onTop, candidateTask, sourceTask,
+                options, launchFlags);
     }
 
     @VisibleForTesting
@@ -1184,6 +1219,24 @@
         }
     }
 
+    void setLaunchAdjacentFlagRootTask(@Nullable Task adjacentFlagRootTask) {
+        if (adjacentFlagRootTask != null) {
+            if (!adjacentFlagRootTask.mCreatedByOrganizer) {
+                throw new IllegalArgumentException(
+                        "Can't set not mCreatedByOrganizer as launch adjacent flag root tr="
+                                + adjacentFlagRootTask);
+            }
+
+            if (adjacentFlagRootTask.mAdjacentTask == null) {
+                throw new UnsupportedOperationException(
+                        "Can't set non-adjacent root as launch adjacent flag root tr="
+                                + adjacentFlagRootTask);
+            }
+        }
+
+        mLaunchAdjacentFlagRootTask = adjacentFlagRootTask;
+    }
+
     private @Nullable LaunchRootTaskDef getLaunchRootTaskDef(Task rootTask) {
         LaunchRootTaskDef def = null;
         for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) {
@@ -1194,7 +1247,9 @@
         return def;
     }
 
-    Task getLaunchRootTask(int windowingMode, int activityType, ActivityOptions options) {
+    @Nullable
+    Task getLaunchRootTask(int windowingMode, int activityType, @Nullable ActivityOptions options,
+            @Nullable Task sourceTask, int launchFlags) {
         // Try to use the launch root task in options if available.
         if (options != null) {
             final Task launchRootTask = Task.fromWindowContainerToken(options.getLaunchRootTask());
@@ -1204,6 +1259,19 @@
             }
         }
 
+        // Use launch-adjacent-flag-root if launching with launch-adjacent flag.
+        if ((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0
+                && mLaunchAdjacentFlagRootTask != null) {
+            // If the adjacent launch is coming from the same root, launch to adjacent root instead.
+            if (sourceTask != null
+                    && sourceTask.getRootTask().mTaskId == mLaunchAdjacentFlagRootTask.mTaskId
+                    && mLaunchAdjacentFlagRootTask.mAdjacentTask != null) {
+                return mLaunchAdjacentFlagRootTask.mAdjacentTask;
+            } else {
+                return mLaunchAdjacentFlagRootTask;
+            }
+        }
+
         for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) {
             if (mLaunchRootTasks.get(i).contains(windowingMode, activityType)) {
                 return mLaunchRootTasks.get(i).task;
@@ -1667,7 +1735,9 @@
     @Nullable
     Task getOrCreateRootHomeTask(boolean onTop) {
         Task homeTask = getRootHomeTask();
-        if (homeTask == null && mDisplayContent.supportsSystemDecorations()) {
+        // Take into account if this TaskDisplayArea can have a home task before trying to
+        // create the root task
+        if (homeTask == null && canHostHomeTask()) {
             homeTask = createRootTask(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, onTop);
         }
         return homeTask;
@@ -1882,6 +1952,13 @@
     }
 
     /**
+     * Exposes the home task capability of the TaskDisplayArea
+     */
+    boolean canHostHomeTask() {
+        return mDisplayContent.supportsSystemDecorations() && mCanHostHomeTask;
+    }
+
+    /**
      * Callback for when the order of the root tasks in the display changes.
      */
     interface OnRootTaskOrderChangedListener {
@@ -1939,7 +2016,11 @@
                 // Reparent task to corresponding launch root or display area.
                 final WindowContainer launchRoot = task.supportsSplitScreenWindowingMode()
                         ? toDisplayArea.getLaunchRootTask(
-                                task.getWindowingMode(), task.getActivityType(), null /* options */)
+                                task.getWindowingMode(),
+                                task.getActivityType(),
+                                null /* options */,
+                                null /* sourceTask */,
+                                0 /* launchFlags */)
                         : null;
                 task.reparent(launchRoot == null ? toDisplayArea : launchRoot, POSITION_TOP);
 
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index 625cff3..29677b2 100644
--- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
@@ -292,7 +292,8 @@
                     mSupervisor.mRootWindowContainer.resolveActivityType(root, options, task);
             display.forAllTaskDisplayAreas(displayArea -> {
                 final Task launchRoot = displayArea.getLaunchRootTask(
-                        resolvedMode, activityType, null /* ActivityOptions */);
+                        resolvedMode, activityType, null /* ActivityOptions */,
+                        null /* sourceTask*/, 0 /* launchFlags */);
                 if (launchRoot == null) {
                     return false;
                 }
diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
index 1779d2a..7e992ac 100644
--- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
+++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
@@ -17,8 +17,8 @@
 
 import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_RECENTS_ANIMATIONS;
 
+import android.graphics.GraphicBuffer;
 import android.hardware.HardwareBuffer;
-import android.view.Surface;
 import android.view.SurfaceControl;
 import android.view.SurfaceSession;
 
@@ -51,14 +51,14 @@
                         task, mWidth, mHeight);
         mSurfaceControl = surfaceControlFactory.apply(new SurfaceSession())
                 .setName("RecentTaskScreenshotSurface")
-                .setBufferSize(mWidth, mHeight)
+                .setBLASTLayer()
                 .setCallsite("TaskScreenshotAnimatable")
                 .build();
         if (buffer != null) {
-            final Surface surface = new Surface();
-            surface.copyFrom(mSurfaceControl);
-            surface.attachAndQueueBufferWithColorSpace(buffer, screenshotBuffer.getColorSpace());
-            surface.release();
+            GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(buffer);
+            getPendingTransaction().setBuffer(mSurfaceControl, graphicBuffer);
+            getPendingTransaction().setColorSpace(mSurfaceControl,
+                    screenshotBuffer.getColorSpace());
             final float scale = 1.0f * mTask.getBounds().width() / mWidth;
             getPendingTransaction().setMatrix(mSurfaceControl, scale, 0, 0, scale);
         }
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index 79a6bd7..cc4abab 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -37,6 +37,7 @@
 import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_USE_BLAST;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 
 import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES;
@@ -53,8 +54,10 @@
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.GraphicBuffer;
 import android.graphics.Matrix;
 import android.graphics.Paint;
+import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.graphics.RectF;
@@ -69,7 +72,6 @@
 import android.view.IWindowSession;
 import android.view.InsetsSourceControl;
 import android.view.InsetsState;
-import android.view.Surface;
 import android.view.SurfaceControl;
 import android.view.SurfaceSession;
 import android.view.View;
@@ -124,9 +126,7 @@
     private static final Point sTmpSurfaceSize = new Point();
 
     private final Window mWindow;
-    private final Surface mSurface;
-    private SurfaceControl mSurfaceControl;
-    private SurfaceControl mChildSurfaceControl;
+    private final SurfaceControl mSurfaceControl;
     private final IWindowSession mSession;
     private final WindowManagerService mService;
     private final int mDisplayId;
@@ -200,7 +200,7 @@
             // Setting as trusted overlay to let touches pass through. This is safe because this
             // window is controlled by the system.
             layoutParams.privateFlags = (windowPrivateFlags & PRIVATE_FLAG_INHERITS)
-                    | PRIVATE_FLAG_TRUSTED_OVERLAY;
+                    | PRIVATE_FLAG_TRUSTED_OVERLAY | PRIVATE_FLAG_USE_BLAST;
             layoutParams.token = activity.token;
             layoutParams.width = LayoutParams.MATCH_PARENT;
             layoutParams.height = LayoutParams.MATCH_PARENT;
@@ -262,7 +262,6 @@
             InsetsState insetsState) {
         mService = service;
         mDisplayId = displayId;
-        mSurface = service.mSurfaceFactory.get();
         mHandler = new Handler(mService.mH.getLooper());
         mSession = WindowManagerGlobal.getWindowSession();
         mWindow = window;
@@ -314,8 +313,6 @@
     }
 
     private void drawSnapshot() {
-        mSurface.copyFrom(mSurfaceControl);
-
         ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Drawing snapshot surface sizeMismatch=%b",
                 mSizeMismatch);
         if (mSizeMismatch) {
@@ -337,15 +334,14 @@
     }
 
     private void drawSizeMatchSnapshot() {
-        mSurface.attachAndQueueBufferWithColorSpace(mSnapshot.getHardwareBuffer(),
-                mSnapshot.getColorSpace());
-        mSurface.release();
+        GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(
+                mSnapshot.getHardwareBuffer());
+        mTransaction.setBuffer(mSurfaceControl, graphicBuffer)
+                .setColorSpace(mSurfaceControl, mSnapshot.getColorSpace())
+                .apply();
     }
 
     private void drawSizeMismatchSnapshot() {
-        if (!mSurface.isValid()) {
-            throw new IllegalStateException("mSurface does not hold a valid surface.");
-        }
         final HardwareBuffer buffer = mSnapshot.getHardwareBuffer();
         final SurfaceSession session = new SurfaceSession();
         // We consider nearly matched dimensions as there can be rounding errors and the user won't
@@ -356,26 +352,24 @@
 
         // Keep a reference to it such that it doesn't get destroyed when finalized.
         final String name = mTitle + " - task-snapshot-surface";
-        mChildSurfaceControl = mService.mSurfaceControlFactory.apply(session)
+        SurfaceControl childSurfaceControl = mService.mSurfaceControlFactory.apply(session)
                 .setName(name)
-                .setBufferSize(buffer.getWidth(), buffer.getHeight())
+                .setBLASTLayer()
                 .setFormat(buffer.getFormat())
                 .setParent(mSurfaceControl)
                 .setCallsite("TaskSnapshotSurface.drawSizeMismatchSnapshot")
                 .build();
-        Surface surface = mService.mSurfaceFactory.get();
-        surface.copyFrom(mChildSurfaceControl);
 
         final Rect frame;
         // We can just show the surface here as it will still be hidden as the parent is
         // still hidden.
-        mTransaction.show(mChildSurfaceControl);
+        mTransaction.show(childSurfaceControl);
         if (aspectRatioMismatch) {
             // Clip off ugly navigation bar.
             final Rect crop = calculateSnapshotCrop();
             frame = calculateSnapshotFrame(crop);
-            mTransaction.setWindowCrop(mChildSurfaceControl, crop);
-            mTransaction.setPosition(mChildSurfaceControl, frame.left, frame.top);
+            mTransaction.setWindowCrop(childSurfaceControl, crop);
+            mTransaction.setPosition(childSurfaceControl, frame.left, frame.top);
             mTmpSnapshotSize.set(crop);
             mTmpDstFrame.set(frame);
         } else {
@@ -387,23 +381,29 @@
 
         // Scale the mismatch dimensions to fill the task bounds
         mSnapshotMatrix.setRectToRect(mTmpSnapshotSize, mTmpDstFrame, Matrix.ScaleToFit.FILL);
-        mTransaction.setMatrix(mChildSurfaceControl, mSnapshotMatrix, mTmpFloat9);
+        mTransaction.setMatrix(childSurfaceControl, mSnapshotMatrix, mTmpFloat9);
 
+        GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(
+                mSnapshot.getHardwareBuffer());
+        mTransaction.setColorSpace(childSurfaceControl, mSnapshot.getColorSpace());
+        mTransaction.setBuffer(childSurfaceControl, graphicBuffer);
         // This is the way to tell the input system to exclude this surface from occlusion
         // detection since we don't have a window for it. We do this because this window is
         // generated by the system as well as its content (the snapshot of the app).
-        InputMonitor.setTrustedOverlayInputInfo(mChildSurfaceControl, mTransaction, mDisplayId,
+        InputMonitor.setTrustedOverlayInputInfo(childSurfaceControl, mTransaction, mDisplayId,
                 name);
-        mTransaction.apply();
-        surface.attachAndQueueBufferWithColorSpace(buffer, mSnapshot.getColorSpace());
-        surface.release();
 
         if (aspectRatioMismatch) {
-            final Canvas c = mSurface.lockCanvas(null);
+            GraphicBuffer background = GraphicBuffer.create(mFrame.width(), mFrame.height(),
+                    PixelFormat.RGBA_8888,
+                    GraphicBuffer.USAGE_HW_TEXTURE | GraphicBuffer.USAGE_HW_COMPOSER
+                            | GraphicBuffer.USAGE_SW_WRITE_RARELY);
+            final Canvas c = background.lockCanvas();
             drawBackgroundAndBars(c, frame);
-            mSurface.unlockCanvasAndPost(c);
-            mSurface.release();
+            background.unlockCanvasAndPost(c);
+            mTransaction.setBuffer(mSurfaceControl, background);
         }
+        mTransaction.apply();
     }
 
     /**
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index e4ac1f6..42e2d2f 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -32,6 +32,7 @@
 import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_TO_FRONT;
 import static android.view.WindowManager.transitTypeToString;
+import static android.window.TransitionInfo.FLAG_IS_VOICE_INTERACTION;
 import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
 import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
 import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
@@ -106,11 +107,9 @@
     private final BLASTSyncEngine mSyncEngine;
     private IRemoteTransition mRemoteTransition = null;
 
-    /**
-     * This is a leash to put animating surfaces into flatly without clipping/ordering issues. It
-     * is a child of all the targets' shared ancestor.
-     */
-    private SurfaceControl mRootLeash = null;
+    /** Only use for clean-up after binder death! */
+    private SurfaceControl.Transaction mStartTransaction = null;
+    private SurfaceControl.Transaction mFinishTransaction = null;
 
     /**
      * Contains change infos for both participants and all ancestors. We have to track ancestors
@@ -229,16 +228,16 @@
         setReady(true);
     }
 
-    /** The transition has finished animating and is ready to finalize WM state */
-    void finishTransition() {
-        if (mState < STATE_PLAYING) {
-            throw new IllegalStateException("Can't finish a non-playing transition " + mSyncId);
-        }
+    /**
+     * Build a transaction that "resets" all the re-parenting and layer changes. This is
+     * intended to be applied at the end of the transition but before the finish callback. This
+     * needs to be passed/applied in shell because until finish is called, shell owns the surfaces.
+     * Additionally, this gives shell the ability to better deal with merged transitions.
+     */
+    private void buildFinishTransaction(SurfaceControl.Transaction t, SurfaceControl rootLeash) {
         final Point tmpPos = new Point();
         // usually only size 1
         final ArraySet<DisplayContent> displays = new ArraySet<>();
-        // Immediately apply all surface reparents, don't wait for pending/sync/etc.
-        SurfaceControl.Transaction t = mController.mAtm.mWindowManager.mTransactionFactory.get();
         for (int i = mTargets.size() - 1; i >= 0; --i) {
             final WindowContainer target = mTargets.valueAt(i);
             if (target.getParent() != null) {
@@ -247,9 +246,6 @@
                 // Ensure surfaceControls are re-parented back into the hierarchy.
                 t.reparent(targetLeash, origParent);
                 t.setLayer(targetLeash, target.getLastLayer());
-                // TODO(shell-transitions): Once all remotables have been moved, see if there is
-                //                          a more appropriate place to do the following. This may
-                //                          involve passing an SF transaction from shell on finish.
                 target.getRelativePosition(tmpPos);
                 t.setPosition(targetLeash, tmpPos.x, tmpPos.y);
                 t.setCornerRadius(targetLeash, 0);
@@ -257,25 +253,26 @@
                 displays.add(target.getDisplayContent());
             }
         }
-        // Need to update layers on ALL displays (for now) since they were all paused while
-        // the animation played.
+        // Need to update layers on involved displays since they were all paused while
+        // the animation played. This puts the layers back into the correct order.
         for (int i = displays.size() - 1; i >= 0; --i) {
             if (displays.valueAt(i) == null) continue;
             displays.valueAt(i).assignChildLayers(t);
         }
-        // Also pro-actively hide going-invisible activity surfaces in same transaction to
-        // prevent flickers due to reparenting and animation z-order mismatch.
-        for (int i = mParticipants.size() - 1; i >= 0; --i) {
-            final ActivityRecord ar = mParticipants.valueAt(i).asActivityRecord();
-            if (ar == null || ar.mVisibleRequested || !ar.isVisible()) continue;
-            t.hide(ar.getSurfaceControl());
+        if (rootLeash.isValid()) {
+            t.reparent(rootLeash, null);
         }
-        if (mRootLeash.isValid()) {
-            t.remove(mRootLeash);
+    }
+
+    /**
+     * The transition has finished animating and is ready to finalize WM state. This should not
+     * be called directly; use {@link TransitionController#finishTransition} instead.
+     */
+    void finishTransition() {
+        mStartTransaction = mFinishTransaction = null;
+        if (mState < STATE_PLAYING) {
+            throw new IllegalStateException("Can't finish a non-playing transition " + mSyncId);
         }
-        mRootLeash = null;
-        t.apply();
-        t.close();
 
         // Commit all going-invisible containers
         for (int i = 0; i < mParticipants.size(); ++i) {
@@ -343,29 +340,60 @@
         // Resolve the animating targets from the participants
         mTargets = calculateTargets(mParticipants, mChanges);
         final TransitionInfo info = calculateTransitionInfo(mType, mFlags, mTargets, mChanges);
-        mRootLeash = info.getRootLeash();
 
         handleNonAppWindowsInTransition(displayId, mType, mFlags);
 
+        // Manually show any activities that are visibleRequested. This is needed to properly
+        // support simultaneous animation queueing/merging. Specifically, if transition A makes
+        // an activity invisible, it's finishTransaction (which is applied *after* the animation)
+        // will hide the activity surface. If transition B then makes the activity visible again,
+        // the normal surfaceplacement logic won't add a show to this start transaction because
+        // the activity visibility hasn't been committed yet. To deal with this, we have to manually
+        // show here in the same way that we manually hide in finishTransaction.
+        for (int i = mParticipants.size() - 1; i >= 0; --i) {
+            final ActivityRecord ar = mParticipants.valueAt(i).asActivityRecord();
+            if (ar == null || !ar.mVisibleRequested) continue;
+            transaction.show(ar.getSurfaceControl());
+        }
+
+        mStartTransaction = transaction;
+        mFinishTransaction = mController.mAtm.mWindowManager.mTransactionFactory.get();
+        buildFinishTransaction(mFinishTransaction, info.getRootLeash());
         if (mController.getTransitionPlayer() != null) {
             try {
                 ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
                         "Calling onTransitionReady: %s", info);
-                mController.getTransitionPlayer().onTransitionReady(this, info, transaction);
+                mController.getTransitionPlayer().onTransitionReady(
+                        this, info, transaction, mFinishTransaction);
             } catch (RemoteException e) {
                 // If there's an exception when trying to send the mergedTransaction to the
                 // client, we should finish and apply it here so the transactions aren't lost.
-                transaction.apply();
-                finishTransition();
+                cleanUpOnFailure();
             }
         } else {
             // No player registered, so just finish/apply immediately
-            transaction.apply();
-            finishTransition();
+            cleanUpOnFailure();
         }
         mSyncId = -1;
     }
 
+    /**
+     * If the remote failed for any reason, use this to do any appropriate clean-up. Do not call
+     * this directly, it's designed to by called by {@link TransitionController} only.
+     */
+    void cleanUpOnFailure() {
+        // No need to clean-up if this isn't playing yet.
+        if (mState < STATE_PLAYING) return;
+
+        if (mStartTransaction != null) {
+            mStartTransaction.apply();
+        }
+        if (mFinishTransaction != null) {
+            mFinishTransaction.apply();
+        }
+        finishTransition();
+    }
+
     private void handleNonAppWindowsInTransition(int displayId,
             @WindowManager.TransitionType int transit, int flags) {
         final DisplayContent dc =
@@ -849,8 +877,18 @@
                 //                    checks to use requested visibility.
                 flags |= FLAG_TRANSLUCENT;
             }
-            if (wc.asActivityRecord() != null && wc.asActivityRecord().mUseTransferredAnimation) {
-                flags |= FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
+            final Task task = wc.asTask();
+            if (task != null && task.voiceSession != null) {
+                flags |= FLAG_IS_VOICE_INTERACTION;
+            }
+            final ActivityRecord record = wc.asActivityRecord();
+            if (record != null) {
+                if (record.mUseTransferredAnimation) {
+                    flags |= FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
+                }
+                if (record.mVoiceInteraction) {
+                    flags |= FLAG_IS_VOICE_INTERACTION;
+                }
             }
             if (isWallpaper(wc)) {
                 flags |= FLAG_IS_WALLPAPER;
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index 6338f39..cc63c49 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -42,17 +42,24 @@
     private static final String TAG = "TransitionController";
 
     private ITransitionPlayer mTransitionPlayer;
-    private final IBinder.DeathRecipient mTransitionPlayerDeath = () -> mTransitionPlayer = null;
     final ActivityTaskManagerService mAtm;
 
-    /** Currently playing transitions. When finished, records are removed from this list. */
+    /**
+     * Currently playing transitions (in the order they were started). When finished, records are
+     * removed from this list.
+     */
     private final ArrayList<Transition> mPlayingTransitions = new ArrayList<>();
 
-    /**
-     * The transition currently being constructed (collecting participants).
-     * TODO(shell-transitions): When simultaneous transitions are supported, merge this with
-     *                          mPlayingTransitions.
-     */
+    private final IBinder.DeathRecipient mTransitionPlayerDeath = () -> {
+        // clean-up/finish any playing transitions.
+        for (int i = 0; i < mPlayingTransitions.size(); ++i) {
+            mPlayingTransitions.get(i).cleanUpOnFailure();
+        }
+        mPlayingTransitions.clear();
+        mTransitionPlayer = null;
+    };
+
+    /** The transition currently being constructed (collecting participants). */
     private Transition mCollectingTransition = null;
 
     TransitionController(ActivityTaskManagerService atm) {
diff --git a/services/core/java/com/android/server/wm/Watermark.java b/services/core/java/com/android/server/wm/Watermark.java
index 7f28ffc..66ab094 100644
--- a/services/core/java/com/android/server/wm/Watermark.java
+++ b/services/core/java/com/android/server/wm/Watermark.java
@@ -18,30 +18,26 @@
 
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
+import android.graphics.BLASTBufferQueue;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.FontMetricsInt;
 import android.graphics.PixelFormat;
 import android.graphics.PorterDuff;
-import android.graphics.Rect;
 import android.graphics.Typeface;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.TypedValue;
-import android.view.Display;
-import android.view.InputWindowHandle;
 import android.view.Surface;
 import android.view.Surface.OutOfResourcesException;
 import android.view.SurfaceControl;
 
-import java.util.function.Supplier;
-
 /**
  * Displays a watermark on top of the window manager's windows.
  */
 class Watermark {
-    private final Display mDisplay;
-    private final String[] mTokens;
+    private static final String TITLE = "WatermarkSurface";
+
     private final String mText;
     private final Paint mTextPaint;
     private final int mTextWidth;
@@ -51,28 +47,26 @@
 
     private final SurfaceControl mSurfaceControl;
     private final Surface mSurface;
+    private final BLASTBufferQueue mBlastBufferQueue;
+
     private int mLastDW;
     private int mLastDH;
     private boolean mDrawNeeded;
 
-    Watermark(Supplier<Surface> surfaceFactory, DisplayContent dc, DisplayMetrics dm,
-            String[] tokens, SurfaceControl.Transaction t) {
+    Watermark(DisplayContent dc, DisplayMetrics dm, String[] tokens, SurfaceControl.Transaction t) {
         if (false) {
             Log.i(TAG_WM, "*********************** WATERMARK");
             for (int i=0; i<tokens.length; i++) {
                 Log.i(TAG_WM, "  TOKEN #" + i + ": " + tokens[i]);
             }
         }
-        mSurface = surfaceFactory.get();
-        mDisplay = dc.getDisplay();
-        mTokens = tokens;
 
         StringBuilder builder = new StringBuilder(32);
-        int len = mTokens[0].length();
+        int len = tokens[0].length();
         len = len & ~1;
         for (int i=0; i<len; i+=2) {
-            int c1 = mTokens[0].charAt(i);
-            int c2 = mTokens[0].charAt(i+1);
+            int c1 = tokens[0].charAt(i);
+            int c2 = tokens[0].charAt(i + 1);
             if (c1 >= 'a' && c1 <= 'f') c1 = c1 - 'a' + 10;
             else if (c1 >= 'A' && c1 <= 'F') c1 = c1 - 'A' + 10;
             else c1 -= '0';
@@ -118,20 +112,22 @@
         SurfaceControl ctrl = null;
         try {
             ctrl = dc.makeOverlay()
-                    .setName("WatermarkSurface")
-                    .setBufferSize(1, 1)
+                    .setName(TITLE)
+                    .setBLASTLayer()
                     .setFormat(PixelFormat.TRANSLUCENT)
-                    .setCallsite("Watermark")
+                    .setCallsite(TITLE)
                     .build();
             t.setLayer(ctrl, WindowManagerService.TYPE_LAYER_MULTIPLIER * 100)
                     .setPosition(ctrl, 0, 0)
                     .show(ctrl);
             // Ensure we aren't considered as obscuring for Input purposes.
-            InputMonitor.setTrustedOverlayInputInfo(ctrl, t, dc.getDisplayId(), "Watermark");
-            mSurface.copyFrom(ctrl);
+            InputMonitor.setTrustedOverlayInputInfo(ctrl, t, dc.getDisplayId(), TITLE);
         } catch (OutOfResourcesException e) {
         }
         mSurfaceControl = ctrl;
+        mBlastBufferQueue = new BLASTBufferQueue(TITLE, mSurfaceControl, 1 /* width */,
+                1 /* height */, PixelFormat.RGBA_8888);
+        mSurface = mBlastBufferQueue.createSurface();
     }
 
     void positionSurface(int dw, int dh, SurfaceControl.Transaction t) {
@@ -144,45 +140,46 @@
     }
 
     void drawIfNeeded() {
-        if (mDrawNeeded) {
-            final int dw = mLastDW;
-            final int dh = mLastDH;
+        if (!mDrawNeeded) {
+            return;
+        }
 
-            mDrawNeeded = false;
-            Rect dirty = new Rect(0, 0, dw, dh);
-            Canvas c = null;
-            try {
-                c = mSurface.lockCanvas(dirty);
-            } catch (IllegalArgumentException e) {
-            } catch (Surface.OutOfResourcesException e) {
+        final int dw = mLastDW;
+        final int dh = mLastDH;
+
+        mDrawNeeded = false;
+        mBlastBufferQueue.update(mSurfaceControl, dw, dh, PixelFormat.RGBA_8888);
+        Canvas c = null;
+        try {
+            c = mSurface.lockCanvas(null);
+        } catch (IllegalArgumentException | OutOfResourcesException e) {
+        }
+        if (c != null) {
+            c.drawColor(0, PorterDuff.Mode.CLEAR);
+
+            int deltaX = mDeltaX;
+            int deltaY = mDeltaY;
+
+            // deltaX shouldn't be close to a round fraction of our
+            // x step, or else things will line up too much.
+            int div = (dw + mTextWidth) / deltaX;
+            int rem = (dw + mTextWidth) - (div * deltaX);
+            int qdelta = deltaX / 4;
+            if (rem < qdelta || rem > (deltaX - qdelta)) {
+                deltaX += deltaX / 3;
             }
-            if (c != null) {
-                c.drawColor(0, PorterDuff.Mode.CLEAR);
 
-                int deltaX = mDeltaX;
-                int deltaY = mDeltaY;
-
-                // deltaX shouldn't be close to a round fraction of our
-                // x step, or else things will line up too much.
-                int div = (dw+mTextWidth)/deltaX;
-                int rem = (dw+mTextWidth) - (div*deltaX);
-                int qdelta = deltaX/4;
-                if (rem < qdelta || rem > (deltaX-qdelta)) {
-                    deltaX += deltaX/3;
+            int y = -mTextHeight;
+            int x = -mTextWidth;
+            while (y < (dh + mTextHeight)) {
+                c.drawText(mText, x, y, mTextPaint);
+                x += deltaX;
+                if (x >= dw) {
+                    x -= (dw + mTextWidth);
+                    y += deltaY;
                 }
-
-                int y = -mTextHeight;
-                int x = -mTextWidth;
-                while (y < (dh+mTextHeight)) {
-                    c.drawText(mText, x, y, mTextPaint);
-                    x += deltaX;
-                    if (x >= dw) {
-                        x -= (dw+mTextWidth);
-                        y += deltaY;
-                    }
-                }
-                mSurface.unlockCanvasAndPost(c);
             }
+            mSurface.unlockCanvasAndPost(c);
         }
     }
 }
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 191c3a11..bea733b 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -1257,7 +1257,14 @@
         mOrientation = orientation;
         final WindowContainer parent = getParent();
         if (parent != null) {
-            if (getConfiguration().orientation != getRequestedConfigurationOrientation()) {
+            if (getConfiguration().orientation != getRequestedConfigurationOrientation()
+                    // Update configuration directly only if the change won't be dispatched from
+                    // ancestor. This prevents from computing intermediate configuration when the
+                    // parent also needs to be updated from the ancestor. E.g. the app requests
+                    // portrait but the task is still in landscape. While updating from display,
+                    // the task can be updated to portrait first so the configuration can be
+                    // computed in a consistent environment.
+                    && (inMultiWindowMode() || !handlesOrientationChangeFromDescendant())) {
                 // Resolve the requested orientation.
                 onConfigurationChanged(parent.getConfiguration());
             }
diff --git a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
index b9f67a5..7f21eeb 100644
--- a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
+++ b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
@@ -28,12 +28,13 @@
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
 
+import android.graphics.ColorSpace;
+import android.graphics.GraphicBuffer;
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.hardware.HardwareBuffer;
 import android.os.Process;
 import android.util.proto.ProtoOutputStream;
-import android.view.Surface;
 import android.view.SurfaceControl;
 import android.view.SurfaceControl.Builder;
 import android.view.SurfaceControl.Transaction;
@@ -43,8 +44,6 @@
 import com.android.server.wm.SurfaceAnimator.Animatable;
 import com.android.server.wm.SurfaceAnimator.AnimationType;
 
-import java.util.function.Supplier;
-
 /**
  * Represents a surface that is displayed over a subclass of {@link WindowContainer}
  */
@@ -57,30 +56,20 @@
     private final SurfaceAnimator mSurfaceAnimator;
     private final int mWidth;
     private final int mHeight;
-    private final boolean mRelative;
-
-    WindowContainerThumbnail(Supplier<Surface> surfaceFactory, Transaction t,
-            WindowContainer container, HardwareBuffer thumbnailHeader) {
-        this(surfaceFactory, t, container, thumbnailHeader, false /* relative */);
-    }
 
     /**
      * @param t Transaction to create the thumbnail in.
      * @param container The sub-class of {@link WindowContainer} to associate this thumbnail with.
      * @param thumbnailHeader A thumbnail or placeholder for thumbnail to initialize with.
-     * @param relative Whether this thumbnail will be a child of the container (and thus positioned
-     *                 relative to it) or not.
      */
-    WindowContainerThumbnail(Supplier<Surface> surfaceFactory, Transaction t,
-            WindowContainer container, HardwareBuffer thumbnailHeader, boolean relative) {
-        this(t, container, thumbnailHeader, relative, surfaceFactory.get(), null);
+    WindowContainerThumbnail(Transaction t, WindowContainer container,
+            HardwareBuffer thumbnailHeader) {
+        this(t, container, thumbnailHeader, null /* animator */);
     }
 
     WindowContainerThumbnail(Transaction t, WindowContainer container,
-            HardwareBuffer thumbnailHeader, boolean relative, Surface drawSurface,
-            SurfaceAnimator animator) {
+            HardwareBuffer thumbnailHeader, SurfaceAnimator animator) {
         mWindowContainer = container;
-        mRelative = relative;
         if (animator != null) {
             mSurfaceAnimator = animator;
         } else {
@@ -99,7 +88,7 @@
         // this to the task.
         mSurfaceControl = mWindowContainer.makeChildSurface(mWindowContainer.getTopChild())
                 .setName("thumbnail anim: " + mWindowContainer.toString())
-                .setBufferSize(mWidth, mHeight)
+                .setBLASTLayer()
                 .setFormat(PixelFormat.TRANSLUCENT)
                 .setMetadata(METADATA_WINDOW_TYPE, mWindowContainer.getWindowingMode())
                 .setMetadata(METADATA_OWNER_UID, Process.myUid())
@@ -108,18 +97,14 @@
 
         ProtoLog.i(WM_SHOW_TRANSACTIONS, "  THUMBNAIL %s: CREATE", mSurfaceControl);
 
-        // Transfer the thumbnail to the surface
-        drawSurface.copyFrom(mSurfaceControl);
-        drawSurface.attachAndQueueBufferWithColorSpace(thumbnailHeader, null);
-        drawSurface.release();
+        GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(thumbnailHeader);
+        t.setBuffer(mSurfaceControl, graphicBuffer);
+        t.setColorSpace(mSurfaceControl, ColorSpace.get(ColorSpace.Named.SRGB));
         t.show(mSurfaceControl);
 
         // We parent the thumbnail to the container, and just place it on top of anything else in
         // the container.
         t.setLayer(mSurfaceControl, Integer.MAX_VALUE);
-        if (relative) {
-            t.reparent(mSurfaceControl, mWindowContainer.getSurfaceControl());
-        }
     }
 
     void startAnimation(Transaction t, Animation anim) {
@@ -194,9 +179,6 @@
     @Override
     public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
         t.setLayer(leash, Integer.MAX_VALUE);
-        if (mRelative) {
-            t.reparent(leash, mWindowContainer.getSurfaceControl());
-        }
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wm/WindowContextListenerController.java b/services/core/java/com/android/server/wm/WindowContextListenerController.java
index 0bb56e4..b417832 100644
--- a/services/core/java/com/android/server/wm/WindowContextListenerController.java
+++ b/services/core/java/com/android/server/wm/WindowContextListenerController.java
@@ -271,6 +271,21 @@
             if (mDeathRecipient == null) {
                 throw new IllegalStateException("Invalid client token: " + mClientToken);
             }
+            final WindowToken windowToken = mContainer.asWindowToken();
+            if (windowToken != null && windowToken.isFromClient()) {
+                // If the WindowContext created WindowToken is removed by
+                // WMS#postWindowRemoveCleanupLocked, the WindowContext should switch back to
+                // listen to previous associated DisplayArea.
+                final DisplayContent dc = windowToken.mWmService.mRoot
+                        .getDisplayContent(mLastReportedDisplay);
+                // If we cannot obtain the DisplayContent, the DisplayContent may also be removed.
+                // We should proceed the removal process.
+                if (dc != null) {
+                    final DisplayArea da = dc.findAreaForToken(windowToken);
+                    updateContainer(da);
+                    return;
+                }
+            }
             mDeathRecipient.unlinkToDeath();
             IWindowToken windowTokenClient = IWindowToken.Stub.asInterface(mClientToken);
             try {
diff --git a/services/core/java/com/android/server/wm/WindowManagerConstants.java b/services/core/java/com/android/server/wm/WindowManagerConstants.java
index 015a0fb..a5ebf9a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerConstants.java
+++ b/services/core/java/com/android/server/wm/WindowManagerConstants.java
@@ -49,10 +49,6 @@
     static final String KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS =
             "system_gesture_exclusion_log_debounce_millis";
 
-    // Enable logging from the sensor which publishes accel and gyro data generating a rotation
-    // event
-    private static final String KEY_RAW_SENSOR_LOGGING_ENABLED = "raw_sensor_logging_enabled";
-
     private static final int MIN_GESTURE_EXCLUSION_LIMIT_DP = 200;
 
     /** @see #KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS */
@@ -62,8 +58,6 @@
     /** @see AndroidDeviceConfig#KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE */
     boolean mSystemGestureExcludedByPreQStickyImmersive;
 
-    boolean mRawSensorLoggingEnabled;
-
     private final WindowManagerGlobalLock mGlobalLock;
     private final Runnable mUpdateSystemGestureExclusionCallback;
     private final DeviceConfigInterface mDeviceConfig;
@@ -139,9 +133,6 @@
                     case KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS:
                         updateSystemGestureExclusionLogDebounceMillis();
                         break;
-                    case KEY_RAW_SENSOR_LOGGING_ENABLED:
-                        updateRawSensorDataLoggingEnabled();
-                        break;
                     default:
                         break;
                 }
@@ -167,12 +158,6 @@
                 KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE, false);
     }
 
-    private void updateRawSensorDataLoggingEnabled() {
-        mRawSensorLoggingEnabled = DeviceConfig.getBoolean(
-                DeviceConfig.NAMESPACE_WINDOW_MANAGER,
-                KEY_RAW_SENSOR_LOGGING_ENABLED, false);
-    }
-
     void dump(PrintWriter pw) {
         pw.println("WINDOW MANAGER CONSTANTS (dumpsys window constants):");
 
@@ -182,8 +167,6 @@
         pw.print("="); pw.println(mSystemGestureExclusionLimitDp);
         pw.print("  "); pw.print(KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE);
         pw.print("="); pw.println(mSystemGestureExcludedByPreQStickyImmersive);
-        pw.print("  "); pw.print(KEY_RAW_SENSOR_LOGGING_ENABLED);
-        pw.print("="); pw.println(mRawSensorLoggingEnabled);
         pw.println();
     }
 }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 61fce88..9e8b6a3 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -451,8 +451,7 @@
 
     private static final int ANIMATION_COMPLETED_TIMEOUT_MS = 5000;
 
-    @VisibleForTesting
-    WindowManagerConstants mConstants;
+    final WindowManagerConstants mConstants;
 
     final WindowTracing mWindowTracing;
 
@@ -1543,13 +1542,20 @@
                     final IBinder binder = attrs.token != null ? attrs.token : windowContextToken;
                     final Bundle options = mWindowContextListenerController
                             .getOptions(windowContextToken);
-                    token = new WindowToken(this, binder, type, false /* persistOnEmpty */,
-                            displayContent, session.mCanAddInternalSystemWindow,
-                            isRoundedCornerOverlay, true /* fromClientToken */, options);
+                    token = new WindowToken.Builder(this, binder, type)
+                            .setDisplayContent(displayContent)
+                            .setOwnerCanManageAppTokens(session.mCanAddInternalSystemWindow)
+                            .setRoundedCornerOverlay(isRoundedCornerOverlay)
+                            .setFromClientToken(true)
+                            .setOptions(options)
+                            .build();
                 } else {
                     final IBinder binder = attrs.token != null ? attrs.token : client.asBinder();
-                    token = new WindowToken(this, binder, type, false, displayContent,
-                            session.mCanAddInternalSystemWindow, isRoundedCornerOverlay);
+                    token = new WindowToken.Builder(this, binder, type)
+                            .setDisplayContent(displayContent)
+                            .setOwnerCanManageAppTokens(session.mCanAddInternalSystemWindow)
+                            .setRoundedCornerOverlay(isRoundedCornerOverlay)
+                            .build();
                 }
             } else if (rootType >= FIRST_APPLICATION_WINDOW
                     && rootType <= LAST_APPLICATION_WINDOW) {
@@ -1620,8 +1626,10 @@
                 // It is not valid to use an app token with other system types; we will
                 // instead make a new token for it (as if null had been passed in for the token).
                 attrs.token = null;
-                token = new WindowToken(this, client.asBinder(), type, false /* persistOnEmpty */,
-                        displayContent, session.mCanAddInternalSystemWindow);
+                token = new WindowToken.Builder(this, client.asBinder(), type)
+                        .setDisplayContent(displayContent)
+                        .setOwnerCanManageAppTokens(session.mCanAddInternalSystemWindow)
+                        .build();
             }
 
             final WindowState win = new WindowState(this, session, client, token, parentWindow,
@@ -2510,7 +2518,8 @@
         } else if (win.isWinVisibleLw() && winAnimator.applyAnimationLocked(transit, false)) {
             focusMayChange = true;
             win.mAnimatingExit = true;
-        } else if (win.mDisplayContent.okToAnimate() && win.isAnimating(TRANSITION | PARENTS)) {
+        } else if (win.mDisplayContent.okToAnimate() && win.isAnimating(TRANSITION | PARENTS,
+                WindowState.EXIT_ANIMATING_TYPES)) {
             // Currently in a hide animation... turn this into
             // an exit.
             win.mAnimatingExit = true;
@@ -2647,9 +2656,12 @@
                 new WallpaperWindowToken(this, binder, true, dc,
                         true /* ownerCanManageAppTokens */, options);
             } else {
-                new WindowToken(this, binder, type, true /* persistOnEmpty */, dc,
-                        true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                        false /* fromClientToken */, options);
+                new WindowToken.Builder(this, binder, type)
+                        .setDisplayContent(dc)
+                        .setPersistOnEmpty(true)
+                        .setOwnerCanManageAppTokens(true)
+                        .setOptions(options)
+                        .build();
             }
         }
     }
@@ -3646,7 +3658,7 @@
 
             if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM, ">>> showEmulatorDisplayOverlay");
             if (mEmulatorDisplayOverlay == null) {
-                mEmulatorDisplayOverlay = new EmulatorDisplayOverlay(mSurfaceFactory, mContext,
+                mEmulatorDisplayOverlay = new EmulatorDisplayOverlay(mContext,
                         getDefaultDisplayContentLocked(),
                         mPolicy.getWindowLayerFromTypeLw(WindowManager.LayoutParams.TYPE_POINTER)
                                 * TYPE_LAYER_MULTIPLIER + 10, mTransaction);
@@ -3686,8 +3698,8 @@
             // b/31532461
             // TODO(multi-display): support multiple displays
             if (mStrictModeFlash == null) {
-                mStrictModeFlash = new StrictModeFlash(mSurfaceFactory,
-                        getDefaultDisplayContentLocked(), mTransaction);
+                mStrictModeFlash = new StrictModeFlash(getDefaultDisplayContentLocked(),
+                        mTransaction);
             }
             mStrictModeFlash.setVisibility(on, mTransaction);
             mTransaction.apply();
@@ -5541,11 +5553,6 @@
         mBlurController.unregisterCrossWindowBlurEnabledListener(listener);
     }
 
-    @Override
-    public void setForceCrossWindowBlurDisabled(boolean disable) {
-        mBlurController.setForceCrossWindowBlurDisabled(disable);
-    }
-
     // -------------------------------------------------------------
     // Internals
     // -------------------------------------------------------------
@@ -5882,8 +5889,8 @@
                 if (toks != null && toks.length > 0) {
                     // TODO(multi-display): Show watermarks on secondary displays.
                     final DisplayContent displayContent = getDefaultDisplayContentLocked();
-                    mWatermark = new Watermark(mSurfaceFactory, displayContent,
-                            displayContent.mRealDisplayMetrics, toks, mTransaction);
+                    mWatermark = new Watermark(displayContent, displayContent.mRealDisplayMetrics,
+                            toks, mTransaction);
                     mTransaction.apply();
                 }
             }
@@ -6285,7 +6292,7 @@
             }
         });
         pw.print("  mInTouchMode="); pw.println(mInTouchMode);
-        pw.print("  mBlurEnabled="); pw.println(mBlurController.mBlurEnabled);
+        pw.print("  mBlurEnabled="); pw.println(mBlurController.getBlurEnabled());
         pw.print("  mLastDisplayFreezeDuration=");
                 TimeUtils.formatDuration(mLastDisplayFreezeDuration, pw);
                 if ( mLastFinishedFreezeSource != null) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
index 1b578d1..4dc6007 100644
--- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
+++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
@@ -31,6 +31,7 @@
 import android.os.RemoteException;
 import android.os.ShellCommand;
 import android.os.UserHandle;
+import android.provider.Settings;
 import android.util.DisplayMetrics;
 import android.util.Pair;
 import android.view.Display;
@@ -216,7 +217,7 @@
         String arg = getNextArg();
         if (arg == null) {
             pw.println("Blur supported on device: " + CROSS_WINDOW_BLUR_SUPPORTED);
-            pw.println("Blur enabled: " + mInternal.mBlurController.mBlurEnabled);
+            pw.println("Blur enabled: " + mInternal.mBlurController.getBlurEnabled());
             return 0;
         }
 
@@ -235,7 +236,9 @@
                 return -1;
         }
 
-        mInterface.setForceCrossWindowBlurDisabled(disableBlur);
+        Settings.Global.putInt(mInternal.mContext.getContentResolver(),
+                Settings.Global.DISABLE_WINDOW_BLURS, disableBlur ? 1 : 0);
+
         return 0;
     }
 
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 9382b8e..c29211f 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -22,6 +22,7 @@
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REPARENT;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS;
+import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT;
 import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT;
 
 import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
@@ -320,6 +321,26 @@
                             }
                             break;
                         }
+                        case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT: {
+                            final WindowContainer wc = WindowContainer.fromBinder(
+                                    hop.getContainer());
+                            final Task task = wc != null ? wc.asTask() : null;
+                            if (task == null) {
+                                throw new IllegalArgumentException("Cannot set "
+                                        + "non-task as launch root: " + wc);
+                            } else if (!task.mCreatedByOrganizer) {
+                                throw new UnsupportedOperationException("Cannot set "
+                                        + "non-organized task as adjacent flag root: " + wc);
+                            } else if (task.mAdjacentTask == null) {
+                                throw new UnsupportedOperationException("Cannot set "
+                                        + "non-adjacent task as adjacent flag root: " + wc);
+                            }
+
+                            final boolean clearRoot = hop.getToTop();
+                            task.getDisplayArea()
+                                    .setLaunchAdjacentFlagRootTask(clearRoot ? null : task);
+                            break;
+                        }
                         case HIERARCHY_OP_TYPE_CHILDREN_TASKS_REPARENT:
                             effects |= reparentChildrenTasksHierarchyOp(hop, transition, syncId);
                             break;
@@ -491,7 +512,7 @@
 
         Rect enterPipBounds = c.getEnterPipBounds();
         if (enterPipBounds != null) {
-            mService.mTaskSupervisor.updatePictureInPictureMode(tr, enterPipBounds, true);
+            tr.mDisplayContent.mPinnedTaskController.setEnterPipBounds(enterPipBounds);
         }
 
         return effects;
diff --git a/services/core/java/com/android/server/wm/WindowOrientationListener.java b/services/core/java/com/android/server/wm/WindowOrientationListener.java
index be6847a..3e099fb 100644
--- a/services/core/java/com/android/server/wm/WindowOrientationListener.java
+++ b/services/core/java/com/android/server/wm/WindowOrientationListener.java
@@ -85,7 +85,6 @@
 
     private int mCurrentRotation = -1;
     private final Context mContext;
-    private final WindowManagerConstants mConstants;
 
     private final Object mLock = new Object();
 
@@ -94,11 +93,9 @@
      *
      * @param context for the WindowOrientationListener.
      * @param handler Provides the Looper for receiving sensor updates.
-     * @param wmService WindowManagerService to read the device config from.
      */
-    public WindowOrientationListener(
-            Context context, Handler handler, WindowManagerService wmService) {
-        this(context, handler, wmService, SensorManager.SENSOR_DELAY_UI);
+    public WindowOrientationListener(Context context, Handler handler) {
+        this(context, handler, SensorManager.SENSOR_DELAY_UI);
     }
 
     /**
@@ -115,10 +112,9 @@
      * This constructor is private since no one uses it.
      */
     private WindowOrientationListener(
-            Context context, Handler handler, WindowManagerService wmService, int rate) {
+            Context context, Handler handler, int rate) {
         mContext = context;
         mHandler = handler;
-        mConstants = wmService.mConstants;
         mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
         mRate = rate;
         List<Sensor> l = mSensorManager.getSensorList(Sensor.TYPE_DEVICE_ORIENTATION);
@@ -1134,16 +1130,11 @@
                 return;
             }
 
-            // Log raw sensor rotation.
-            if (evaluateRotationChangeLocked() >= 0) {
-                if (mConstants.mRawSensorLoggingEnabled) {
-                    FrameworkStatsLog.write(
-                            FrameworkStatsLog.DEVICE_ROTATED,
-                            event.timestamp,
-                            rotationToLogEnum(reportedRotation),
-                            FrameworkStatsLog.DEVICE_ROTATED__ROTATION_EVENT_TYPE__ACTUAL_EVENT);
-                }
-            }
+            FrameworkStatsLog.write(
+                    FrameworkStatsLog.DEVICE_ROTATED,
+                    event.timestamp,
+                    rotationToLogEnum(reportedRotation),
+                    FrameworkStatsLog.DEVICE_ROTATED__ROTATION_EVENT_TYPE__ACTUAL_EVENT);
 
             if (isRotationResolverEnabled()) {
                 if (mRotationResolverService == null) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 1a5042f..2e8d4cd 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -132,6 +132,7 @@
 import static com.android.server.wm.MoveAnimationSpecProto.TO;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
+import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
 import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
 import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
@@ -517,6 +518,13 @@
      */
     boolean mSurfacePlacementNeeded;
 
+    /**
+     * The animation types that will call {@link #onExitAnimationDone} so {@link #mAnimatingExit}
+     * is guaranteed to be cleared.
+     */
+    static final int EXIT_ANIMATING_TYPES = ANIMATION_TYPE_APP_TRANSITION
+            | ANIMATION_TYPE_WINDOW_ANIMATION | ANIMATION_TYPE_RECENTS;
+
     /** Currently running an exit animation? */
     boolean mAnimatingExit;
 
@@ -898,6 +906,12 @@
             // The transform of its surface is handled by fixed rotation.
             return;
         }
+        final Task task = getTask();
+        if (task != null && task.inPinnedWindowingMode()) {
+            // It is handled by PinnedTaskController. Note that the windowing mode of activity
+            // and windows may still be fullscreen.
+            return;
+        }
 
         if (mPendingSeamlessRotate != null) {
             oldRotation = mPendingSeamlessRotate.getOldRotation();
@@ -1251,7 +1265,7 @@
         mHaveFrame = true;
 
         final Task task = getTask();
-        final boolean isFullscreenAndFillsDisplay = !inMultiWindowMode() && matchesDisplayBounds();
+        final boolean isFullscreenAndFillsArea = !inMultiWindowMode() && matchesDisplayAreaBounds();
         final boolean windowsAreFloating = task != null && task.isFloating();
         final DisplayContent dc = getDisplayContent();
         final DisplayInfo displayInfo = getDisplayInfo();
@@ -1276,7 +1290,7 @@
                 : isImeLayeringTarget();
         final boolean isImeTarget =
                 imeWin != null && imeWin.isVisibleNow() && isInputMethodAdjustTarget;
-        if (isFullscreenAndFillsDisplay || layoutInParentFrame()) {
+        if (isFullscreenAndFillsArea || layoutInParentFrame()) {
             // We use the parent frame as the containing frame for fullscreen and child windows
             windowFrames.mContainingFrame.set(windowFrames.mParentFrame);
             layoutDisplayFrame = windowFrames.mDisplayFrame;
@@ -2258,19 +2272,15 @@
                 && mWindowFrames.mFrame.bottom >= displayInfo.appHeight;
     }
 
-    private boolean matchesDisplayBounds() {
-        final Rect displayBounds = mToken.getFixedRotationTransformDisplayBounds();
-        if (displayBounds != null) {
-            // If the rotated display bounds are available, the window bounds are also rotated.
-            return displayBounds.equals(getBounds());
-        }
-        return getDisplayContent().getBounds().equals(getBounds());
-    }
-
     boolean matchesDisplayAreaBounds() {
+        final Rect rotatedDisplayBounds = mToken.getFixedRotationTransformDisplayBounds();
+        if (rotatedDisplayBounds != null) {
+            // If the rotated display bounds are available, the window bounds are also rotated.
+            return rotatedDisplayBounds.equals(getBounds());
+        }
         final DisplayArea displayArea = getDisplayArea();
         if (displayArea == null) {
-            return matchesDisplayBounds();
+            return getDisplayContent().getBounds().equals(getBounds());
         }
         return displayArea.getBounds().equals(getBounds());
     }
@@ -2284,6 +2294,27 @@
     }
 
     @Override
+    public void onConfigurationChanged(Configuration newParentConfig) {
+        if (getDisplayContent().getImeTarget(IME_TARGET_INPUT) != this && !isImeLayeringTarget()) {
+            super.onConfigurationChanged(newParentConfig);
+            return;
+        }
+
+        mTempConfiguration.setTo(getConfiguration());
+        super.onConfigurationChanged(newParentConfig);
+        final boolean windowConfigChanged = mTempConfiguration.windowConfiguration
+                .diff(newParentConfig.windowConfiguration, false) != 0;
+
+        // When the window configuration changed, we need to update the IME control target in
+        // case the app may lose the IME inets control when exiting from split-screen mode, or the
+        // IME parent may failed to attach to the app during rotating the screen.
+        // See DisplayContent#isImeAttachedToApp, DisplayContent#isImeControlledByApp
+        if (windowConfigChanged) {
+            getDisplayContent().updateImeControlTarget();
+        }
+    }
+
+    @Override
     void onMergedOverrideConfigurationChanged() {
         super.onMergedOverrideConfigurationChanged();
         mLastConfigReportedToClient = false;
@@ -2456,8 +2487,8 @@
                         mWmService.mAccessibilityController.onWindowTransition(this, transit);
                     }
                 }
-                final boolean isAnimating = mAnimatingExit || isAnimating(TRANSITION | PARENTS,
-                        ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_WINDOW_ANIMATION)
+                final boolean isAnimating = mAnimatingExit
+                        || isAnimating(TRANSITION | PARENTS, EXIT_ANIMATING_TYPES)
                         && (mActivityRecord == null || !mActivityRecord.isWaitingForTransitionStart());
                 final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null
                         && mActivityRecord.isLastWindow(this);
@@ -4001,10 +4032,6 @@
         return mActivityRecord == null || mActivityRecord.isFullyTransparentBarAllowed(frame);
     }
 
-    public boolean isLetterboxedOverlappingWith(Rect rect) {
-        return mActivityRecord != null && mActivityRecord.isLetterboxOverlappingWith(rect);
-    }
-
     boolean isDragResizeChanged() {
         return mDragResizing != computeDragResizing();
     }
@@ -5344,7 +5371,8 @@
     }
 
     private boolean shouldDrawBlurBehind() {
-        return (mAttrs.flags & FLAG_BLUR_BEHIND) != 0 && mWmService.mBlurController.mBlurEnabled;
+        return (mAttrs.flags & FLAG_BLUR_BEHIND) != 0
+            && mWmService.mBlurController.getBlurEnabled();
     }
 
     /**
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index ef39560..fbfa400 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -53,6 +53,7 @@
 import android.view.InsetsState;
 import android.view.SurfaceControl;
 import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams.WindowType;
 import android.window.WindowContext;
 
 import com.android.internal.protolog.common.ProtoLog;
@@ -70,10 +71,10 @@
 class WindowToken extends WindowContainer<WindowState> {
     private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowToken" : TAG_WM;
 
-    // The actual token.
+    /** The actual token */
     final IBinder token;
 
-    // The type of window this token is for, as per WindowManager.LayoutParams.
+    /** The type of window this token is for, as per {@link WindowManager.LayoutParams} */
     final int windowType;
 
     /**
@@ -86,8 +87,10 @@
     /** {@code true} if this holds the rounded corner overlay */
     final boolean mRoundedCornerOverlay;
 
-    // Set if this token was explicitly added by a client, so should
-    // persist (not be removed) when all windows are removed.
+    /**
+     * Set if this token was explicitly added by a client, so should persist (not be removed)
+     * when all windows are removed.
+     */
     boolean mPersistOnEmpty;
 
     // For printing.
@@ -198,21 +201,15 @@
         return isFirstChildWindowGreaterThanSecond(newWindow, existingWindow) ? 1 : -1;
     };
 
-    WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty,
-            DisplayContent dc, boolean ownerCanManageAppTokens) {
+    protected WindowToken(WindowManagerService service, IBinder _token, int type,
+            boolean persistOnEmpty, DisplayContent dc, boolean ownerCanManageAppTokens) {
         this(service, _token, type, persistOnEmpty, dc, ownerCanManageAppTokens,
-                false /* roundedCornerOverlay */);
+                false /* roundedCornerOverlay */, false /* fromClientToken */, null /* options */);
     }
 
-    WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty,
-            DisplayContent dc, boolean ownerCanManageAppTokens, boolean roundedCornerOverlay) {
-        this(service, _token, type, persistOnEmpty, dc, ownerCanManageAppTokens,
-                roundedCornerOverlay, false /* fromClientToken */, null /* options */);
-    }
-
-    WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty,
-            DisplayContent dc, boolean ownerCanManageAppTokens, boolean roundedCornerOverlay,
-            boolean fromClientToken, @Nullable Bundle options) {
+    protected WindowToken(WindowManagerService service, IBinder _token, int type,
+            boolean persistOnEmpty, DisplayContent dc, boolean ownerCanManageAppTokens,
+            boolean roundedCornerOverlay, boolean fromClientToken, @Nullable Bundle options) {
         super(service);
         token = _token;
         windowType = type;
@@ -770,7 +767,69 @@
     }
 
     @Override
-    @WindowManager.LayoutParams.WindowType int getWindowType() {
+    @WindowType int getWindowType() {
         return windowType;
     }
+
+    static class Builder {
+        private final WindowManagerService mService;
+        private final IBinder mToken;
+        @WindowType
+        private final int mType;
+
+        private boolean mPersistOnEmpty;
+        private DisplayContent mDisplayContent;
+        private boolean mOwnerCanManageAppTokens;
+        private boolean mRoundedCornerOverlay;
+        private boolean mFromClientToken;
+        @Nullable
+        private Bundle mOptions;
+
+        Builder(WindowManagerService service, IBinder token, int type) {
+            mService = service;
+            mToken = token;
+            mType = type;
+        }
+
+        /** @see WindowToken#mPersistOnEmpty */
+        Builder setPersistOnEmpty(boolean persistOnEmpty) {
+            mPersistOnEmpty = persistOnEmpty;
+            return this;
+        }
+
+        /** Sets the {@link DisplayContent} to be associated. */
+        Builder setDisplayContent(DisplayContent dc) {
+            mDisplayContent = dc;
+            return this;
+        }
+
+        /** @see WindowToken#mOwnerCanManageAppTokens */
+        Builder setOwnerCanManageAppTokens(boolean ownerCanManageAppTokens) {
+            mOwnerCanManageAppTokens = ownerCanManageAppTokens;
+            return this;
+        }
+
+        /** @see WindowToken#mRoundedCornerOverlay */
+        Builder setRoundedCornerOverlay(boolean roundedCornerOverlay) {
+            mRoundedCornerOverlay = roundedCornerOverlay;
+            return this;
+        }
+
+        /** @see WindowToken#mFromClientToken */
+        Builder setFromClientToken(boolean fromClientToken) {
+            mFromClientToken = fromClientToken;
+            return this;
+        }
+
+        /** @see WindowToken#mOptions */
+        Builder setOptions(Bundle options) {
+            mOptions = options;
+            return this;
+        }
+
+        WindowToken build() {
+            return new WindowToken(mService, mToken, mType, mPersistOnEmpty, mDisplayContent,
+                    mOwnerCanManageAppTokens, mRoundedCornerOverlay, mFromClientToken, mOptions);
+        }
+    }
 }
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 74fbb42..4ce9591 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -34,6 +34,7 @@
         "gnss/GnssMeasurement.cpp",
         "gnss/GnssMeasurementCallback.cpp",
         "gnss/Utils.cpp",
+        "stats/SurfaceFlingerPuller.cpp",
         "com_android_server_adb_AdbDebuggingManager.cpp",
         "com_android_server_am_BatteryStatsService.cpp",
         "com_android_server_biometrics_SurfaceToNativeHandleConverter.cpp",
@@ -53,6 +54,7 @@
         "com_android_server_SerialService.cpp",
         "com_android_server_soundtrigger_middleware_AudioSessionProviderImpl.cpp",
         "com_android_server_soundtrigger_middleware_ExternalCaptureStateTracker.cpp",
+        "com_android_server_stats_pull_StatsPullAtomService.cpp",
         "com_android_server_storage_AppFuseBridge.cpp",
         "com_android_server_SystemServer.cpp",
         "com_android_server_tv_TvUinputBridge.cpp",
@@ -127,6 +129,7 @@
         "libsensorservice",
         "libsensorservicehidl",
         "libgui",
+        "libtimestats_atoms_proto",
         "libusbhost",
         "libtinyalsa",
         "libEGL",
diff --git a/services/core/jni/OWNERS b/services/core/jni/OWNERS
index d076434..51bc99a 100644
--- a/services/core/jni/OWNERS
+++ b/services/core/jni/OWNERS
@@ -27,3 +27,4 @@
 per-file com_android_server_security_* = file:/core/java/android/security/OWNERS
 per-file com_android_server_tv_* = file:/media/java/android/media/tv/OWNERS
 per-file com_android_server_vibrator_* = file:/services/core/java/com/android/server/vibrator/OWNERS
+per-file com_android_server_am_CachedAppOptimizer.cpp = timmurray@google.com, edgararriaga@google.com, dualli@google.com, carmenjackson@google.com, philipcuadra@google.com
\ No newline at end of file
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 3ee2b8d..cca62b9 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -118,6 +118,7 @@
     jmethodID getVirtualKeyQuietTimeMillis;
     jmethodID getExcludedDeviceNames;
     jmethodID getInputPortAssociations;
+    jmethodID getInputUniqueIdAssociations;
     jmethodID getKeyRepeatTimeout;
     jmethodID getKeyRepeatDelay;
     jmethodID getHoverTapTimeout;
@@ -579,6 +580,21 @@
         }
         env->DeleteLocalRef(portAssociations);
     }
+    outConfig->uniqueIdAssociations.clear();
+    jobjectArray uniqueIdAssociations = jobjectArray(
+            env->CallObjectMethod(mServiceObj, gServiceClassInfo.getInputUniqueIdAssociations));
+    if (!checkAndClearExceptionFromCallback(env, "getInputUniqueIdAssociations") &&
+        uniqueIdAssociations) {
+        jsize length = env->GetArrayLength(uniqueIdAssociations);
+        for (jsize i = 0; i < length / 2; i++) {
+            std::string inputDeviceUniqueId =
+                    getStringElementFromJavaArray(env, uniqueIdAssociations, 2 * i);
+            std::string displayUniqueId =
+                    getStringElementFromJavaArray(env, uniqueIdAssociations, 2 * i + 1);
+            outConfig->uniqueIdAssociations.insert({inputDeviceUniqueId, displayUniqueId});
+        }
+        env->DeleteLocalRef(uniqueIdAssociations);
+    }
 
     jint hoverTapTimeout = env->CallIntMethod(mServiceObj,
             gServiceClassInfo.getHoverTapTimeout);
@@ -2134,6 +2150,12 @@
             InputReaderConfiguration::CHANGE_DISPLAY_INFO);
 }
 
+static void nativeChangeUniqueIdAssociation(JNIEnv* env, jclass /* clazz */, jlong ptr) {
+    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
+    im->getInputManager()->getReader()->requestRefreshConfiguration(
+            InputReaderConfiguration::CHANGE_DISPLAY_INFO);
+}
+
 static void nativeSetMotionClassifierEnabled(JNIEnv* /* env */, jclass /* clazz */, jlong ptr,
                                              jboolean enabled) {
     NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
@@ -2316,6 +2338,7 @@
          (void*)nativeSetCustomPointerIcon},
         {"nativeCanDispatchToDisplay", "(JII)Z", (void*)nativeCanDispatchToDisplay},
         {"nativeNotifyPortAssociationsChanged", "(J)V", (void*)nativeNotifyPortAssociationsChanged},
+        {"nativeChangeUniqueIdAssociation", "(J)V", (void*)nativeChangeUniqueIdAssociation},
         {"nativeSetMotionClassifierEnabled", "(JZ)V", (void*)nativeSetMotionClassifierEnabled},
         {"nativeGetSensorList", "(JI)[Landroid/hardware/input/InputSensorInfo;",
          (void*)nativeGetSensorList},
@@ -2425,6 +2448,9 @@
     GET_METHOD_ID(gServiceClassInfo.getInputPortAssociations, clazz,
             "getInputPortAssociations", "()[Ljava/lang/String;");
 
+    GET_METHOD_ID(gServiceClassInfo.getInputUniqueIdAssociations, clazz,
+                  "getInputUniqueIdAssociations", "()[Ljava/lang/String;");
+
     GET_METHOD_ID(gServiceClassInfo.getKeyRepeatTimeout, clazz,
             "getKeyRepeatTimeout", "()I");
 
diff --git a/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp b/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp
new file mode 100644
index 0000000..46fe595
--- /dev/null
+++ b/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "StatsPullAtomService"
+
+#include <jni.h>
+#include <log/log.h>
+#include <nativehelper/JNIHelp.h>
+#include <stats_event.h>
+#include <stats_pull_atom_callback.h>
+#include <statslog.h>
+
+#include "stats/SurfaceFlingerPuller.h"
+
+namespace android {
+
+static server::stats::SurfaceFlingerPuller gSurfaceFlingerPuller;
+
+static AStatsManager_PullAtomCallbackReturn onSurfaceFlingerPullCallback(int32_t atom_tag,
+                                                                         AStatsEventList* data,
+                                                                         void* cookie) {
+    return gSurfaceFlingerPuller.pull(atom_tag, data);
+}
+
+static void initializeNativePullers(JNIEnv* env, jobject javaObject) {
+    // Surface flinger layer & global info.
+    gSurfaceFlingerPuller = server::stats::SurfaceFlingerPuller();
+    AStatsManager_setPullAtomCallback(android::util::SURFACEFLINGER_STATS_GLOBAL_INFO,
+                                      /* metadata= */ nullptr, onSurfaceFlingerPullCallback,
+                                      /* cookie= */ nullptr);
+    AStatsManager_setPullAtomCallback(android::util::SURFACEFLINGER_STATS_LAYER_INFO,
+                                      /* metadata= */ nullptr, onSurfaceFlingerPullCallback,
+                                      /* cookie= */ nullptr);
+}
+
+static const JNINativeMethod sMethods[] = {
+        {"initializeNativePullers", "()V", (void*)initializeNativePullers}};
+
+int register_android_server_stats_pull_StatsPullAtomService(JNIEnv* env) {
+    int res = jniRegisterNativeMethods(env, "com/android/server/stats/pull/StatsPullAtomService",
+                                       sMethods, NELEM(sMethods));
+    if (res < 0) {
+        ALOGE("failed to register native methods");
+    }
+    return res;
+}
+
+} // namespace android
\ No newline at end of file
diff --git a/services/core/jni/com_android_server_vibrator_VibratorController.cpp b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
index b7fa796..698e3f7 100644
--- a/services/core/jni/com_android_server_vibrator_VibratorController.cpp
+++ b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
@@ -370,6 +370,7 @@
     jintArray supportedEffects = nullptr;
     jintArray supportedBraking = nullptr;
     jintArray supportedPrimitives = nullptr;
+    jintArray primitiveDurations = nullptr;
     jfloatArray maxAmplitudes = nullptr;
 
     if (info.supportedEffects.isOk()) {
@@ -390,6 +391,15 @@
         env->SetIntArrayRegion(supportedPrimitives, 0, primitives.size(),
                                reinterpret_cast<jint*>(primitives.data()));
     }
+    if (info.primitiveDurations.isOk()) {
+        std::vector<int32_t> durations;
+        for (auto duration : info.primitiveDurations.value()) {
+            durations.push_back(duration.count());
+        }
+        primitiveDurations = env->NewIntArray(durations.size());
+        env->SetIntArrayRegion(primitiveDurations, 0, durations.size(),
+                               reinterpret_cast<jint*>(durations.data()));
+    }
     if (info.maxAmplitudes.isOk()) {
         std::vector<float> amplitudes = info.maxAmplitudes.value();
         maxAmplitudes = env->NewFloatArray(amplitudes.size());
@@ -403,7 +413,7 @@
 
     return env->NewObject(sVibratorInfoClass, sVibratorInfoCtor, wrapper->getVibratorId(),
                           capabilities, supportedEffects, supportedBraking, supportedPrimitives,
-                          qFactor, frequencyMapping);
+                          primitiveDurations, qFactor, frequencyMapping);
 }
 
 static const JNINativeMethod method_table[] = {
@@ -450,9 +460,10 @@
     sFrequencyMappingCtor = GetMethodIDOrDie(env, sFrequencyMappingClass, "<init>", "(FFFF[F)V");
 
     jclass vibratorInfoClass = FindClassOrDie(env, "android/os/VibratorInfo");
-    sVibratorInfoClass = static_cast<jclass>(env->NewGlobalRef(vibratorInfoClass));
-    sVibratorInfoCtor = GetMethodIDOrDie(env, sVibratorInfoClass, "<init>",
-                                         "(IJ[I[I[IFLandroid/os/VibratorInfo$FrequencyMapping;)V");
+    sVibratorInfoClass = (jclass)env->NewGlobalRef(vibratorInfoClass);
+    sVibratorInfoCtor =
+            GetMethodIDOrDie(env, sVibratorInfoClass, "<init>",
+                             "(IJ[I[I[I[IFLandroid/os/VibratorInfo$FrequencyMapping;)V");
 
     return jniRegisterNativeMethods(env,
                                     "com/android/server/vibrator/VibratorController$NativeWrapper",
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index f257686..b043e64 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -61,6 +61,7 @@
 int register_android_server_AdbDebuggingManager(JNIEnv* env);
 int register_android_server_FaceService(JNIEnv* env);
 int register_android_server_GpuService(JNIEnv* env);
+int register_android_server_stats_pull_StatsPullAtomService(JNIEnv* env);
 };
 
 using namespace android;
@@ -115,5 +116,6 @@
     register_android_server_AdbDebuggingManager(env);
     register_android_server_FaceService(env);
     register_android_server_GpuService(env);
+    register_android_server_stats_pull_StatsPullAtomService(env);
     return JNI_VERSION_1_4;
 }
diff --git a/services/core/jni/stats/OWNERS b/services/core/jni/stats/OWNERS
new file mode 100644
index 0000000..2611e5b
--- /dev/null
+++ b/services/core/jni/stats/OWNERS
@@ -0,0 +1,8 @@
+jeffreyhuang@google.com
+jtnguyen@google.com
+muhammadq@google.com
+sharaieko@google.com
+singhtejinder@google.com
+tsaichristine@google.com
+yaochen@google.com
+yro@google.com
diff --git a/services/core/jni/stats/SurfaceFlingerPuller.cpp b/services/core/jni/stats/SurfaceFlingerPuller.cpp
new file mode 100644
index 0000000..0e28da7
--- /dev/null
+++ b/services/core/jni/stats/SurfaceFlingerPuller.cpp
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "SurfaceFlingerPuller"
+
+#include "SurfaceFlingerPuller.h"
+
+#include <gui/SurfaceComposerClient.h>
+#include <log/log.h>
+#include <statslog.h>
+#include <timestatsatomsproto/TimeStatsAtomsProtoHeader.h>
+
+#include <vector>
+
+namespace android {
+namespace server {
+namespace stats {
+
+using android::util::BytesField;
+using std::optional;
+
+namespace {
+optional<BytesField> getBytes(const google::protobuf::MessageLite& proto, std::string& data) {
+    if (!proto.SerializeToString(&data)) {
+        ALOGW("Unable to serialize surface flinger bytes field");
+        return std::nullopt;
+    }
+    return {BytesField(data.data(), data.size())};
+}
+} // namespace
+
+AStatsManager_PullAtomCallbackReturn SurfaceFlingerPuller::pull(int32_t atomTag,
+                                                                AStatsEventList* data) {
+    // Don't need mutexes here, since there is no global state.
+    // SurfaceComposerClient is thread safe, and surfaceflinger is internally thread safe.
+
+    bool success = false;
+    std::string pullDataProto;
+    status_t err = SurfaceComposerClient::onPullAtom(atomTag, &pullDataProto, &success);
+    if (!success || err != NO_ERROR) {
+        ALOGW("Failed to pull atom %" PRId32
+              " from surfaceflinger. Success is %d, binder status is %s",
+              atomTag, (int)success, binder::Status::exceptionToString(err).c_str());
+        return AStatsManager_PULL_SKIP;
+    }
+
+    switch (atomTag) {
+        case android::util::SURFACEFLINGER_STATS_GLOBAL_INFO:
+            return parseGlobalInfoPull(pullDataProto, data);
+        case android::util::SURFACEFLINGER_STATS_LAYER_INFO:
+            return parseLayerInfoPull(pullDataProto, data);
+        default:
+            ALOGW("Invalid atom id for surfaceflinger pullers: %" PRId32, atomTag);
+            return AStatsManager_PULL_SKIP;
+    }
+}
+
+AStatsManager_PullAtomCallbackReturn SurfaceFlingerPuller::parseGlobalInfoPull(
+        const std::string& protoData, AStatsEventList* data) {
+    android::surfaceflinger::SurfaceflingerStatsGlobalInfoWrapper atomList;
+    if (!atomList.ParseFromString(protoData)) {
+        ALOGW("Error parsing surface flinger global stats to proto");
+        return AStatsManager_PULL_SKIP;
+    }
+
+    for (const auto& atom : atomList.atom()) {
+        // The strings must outlive the BytesFields, which only have a pointer to the data.
+        std::string frameDurationStr, renderEngineTimeStr, deadlineMissesStr, predictionErrorsStr;
+        optional<BytesField> frameDuration = getBytes(atom.frame_duration(), frameDurationStr);
+        optional<BytesField> renderEngineTime =
+                getBytes(atom.render_engine_timing(), renderEngineTimeStr);
+        optional<BytesField> deadlineMisses =
+                getBytes(atom.sf_deadline_misses(), deadlineMissesStr);
+        optional<BytesField> predictionErrors =
+                getBytes(atom.sf_prediction_errors(), predictionErrorsStr);
+
+        // Fail if any serialization to bytes failed.
+        if (!frameDuration || !renderEngineTime || !deadlineMisses || !predictionErrors) {
+            return AStatsManager_PULL_SKIP;
+        }
+
+        android::util::addAStatsEvent(data, android::util::SURFACEFLINGER_STATS_GLOBAL_INFO,
+                                      atom.total_frames(), atom.missed_frames(),
+                                      atom.client_composition_frames(), atom.display_on_millis(),
+                                      atom.animation_millis(), atom.event_connection_count(),
+                                      frameDuration.value(), renderEngineTime.value(),
+                                      atom.total_timeline_frames(), atom.total_janky_frames(),
+                                      atom.total_janky_frames_with_long_cpu(),
+                                      atom.total_janky_frames_with_long_gpu(),
+                                      atom.total_janky_frames_sf_unattributed(),
+                                      atom.total_janky_frames_app_unattributed(),
+                                      atom.total_janky_frames_sf_scheduling(),
+                                      atom.total_jank_frames_sf_prediction_error(),
+                                      atom.total_jank_frames_app_buffer_stuffing(),
+                                      atom.display_refresh_rate_bucket(), deadlineMisses.value(),
+                                      predictionErrors.value(), atom.render_rate_bucket());
+    }
+    return AStatsManager_PULL_SUCCESS;
+}
+
+AStatsManager_PullAtomCallbackReturn SurfaceFlingerPuller::parseLayerInfoPull(
+        const std::string& protoData, AStatsEventList* data) {
+    android::surfaceflinger::SurfaceflingerStatsLayerInfoWrapper atomList;
+    if (!atomList.ParseFromString(protoData)) {
+        ALOGW("Error parsing surface flinger layer stats to proto");
+        return AStatsManager_PULL_SKIP;
+    }
+
+    for (const auto& atom : atomList.atom()) {
+        // The strings must outlive the BytesFields, which only have a pointer to the data.
+        std::string present2PresentStr, post2presentStr, acquire2PresentStr, latch2PresentStr,
+                desired2PresentStr, post2AcquireStr, frameRateVoteStr, appDeadlineMissesStr;
+        optional<BytesField> present2Present =
+                getBytes(atom.present_to_present(), present2PresentStr);
+        optional<BytesField> post2present = getBytes(atom.post_to_present(), post2presentStr);
+        optional<BytesField> acquire2Present =
+                getBytes(atom.acquire_to_present(), acquire2PresentStr);
+        optional<BytesField> latch2Present = getBytes(atom.latch_to_present(), latch2PresentStr);
+        optional<BytesField> desired2Present =
+                getBytes(atom.desired_to_present(), desired2PresentStr);
+        optional<BytesField> post2Acquire = getBytes(atom.post_to_acquire(), post2AcquireStr);
+        optional<BytesField> frameRateVote = getBytes(atom.set_frame_rate_vote(), frameRateVoteStr);
+        optional<BytesField> appDeadlineMisses =
+                getBytes(atom.app_deadline_misses(), appDeadlineMissesStr);
+
+        // Fail if any serialization to bytes failed.
+        if (!present2Present || !post2present || !acquire2Present || !latch2Present ||
+            !desired2Present || !post2Acquire || !frameRateVote || !appDeadlineMisses) {
+            return AStatsManager_PULL_SKIP;
+        }
+
+        android::util::addAStatsEvent(data, android::util::SURFACEFLINGER_STATS_LAYER_INFO,
+                                      atom.layer_name().c_str(), atom.total_frames(),
+                                      atom.dropped_frames(), present2Present.value(),
+                                      post2present.value(), acquire2Present.value(),
+                                      latch2Present.value(), desired2Present.value(),
+                                      post2Acquire.value(), atom.late_acquire_frames(),
+                                      atom.bad_desired_present_frames(), atom.uid(),
+                                      atom.total_timeline_frames(), atom.total_janky_frames(),
+                                      atom.total_janky_frames_with_long_cpu(),
+                                      atom.total_janky_frames_with_long_gpu(),
+                                      atom.total_janky_frames_sf_unattributed(),
+                                      atom.total_janky_frames_app_unattributed(),
+                                      atom.total_janky_frames_sf_scheduling(),
+                                      atom.total_jank_frames_sf_prediction_error(),
+                                      atom.total_jank_frames_app_buffer_stuffing(),
+                                      atom.display_refresh_rate_bucket(), atom.render_rate_bucket(),
+                                      frameRateVote.value(), appDeadlineMisses.value());
+    }
+    return AStatsManager_PULL_SUCCESS;
+}
+
+} // namespace stats
+} // namespace server
+} // namespace android
diff --git a/services/core/jni/stats/SurfaceFlingerPuller.h b/services/core/jni/stats/SurfaceFlingerPuller.h
new file mode 100644
index 0000000..301af1d
--- /dev/null
+++ b/services/core/jni/stats/SurfaceFlingerPuller.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <stats_event.h>
+#include <stats_pull_atom_callback.h>
+#include <utils/String16.h>
+
+namespace android {
+namespace server {
+namespace stats {
+
+/**
+ * Pulls data from surfaceflinger.
+ * The indirection is needed because surfaceflinger is a bootstrap process.
+ */
+class SurfaceFlingerPuller {
+public:
+    AStatsManager_PullAtomCallbackReturn pull(int32_t atomTag, AStatsEventList* data);
+
+private:
+    AStatsManager_PullAtomCallbackReturn parseGlobalInfoPull(const std::string& protoData,
+                                                             AStatsEventList* data);
+    AStatsManager_PullAtomCallbackReturn parseLayerInfoPull(const std::string& protoData,
+                                                            AStatsEventList* data);
+};
+
+} // namespace stats
+} // namespace server
+} // namespace android
\ No newline at end of file
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index e4b9612..01834dd 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -48,6 +48,9 @@
                 <xs:element type="nonNegativeDecimal" name="screenBrightnessRampSlowIncrease">
                     <xs:annotation name="final"/>
                 </xs:element>
+                <xs:element type="sensorDetails" name="lightSensor">
+                    <xs:annotation name="final"/>
+                </xs:element>
             </xs:sequence>
         </xs:complexType>
     </xs:element>
@@ -119,4 +122,18 @@
             <xs:minInclusive value="0.0"/>
         </xs:restriction>
     </xs:simpleType>
+
+    <xs:complexType name="sensorDetails">
+        <xs:sequence>
+            <xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1">
+                <xs:annotation name="nullable" />
+                <xs:annotation name="final"/>
+            </xs:element>
+            <xs:element type="xs:string" name="name" minOccurs="0" maxOccurs="1">
+                <xs:annotation name="nullable" />
+                <xs:annotation name="final"/>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
 </xs:schema>
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index eb3f1b7..a848f82 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -4,6 +4,7 @@
   public class DisplayConfiguration {
     ctor public DisplayConfiguration();
     method public com.android.server.display.config.HighBrightnessMode getHighBrightnessMode();
+    method public final com.android.server.display.config.SensorDetails getLightSensor();
     method public com.android.server.display.config.DisplayQuirks getQuirks();
     method @NonNull public final java.math.BigDecimal getScreenBrightnessDefault();
     method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap();
@@ -12,6 +13,7 @@
     method public final java.math.BigDecimal getScreenBrightnessRampSlowDecrease();
     method public final java.math.BigDecimal getScreenBrightnessRampSlowIncrease();
     method public void setHighBrightnessMode(com.android.server.display.config.HighBrightnessMode);
+    method public final void setLightSensor(com.android.server.display.config.SensorDetails);
     method public void setQuirks(com.android.server.display.config.DisplayQuirks);
     method public final void setScreenBrightnessDefault(@NonNull java.math.BigDecimal);
     method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap);
@@ -61,6 +63,14 @@
     method public final void setValue(@NonNull java.math.BigDecimal);
   }
 
+  public class SensorDetails {
+    ctor public SensorDetails();
+    method @Nullable public final String getName();
+    method @Nullable public final String getType();
+    method public final void setName(@Nullable String);
+    method public final void setType(@Nullable String);
+  }
+
   public class XmlParser {
     ctor public XmlParser();
     method public static com.android.server.display.config.DisplayConfiguration read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6283b4e..2a0feaf 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -108,7 +108,6 @@
 import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_DEFAULT;
 import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_ENTERPRISE;
 import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
-import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
 import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
 import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
 import static android.provider.Telephony.Carriers.DPC_URI;
@@ -227,6 +226,7 @@
 import android.media.AudioManager;
 import android.media.IAudioService;
 import android.net.ConnectivityManager;
+import android.net.ConnectivitySettingsManager;
 import android.net.IIpConnectivityMetrics;
 import android.net.ProxyInfo;
 import android.net.Uri;
@@ -626,6 +626,11 @@
     @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S)
     private static final long PREVENT_SETTING_PASSWORD_QUALITY_ON_PARENT = 165573442L;
 
+    private static final String CREDENTIAL_MANAGEMENT_APP_INVALID_ALIAS_MSG =
+            "The alias provided must be contained in the aliases specified in the credential "
+                    + "management app's authentication policy";
+    private static final String NOT_SYSTEM_CALLER_MSG = "Only the system can %s";
+
     final Context mContext;
     final Injector mInjector;
     final IPackageManager mIPackageManager;
@@ -740,6 +745,15 @@
         Slogf.wtfStack(LOG_TAG, "Not holding DPMS lock.");
     }
 
+    /**
+     * Calls wtfStack() if called with the DPMS lock held.
+     */
+    private void wtfIfInLock() {
+        if (Thread.holdsLock(mLockDoNoUseDirectly)) {
+            Slogf.wtfStack(LOG_TAG, "Shouldn't be called with DPMS lock held");
+        }
+    }
+
     @VisibleForTesting
     final TransferOwnershipMetadataManager mTransferOwnershipMetadataManager;
 
@@ -2497,9 +2511,9 @@
             int reqPolicy,
             @Nullable String permission) throws SecurityException {
         ensureLocked();
-        final int callingUid = mInjector.binderGetCallingUid();
+        final CallerIdentity caller = getCallerIdentity();
 
-        ActiveAdmin result = getActiveAdminWithPolicyForUidLocked(who, reqPolicy, callingUid);
+        ActiveAdmin result = getActiveAdminWithPolicyForUidLocked(who, reqPolicy, caller.getUid());
         if (result != null) {
             return result;
         } else if (permission != null && hasCallingPermission(permission)) {
@@ -2510,11 +2524,12 @@
         // that satisfies the required policy.
         // Throws a security exception with the right error message.
         if (who != null) {
-            final int userId = UserHandle.getUserId(callingUid);
-            final DevicePolicyData policy = getUserData(userId);
+            final DevicePolicyData policy = getUserData(caller.getUserId());
             ActiveAdmin admin = policy.mAdminMap.get(who);
-            final boolean isDeviceOwner = isDeviceOwner(admin.info.getComponent(), userId);
-            final boolean isProfileOwner = isProfileOwner(admin.info.getComponent(), userId);
+            final boolean isDeviceOwner = isDeviceOwner(admin.info.getComponent(),
+                    caller.getUserId());
+            final boolean isProfileOwner = isProfileOwner(admin.info.getComponent(),
+                    caller.getUserId());
 
             if (DA_DISALLOWED_POLICIES.contains(reqPolicy) && !isDeviceOwner && !isProfileOwner) {
                 throw new SecurityException("Admin " + admin.info.getComponent()
@@ -2526,7 +2541,7 @@
                     + admin.info.getTagForPolicy(reqPolicy));
         } else {
             throw new SecurityException("No active admin owned by uid "
-                    + callingUid + " for policy #" + reqPolicy + (permission == null ? ""
+                    + caller.getUid() + " for policy #" + reqPolicy + (permission == null ? ""
                     : ", which doesn't have " + permission));
         }
     }
@@ -3617,10 +3632,8 @@
                         + adminReceiver);
                 return;
             }
-            if (admin.getUid() != mInjector.binderGetCallingUid()) {
-                mContext.enforceCallingOrSelfPermission(
-                        android.Manifest.permission.MANAGE_DEVICE_ADMINS, null);
-            }
+            Preconditions.checkCallAuthorization(admin.getUid() == caller.getUid()
+                    || hasCallingOrSelfPermission(permission.MANAGE_DEVICE_ADMINS));
             mInjector.binderWithCleanCallingIdentity(() ->
                     removeActiveAdminLocked(adminReceiver, userHandle));
         }
@@ -3628,7 +3641,8 @@
 
     @Override
     public boolean isSeparateProfileChallengeAllowed(int userHandle) {
-        enforceSystemCaller("query separate challenge support");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "query separate challenge support"));
 
         ComponentName profileOwner = getProfileOwnerAsUser(userHandle);
         // Profile challenge is supported on N or newer release.
@@ -4502,8 +4516,7 @@
 
             PasswordMetrics metrics = mLockSettingsInternal.getUserPasswordMetrics(parentUser);
             final List<PasswordValidationError> passwordValidationErrors =
-                    PasswordMetrics.validatePasswordMetrics(
-                            minMetrics, complexity, false, metrics);
+                    PasswordMetrics.validatePasswordMetrics(minMetrics, complexity, metrics);
             isSufficient = passwordValidationErrors.isEmpty();
         }
         DevicePolicyEventLogger
@@ -4580,7 +4593,7 @@
                 maxRequiredComplexity = Math.max(maxRequiredComplexity, admin.mPasswordComplexity);
             }
             return PasswordMetrics.validatePasswordMetrics(PasswordMetrics.merge(adminMetrics),
-                    maxRequiredComplexity, false, metrics).isEmpty();
+                    maxRequiredComplexity, metrics).isEmpty();
         }
     }
 
@@ -4616,8 +4629,7 @@
         final int complexity = getAggregatedPasswordComplexityLocked(userId);
         PasswordMetrics minMetrics = getPasswordMinimumMetricsUnchecked(userId);
         final List<PasswordValidationError> passwordValidationErrors =
-                PasswordMetrics.validatePasswordMetrics(
-                        minMetrics, complexity, false, metrics);
+                PasswordMetrics.validatePasswordMetrics(minMetrics, complexity, metrics);
         return passwordValidationErrors.isEmpty();
     }
 
@@ -4628,8 +4640,7 @@
         DevicePolicyEventLogger
                 .createEvent(DevicePolicyEnums.GET_USER_PASSWORD_COMPLEXITY_LEVEL)
                 .setStrings(parent ? CALLED_FROM_PARENT : NOT_CALLED_FROM_PARENT,
-                        mInjector.getPackageManager().getPackagesForUid(
-                                mInjector.binderGetCallingUid()))
+                        mInjector.getPackageManager().getPackagesForUid(caller.getUid()))
                 .write();
 
         enforceUserUnlocked(caller.getUserId());
@@ -4965,8 +4976,7 @@
             // TODO: Consider changing validation API to take LockscreenCredential.
             if (password.isEmpty()) {
                 validationErrors = PasswordMetrics.validatePasswordMetrics(
-                        minMetrics, complexity, isPin,
-                        new PasswordMetrics(CREDENTIAL_TYPE_NONE));
+                        minMetrics, complexity, new PasswordMetrics(CREDENTIAL_TYPE_NONE));
             } else {
                 // TODO(b/120484642): remove getBytes() below
                 validationErrors = PasswordMetrics.validatePassword(
@@ -5048,8 +5058,8 @@
 
     @Override
     public boolean getDoNotAskCredentialsOnBoot() {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.QUERY_DO_NOT_ASK_CREDENTIALS_ON_BOOT, null);
+        Preconditions.checkCallAuthorization(
+                hasCallingOrSelfPermission(permission.QUERY_DO_NOT_ASK_CREDENTIALS_ON_BOOT));
         synchronized (getLockObject()) {
             DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
             return policyData.mDoNotAskCredentialsOnBoot;
@@ -5450,11 +5460,17 @@
             boolean isUserSelectable) {
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
         final boolean isCallerDelegate = isCallerDelegate(caller, DELEGATION_CERT_INSTALL);
-        final boolean isCredentialManagementApp =
-                isCredentialManagementApp(caller, alias, isUserSelectable);
+        final boolean isCredentialManagementApp = isCredentialManagementApp(caller);
         Preconditions.checkCallAuthorization((caller.hasAdminComponent()
                 && (isProfileOwner(caller) || isDeviceOwner(caller)))
                 || (caller.hasPackage() && (isCallerDelegate || isCredentialManagementApp)));
+        if (isCredentialManagementApp) {
+            Preconditions.checkCallAuthorization(!isUserSelectable, "The credential "
+                    + "management app is not allowed to install a user selectable key pair");
+            Preconditions.checkCallAuthorization(
+                    isAliasInCredentialManagementAppPolicy(caller, alias),
+                    CREDENTIAL_MANAGEMENT_APP_INVALID_ALIAS_MSG);
+        }
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_INSTALL_KEY_PAIR);
 
         final long id = mInjector.binderClearCallingIdentity();
@@ -5509,10 +5525,15 @@
     public boolean removeKeyPair(ComponentName who, String callerPackage, String alias) {
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
         final boolean isCallerDelegate = isCallerDelegate(caller, DELEGATION_CERT_INSTALL);
-        final boolean isCredentialManagementApp = isCredentialManagementApp(caller, alias);
+        final boolean isCredentialManagementApp = isCredentialManagementApp(caller);
         Preconditions.checkCallAuthorization((caller.hasAdminComponent()
                 && (isProfileOwner(caller) || isDeviceOwner(caller)))
                 || (caller.hasPackage() && (isCallerDelegate || isCredentialManagementApp)));
+        if (isCredentialManagementApp) {
+            Preconditions.checkCallAuthorization(
+                    isAliasInCredentialManagementAppPolicy(caller, alias),
+                    CREDENTIAL_MANAGEMENT_APP_INVALID_ALIAS_MSG);
+        }
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_REMOVE_KEY_PAIR);
 
         final long id = Binder.clearCallingIdentity();
@@ -5546,8 +5567,14 @@
     @Override
     public boolean hasKeyPair(String callerPackage, String alias) {
         final CallerIdentity caller = getCallerIdentity(callerPackage);
-        Preconditions.checkCallAuthorization(canManageCertificates(caller)
-                || isCredentialManagementApp(caller, alias));
+        final boolean isCredentialManagementApp = isCredentialManagementApp(caller);
+        Preconditions.checkCallAuthorization(canInstallCertificates(caller)
+                || isCredentialManagementApp);
+        if (isCredentialManagementApp) {
+            Preconditions.checkCallAuthorization(
+                    isAliasInCredentialManagementAppPolicy(caller, alias),
+                    CREDENTIAL_MANAGEMENT_APP_INVALID_ALIAS_MSG);
+        }
 
         return mInjector.binderWithCleanCallingIdentity(() -> {
             try (KeyChainConnection keyChainConnection =
@@ -5563,17 +5590,22 @@
         });
     }
 
-    private boolean canManageCertificates(CallerIdentity caller) {
+    private boolean canInstallCertificates(CallerIdentity caller) {
         return isProfileOwner(caller) || isDeviceOwner(caller)
                 || isCallerDelegate(caller, DELEGATION_CERT_INSTALL);
     }
 
+    private boolean canChooseCertificates(CallerIdentity caller) {
+        return isProfileOwner(caller) || isDeviceOwner(caller)
+                || isCallerDelegate(caller, DELEGATION_CERT_SELECTION);
+    }
+
     @Override
     public boolean setKeyGrantToWifiAuth(String callerPackage, String alias, boolean hasGrant) {
         Preconditions.checkStringNotEmpty(alias, "Alias to grant cannot be empty");
 
         final CallerIdentity caller = getCallerIdentity(callerPackage);
-        Preconditions.checkCallAuthorization(canManageCertificates(caller));
+        Preconditions.checkCallAuthorization(canChooseCertificates(caller));
 
         return setKeyChainGrantInternal(alias, hasGrant, Process.WIFI_UID, caller.getUserHandle());
     }
@@ -5583,7 +5615,7 @@
         Preconditions.checkStringNotEmpty(alias, "Alias to check cannot be empty");
 
         final CallerIdentity caller = getCallerIdentity(callerPackage);
-        Preconditions.checkCallAuthorization(canManageCertificates(caller));
+        Preconditions.checkCallAuthorization(canChooseCertificates(caller));
 
         return mInjector.binderWithCleanCallingIdentity(() -> {
             try (KeyChainConnection keyChainConnection =
@@ -5613,7 +5645,7 @@
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
         Preconditions.checkCallAuthorization((caller.hasAdminComponent()
                 && (isProfileOwner(caller) || isDeviceOwner(caller)))
-                || (caller.hasPackage() && isCallerDelegate(caller, DELEGATION_CERT_INSTALL)));
+                || (caller.hasPackage() && isCallerDelegate(caller, DELEGATION_CERT_SELECTION)));
 
         final int granteeUid;
         try {
@@ -5636,8 +5668,7 @@
             try (KeyChainConnection keyChainConnection =
                          KeyChain.bindAsUser(mContext, userHandle)) {
                 IKeyChainService keyChain = keyChainConnection.getService();
-                keyChain.setGrant(granteeUid, alias, hasGrant);
-                return true;
+                return keyChain.setGrant(granteeUid, alias, hasGrant);
             } catch (RemoteException e) {
                 Slogf.e(LOG_TAG, "Setting grant for package.", e);
                 return false;
@@ -5654,7 +5685,7 @@
     @Override
     public ParcelableGranteeMap getKeyPairGrants(String callerPackage, String alias) {
         final CallerIdentity caller = getCallerIdentity(callerPackage);
-        Preconditions.checkCallAuthorization(canManageCertificates(caller));
+        Preconditions.checkCallAuthorization(canChooseCertificates(caller));
 
         final ArrayMap<Integer, Set<String>> result = new ArrayMap<>();
         mInjector.binderWithCleanCallingIdentity(() -> {
@@ -5714,7 +5745,7 @@
          */
         if (hasProfileOwner(caller.getUserId())) {
             // Make sure that the caller is the profile owner or delegate.
-            Preconditions.checkCallAuthorization(canManageCertificates(caller));
+            Preconditions.checkCallAuthorization(canInstallCertificates(caller));
             // Verify that the managed profile is on an organization-owned device and as such
             // the profile owner can access Device IDs.
             if (isProfileOwnerOfOrganizationOwnedDevice(caller.getUserId())) {
@@ -5782,7 +5813,7 @@
 
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
         final boolean isCallerDelegate = isCallerDelegate(caller, DELEGATION_CERT_INSTALL);
-        final boolean isCredentialManagementApp = isCredentialManagementApp(caller, alias);
+        final boolean isCredentialManagementApp = isCredentialManagementApp(caller);
         if (deviceIdAttestationRequired && attestationUtilsFlags.length > 0) {
             // TODO: replace enforce methods
             enforceCallerCanRequestDeviceIdAttestation(caller);
@@ -5791,6 +5822,11 @@
             Preconditions.checkCallAuthorization((caller.hasAdminComponent()
                     && (isProfileOwner(caller) || isDeviceOwner(caller)))
                     || (caller.hasPackage() && (isCallerDelegate || isCredentialManagementApp)));
+            if (isCredentialManagementApp) {
+                Preconditions.checkCallAuthorization(
+                        isAliasInCredentialManagementAppPolicy(caller, alias),
+                        CREDENTIAL_MANAGEMENT_APP_INVALID_ALIAS_MSG);
+            }
         }
 
         if (TextUtils.isEmpty(alias)) {
@@ -5815,11 +5851,10 @@
             keySpec = specBuilder.build();
         }
 
-        final UserHandle userHandle = mInjector.binderGetCallingUserHandle();
         final long id = mInjector.binderClearCallingIdentity();
         try {
             try (KeyChainConnection keyChainConnection =
-                    KeyChain.bindAsUser(mContext, userHandle)) {
+                    KeyChain.bindAsUser(mContext, caller.getUserHandle())) {
                 IKeyChainService keyChain = keyChainConnection.getService();
 
                 final int generationResult = keyChain.generateKeyPair(algorithm,
@@ -5918,10 +5953,15 @@
             byte[] cert, byte[] chain, boolean isUserSelectable) {
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
         final boolean isCallerDelegate = isCallerDelegate(caller, DELEGATION_CERT_INSTALL);
-        final boolean isCredentialManagementApp = isCredentialManagementApp(caller, alias);
+        final boolean isCredentialManagementApp = isCredentialManagementApp(caller);
         Preconditions.checkCallAuthorization((caller.hasAdminComponent()
                 && (isProfileOwner(caller) || isDeviceOwner(caller)))
                 || (caller.hasPackage() && (isCallerDelegate || isCredentialManagementApp)));
+        if (isCredentialManagementApp) {
+            Preconditions.checkCallAuthorization(
+                    isAliasInCredentialManagementAppPolicy(caller, alias),
+                    CREDENTIAL_MANAGEMENT_APP_INVALID_ALIAS_MSG);
+        }
 
         final long id = mInjector.binderClearCallingIdentity();
         try (final KeyChainConnection keyChainConnection =
@@ -5953,12 +5993,13 @@
     @Override
     public void choosePrivateKeyAlias(final int uid, final Uri uri, final String alias,
             final IBinder response) {
-        enforceSystemCaller("choose private key alias");
+        final CallerIdentity caller = getCallerIdentity();
+        Preconditions.checkCallAuthorization(isSystemUid(caller),
+                String.format(NOT_SYSTEM_CALLER_MSG, "choose private key alias"));
 
-        final UserHandle caller = mInjector.binderGetCallingUserHandle();
         // If there is a profile owner, redirect to that; otherwise query the device owner.
-        ComponentName aliasChooser = getProfileOwnerAsUser(caller.getIdentifier());
-        if (aliasChooser == null && caller.isSystem()) {
+        ComponentName aliasChooser = getProfileOwnerAsUser(caller.getUserId());
+        if (aliasChooser == null && caller.getUserHandle().isSystem()) {
             synchronized (getLockObject()) {
                 final ActiveAdmin deviceOwnerAdmin = getDeviceOwnerAdminLocked();
                 if (deviceOwnerAdmin != null) {
@@ -5980,7 +6021,7 @@
 
         final ComponentName delegateReceiver;
         delegateReceiver = resolveDelegateReceiver(DELEGATION_CERT_SELECTION,
-                DeviceAdminReceiver.ACTION_CHOOSE_PRIVATE_KEY_ALIAS, caller.getIdentifier());
+                DeviceAdminReceiver.ACTION_CHOOSE_PRIVATE_KEY_ALIAS, caller.getUserId());
 
         final boolean isDelegate;
         if (delegateReceiver != null) {
@@ -5992,7 +6033,8 @@
         }
 
         mInjector.binderWithCleanCallingIdentity(() -> {
-            mContext.sendOrderedBroadcastAsUser(intent, caller, null, new BroadcastReceiver() {
+            mContext.sendOrderedBroadcastAsUser(intent, caller.getUserHandle(), null,
+                    new BroadcastReceiver() {
                 @Override
                 public void onReceive(Context context, Intent intent) {
                     final String chosenAlias = getResultData();
@@ -6367,55 +6409,36 @@
      * privileged APIs.
      * <p>
      * This is done by checking that the calling package is authorized to perform the app operation
-     * {@link android.app.AppOpsManager#OP_MANAGE_CREDENTIALS}. The alias provided must be contained
-     * in the aliases specified in the credential management app's authentication policy. The
-     * key pair to install must not be user selectable.
+     * {@link android.app.AppOpsManager#OP_MANAGE_CREDENTIALS}.
      *
      * @param caller the calling identity
      * @return {@code true} if the calling process is the credential management app.
      */
-    private boolean isCredentialManagementApp(CallerIdentity caller, String alias,
-            boolean isUserSelectable) {
-        // Should not be user selectable
-        if (isUserSelectable) {
-            Slogf.e(LOG_TAG, "The credential management app is not allowed to install a "
-                    + "user selectable key pair");
-            return false;
-        }
-        return isCredentialManagementApp(caller, alias);
+    private boolean isCredentialManagementApp(CallerIdentity caller) {
+        return mInjector.binderWithCleanCallingIdentity(() -> {
+            AppOpsManager appOpsManager = mInjector.getAppOpsManager();
+            if (appOpsManager == null) return false;
+            return appOpsManager.noteOpNoThrow(AppOpsManager.OP_MANAGE_CREDENTIALS, caller.getUid(),
+                    caller.getPackageName(), null, null) == AppOpsManager.MODE_ALLOWED;
+        });
     }
 
     /**
-     * Check whether a caller application is the credential mangement app, which can access
-     * privileged APIs.
-     * <p>
-     * This is done by checking that the calling package is authorized to perform the app operation
-     * {@link android.app.AppOpsManager#OP_MANAGE_CREDENTIALS}. The alias provided must be contained
+     * If the caller is the credential management app, the alias provided must be contained
      * in the aliases specified in the credential management app's authentication policy.
-     *
-     * @param caller the calling identity
-     * @return {@code true} if the calling process is the credential management app.
      */
-    private boolean isCredentialManagementApp(CallerIdentity caller, String alias) {
+    private boolean isAliasInCredentialManagementAppPolicy(CallerIdentity caller, String alias) {
         return mInjector.binderWithCleanCallingIdentity(() -> {
-            // Should include alias in authentication policy
             try (KeyChainConnection connection = KeyChain.bindAsUser(mContext,
                     caller.getUserHandle())) {
                 // The policy will be null if there is no credential management app
                 AppUriAuthenticationPolicy policy =
                         connection.getService().getCredentialManagementAppPolicy();
-                if (policy == null || policy.getAppAndUriMappings().isEmpty()
-                        || !containsAlias(policy, alias)) {
-                    return false;
-                }
+                return policy != null && !policy.getAppAndUriMappings().isEmpty()
+                        && containsAlias(policy, alias);
             } catch (RemoteException | InterruptedException e) {
                 return false;
             }
-
-            AppOpsManager appOpsManager = mInjector.getAppOpsManager();
-            if (appOpsManager == null) return false;
-            return appOpsManager.noteOpNoThrow(AppOpsManager.OP_MANAGE_CREDENTIALS, caller.getUid(),
-                    caller.getPackageName(), null, null) == AppOpsManager.MODE_ALLOWED;
         });
     }
 
@@ -6520,7 +6543,8 @@
 
     @Override
     public String getAlwaysOnVpnPackageForUser(int userHandle) {
-        enforceSystemCaller("getAlwaysOnVpnPackageForUser");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "call getAlwaysOnVpnPackageForUser"));
         synchronized (getLockObject()) {
             ActiveAdmin admin = getDeviceOrProfileOwnerAdminLocked(userHandle);
             return admin != null ? admin.mAlwaysOnVpnPackage : null;
@@ -6546,7 +6570,8 @@
 
     @Override
     public boolean isAlwaysOnVpnLockdownEnabledForUser(int userHandle) {
-        enforceSystemCaller("isAlwaysOnVpnLockdownEnabledForUser");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "call isAlwaysOnVpnLockdownEnabledForUser"));
         synchronized (getLockObject()) {
             ActiveAdmin admin = getDeviceOrProfileOwnerAdminLocked(userHandle);
             return admin != null ? admin.mAlwaysOnVpnLockdown : null;
@@ -6836,18 +6861,17 @@
             return null;
         }
 
+        final CallerIdentity caller = getCallerIdentity(who);
         final int frpManagementAgentUid = getFrpManagementAgentUidOrThrow();
         final ActiveAdmin admin;
         synchronized (getLockObject()) {
             if (who == null) {
-                Preconditions.checkCallAuthorization(
-                        frpManagementAgentUid == mInjector.binderGetCallingUid()
+                Preconditions.checkCallAuthorization(frpManagementAgentUid == caller.getUid()
                                 || hasCallingPermission(permission.MASTER_CLEAR),
                         "Must be called by the FRP management agent on device");
                 admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked(
                         UserHandle.getUserId(frpManagementAgentUid));
             } else {
-                final CallerIdentity caller = getCallerIdentity(who);
                 Preconditions.checkCallAuthorization(
                         isDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller));
                 admin = getProfileOwnerOrDeviceOwnerLocked(caller);
@@ -8123,8 +8147,11 @@
         Preconditions.checkArgument(admin != null);
 
         final CallerIdentity caller = getCallerIdentity();
+        // Cannot be called while holding the lock:
+        final boolean hasIncompatibleAccountsOrNonAdb =
+                hasIncompatibleAccountsOrNonAdbNoLock(caller, userId, admin);
         synchronized (getLockObject()) {
-            enforceCanSetDeviceOwnerLocked(caller, admin, userId);
+            enforceCanSetDeviceOwnerLocked(caller, admin, userId, hasIncompatibleAccountsOrNonAdb);
             Preconditions.checkArgument(isPackageInstalledForUser(admin.getPackageName(), userId),
                     "Invalid component " + admin + " for device owner");
             final ActiveAdmin activeAdmin = getActiveAdminUncheckedLocked(admin, userId);
@@ -8420,16 +8447,14 @@
     @Override
     public void clearDeviceOwner(String packageName) {
         Objects.requireNonNull(packageName, "packageName is null");
-        final int callingUid = mInjector.binderGetCallingUid();
-        if (!isCallingFromPackage(packageName, callingUid)) {
-            throw new SecurityException("Invalid packageName");
-        }
+
+        final CallerIdentity caller = getCallerIdentity(packageName);
         synchronized (getLockObject()) {
             final ComponentName deviceOwnerComponent = mOwners.getDeviceOwnerComponent();
             final int deviceOwnerUserId = mOwners.getDeviceOwnerUserId();
             if (!mOwners.hasDeviceOwner()
                     || !deviceOwnerComponent.getPackageName().equals(packageName)
-                    || (deviceOwnerUserId != UserHandle.getUserId(callingUid))) {
+                    || (deviceOwnerUserId != caller.getUserId())) {
                 throw new SecurityException(
                         "clearDeviceOwner can only be called by the device owner");
             }
@@ -8521,8 +8546,12 @@
         Preconditions.checkArgument(who != null);
 
         final CallerIdentity caller = getCallerIdentity();
+        // Cannot be called while holding the lock:
+        final boolean hasIncompatibleAccountsOrNonAdb =
+                hasIncompatibleAccountsOrNonAdbNoLock(caller, userHandle, who);
         synchronized (getLockObject()) {
-            enforceCanSetProfileOwnerLocked(caller, who, userHandle);
+            enforceCanSetProfileOwnerLocked(
+                    caller, who, userHandle, hasIncompatibleAccountsOrNonAdb);
             Preconditions.checkArgument(isPackageInstalledForUser(who.getPackageName(), userHandle),
                     "Component " + who + " not installed for userId:" + userHandle);
             final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
@@ -9003,7 +9032,8 @@
 
     @Override
     public boolean checkDeviceIdentifierAccess(String packageName, int pid, int uid) {
-        ensureCallerIdentityMatchesIfNotSystem(packageName, pid, uid);
+        final CallerIdentity caller = getCallerIdentity();
+        ensureCallerIdentityMatchesIfNotSystem(packageName, pid, uid, caller);
 
         // Verify that the specified packages matches the provided uid.
         if (!doesPackageMatchUid(packageName, uid)) {
@@ -9011,8 +9041,7 @@
         }
         // A device or profile owner must also have the READ_PHONE_STATE permission to access device
         // identifiers. If the package being checked does not have this permission then deny access.
-        if (mContext.checkPermission(android.Manifest.permission.READ_PHONE_STATE, pid, uid)
-                != PackageManager.PERMISSION_GRANTED) {
+        if (!hasPermission(permission.READ_PHONE_STATE, pid, uid)) {
             return false;
         }
 
@@ -9061,10 +9090,11 @@
         return true;
     }
 
-    private void ensureCallerIdentityMatchesIfNotSystem(String packageName, int pid, int uid) {
+    private void ensureCallerIdentityMatchesIfNotSystem(String packageName, int pid, int uid,
+            CallerIdentity caller) {
         // If the caller is not a system app then it should only be able to check its own device
         // identifier access.
-        int callingUid = mInjector.binderGetCallingUid();
+        int callingUid = caller.getUid();
         int callingPid = mInjector.binderGetCallingPid();
         if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID
                 && (callingUid != uid || callingPid != pid)) {
@@ -9100,15 +9130,6 @@
     }
 
     /**
-     * Calls wtfStack() if called with the DPMS lock held.
-     */
-    private void wtfIfInLock() {
-        if (Thread.holdsLock(this)) {
-            Slogf.wtfStack(LOG_TAG, "Shouldn't be called with DPMS lock held");
-        }
-    }
-
-    /**
      * The profile owner can only be set by adb or an app with the MANAGE_PROFILE_AND_DEVICE_OWNERS
      * permission.
      * The profile owner can only be set before the user setup phase has completed,
@@ -9116,8 +9137,9 @@
      * - SYSTEM_UID
      * - adb unless hasIncompatibleAccountsOrNonAdb is true.
      */
-    private void enforceCanSetProfileOwnerLocked(CallerIdentity caller,
-            @Nullable ComponentName owner, int userHandle) {
+    private void enforceCanSetProfileOwnerLocked(
+            CallerIdentity caller, @Nullable ComponentName owner, int userHandle,
+            boolean hasIncompatibleAccountsOrNonAdb) {
         UserInfo info = getUserInfo(userHandle);
         if (info == null) {
             // User doesn't exist.
@@ -9137,7 +9159,7 @@
         }
         if (isAdb(caller)) {
             if ((mIsWatch || hasUserSetupCompleted(userHandle))
-                    && hasIncompatibleAccountsOrNonAdbNoLock(caller, userHandle, owner)) {
+                    && hasIncompatibleAccountsOrNonAdb) {
                 throw new IllegalStateException("Not allowed to set the profile owner because "
                         + "there are already some accounts on the profile");
             }
@@ -9147,10 +9169,8 @@
                 hasCallingOrSelfPermission(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS));
 
         if ((mIsWatch || hasUserSetupCompleted(userHandle))) {
-            if (!isCallerWithSystemUid()) {
-                throw new IllegalStateException("Cannot set the profile owner on a user which is "
-                        + "already set-up");
-            }
+            Preconditions.checkState(isSystemUid(caller),
+                    "Cannot set the profile owner on a user which is already set-up");
 
             if (!mIsWatch) {
                 // Only the default supervision profile owner can be set as profile owner after SUW
@@ -9176,8 +9196,9 @@
      * The Device owner can only be set by adb or an app with the MANAGE_PROFILE_AND_DEVICE_OWNERS
      * permission.
      */
-    private void enforceCanSetDeviceOwnerLocked(CallerIdentity caller,
-            @Nullable ComponentName owner, @UserIdInt int deviceOwnerUserId) {
+    private void enforceCanSetDeviceOwnerLocked(
+            CallerIdentity caller, @Nullable ComponentName owner, @UserIdInt int deviceOwnerUserId,
+            boolean hasIncompatibleAccountsOrNonAdb) {
         if (!isAdb(caller)) {
             Preconditions.checkCallAuthorization(
                     hasCallingOrSelfPermission(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS));
@@ -9185,8 +9206,7 @@
 
         final int code = checkDeviceOwnerProvisioningPreConditionLocked(owner,
                 /* deviceOwnerUserId= */ deviceOwnerUserId, /* callingUserId*/ caller.getUserId(),
-                isAdb(caller),
-                hasIncompatibleAccountsOrNonAdbNoLock(caller, deviceOwnerUserId, owner));
+                isAdb(caller), hasIncompatibleAccountsOrNonAdb);
         if (code != CODE_OK) {
             throw new IllegalStateException(
                     computeProvisioningErrorString(code, deviceOwnerUserId));
@@ -9242,6 +9262,10 @@
                 || hasCallingOrSelfPermission(permission.MANAGE_USERS);
     }
 
+    private boolean hasPermission(String permission, int pid, int uid) {
+        return mContext.checkPermission(permission, pid, uid) == PackageManager.PERMISSION_GRANTED;
+    }
+
     private boolean hasCallingPermission(String permission) {
         return mContext.checkCallingPermission(permission) == PackageManager.PERMISSION_GRANTED;
     }
@@ -9301,10 +9325,6 @@
         }
     }
 
-    private boolean isCallerWithSystemUid() {
-        return UserHandle.isSameApp(mInjector.binderGetCallingUid(), Process.SYSTEM_UID);
-    }
-
     private boolean isSystemUid(CallerIdentity caller) {
         return UserHandle.isSameApp(caller.getUid(), Process.SYSTEM_UID);
     }
@@ -9615,7 +9635,7 @@
 
     @Override
     public boolean isCallerApplicationRestrictionsManagingPackage(String callerPackage) {
-        return isCallerDelegate(callerPackage, mInjector.binderGetCallingUid(),
+        return isCallerDelegate(callerPackage, getCallerIdentity().getUid(),
                 DELEGATION_APP_RESTRICTIONS);
     }
 
@@ -9735,7 +9755,8 @@
 
     @Override
     public ComponentName getRestrictionsProvider(int userHandle) {
-        enforceSystemCaller("query the permission provider");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "query the permission provider"));
         synchronized (getLockObject()) {
             DevicePolicyData userData = getUserData(userHandle);
             return userData != null ? userData.mRestrictionsProvider : null;
@@ -10005,7 +10026,9 @@
         }
         Objects.requireNonNull(who, "ComponentName is null");
         Preconditions.checkStringNotEmpty(packageName, "packageName is null");
-        enforceSystemCaller("query if an accessibility service is disabled by admin");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG,
+                        "query if an accessibility service is disabled by admin"));
 
         synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
@@ -10151,7 +10174,9 @@
         }
         Objects.requireNonNull(who, "ComponentName is null");
         Preconditions.checkStringNotEmpty(packageName, "packageName is null");
-        enforceSystemCaller("query if an input method is disabled by admin");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG,
+                        "query if an input method is disabled by admin"));
 
         synchronized (getLockObject()) {
             ActiveAdmin admin = getParentOfAdminIfRequired(
@@ -10211,7 +10236,9 @@
         }
 
         Preconditions.checkStringNotEmpty(packageName, "packageName is null or empty");
-        enforceSystemCaller("query if a notification listener service is permitted");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG,
+                        "query if a notification listener service is permitted"));
 
         synchronized (getLockObject()) {
             ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
@@ -10224,12 +10251,6 @@
         }
     }
 
-    private void enforceSystemCaller(String action) {
-        if (!isCallerWithSystemUid()) {
-            throw new SecurityException("Only the system can " + action);
-        }
-    }
-
     private void maybeSendAdminEnabledBroadcastLocked(int userHandle) {
         DevicePolicyData policyData = getUserData(userHandle);
         if (policyData.mAdminBroadcastPending) {
@@ -10279,11 +10300,10 @@
         // Create user.
         UserHandle user = null;
         synchronized (getLockObject()) {
-            final int callingUid = mInjector.binderGetCallingUid();
             final long id = mInjector.binderClearCallingIdentity();
             try {
                 targetSdkVersion = mInjector.getPackageManagerInternal().getUidTargetSdkVersion(
-                        callingUid);
+                        caller.getUid());
 
                 // Return detail error code for checks inside
                 // UserManagerService.createUserInternalUnchecked.
@@ -11774,7 +11794,8 @@
 
     @Override
     public void notifyLockTaskModeChanged(boolean isEnabled, String pkg, int userHandle) {
-        enforceSystemCaller("call notifyLockTaskModeChanged");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "call notifyLockTaskModeChanged"));
         synchronized (getLockObject()) {
             final DevicePolicyData policy = getUserData(userHandle);
 
@@ -11910,17 +11931,25 @@
         final CallerIdentity caller = getCallerIdentity(who);
         Preconditions.checkCallAuthorization(isDeviceOwner(caller));
 
+        UserHandle userHandle = caller.getUserHandle();
+        if (mIsAutomotive) {
+            Slogf.v(LOG_TAG, "setLocationEnabled(%s, %b): ignoring for user %s on automotive build",
+                    who.flattenToShortString(), locationEnabled, userHandle);
+            return;
+        }
+
         mInjector.binderWithCleanCallingIdentity(() -> {
             boolean wasLocationEnabled = mInjector.getLocationManager().isLocationEnabledForUser(
-                    caller.getUserHandle());
-            mInjector.getLocationManager().setLocationEnabledForUser(locationEnabled,
-                    caller.getUserHandle());
+                    userHandle);
+            Slogf.v(LOG_TAG, "calling locationManager.setLocationEnabledForUser(%b, %s)",
+                    locationEnabled, userHandle);
+            mInjector.getLocationManager().setLocationEnabledForUser(locationEnabled, userHandle);
 
             // make a best effort to only show the notification if the admin is actually enabling
             // location. this is subject to race conditions with settings changes, but those are
             // unlikely to realistically interfere
             if (locationEnabled && !wasLocationEnabled) {
-                showLocationSettingsEnabledNotification(caller.getUserHandle());
+                showLocationSettingsEnabledNotification(userHandle);
             }
         });
 
@@ -12835,13 +12864,12 @@
     @Override
     public Intent createAdminSupportIntent(String restriction) {
         Objects.requireNonNull(restriction);
-        final int uid = mInjector.binderGetCallingUid();
-        final int userId = UserHandle.getUserId(uid);
+        final CallerIdentity caller = getCallerIdentity();
         Intent intent = null;
         if (DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction) ||
                 DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE.equals(restriction)) {
             synchronized (getLockObject()) {
-                final DevicePolicyData policy = getUserData(userId);
+                final DevicePolicyData policy = getUserData(caller.getUserId());
                 final int N = policy.mAdminList.size();
                 for (int i = 0; i < N; i++) {
                     final ActiveAdmin admin = policy.mAdminList.get(i);
@@ -12849,7 +12877,8 @@
                                 DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction)) ||
                         (admin.disableScreenCapture && DevicePolicyManager
                                 .POLICY_DISABLE_SCREEN_CAPTURE.equals(restriction))) {
-                        intent = createShowAdminSupportIntent(admin.info.getComponent(), userId);
+                        intent = createShowAdminSupportIntent(admin.info.getComponent(),
+                                caller.getUserId());
                         break;
                     }
                 }
@@ -12866,7 +12895,8 @@
             }
         } else {
             // if valid, |restriction| can only be a user restriction
-            intent = mLocalService.createUserRestrictionSupportIntent(userId, restriction);
+            intent = mLocalService.createUserRestrictionSupportIntent(caller.getUserId(),
+                    restriction);
         }
         if (intent != null) {
             intent.putExtra(DevicePolicyManager.EXTRA_RESTRICTION, restriction);
@@ -13043,7 +13073,8 @@
 
     @Override
     public void notifyPendingSystemUpdate(@Nullable SystemUpdateInfo info) {
-        mContext.enforceCallingOrSelfPermission(permission.NOTIFY_PENDING_SYSTEM_UPDATE,
+        Preconditions.checkCallAuthorization(
+                hasCallingOrSelfPermission(permission.NOTIFY_PENDING_SYSTEM_UPDATE),
                 "Only the system update service can broadcast update information");
 
         if (UserHandle.getCallingUserId() != UserHandle.USER_SYSTEM) {
@@ -13285,12 +13316,12 @@
     public boolean isProvisioningAllowed(String action, String packageName) {
         Objects.requireNonNull(packageName);
 
-        final int callingUid = mInjector.binderGetCallingUid();
+        final CallerIdentity caller = getCallerIdentity();
         final long ident = mInjector.binderClearCallingIdentity();
         try {
             final int uidForPackage = mInjector.getPackageManager().getPackageUidAsUser(
-                    packageName, UserHandle.getUserId(callingUid));
-            Preconditions.checkArgument(callingUid == uidForPackage,
+                    packageName, caller.getUserId());
+            Preconditions.checkArgument(caller.getUid() == uidForPackage,
                     "Caller uid doesn't match the one for the provided package.");
         } catch (NameNotFoundException e) {
             throw new IllegalArgumentException("Invalid package provided " + packageName, e);
@@ -13609,12 +13640,12 @@
             return;
         }
         Objects.requireNonNull(who, "ComponentName is null");
-        final int userHandle = mInjector.userHandleGetCallingUserId();
+        final CallerIdentity caller = getCallerIdentity(who);
         synchronized (getLockObject()) {
-            ActiveAdmin admin = getActiveAdminForUidLocked(who, mInjector.binderGetCallingUid());
+            ActiveAdmin admin = getActiveAdminForUidLocked(who, caller.getUid());
             if (!TextUtils.equals(admin.shortSupportMessage, message)) {
                 admin.shortSupportMessage = message;
-                saveSettingsLocked(userHandle);
+                saveSettingsLocked(caller.getUserId());
             }
         }
         DevicePolicyEventLogger
@@ -13629,8 +13660,9 @@
             return null;
         }
         Objects.requireNonNull(who, "ComponentName is null");
+        final CallerIdentity caller = getCallerIdentity(who);
         synchronized (getLockObject()) {
-            ActiveAdmin admin = getActiveAdminForUidLocked(who, mInjector.binderGetCallingUid());
+            ActiveAdmin admin = getActiveAdminForUidLocked(who, caller.getUid());
             return admin.shortSupportMessage;
         }
     }
@@ -13641,12 +13673,12 @@
             return;
         }
         Objects.requireNonNull(who, "ComponentName is null");
-        final int userHandle = mInjector.userHandleGetCallingUserId();
+        final CallerIdentity caller = getCallerIdentity(who);
         synchronized (getLockObject()) {
-            ActiveAdmin admin = getActiveAdminForUidLocked(who, mInjector.binderGetCallingUid());
+            ActiveAdmin admin = getActiveAdminForUidLocked(who, caller.getUid());
             if (!TextUtils.equals(admin.longSupportMessage, message)) {
                 admin.longSupportMessage = message;
-                saveSettingsLocked(userHandle);
+                saveSettingsLocked(caller.getUserId());
             }
         }
         DevicePolicyEventLogger
@@ -13661,8 +13693,9 @@
             return null;
         }
         Objects.requireNonNull(who, "ComponentName is null");
+        final CallerIdentity caller = getCallerIdentity(who);
         synchronized (getLockObject()) {
-            ActiveAdmin admin = getActiveAdminForUidLocked(who, mInjector.binderGetCallingUid());
+            ActiveAdmin admin = getActiveAdminForUidLocked(who, caller.getUid());
             return admin.longSupportMessage;
         }
     }
@@ -13673,7 +13706,8 @@
             return null;
         }
         Objects.requireNonNull(who, "ComponentName is null");
-        enforceSystemCaller("query support message for user");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "query support message for user"));
 
         synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
@@ -13690,7 +13724,8 @@
             return null;
         }
         Objects.requireNonNull(who, "ComponentName is null");
-        enforceSystemCaller("query support message for user");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "query support message for user"));
 
         synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
@@ -13920,7 +13955,8 @@
         if (!mHasFeature) {
             return false;
         }
-        enforceSystemCaller("query restricted pkgs for a specific user");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG, "query restricted pkgs for a specific user"));
 
         synchronized (getLockObject()) {
             final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userId);
@@ -14185,7 +14221,7 @@
         }
 
         synchronized (getLockObject()) {
-            if (!isCallerWithSystemUid()) {
+            if (!isSystemUid(getCallerIdentity())) {
                 final CallerIdentity caller = getCallerIdentity(admin, packageName);
                 if (admin != null) {
                     Preconditions.checkCallAuthorization(
@@ -14304,14 +14340,6 @@
         return mSecurityLogMonitor.forceLogs();
     }
 
-    private void enforceCallerSystemUserHandle() {
-        final int callingUid = mInjector.binderGetCallingUid();
-        final int userId = UserHandle.getUserId(callingUid);
-        if (userId != UserHandle.USER_SYSTEM) {
-            throw new SecurityException("Caller has to be in user 0");
-        }
-    }
-
     @Override
     public boolean isUninstallInQueue(final String packageName) {
         final CallerIdentity caller = getCallerIdentity();
@@ -14495,9 +14523,11 @@
      */
     @Override
     public void forceUpdateUserSetupComplete() {
+        final CallerIdentity caller = getCallerIdentity();
         Preconditions.checkCallAuthorization(
                 hasCallingOrSelfPermission(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS));
-        enforceCallerSystemUserHandle();
+        Preconditions.checkCallAuthorization(caller.getUserHandle().isSystem(),
+                "Caller has to be in user 0");
 
         final int userId = UserHandle.USER_SYSTEM;
         boolean isUserCompleted = mInjector.settingsSecureGetIntForUser(
@@ -15675,12 +15705,12 @@
         return context.getResources().getString(R.string.config_managed_provisioning_package);
     }
 
-    private void putPrivateDnsSettings(@Nullable String mode, @Nullable String host) {
+    private void putPrivateDnsSettings(int mode, @Nullable String host) {
         // Set Private DNS settings using system permissions, as apps cannot write
         // to global settings.
         mInjector.binderWithCleanCallingIdentity(() -> {
-            mInjector.settingsGlobalPutString(PRIVATE_DNS_MODE, mode);
-            mInjector.settingsGlobalPutString(PRIVATE_DNS_SPECIFIER, host);
+            ConnectivitySettingsManager.setPrivateDnsMode(mContext, mode);
+            ConnectivitySettingsManager.setPrivateDnsHostname(mContext, host);
         });
     }
 
@@ -15700,7 +15730,8 @@
                     throw new IllegalArgumentException(
                             "Host provided for opportunistic mode, but is not needed.");
                 }
-                putPrivateDnsSettings(ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC, null);
+                putPrivateDnsSettings(ConnectivitySettingsManager.PRIVATE_DNS_MODE_OPPORTUNISTIC,
+                        null);
                 return PRIVATE_DNS_SET_NO_ERROR;
             case PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:
                 if (TextUtils.isEmpty(privateDnsHost)
@@ -15712,7 +15743,7 @@
                 // Connectivity check will have been performed in the DevicePolicyManager before
                 // the call here.
                 putPrivateDnsSettings(
-                        ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME,
+                        ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME,
                         privateDnsHost);
                 return PRIVATE_DNS_SET_NO_ERROR;
             default:
@@ -15730,13 +15761,13 @@
         final CallerIdentity caller = getCallerIdentity(who);
         Preconditions.checkCallAuthorization(isDeviceOwner(caller));
 
-        final String currentMode = ConnectivityManager.getPrivateDnsMode(mContext);
+        final int currentMode = ConnectivitySettingsManager.getPrivateDnsMode(mContext);
         switch (currentMode) {
-            case ConnectivityManager.PRIVATE_DNS_MODE_OFF:
+            case ConnectivitySettingsManager.PRIVATE_DNS_MODE_OFF:
                 return PRIVATE_DNS_MODE_OFF;
-            case ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC:
+            case ConnectivitySettingsManager.PRIVATE_DNS_MODE_OPPORTUNISTIC:
                 return PRIVATE_DNS_MODE_OPPORTUNISTIC;
-            case ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:
+            case ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:
                 return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
         }
 
@@ -16065,14 +16096,13 @@
         }
         Preconditions.checkStringNotEmpty(packageName, "Package name is empty");
 
-        final int callingUid = mInjector.binderGetCallingUid();
-        final int callingUserId = mInjector.userHandleGetCallingUserId();
-        if (!isCallingFromPackage(packageName, callingUid)) {
+        final CallerIdentity caller = getCallerIdentity();
+        if (!isCallingFromPackage(packageName, caller.getUid())) {
             throw new SecurityException("Input package name doesn't align with actual "
                     + "calling package.");
         }
         return mInjector.binderWithCleanCallingIdentity(() -> {
-            final int workProfileUserId = getManagedUserId(callingUserId);
+            final int workProfileUserId = getManagedUserId(caller.getUserId());
             if (workProfileUserId < 0) {
                 return false;
             }
@@ -16590,7 +16620,9 @@
 
     @Override
     public boolean canProfileOwnerResetPasswordWhenLocked(int userId) {
-        enforceSystemCaller("call canProfileOwnerResetPasswordWhenLocked");
+        Preconditions.checkCallAuthorization(isSystemUid(getCallerIdentity()),
+                String.format(NOT_SYSTEM_CALLER_MSG,
+                        "call canProfileOwnerResetPasswordWhenLocked"));
         synchronized (getLockObject()) {
             final ActiveAdmin poAdmin = getProfileOwnerAdminLocked(userId);
             if (poAdmin == null
@@ -16756,7 +16788,9 @@
                     provisioningParams.isKeepAccountMigrated(), callerPackage);
 
             if (provisioningParams.isOrganizationOwnedProvisioning()) {
-                setProfileOwnerOnOrgOwnedDeviceState(admin, userInfo.id, caller.getUserId());
+                synchronized (getLockObject()) {
+                    markProfileOwnerOnOrganizationOwnedDeviceUncheckedLocked(admin, userInfo.id);
+                }
             }
 
             return userInfo.getUserHandle();
@@ -16988,22 +17022,6 @@
         }
     }
 
-    private void setProfileOwnerOnOrgOwnedDeviceState(
-            ComponentName admin, @UserIdInt int profileId, @UserIdInt int parentUserId) {
-        synchronized (getLockObject()) {
-            markProfileOwnerOnOrganizationOwnedDeviceUncheckedLocked(admin, profileId);
-        }
-        restrictRemovalOfManagedProfile(parentUserId);
-    }
-
-    private void restrictRemovalOfManagedProfile(@UserIdInt int parentUserId) {
-        final UserHandle parentUserHandle = UserHandle.of(parentUserId);
-        mUserManager.setUserRestriction(
-                UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
-                /* value= */ true,
-                parentUserHandle);
-    }
-
     @Override
     public void provisionFullyManagedDevice(
             @NonNull FullyManagedDeviceProvisioningParams provisioningParams,
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java
index 285ecfb..a2db6aac 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerServiceShellCommand.java
@@ -15,8 +15,12 @@
  */
 package com.android.server.devicepolicy;
 
+import android.app.ActivityManager;
 import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
 import android.os.ShellCommand;
+import android.os.SystemClock;
+import android.os.UserHandle;
 
 import com.android.server.devicepolicy.Owners.OwnerDto;
 
@@ -32,8 +36,23 @@
     private static final String CMD_SET_SAFE_OPERATION = "set-operation-safe";
     private static final String CMD_LIST_OWNERS = "list-owners";
     private static final String CMD_LIST_POLICY_EXEMPT_APPS = "list-policy-exempt-apps";
+    private static final String CMD_SET_ACTIVE_ADMIN = "set-active-admin";
+    private static final String CMD_SET_DEVICE_OWNER = "set-device-owner";
+    private static final String CMD_SET_PROFILE_OWNER = "set-profile-owner";
+    private static final String CMD_REMOVE_ACTIVE_ADMIN = "remove-active-admin";
+    private static final String CMD_CLEAR_FREEZE_PERIOD_RECORD = "clear-freeze-period-record";
+    private static final String CMD_FORCE_NETWORK_LOGS = "force-network-logs";
+    private static final String CMD_FORCE_SECURITY_LOGS = "force-security-logs";
+    private static final String CMD_MARK_PO_ON_ORG_OWNED_DEVICE =
+            "mark-profile-owner-on-organization-owned-device";
+
+    private static final String USER_OPTION = "--user";
+    private static final String NAME_OPTION = "--name";
 
     private final DevicePolicyManagerService mService;
+    private int mUserId = UserHandle.USER_SYSTEM;
+    private String mName = "";
+    private ComponentName mComponent;
 
     DevicePolicyManagerServiceShellCommand(DevicePolicyManagerService service) {
         mService = Objects.requireNonNull(service);
@@ -41,7 +60,7 @@
 
     @Override
     public void onHelp() {
-        try (PrintWriter pw = getOutPrintWriter();) {
+        try (PrintWriter pw = getOutPrintWriter()) {
             pw.printf("DevicePolicyManager Service (device_policy) commands:\n\n");
             showHelp(pw);
         }
@@ -52,7 +71,7 @@
         if (cmd == null) {
             return handleDefaultCommands(cmd);
         }
-        try (PrintWriter pw = getOutPrintWriter();) {
+        try (PrintWriter pw = getOutPrintWriter()) {
             switch (cmd) {
                 case CMD_IS_SAFE_OPERATION:
                     return runIsSafeOperation(pw);
@@ -64,6 +83,22 @@
                     return runListOwners(pw);
                 case CMD_LIST_POLICY_EXEMPT_APPS:
                     return runListPolicyExemptApps(pw);
+                case CMD_SET_ACTIVE_ADMIN:
+                    return runSetActiveAdmin(pw);
+                case CMD_SET_DEVICE_OWNER:
+                    return runSetDeviceOwner(pw);
+                case CMD_SET_PROFILE_OWNER:
+                    return runSetProfileOwner(pw);
+                case CMD_REMOVE_ACTIVE_ADMIN:
+                    return runRemoveActiveAdmin(pw);
+                case CMD_CLEAR_FREEZE_PERIOD_RECORD:
+                    return runClearFreezePeriodRecord(pw);
+                case CMD_FORCE_NETWORK_LOGS:
+                    return runForceNetworkLogs(pw);
+                case CMD_FORCE_SECURITY_LOGS:
+                    return runForceSecurityLogs(pw);
+                case CMD_MARK_PO_ON_ORG_OWNED_DEVICE:
+                    return runMarkProfileOwnerOnOrganizationOwnedDevice(pw);
                 default:
                     return onInvalidCommand(pw, cmd);
             }
@@ -75,7 +110,7 @@
             return 0;
         }
 
-        pw.println("Usage: ");
+        pw.printf("Usage: \n");
         showHelp(pw);
         return -1;
     }
@@ -94,6 +129,37 @@
         pw.printf("    Lists the device / profile owners per user \n\n");
         pw.printf("  %s\n", CMD_LIST_POLICY_EXEMPT_APPS);
         pw.printf("    Lists the apps that are exempt from policies\n\n");
+        pw.printf("  %s [ %s <USER_ID> | current ] <COMPONENT>\n",
+                CMD_SET_ACTIVE_ADMIN, USER_OPTION);
+        pw.printf("    Sets the given component as active admin for an existing user.\n\n");
+        pw.printf("  %s [ %s <USER_ID> | current *EXPERIMENTAL* ] [ %s <NAME> ] "
+                + "<COMPONENT>\n", CMD_SET_DEVICE_OWNER, USER_OPTION, NAME_OPTION);
+        pw.printf("    Sets the given component as active admin, and its package as device owner."
+                + "\n\n");
+        pw.printf("  %s [ %s <USER_ID> | current ] [ %s <NAME> ] <COMPONENT>\n",
+                CMD_SET_PROFILE_OWNER, USER_OPTION, NAME_OPTION);
+        pw.printf("    Sets the given component as active admin and profile owner for an existing "
+                + "user.\n\n");
+        pw.printf("  %s [ %s <USER_ID> | current ] [ %s <NAME> ] <COMPONENT>\n",
+                CMD_REMOVE_ACTIVE_ADMIN, USER_OPTION, NAME_OPTION);
+        pw.printf("    Disables an active admin, the admin must have declared android:testOnly in "
+                + "the application in its manifest. This will also remove device and profile "
+                + "owners.\n\n");
+        pw.printf("  %s\n", CMD_CLEAR_FREEZE_PERIOD_RECORD);
+        pw.printf("    Clears framework-maintained record of past freeze periods that the device "
+                + "went through. For use during feature development to prevent triggering "
+                + "restriction on setting freeze periods.\n\n");
+        pw.printf("  %s\n", CMD_FORCE_NETWORK_LOGS);
+        pw.printf("    Makes all network logs available to the DPC and triggers "
+                + "DeviceAdminReceiver.onNetworkLogsAvailable() if needed.\n\n");
+        pw.printf("  %s\n", CMD_FORCE_SECURITY_LOGS);
+        pw.printf("    Makes all security logs available to the DPC and triggers "
+                + "DeviceAdminReceiver.onSecurityLogsAvailable() if needed.\n\n");
+        pw.printf("  %s [ %s <USER_ID> | current ] <COMPONENT>\n",
+                CMD_MARK_PO_ON_ORG_OWNED_DEVICE, USER_OPTION);
+        pw.printf("    Marks the profile owner of the given user as managing an organization-owned"
+                + "device. That will give it access to device identifiers (such as serial number, "
+                + "IMEI and MEID), as well as other privileges.\n\n");
     }
 
     private int runIsSafeOperation(PrintWriter pw) {
@@ -161,7 +227,6 @@
         return 0;
     }
 
-
     private int runListPolicyExemptApps(PrintWriter pw) {
         List<String> apps = mService.listPolicyExemptApps();
         int size = printAndGetSize(pw, apps, "policy exempt app");
@@ -174,4 +239,131 @@
         }
         return 0;
     }
+
+    private int runSetActiveAdmin(PrintWriter pw) {
+        parseArgs(/* canHaveName= */ false);
+        mService.setActiveAdmin(mComponent, /* refreshing= */ true, mUserId);
+
+        pw.printf("Success: Active admin set to component %s\n", mComponent.flattenToShortString());
+        return 0;
+    }
+
+    private int runSetDeviceOwner(PrintWriter pw) {
+        parseArgs(/* canHaveName= */ true);
+        mService.setActiveAdmin(mComponent, /* refreshing= */ true, mUserId);
+
+        try {
+            if (!mService.setDeviceOwner(mComponent, mName, mUserId)) {
+                throw new RuntimeException(
+                        "Can't set package " + mComponent + " as device owner.");
+            }
+        } catch (Exception e) {
+            // Need to remove the admin that we just added.
+            mService.removeActiveAdmin(mComponent, UserHandle.USER_SYSTEM);
+            throw e;
+        }
+
+        mService.setUserProvisioningState(
+                DevicePolicyManager.STATE_USER_SETUP_FINALIZED, mUserId);
+
+        pw.printf("Success: Device owner set to package %s\n", mComponent.flattenToShortString());
+        pw.printf("Active admin set to component %s\n", mComponent.flattenToShortString());
+        return 0;
+    }
+
+    private int runRemoveActiveAdmin(PrintWriter pw) {
+        parseArgs(/* canHaveName= */ false);
+        mService.forceRemoveActiveAdmin(mComponent, mUserId);
+        pw.printf("Success: Admin removed %s\n", mComponent);
+        return 0;
+    }
+
+    private int runSetProfileOwner(PrintWriter pw) {
+        parseArgs(/* canHaveName= */ true);
+        mService.setActiveAdmin(mComponent, /* refreshing= */ true, mUserId);
+
+        try {
+            if (!mService.setProfileOwner(mComponent, mName, mUserId)) {
+                throw new RuntimeException("Can't set component "
+                        + mComponent.flattenToShortString() + " as profile owner for user "
+                        + mUserId);
+            }
+        } catch (Exception e) {
+            // Need to remove the admin that we just added.
+            mService.removeActiveAdmin(mComponent, mUserId);
+            throw e;
+        }
+
+        mService.setUserProvisioningState(
+                DevicePolicyManager.STATE_USER_SETUP_FINALIZED, mUserId);
+
+        pw.printf("Success: Active admin and profile owner set to %s for user %d\n",
+                mComponent.flattenToShortString(), mUserId);
+        return 0;
+    }
+
+    private int runClearFreezePeriodRecord(PrintWriter pw) {
+        mService.clearSystemUpdatePolicyFreezePeriodRecord();
+        pw.printf("Success\n");
+        return 0;
+    }
+
+    private int runForceNetworkLogs(PrintWriter pw) {
+        while (true) {
+            long toWait = mService.forceNetworkLogs();
+            if (toWait == 0) {
+                break;
+            }
+            pw.printf("We have to wait for %d milliseconds...\n", toWait);
+            SystemClock.sleep(toWait);
+        }
+        pw.printf("Success\n");
+        return 0;
+    }
+
+    private int runForceSecurityLogs(PrintWriter pw) {
+        while (true) {
+            long toWait = mService.forceSecurityLogs();
+            if (toWait == 0) {
+                break;
+            }
+            pw.printf("We have to wait for %d milliseconds...\n", toWait);
+            SystemClock.sleep(toWait);
+        }
+        pw.printf("Success\n");
+        return 0;
+    }
+
+    private int runMarkProfileOwnerOnOrganizationOwnedDevice(PrintWriter pw) {
+        parseArgs(/* canHaveName= */ false);
+        mService.markProfileOwnerOnOrganizationOwnedDevice(mComponent, mUserId);
+        pw.printf("Success\n");
+        return 0;
+    }
+
+    private void parseArgs(boolean canHaveName) {
+        String opt;
+        while ((opt = getNextOption()) != null) {
+            if (USER_OPTION.equals(opt)) {
+                String arg = getNextArgRequired();
+                mUserId = UserHandle.parseUserArg(arg);
+                if (mUserId == UserHandle.USER_CURRENT) {
+                    mUserId = ActivityManager.getCurrentUser();
+                }
+            } else if (canHaveName && NAME_OPTION.equals(opt)) {
+                mName = getNextArgRequired();
+            } else {
+                throw new IllegalArgumentException("Unknown option: " + opt);
+            }
+        }
+        mComponent = parseComponentName(getNextArgRequired());
+    }
+
+    private ComponentName parseComponentName(String component) {
+        ComponentName cn = ComponentName.unflattenFromString(component);
+        if (cn == null) {
+            throw new IllegalArgumentException("Invalid component " + component);
+        }
+        return cn;
+    }
 }
diff --git a/services/incremental/BinderIncrementalService.cpp b/services/incremental/BinderIncrementalService.cpp
index f843ea4..2f031bf 100644
--- a/services/incremental/BinderIncrementalService.cpp
+++ b/services/incremental/BinderIncrementalService.cpp
@@ -335,20 +335,6 @@
     return ok();
 }
 
-binder::Status BinderIncrementalService::registerStorageHealthListener(
-        int32_t storageId,
-        const ::android::os::incremental::StorageHealthCheckParams& healthCheckParams,
-        const ::android::sp<IStorageHealthListener>& healthListener, bool* _aidl_return) {
-    *_aidl_return =
-            mImpl.registerStorageHealthListener(storageId, healthCheckParams, healthListener);
-    return ok();
-}
-
-binder::Status BinderIncrementalService::unregisterStorageHealthListener(int32_t storageId) {
-    mImpl.unregisterStorageHealthListener(storageId);
-    return ok();
-}
-
 binder::Status BinderIncrementalService::getMetrics(int32_t storageId,
                                                     android::os::PersistableBundle* _aidl_return) {
     mImpl.getMetrics(storageId, _aidl_return);
diff --git a/services/incremental/BinderIncrementalService.h b/services/incremental/BinderIncrementalService.h
index 5c8741b..39f1bcb 100644
--- a/services/incremental/BinderIncrementalService.h
+++ b/services/incremental/BinderIncrementalService.h
@@ -95,11 +95,6 @@
                     progressListener,
             bool* _aidl_return) final;
     binder::Status unregisterLoadingProgressListener(int32_t storageId, bool* _aidl_return) final;
-    binder::Status registerStorageHealthListener(
-            int32_t storageId,
-            const ::android::os::incremental::StorageHealthCheckParams& healthCheckParams,
-            const ::android::sp<IStorageHealthListener>& healthListener, bool* _aidl_return) final;
-    binder::Status unregisterStorageHealthListener(int32_t storageId) final;
     binder::Status getMetrics(int32_t storageId,
                               android::os::PersistableBundle* _aidl_return) final;
 
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 11a700c..f3e7d67 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -2189,29 +2189,6 @@
     return removeTimedJobs(*mProgressUpdateJobQueue, storage);
 }
 
-bool IncrementalService::registerStorageHealthListener(
-        StorageId storage, const StorageHealthCheckParams& healthCheckParams,
-        StorageHealthListener healthListener) {
-    DataLoaderStubPtr dataLoaderStub;
-    {
-        const auto& ifs = getIfs(storage);
-        if (!ifs) {
-            return false;
-        }
-        std::unique_lock l(ifs->lock);
-        dataLoaderStub = ifs->dataLoaderStub;
-        if (!dataLoaderStub) {
-            return false;
-        }
-    }
-    dataLoaderStub->setHealthListener(healthCheckParams, std::move(healthListener));
-    return true;
-}
-
-void IncrementalService::unregisterStorageHealthListener(StorageId storage) {
-    registerStorageHealthListener(storage, {}, {});
-}
-
 bool IncrementalService::perfLoggingEnabled() {
     static const bool enabled = base::GetBoolProperty("incremental.perflogging", false);
     return enabled;
@@ -2417,26 +2394,20 @@
 }
 
 void IncrementalService::getMetrics(StorageId storageId, android::os::PersistableBundle* result) {
-    const auto duration = getMillsSinceOldestPendingRead(storageId);
-    if (duration >= 0) {
-        const auto kMetricsMillisSinceOldestPendingRead =
-                os::incremental::BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ();
-        result->putLong(String16(kMetricsMillisSinceOldestPendingRead.data()), duration);
-    }
-}
-
-long IncrementalService::getMillsSinceOldestPendingRead(StorageId storageId) {
     const auto ifs = getIfs(storageId);
     if (!ifs) {
-        LOG(ERROR) << "getMillsSinceOldestPendingRead failed, invalid storageId: " << storageId;
-        return -EINVAL;
+        LOG(ERROR) << "getMetrics failed, invalid storageId: " << storageId;
+        return;
     }
+    const auto kMetricsReadLogsEnabled =
+            os::incremental::BnIncrementalService::METRICS_READ_LOGS_ENABLED();
+    result->putBoolean(String16(kMetricsReadLogsEnabled.data()), ifs->readLogsEnabled() != 0);
+
     std::unique_lock l(ifs->lock);
     if (!ifs->dataLoaderStub) {
-        LOG(ERROR) << "getMillsSinceOldestPendingRead failed, no data loader: " << storageId;
-        return -EINVAL;
+        return;
     }
-    return ifs->dataLoaderStub->elapsedMsSinceOldestPendingRead();
+    ifs->dataLoaderStub->getMetrics(result);
 }
 
 IncrementalService::DataLoaderStub::DataLoaderStub(
@@ -2683,9 +2654,6 @@
     }
 
     switch (targetStatus) {
-        case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE:
-            // Do nothing, this is a reset state.
-            break;
         case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: {
             switch (currentStatus) {
                 case IDataLoaderStatusListener::DATA_LOADER_BINDING:
@@ -2706,8 +2674,12 @@
         }
         case IDataLoaderStatusListener::DATA_LOADER_CREATED:
             switch (currentStatus) {
-                case IDataLoaderStatusListener::DATA_LOADER_DESTROYED:
                 case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE:
+                case IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE:
+                    // Before binding need to make sure we are unbound.
+                    // Otherwise we'll get stuck binding.
+                    return destroy();
+                case IDataLoaderStatusListener::DATA_LOADER_DESTROYED:
                 case IDataLoaderStatusListener::DATA_LOADER_BINDING:
                     return bind();
                 case IDataLoaderStatusListener::DATA_LOADER_BOUND:
@@ -2732,7 +2704,8 @@
                    << ", but got: " << mountId;
         return binder::Status::fromServiceSpecificError(-EPERM, "Mount ID mismatch.");
     }
-    if (newStatus == IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE) {
+    if (newStatus == IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE ||
+        newStatus == IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE) {
         // User-provided status, let's postpone the handling to avoid possible deadlocks.
         mService.addTimedJob(*mService.mTimedQueue, id(), Constants::userStatusDelay,
                              [this, newStatus]() { setCurrentStatus(newStatus); });
@@ -2744,7 +2717,7 @@
 }
 
 void IncrementalService::DataLoaderStub::setCurrentStatus(int newStatus) {
-    int targetStatus, oldStatus;
+    int oldStatus, oldTargetStatus, newTargetStatus;
     DataLoaderStatusListener listener;
     {
         std::unique_lock lock(mMutex);
@@ -2753,22 +2726,31 @@
         }
 
         oldStatus = mCurrentStatus;
-        targetStatus = mTargetStatus;
+        oldTargetStatus = mTargetStatus;
         listener = mStatusListener;
 
         // Change the status.
         mCurrentStatus = newStatus;
         mCurrentStatusTs = mService.mClock->now();
 
-        if (mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE ||
-            mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE) {
-            // For unavailable, unbind from DataLoader to ensure proper re-commit.
-            setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
+        switch (mCurrentStatus) {
+            case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE:
+                // Unavailable, retry.
+                setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_STARTED);
+                break;
+            case IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE:
+                // Unrecoverable, just unbind.
+                setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
+                break;
+            default:
+                break;
         }
+
+        newTargetStatus = mTargetStatus;
     }
 
     LOG(DEBUG) << "Current status update for DataLoader " << id() << ": " << oldStatus << " -> "
-               << newStatus << " (target " << targetStatus << ")";
+               << newStatus << " (target " << oldTargetStatus << " -> " << newTargetStatus << ")";
 
     if (listener) {
         listener->onStatusChanged(id(), newStatus);
@@ -2779,25 +2761,6 @@
     mStatusCondition.notify_all();
 }
 
-binder::Status IncrementalService::DataLoaderStub::reportStreamHealth(MountId mountId,
-                                                                      int newStatus) {
-    if (!isValid()) {
-        return binder::Status::
-                fromServiceSpecificError(-EINVAL,
-                                         "reportStreamHealth came to invalid DataLoaderStub");
-    }
-    if (id() != mountId) {
-        LOG(ERROR) << "reportStreamHealth: mount ID mismatch: expected " << id()
-                   << ", but got: " << mountId;
-        return binder::Status::fromServiceSpecificError(-EPERM, "Mount ID mismatch.");
-    }
-    {
-        std::lock_guard lock(mMutex);
-        mStreamStatus = newStatus;
-    }
-    return binder::Status::ok();
-}
-
 bool IncrementalService::DataLoaderStub::isHealthParamsValid() const {
     return mHealthCheckParams.blockedTimeoutMs > 0 &&
             mHealthCheckParams.blockedTimeoutMs < mHealthCheckParams.unhealthyTimeoutMs;
@@ -2809,33 +2772,7 @@
     if (healthListener) {
         healthListener->onHealthStatus(id(), healthStatus);
     }
-}
-
-static int adjustHealthStatus(int healthStatus, int streamStatus) {
-    if (healthStatus == IStorageHealthListener::HEALTH_STATUS_OK) {
-        // everything is good; no need to change status
-        return healthStatus;
-    }
-    int newHeathStatus = healthStatus;
-    switch (streamStatus) {
-        case IDataLoaderStatusListener::STREAM_STORAGE_ERROR:
-            // storage is limited and storage not healthy
-            newHeathStatus = IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE;
-            break;
-        case IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR:
-            // fall through
-        case IDataLoaderStatusListener::STREAM_SOURCE_ERROR:
-            // fall through
-        case IDataLoaderStatusListener::STREAM_TRANSPORT_ERROR:
-            if (healthStatus == IStorageHealthListener::HEALTH_STATUS_UNHEALTHY) {
-                newHeathStatus = IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT;
-            }
-            // pending/blocked status due to transportation issues is not regarded as unhealthy
-            break;
-        default:
-            break;
-    }
-    return newHeathStatus;
+    mHealthStatus = healthStatus;
 }
 
 void IncrementalService::DataLoaderStub::updateHealthStatus(bool baseline) {
@@ -2915,8 +2852,6 @@
             checkBackAfter = unhealthyMonitoring;
             healthStatusToReport = IStorageHealthListener::HEALTH_STATUS_UNHEALTHY;
         }
-        // Adjust health status based on stream status
-        healthStatusToReport = adjustHealthStatus(healthStatusToReport, mStreamStatus);
         LOG(DEBUG) << id() << ": updateHealthStatus in " << double(checkBackAfter.count()) / 1000.0
                    << "secs";
         mService.addTimedJob(*mService.mTimedQueue, id(), checkBackAfter,
@@ -3009,6 +2944,29 @@
     return result;
 }
 
+void IncrementalService::DataLoaderStub::getMetrics(android::os::PersistableBundle* result) {
+    const auto duration = elapsedMsSinceOldestPendingRead();
+    if (duration >= 0) {
+        const auto kMetricsMillisSinceOldestPendingRead =
+                os::incremental::BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ();
+        result->putLong(String16(kMetricsMillisSinceOldestPendingRead.data()), duration);
+    }
+    const auto kMetricsStorageHealthStatusCode =
+            os::incremental::BnIncrementalService::METRICS_STORAGE_HEALTH_STATUS_CODE();
+    result->putInt(String16(kMetricsStorageHealthStatusCode.data()), mHealthStatus);
+    const auto kMetricsDataLoaderStatusCode =
+            os::incremental::BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE();
+    result->putInt(String16(kMetricsDataLoaderStatusCode.data()), mCurrentStatus);
+    const auto kMetricsMillisSinceLastDataLoaderBind =
+            os::incremental::BnIncrementalService::METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND();
+    result->putLong(String16(kMetricsMillisSinceLastDataLoaderBind.data()),
+                    (long)(elapsedMcs(mPreviousBindTs, mService.mClock->now()) / 1000));
+    const auto kMetricsDataLoaderBindDelayMillis =
+            os::incremental::BnIncrementalService::METRICS_DATA_LOADER_BIND_DELAY_MILLIS();
+    result->putLong(String16(kMetricsDataLoaderBindDelayMillis.data()),
+                    (long)(mPreviousBindDelay.count()));
+}
+
 long IncrementalService::DataLoaderStub::elapsedMsSinceOldestPendingRead() {
     const auto oldestPendingReadKernelTs = getOldestTsFromLastPendingReads();
     if (oldestPendingReadKernelTs == kMaxBootClockTsUs) {
@@ -3078,7 +3036,7 @@
         dprintf(fd, "          bootClockTsUs: %lld\n", (long long)pendingRead.bootClockTsUs);
     }
     dprintf(fd, "        bind: %llds ago (delay: %llds)\n",
-            (long long)(elapsedMcs(mPreviousBindTs, Clock::now()) / 1000000),
+            (long long)(elapsedMcs(mPreviousBindTs, mService.mClock->now()) / 1000000),
             (long long)(mPreviousBindDelay.count() / 1000));
     dprintf(fd, "      }\n");
     const auto& params = mParams;
diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h
index e3b1e6f..8dc789f 100644
--- a/services/incremental/IncrementalService.h
+++ b/services/incremental/IncrementalService.h
@@ -189,10 +189,7 @@
     bool registerLoadingProgressListener(StorageId storage,
                                          StorageLoadingProgressListener progressListener);
     bool unregisterLoadingProgressListener(StorageId storage);
-    bool registerStorageHealthListener(StorageId storage,
-                                       const StorageHealthCheckParams& healthCheckParams,
-                                       StorageHealthListener healthListener);
-    void unregisterStorageHealthListener(StorageId storage);
+
     RawMetadata getMetadata(StorageId storage, std::string_view path) const;
     RawMetadata getMetadata(StorageId storage, FileId node) const;
 
@@ -252,11 +249,10 @@
         bool isSystemDataLoader() const;
         void setHealthListener(const StorageHealthCheckParams& healthCheckParams,
                                StorageHealthListener&& healthListener);
-        long elapsedMsSinceOldestPendingRead();
+        void getMetrics(android::os::PersistableBundle* _aidl_return);
 
     private:
         binder::Status onStatusChanged(MountId mount, int newStatus) final;
-        binder::Status reportStreamHealth(MountId mount, int newStatus) final;
 
         void setCurrentStatus(int newStatus);
 
@@ -285,6 +281,7 @@
         BootClockTsUs getOldestPendingReadTs();
         BootClockTsUs getOldestTsFromLastPendingReads();
         Milliseconds elapsedMsSinceKernelTs(TimePoint now, BootClockTsUs kernelTsUs);
+        long elapsedMsSinceOldestPendingRead();
 
         // If the stub has to bind to the DL.
         // Returns {} if bind operation is already in progress.
@@ -302,6 +299,7 @@
         content::pm::FileSystemControlParcel mControl;
         DataLoaderStatusListener mStatusListener;
         StorageHealthListener mHealthListener;
+        std::atomic<int> mHealthStatus = IStorageHealthListener::HEALTH_STATUS_OK;
 
         std::condition_variable mStatusCondition;
         int mCurrentStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
@@ -319,7 +317,6 @@
             BootClockTsUs kernelTsUs;
         } mHealthBase = {TimePoint::max(), kMaxBootClockTsUs};
         StorageHealthCheckParams mHealthCheckParams;
-        int mStreamStatus = content::pm::IDataLoaderStatusListener::STREAM_HEALTHY;
         std::vector<incfs::ReadInfoWithUid> mLastPendingReads;
     };
     using DataLoaderStubPtr = sp<DataLoaderStub>;
@@ -473,7 +470,6 @@
 
     bool updateLoadingProgress(int32_t storageId,
                                StorageLoadingProgressListener&& progressListener);
-    long getMillsSinceOldestPendingRead(StorageId storage);
 
     void trimReservedSpaceV1(const IncFsMount& ifs);
 
diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp
index 14bcd4e..68586a8 100644
--- a/services/incremental/test/IncrementalServiceTest.cpp
+++ b/services/incremental/test/IncrementalServiceTest.cpp
@@ -126,7 +126,7 @@
 class MockDataLoader : public IDataLoader {
 public:
     MockDataLoader() {
-        ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
+        initializeCreateOk();
         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));
@@ -145,6 +145,10 @@
                  binder::Status(int32_t id, const std::vector<InstallationFileParcel>& addedFiles,
                                 const std::vector<std::string>& removedFiles));
 
+    void initializeCreateOk() {
+        ON_CALL(*this, create(_, _, _, _)).WillByDefault(Invoke(this, &MockDataLoader::createOk));
+    }
+
     void initializeCreateOkNoStatus() {
         ON_CALL(*this, create(_, _, _, _))
                 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
@@ -184,18 +188,6 @@
         setAndReportStatus(id, IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY);
         return binder::Status::ok();
     }
-    binder::Status storageError(int32_t id) {
-        if (mListener) {
-            mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_STORAGE_ERROR);
-        }
-        return binder::Status::ok();
-    }
-    binder::Status transportError(int32_t id) {
-        if (mListener) {
-            mListener->reportStreamHealth(id, IDataLoaderStatusListener::STREAM_INTEGRITY_ERROR);
-        }
-        return binder::Status::ok();
-    }
     int32_t setStorageParams(bool enableReadLogs) {
         int32_t result = -1;
         EXPECT_NE(mServiceConnector.get(), nullptr);
@@ -287,6 +279,14 @@
         }
         return binder::Status::ok();
     }
+    binder::Status bindToDataLoaderOkWithNoDelay(int32_t mountId,
+                                                 const DataLoaderParamsParcel& params,
+                                                 int bindDelayMs,
+                                                 const sp<IDataLoaderStatusListener>& listener,
+                                                 bool* _aidl_return) {
+        CHECK(bindDelayMs == 0) << bindDelayMs;
+        return bindToDataLoaderOk(mountId, params, bindDelayMs, listener, _aidl_return);
+    }
     binder::Status bindToDataLoaderOkWith1sDelay(int32_t mountId,
                                                  const DataLoaderParamsParcel& params,
                                                  int bindDelayMs,
@@ -350,14 +350,13 @@
         mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE);
     }
     binder::Status unbindFromDataLoaderOk(int32_t id) {
+        mBindDelayMs = -1;
         if (mDataLoader) {
             if (auto status = mDataLoader->destroy(id); !status.isOk()) {
                 return status;
             }
             mDataLoader = nullptr;
-        }
-        mBindDelayMs = -1;
-        if (mListener) {
+        } else if (mListener) {
             mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
         }
         return binder::Status::ok();
@@ -787,16 +786,53 @@
         mDataLoaderManager->getDataLoaderSuccess();
     }
 
-    void checkMillisSinceOldestPendingRead(int storageId, long expected) {
+    void checkHealthMetrics(int storageId, long expectedMillisSinceOldestPendingRead,
+                            int expectedStorageHealthStatusCode) {
         android::os::PersistableBundle result{};
         mIncrementalService->getMetrics(storageId, &result);
-        int64_t value = -1;
+        ASSERT_EQ(6, (int)result.size());
+        int64_t millisSinceOldestPendingRead = -1;
         ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
                                                     METRICS_MILLIS_SINCE_OLDEST_PENDING_READ()
                                                             .c_str()),
-                                   &value));
-        ASSERT_EQ(expected, value);
-        ASSERT_EQ(1, (int)result.size());
+                                   &millisSinceOldestPendingRead));
+        ASSERT_EQ(expectedMillisSinceOldestPendingRead, millisSinceOldestPendingRead);
+        int storageHealthStatusCode = -1;
+        ASSERT_TRUE(
+                result.getInt(String16(BnIncrementalService::METRICS_STORAGE_HEALTH_STATUS_CODE()
+                                               .c_str()),
+                              &storageHealthStatusCode));
+        ASSERT_EQ(expectedStorageHealthStatusCode, storageHealthStatusCode);
+        int dataLoaderStatusCode = -1;
+        ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
+                                                   .c_str()),
+                                  &dataLoaderStatusCode));
+        ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatusCode);
+    }
+
+    void checkBindingMetrics(int storageId, int64_t expectedMillisSinceLastDataLoaderBind,
+                             int64_t expectedDataLoaderBindDelayMillis) {
+        android::os::PersistableBundle result{};
+        mIncrementalService->getMetrics(storageId, &result);
+        ASSERT_EQ(6, (int)result.size());
+        int dataLoaderStatus = -1;
+        ASSERT_TRUE(result.getInt(String16(BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE()
+                                                   .c_str()),
+                                  &dataLoaderStatus));
+        ASSERT_EQ(IDataLoaderStatusListener::DATA_LOADER_STARTED, dataLoaderStatus);
+        int64_t millisSinceLastDataLoaderBind = -1;
+        ASSERT_TRUE(result.getLong(String16(BnIncrementalService::
+                                                    METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND()
+                                                            .c_str()),
+                                   &millisSinceLastDataLoaderBind));
+        ASSERT_EQ(expectedMillisSinceLastDataLoaderBind, millisSinceLastDataLoaderBind);
+        int64_t dataLoaderBindDelayMillis = -1;
+        ASSERT_TRUE(
+                result.getLong(String16(
+                                       BnIncrementalService::METRICS_DATA_LOADER_BIND_DELAY_MILLIS()
+                                               .c_str()),
+                               &dataLoaderBindDelayMillis));
+        ASSERT_EQ(expectedDataLoaderBindDelayMillis, dataLoaderBindDelayMillis);
     }
 
 protected:
@@ -916,38 +952,55 @@
     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
             .WillByDefault(Invoke(mDataLoaderManager,
                                   &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
+    checkBindingMetrics(storageId, 0, 0);
     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
+    checkBindingMetrics(storageId, 0, 0);
     mDataLoaderManager->setDataLoaderStatusDestroyed();
 
     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
             .WillByDefault(Invoke(mDataLoaderManager,
                                   &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
+    checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
+    checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
+                        mDataLoaderManager->bindDelayMs());
     mDataLoaderManager->setDataLoaderStatusDestroyed();
 
     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
             .WillByDefault(Invoke(mDataLoaderManager,
                                   &MockDataLoaderManager::bindToDataLoaderOkWith100sDelay));
+    checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
+    checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
+                        mDataLoaderManager->bindDelayMs());
     mDataLoaderManager->setDataLoaderStatusDestroyed();
 
     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
             .WillByDefault(Invoke(mDataLoaderManager,
                                   &MockDataLoaderManager::bindToDataLoaderOkWith1000sDelay));
+    checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
+    checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
+                        mDataLoaderManager->bindDelayMs());
     mDataLoaderManager->setDataLoaderStatusDestroyed();
 
     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
             .WillByDefault(Invoke(mDataLoaderManager,
                                   &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
+    checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
     // Try the reduced delay, just in case.
     mClock->advanceMs(mDataLoaderManager->bindDelayMs() / 2);
+    checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs() / 2,
+                        mDataLoaderManager->bindDelayMs());
     mDataLoaderManager->setDataLoaderStatusDestroyed();
 
     ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
             .WillByDefault(Invoke(mDataLoaderManager,
                                   &MockDataLoaderManager::bindToDataLoaderOkWith10000sDelay));
+    checkBindingMetrics(storageId, 0, mDataLoaderManager->bindDelayMs());
     mClock->advanceMs(mDataLoaderManager->bindDelayMs());
+    checkBindingMetrics(storageId, mDataLoaderManager->bindDelayMs(),
+                        mDataLoaderManager->bindDelayMs());
     mDataLoaderManager->setDataLoaderStatusDestroyed();
 }
 
@@ -1168,12 +1221,81 @@
     ASSERT_GE(storageId, 0);
     ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
                                                   {}, {}));
-    mDataLoaderManager->setDataLoaderStatusUnavailable();
+    mDataLoaderManager->setDataLoaderStatusUnrecoverable();
+
+    // Timed callback present.
+    ASSERT_EQ(storageId, mTimedQueue->mId);
+    ASSERT_GE(mTimedQueue->mAfter, 10ms);
+    auto timedCallback = mTimedQueue->mWhat;
+    mTimedQueue->clearJob(storageId);
+
+    // First callback call to propagate unrecoverable.
+    timedCallback();
+
+    // And second call to trigger recreation.
     ASSERT_NE(nullptr, mLooper->mCallback);
     ASSERT_NE(nullptr, mLooper->mCallbackData);
     mLooper->mCallback(-1, -1, mLooper->mCallbackData);
 }
 
+TEST_F(IncrementalServiceTest, testStartDataLoaderUnavailable) {
+    mIncFs->openMountSuccess();
+    mDataLoader->initializeCreateOkNoStatus();
+
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _)).Times(3);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(3);
+    EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(3);
+    EXPECT_CALL(*mDataLoader, start(_)).Times(1);
+    EXPECT_CALL(*mDataLoader, destroy(_)).Times(2);
+    EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
+    EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1);
+    EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1);
+    TemporaryDir tempDir;
+    int storageId =
+            mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
+                                               IncrementalService::CreateOptions::CreateNew);
+    ASSERT_GE(storageId, 0);
+
+    ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
+            .WillByDefault(Invoke(mDataLoaderManager,
+                                  &MockDataLoaderManager::bindToDataLoaderOkWithNoDelay));
+
+    ASSERT_TRUE(mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {},
+                                                  {}, {}));
+
+    // Unavailable.
+    mDataLoaderManager->setDataLoaderStatusUnavailable();
+
+    // Timed callback present.
+    ASSERT_EQ(storageId, mTimedQueue->mId);
+    ASSERT_GE(mTimedQueue->mAfter, 10ms);
+    auto timedCallback = mTimedQueue->mWhat;
+    mTimedQueue->clearJob(storageId);
+
+    // Propagating unavailable and expecting it to trigger rebind with 1s retry delay.
+    ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
+            .WillByDefault(Invoke(mDataLoaderManager,
+                                  &MockDataLoaderManager::bindToDataLoaderOkWith1sDelay));
+    timedCallback();
+
+    // Unavailable #2.
+    mDataLoaderManager->setDataLoaderStatusUnavailable();
+
+    // Timed callback present.
+    ASSERT_EQ(storageId, mTimedQueue->mId);
+    ASSERT_GE(mTimedQueue->mAfter, 10ms);
+    timedCallback = mTimedQueue->mWhat;
+    mTimedQueue->clearJob(storageId);
+
+    // Propagating unavailable and expecting it to trigger rebind with 10s retry delay.
+    // This time succeed.
+    mDataLoader->initializeCreateOk();
+    ON_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _, _))
+            .WillByDefault(Invoke(mDataLoaderManager,
+                                  &MockDataLoaderManager::bindToDataLoaderOkWith10sDelay));
+    timedCallback();
+}
+
 TEST_F(IncrementalServiceTest, testStartDataLoaderUnhealthyStorage) {
     mIncFs->openMountSuccess();
 
@@ -1230,7 +1352,7 @@
     ASSERT_NE(nullptr, mLooper->mCallbackData);
     ASSERT_EQ(storageId, listener->mStorageId);
     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
-    checkMillisSinceOldestPendingRead(storageId, 0);
+    checkHealthMetrics(storageId, 0, listener->mStatus);
 
     // Looper/epoll callback.
     mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
@@ -1256,7 +1378,7 @@
     ASSERT_EQ(nullptr, mLooper->mCallbackData);
     ASSERT_EQ(storageId, listener->mStorageId);
     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, listener->mStatus);
-    checkMillisSinceOldestPendingRead(storageId, params.blockedTimeoutMs);
+    checkHealthMetrics(storageId, params.blockedTimeoutMs, listener->mStatus);
 
     // Timed callback present.
     ASSERT_EQ(storageId, mTimedQueue->mId);
@@ -1273,7 +1395,7 @@
     ASSERT_EQ(nullptr, mLooper->mCallbackData);
     ASSERT_EQ(storageId, listener->mStorageId);
     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
-    checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
+    checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
 
     // Timed callback present.
     ASSERT_EQ(storageId, mTimedQueue->mId);
@@ -1290,7 +1412,7 @@
     ASSERT_EQ(nullptr, mLooper->mCallbackData);
     ASSERT_EQ(storageId, listener->mStorageId);
     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY, listener->mStatus);
-    checkMillisSinceOldestPendingRead(storageId, params.unhealthyTimeoutMs);
+    checkHealthMetrics(storageId, params.unhealthyTimeoutMs, listener->mStatus);
 
     // Timed callback present.
     ASSERT_EQ(storageId, mTimedQueue->mId);
@@ -1307,7 +1429,7 @@
     ASSERT_NE(nullptr, mLooper->mCallbackData);
     ASSERT_EQ(storageId, listener->mStorageId);
     ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_OK, listener->mStatus);
-    checkMillisSinceOldestPendingRead(storageId, 0);
+    checkHealthMetrics(storageId, 0, listener->mStatus);
 }
 
 TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) {
@@ -1904,87 +2026,6 @@
     ASSERT_EQ(mDataLoader->status(), IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
 }
 
-TEST_F(IncrementalServiceTest, testRegisterStorageHealthListenerSuccess) {
-    mIncFs->openMountSuccess();
-    sp<NiceMock<MockStorageHealthListener>> listener{new NiceMock<MockStorageHealthListener>};
-    sp<NiceMock<MockStorageHealthListener>> newListener{new NiceMock<MockStorageHealthListener>};
-    NiceMock<MockStorageHealthListener>* newListenerMock = newListener.get();
-
-    TemporaryDir tempDir;
-    int storageId =
-            mIncrementalService->createStorage(tempDir.path, mDataLoaderParcel,
-                                               IncrementalService::CreateOptions::CreateNew);
-    ASSERT_GE(storageId, 0);
-    mIncrementalService->startLoading(storageId, std::move(mDataLoaderParcel), {}, {}, listener,
-                                      {});
-
-    StorageHealthCheckParams newParams;
-    newParams.blockedTimeoutMs = 10000;
-    newParams.unhealthyTimeoutMs = 20000;
-    newParams.unhealthyMonitoringMs = 30000;
-    ASSERT_TRUE(mIncrementalService->registerStorageHealthListener(storageId, std::move(newParams),
-                                                                   newListener));
-
-    using MS = std::chrono::milliseconds;
-    using MCS = std::chrono::microseconds;
-
-    const auto blockedTimeout = MS(newParams.blockedTimeoutMs);
-    const auto unhealthyTimeout = MS(newParams.unhealthyTimeoutMs);
-
-    const uint64_t kFirstTimestampUs = 1000000000ll;
-    const uint64_t kBlockedTimestampUs =
-            kFirstTimestampUs - std::chrono::duration_cast<MCS>(blockedTimeout).count();
-    const uint64_t kUnhealthyTimestampUs =
-            kFirstTimestampUs - std::chrono::duration_cast<MCS>(unhealthyTimeout).count();
-
-    // test that old listener was not called
-    EXPECT_CALL(*listener.get(),
-                onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
-            .Times(0);
-    EXPECT_CALL(*newListenerMock,
-                onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_READS_PENDING))
-            .Times(1);
-    EXPECT_CALL(*newListenerMock, onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_BLOCKED))
-            .Times(1);
-    EXPECT_CALL(*newListenerMock,
-                onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE))
-            .Times(1);
-    EXPECT_CALL(*newListenerMock,
-                onHealthStatus(_, IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT))
-            .Times(1);
-    mIncFs->waitForPendingReadsSuccess(kFirstTimestampUs);
-    mLooper->mCallback(-1, -1, mLooper->mCallbackData);
-
-    ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_READS_PENDING, newListener->mStatus);
-    ASSERT_EQ(storageId, newListener->mStorageId);
-
-    auto timedCallback = mTimedQueue->mWhat;
-    mTimedQueue->clearJob(storageId);
-
-    // test when health status is blocked with transport error
-    mDataLoader->transportError(storageId);
-    mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
-    timedCallback();
-    ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_BLOCKED, newListener->mStatus);
-    timedCallback = mTimedQueue->mWhat;
-    mTimedQueue->clearJob(storageId);
-
-    // test when health status is blocked with storage error
-    mDataLoader->storageError(storageId);
-    mIncFs->waitForPendingReadsSuccess(kBlockedTimestampUs);
-    timedCallback();
-    ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_STORAGE, newListener->mStatus);
-    timedCallback = mTimedQueue->mWhat;
-    mTimedQueue->clearJob(storageId);
-
-    // test when health status is unhealthy with transport error
-    mDataLoader->transportError(storageId);
-    mIncFs->waitForPendingReadsSuccess(kUnhealthyTimestampUs);
-    timedCallback();
-    ASSERT_EQ(IStorageHealthListener::HEALTH_STATUS_UNHEALTHY_TRANSPORT, newListener->mStatus);
-    mTimedQueue->clearJob(storageId);
-}
-
 static std::vector<PerUidReadTimeouts> createPerUidTimeouts(
         std::initializer_list<std::tuple<int, int, int, int>> tuples) {
     std::vector<PerUidReadTimeouts> result;
@@ -2118,7 +2159,7 @@
     ASSERT_TRUE(result.empty());
 }
 
-TEST_F(IncrementalServiceTest, testNoMetrics) {
+TEST_F(IncrementalServiceTest, testNoDataLoaderMetrics) {
     mVold->setIncFsMountOptionsSuccess();
     TemporaryDir tempDir;
     int storageId =
@@ -2133,7 +2174,12 @@
                                             .c_str()),
                            &value));
     ASSERT_EQ(expected, value);
-    ASSERT_EQ(0, (int)result.size());
+    ASSERT_EQ(1, (int)result.size());
+    bool expectedReadLogsEnabled = false;
+    ASSERT_TRUE(
+            result.getBoolean(String16(BnIncrementalService::METRICS_READ_LOGS_ENABLED().c_str()),
+                              &expectedReadLogsEnabled));
+    ASSERT_EQ(mVold->readLogsEnabled(), expectedReadLogsEnabled);
 }
 
 TEST_F(IncrementalServiceTest, testInvalidMetricsKeys) {
@@ -2150,7 +2196,7 @@
     int64_t expected = -1, value = -1;
     ASSERT_FALSE(result.getLong(String16("invalid"), &value));
     ASSERT_EQ(expected, value);
-    ASSERT_EQ(1, (int)result.size());
+    ASSERT_EQ(6, (int)result.size());
 }
 
 } // namespace android::os::incremental
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 4c4c582..8dc5011 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -108,7 +108,6 @@
 import com.android.server.audio.AudioService;
 import com.android.server.biometrics.AuthService;
 import com.android.server.biometrics.BiometricService;
-import com.android.server.biometrics.sensors.BiometricServiceCallback;
 import com.android.server.biometrics.sensors.face.FaceService;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
 import com.android.server.biometrics.sensors.iris.IrisService;
@@ -214,11 +213,9 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Locale;
 import java.util.Timer;
 import java.util.TreeSet;
@@ -2334,12 +2331,10 @@
             final boolean hasFeatureFingerprint
                     = mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
 
-            final List<BiometricServiceCallback> biometricServiceCallback = new ArrayList<>();
             if (hasFeatureFace) {
                 t.traceBegin("StartFaceSensor");
                 final FaceService faceService =
                         mSystemServiceManager.startService(FaceService.class);
-                biometricServiceCallback.add(faceService);
                 t.traceEnd();
             }
 
@@ -2353,18 +2348,12 @@
                 t.traceBegin("StartFingerprintSensor");
                 final FingerprintService fingerprintService =
                         mSystemServiceManager.startService(FingerprintService.class);
-                biometricServiceCallback.add(fingerprintService);
                 t.traceEnd();
             }
 
             // Start this service after all biometric sensor services are started.
             t.traceBegin("StartBiometricService");
             mSystemServiceManager.startService(BiometricService.class);
-            for (BiometricServiceCallback service : biometricServiceCallback) {
-                Slog.d(TAG, "Notifying onBiometricServiceReady for: "
-                        + service.getClass().getSimpleName());
-                service.onBiometricServiceReady();
-            }
             t.traceEnd();
 
             t.traceBegin("StartAuthService");
@@ -2731,13 +2720,6 @@
                 t.traceEnd();
             }
 
-            t.traceBegin("StartSystemUI");
-            try {
-                startSystemUi(context, windowManagerF);
-            } catch (Throwable e) {
-                reportWtf("starting System UI", e);
-            }
-            t.traceEnd();
             // Enable airplane mode in safe mode. setAirplaneMode() cannot be called
             // earlier as it sends broadcasts to other services.
             // TODO: This may actually be too late if radio firmware already started leaking
@@ -2939,6 +2921,14 @@
             }
         }, t);
 
+        t.traceBegin("StartSystemUI");
+        try {
+            startSystemUi(context, windowManagerF);
+        } catch (Throwable e) {
+            reportWtf("starting System UI", e);
+        }
+        t.traceEnd();
+
         t.traceEnd(); // startOtherServices
     }
 
diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
index 1208ecc..9706d7f 100644
--- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
+++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
@@ -23,11 +23,13 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ResolveInfo;
 import android.os.Handler;
 import android.os.IBinder.DeathRecipient;
 import android.os.Looper;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.os.SystemProperties;
 import android.os.UpdateEngine;
 import android.os.UpdateEngineCallback;
 import android.os.UserHandle;
@@ -42,6 +44,9 @@
 import com.android.server.wm.ActivityMetricsLaunchObserverRegistry;
 import com.android.server.wm.ActivityTaskManagerInternal;
 
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
@@ -75,7 +80,7 @@
      */
     public static boolean enabled() {
         return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, "enabled",
-            false);
+            false) || SystemProperties.getBoolean("persist.profcollectd.enabled_override", false);
     }
 
     @Override
@@ -297,24 +302,20 @@
             return;
         }
 
-        final boolean uploadReport =
-                DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT,
-                                        "upload_report", false);
-
         new Thread(() -> {
             try {
                 String reportUuid = mIProfcollect.report();
 
-                if (!uploadReport) {
+                final int profileId = getBBProfileId();
+                String reportDir = "/data/user/" + profileId
+                        + "/com.google.android.apps.internal.betterbug/cache/";
+                String reportPath = reportDir + reportUuid + ".zip";
+
+                if (!Files.exists(Paths.get(reportDir))) {
+                    Log.i(LOG_TAG, "Destination directory does not exist, abort upload.");
                     return;
                 }
 
-                final int profileId = getBBProfileId();
-                mIProfcollect.copy_report_to_bb(profileId, reportUuid);
-                String reportPath =
-                        "/data/user/" + profileId
-                        + "/com.google.android.apps.internal.betterbug/cache/"
-                        + reportUuid + ".zip";
                 Intent uploadIntent =
                         new Intent("com.google.android.apps.betterbug.intent.action.UPLOAD_PROFILE")
                         .setPackage("com.google.android.apps.internal.betterbug")
@@ -323,9 +324,15 @@
                         .putExtra("EXTRA_PROFILE_PATH", reportPath)
                         .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
                 Context context = getContext();
-                if (context.getPackageManager().queryBroadcastReceivers(uploadIntent, 0) != null) {
-                    context.sendBroadcast(uploadIntent);
+
+                List<ResolveInfo> receivers =
+                        context.getPackageManager().queryBroadcastReceivers(uploadIntent, 0);
+                if (receivers == null || receivers.isEmpty()) {
+                    Log.i(LOG_TAG, "No one to receive upload intent, abort upload.");
+                    return;
                 }
+                mIProfcollect.copy_report_to_bb(profileId, reportUuid);
+                context.sendBroadcast(uploadIntent);
                 mIProfcollect.delete_report(reportUuid);
             } catch (RemoteException e) {
                 Log.e(LOG_TAG, e.getMessage());
diff --git a/services/smartspace/java/com/android/server/smartspace/SmartspaceManagerService.java b/services/smartspace/java/com/android/server/smartspace/SmartspaceManagerService.java
index b07fe19..39ed4dd 100644
--- a/services/smartspace/java/com/android/server/smartspace/SmartspaceManagerService.java
+++ b/services/smartspace/java/com/android/server/smartspace/SmartspaceManagerService.java
@@ -156,7 +156,7 @@
                 @NonNull final Consumer<SmartspacePerUserService> c) {
             ActivityManagerInternal am = LocalServices.getService(ActivityManagerInternal.class);
             final int userId = am.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
-                    sessionId.getUserId(), false, ALLOW_NON_FULL, null, null);
+                    sessionId.getUserHandle().getIdentifier(), false, ALLOW_NON_FULL, null, null);
 
             if (DEBUG) {
                 Slog.d(TAG, "runForUserLocked:" + func + " from pid=" + Binder.getCallingPid()
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index d55bbd1..64dad7f 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -15,6 +15,7 @@
  */
 package com.android.server.alarm;
 
+import static android.Manifest.permission.SCHEDULE_EXACT_ALARM;
 import static android.app.AlarmManager.ELAPSED_REALTIME;
 import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
 import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE;
@@ -50,10 +51,15 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 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.alarm.Alarm.EXACT_ALLOW_REASON_ALLOW_LIST;
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_COMPAT;
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_NOT_APPLICABLE;
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_PERMISSION;
 import static com.android.server.alarm.AlarmManagerService.ACTIVE_INDEX;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.APP_STANDBY_BUCKET_CHANGED;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.CHARGING_STATUS_CHANGED;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.EXACT_ALARM_DENY_LIST_CHANGED;
+import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REFRESH_EXACT_ALARM_CANDIDATES;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_ALARMS;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_FOR_CANCELED;
 import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_COMPAT_QUOTA;
@@ -74,6 +80,7 @@
 import static com.android.server.alarm.AlarmManagerService.FREQUENT_INDEX;
 import static com.android.server.alarm.AlarmManagerService.INDEFINITE_DELAY;
 import static com.android.server.alarm.AlarmManagerService.IS_WAKEUP_MASK;
+import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_UNDEFINED;
 import static com.android.server.alarm.AlarmManagerService.TIME_CHANGED_MASK;
 import static com.android.server.alarm.AlarmManagerService.WORKING_INDEX;
 import static com.android.server.alarm.Constants.TEST_CALLING_PACKAGE;
@@ -99,7 +106,6 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
-import android.Manifest;
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
 import android.app.AlarmManager;
@@ -114,7 +120,6 @@
 import android.app.usage.UsageStatsManagerInternal;
 import android.content.Context;
 import android.content.Intent;
-import android.content.PermissionChecker;
 import android.content.pm.PackageManagerInternal;
 import android.os.BatteryManager;
 import android.os.Bundle;
@@ -139,14 +144,18 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.app.IAppOpsCallback;
 import com.android.internal.app.IAppOpsService;
+import com.android.internal.util.ArrayUtils;
 import com.android.server.AlarmManagerInternal;
 import com.android.server.AppStateTracker;
 import com.android.server.AppStateTrackerImpl;
 import com.android.server.DeviceIdleInternal;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
+import com.android.server.pm.permission.PermissionManagerServiceInternal;
 import com.android.server.usage.AppStandbyInternal;
 
+import libcore.util.EmptyArray;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -160,6 +169,7 @@
 import org.mockito.stubbing.Answer;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -176,6 +186,7 @@
     private long mAllowWhileIdleWindow;
     private AlarmManagerService mService;
     private AppStandbyInternal.AppIdleStateChangeListener mAppStandbyListener;
+    private AlarmManagerService.UninstallReceiver mPackageChangesReceiver;
     private AlarmManagerService.ChargingReceiver mChargingReceiver;
     private IAppOpsCallback mIAppOpsCallback;
     private IAlarmManager mBinder;
@@ -190,6 +201,8 @@
     @Mock
     private DeviceIdleInternal mDeviceIdleInternal;
     @Mock
+    private PermissionManagerServiceInternal mPermissionManagerInternal;
+    @Mock
     private UsageStatsManagerInternal mUsageStatsManagerInternal;
     @Mock
     private AppStandbyInternal mAppStandbyInternal;
@@ -351,7 +364,7 @@
                 .spyStatic(DeviceConfig.class)
                 .mockStatic(LocalServices.class)
                 .spyStatic(Looper.class)
-                .mockStatic(PermissionChecker.class)
+                .mockStatic(MetricsHelper.class)
                 .mockStatic(Settings.Global.class)
                 .mockStatic(ServiceManager.class)
                 .spyStatic(UserHandle.class)
@@ -361,6 +374,8 @@
         doReturn(mIActivityManager).when(ActivityManager::getService);
         doReturn(mDeviceIdleInternal).when(
                 () -> LocalServices.getService(DeviceIdleInternal.class));
+        doReturn(mPermissionManagerInternal).when(
+                () -> LocalServices.getService(PermissionManagerServiceInternal.class));
         doReturn(mActivityManagerInternal).when(
                 () -> LocalServices.getService(ActivityManagerInternal.class));
         doReturn(mPackageManagerInternal).when(
@@ -399,14 +414,19 @@
 
         when(mMockContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
 
-        when(mPackageManagerInternal.getPackageUid(eq(TEST_CALLING_PACKAGE), anyInt(),
-                eq(TEST_CALLING_USER))).thenReturn(TEST_CALLING_UID);
+        registerAppIds(new String[]{TEST_CALLING_PACKAGE},
+                new Integer[]{UserHandle.getAppId(TEST_CALLING_UID)});
+        when(mPermissionManagerInternal.getAppOpPermissionPackages(
+                SCHEDULE_EXACT_ALARM)).thenReturn(EmptyArray.STRING);
 
         mInjector = new Injector(mMockContext);
         mService = new AlarmManagerService(mMockContext, mInjector);
         spyOn(mService);
 
         mService.onStart();
+        // Unable to mock mMockContext to return a mock stats manager.
+        // So just mocking the whole MetricsHelper instance.
+        mService.mMetricsHelper = mock(MetricsHelper.class);
         spyOn(mService.mHandler);
         // Stubbing the handler. Test should simulate any handling of messages synchronously.
         doReturn(true).when(mService.mHandler).sendMessageAtTime(any(Message.class), anyLong());
@@ -424,13 +444,22 @@
         verify(mAppStandbyInternal).addListener(captor.capture());
         mAppStandbyListener = captor.getValue();
 
-        ArgumentCaptor<AlarmManagerService.ChargingReceiver> chargingReceiverCaptor =
+        final ArgumentCaptor<AlarmManagerService.ChargingReceiver> chargingReceiverCaptor =
                 ArgumentCaptor.forClass(AlarmManagerService.ChargingReceiver.class);
         verify(mMockContext).registerReceiver(chargingReceiverCaptor.capture(),
                 argThat((filter) -> filter.hasAction(BatteryManager.ACTION_CHARGING)
                         && filter.hasAction(BatteryManager.ACTION_DISCHARGING)));
         mChargingReceiver = chargingReceiverCaptor.getValue();
 
+        final ArgumentCaptor<AlarmManagerService.UninstallReceiver> packageReceiverCaptor =
+                ArgumentCaptor.forClass(AlarmManagerService.UninstallReceiver.class);
+        verify(mMockContext).registerReceiver(packageReceiverCaptor.capture(),
+                argThat((filter) -> filter.hasAction(Intent.ACTION_PACKAGE_ADDED)
+                        && filter.hasAction(Intent.ACTION_PACKAGE_REMOVED)));
+        mPackageChangesReceiver = packageReceiverCaptor.getValue();
+
+        assertEquals(mService.mExactAlarmCandidates, Collections.emptySet());
+
         ArgumentCaptor<IBinder> binderCaptor = ArgumentCaptor.forClass(IBinder.class);
         verify(() -> ServiceManager.addService(eq(Context.ALARM_SERVICE), binderCaptor.capture(),
                 anyBoolean(), anyInt()));
@@ -472,7 +501,7 @@
             IAlarmListener listener) {
         mService.setImpl(type, triggerTime, windowLength, 0, null, listener, "test",
                 FLAG_STANDALONE | FLAG_PRIORITIZE, null, null, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE, null);
+                TEST_CALLING_PACKAGE, null, 0);
     }
 
     private void setAllowWhileIdleAlarm(int type, long triggerTime, PendingIntent pi,
@@ -496,12 +525,12 @@
             PendingIntent operation, long interval, int flags, int callingUid,
             String callingPackage, Bundle idleOptions) {
         mService.setImpl(type, triggerTime, windowLength, interval, operation, null, "test", flags,
-                null, null, callingUid, callingPackage, idleOptions);
+                null, null, callingUid, callingPackage, idleOptions, 0);
     }
 
     private void setTestAlarmWithListener(int type, long triggerTime, IAlarmListener listener) {
         mService.setImpl(type, triggerTime, WINDOW_EXACT, 0, null, listener, "test",
-                FLAG_STANDALONE, null, null, TEST_CALLING_UID, TEST_CALLING_PACKAGE, null);
+                FLAG_STANDALONE, null, null, TEST_CALLING_UID, TEST_CALLING_PACKAGE, null, 0);
     }
 
 
@@ -743,10 +772,10 @@
         setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 6, pi6);
         assertEquals(mNowElapsedTest + 6, mTestTimer.getElapsed());
 
-        mService.removeLocked(pi6, null);
+        mService.removeLocked(pi6, null, REMOVE_REASON_UNDEFINED);
         assertEquals(mNowElapsedTest + 8, mTestTimer.getElapsed());
 
-        mService.removeLocked(pi8, null);
+        mService.removeLocked(pi8, null, REMOVE_REASON_UNDEFINED);
         assertEquals(mNowElapsedTest + 9, mTestTimer.getElapsed());
     }
 
@@ -927,7 +956,8 @@
 
     private void assertAndHandleMessageSync(int what) {
         final ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mService.mHandler, atLeastOnce()).sendMessage(messageCaptor.capture());
+        verify(mService.mHandler, atLeastOnce()).sendMessageAtTime(messageCaptor.capture(),
+                anyLong());
         final Message lastMessage = messageCaptor.getValue();
         assertEquals("Unexpected message send to handler", lastMessage.what,
                 what);
@@ -1223,7 +1253,8 @@
             setTestAlarm(ELAPSED_REALTIME, mNowElapsedTest + i + 10, getNewMockPendingIntent());
         }
         assertEquals(numAlarms, mService.mAlarmsPerUid.get(TEST_CALLING_UID));
-        mService.removeLocked(TEST_CALLING_UID);
+        mService.removeLocked(TEST_CALLING_UID,
+                REMOVE_REASON_UNDEFINED);
         assertEquals(0, mService.mAlarmsPerUid.get(TEST_CALLING_UID, 0));
     }
 
@@ -1263,7 +1294,7 @@
         }
         assertEquals(numAlarms, mService.mAlarmsPerUid.get(TEST_CALLING_UID));
         for (int i = 0; i < numAlarms; i++) {
-            mService.removeLocked(pis[i], null);
+            mService.removeLocked(pis[i], null, REMOVE_REASON_UNDEFINED);
             assertEquals(numAlarms - i - 1, mService.mAlarmsPerUid.get(TEST_CALLING_UID, 0));
         }
     }
@@ -1393,7 +1424,7 @@
         mTestTimer.expire();
         assertEquals(numAlarms, mService.mPendingNonWakeupAlarms.size());
         for (int i = 0; i < numAlarms; i++) {
-            mService.removeLocked(pis[i], null);
+            mService.removeLocked(pis[i], null, REMOVE_REASON_UNDEFINED);
             assertEquals(numAlarms - i - 1, mService.mAlarmsPerUid.get(TEST_CALLING_UID, 0));
         }
     }
@@ -1463,13 +1494,13 @@
         assertEquals(trigger6, mTestTimer.getElapsed());
         assertEquals(trigger6, mService.mNextWakeFromIdle.getWhenElapsed());
 
-        mService.removeLocked(wakeFromIdle6, null);
+        mService.removeLocked(wakeFromIdle6, null, REMOVE_REASON_UNDEFINED);
 
         assertTrue(mService.mNextWakeFromIdle.matches(wakeFromIdle10, null));
         assertEquals(trigger10, mTestTimer.getElapsed());
         assertEquals(trigger10, mService.mNextWakeFromIdle.getWhenElapsed());
 
-        mService.removeLocked(wakeFromIdle10, null);
+        mService.removeLocked(wakeFromIdle10, null, REMOVE_REASON_UNDEFINED);
         assertNull(mService.mNextWakeFromIdle);
     }
 
@@ -1495,13 +1526,13 @@
         setWakeFromIdle(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 12, wakeFromIdle12);
         assertEquals(mNowElapsedTest + 5, mService.mPendingIdleUntil.getWhenElapsed());
 
-        mService.removeLocked(wakeFromIdle5, null);
+        mService.removeLocked(wakeFromIdle5, null, REMOVE_REASON_UNDEFINED);
         assertEquals(mNowElapsedTest + 8, mService.mPendingIdleUntil.getWhenElapsed());
 
-        mService.removeLocked(wakeFromIdle8, null);
+        mService.removeLocked(wakeFromIdle8, null, REMOVE_REASON_UNDEFINED);
         assertEquals(requestedIdleUntil, mService.mPendingIdleUntil.getWhenElapsed());
 
-        mService.removeLocked(idleUntilPi, null);
+        mService.removeLocked(idleUntilPi, null, REMOVE_REASON_UNDEFINED);
         assertNull(mService.mPendingIdleUntil);
 
         setIdleUntilAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 15, idleUntilPi);
@@ -1612,7 +1643,7 @@
         verify(pis[0], never()).send(eq(mMockContext), eq(0), any(Intent.class), any(),
                 any(Handler.class), isNull(), any());
 
-        mService.removeLocked(idleUntil, null);
+        mService.removeLocked(idleUntil, null, REMOVE_REASON_UNDEFINED);
         mTestTimer.expire();
         // Now, the first 5 alarms (upto i = 4) should expire.
         for (int i = 0; i < 5; i++) {
@@ -1659,14 +1690,16 @@
                 getNewMockPendingIntent(), false), quota, mAllowWhileIdleWindow);
 
         // Refresh the state
-        mService.removeLocked(TEST_CALLING_UID);
+        mService.removeLocked(TEST_CALLING_UID,
+                REMOVE_REASON_UNDEFINED);
         mService.mAllowWhileIdleHistory.removeForPackage(TEST_CALLING_PACKAGE, TEST_CALLING_USER);
 
         testQuotasDeferralOnExpiration(trigger -> setAllowWhileIdleAlarm(ELAPSED_REALTIME_WAKEUP,
                 trigger, getNewMockPendingIntent(), false), quota, mAllowWhileIdleWindow);
 
         // Refresh the state
-        mService.removeLocked(TEST_CALLING_UID);
+        mService.removeLocked(TEST_CALLING_UID,
+                REMOVE_REASON_UNDEFINED);
         mService.mAllowWhileIdleHistory.removeForPackage(TEST_CALLING_PACKAGE, TEST_CALLING_USER);
 
         testQuotasNoDeferral(trigger -> setAllowWhileIdleAlarm(ELAPSED_REALTIME_WAKEUP, trigger,
@@ -1795,70 +1828,45 @@
     }
 
     @Test
-    public void hasScheduleExactAlarmBinderCallEmptyDenyList() throws RemoteException {
-        doReturn(PermissionChecker.PERMISSION_GRANTED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+    public void hasScheduleExactAlarmBinderCallNotDenyListed() throws RemoteException {
+        mockExactAlarmPermissionGrant(true, false, MODE_DEFAULT);
         assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
 
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ALLOWED);
+        assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+        assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+
+        mockExactAlarmPermissionGrant(true, false, MODE_IGNORED);
         assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
     }
 
     @Test
-    public void hasScheduleExactAlarmBinderCallWithDenyList() throws RemoteException {
-        setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, TEST_CALLING_PACKAGE);
-
-        when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE)).thenReturn(MODE_ERRORED);
-
+    public void hasScheduleExactAlarmBinderCallDenyListed() throws RemoteException {
+        mockExactAlarmPermissionGrant(true, true, MODE_ERRORED);
         assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
 
-        when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE)).thenReturn(MODE_DEFAULT);
-
+        mockExactAlarmPermissionGrant(true, true, MODE_DEFAULT);
         assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
 
-        when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE)).thenReturn(MODE_IGNORED);
-
+        mockExactAlarmPermissionGrant(true, true, MODE_IGNORED);
         assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
 
-        when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE)).thenReturn(MODE_ALLOWED);
-
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
-
-        assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
-
-        doReturn(PermissionChecker.PERMISSION_GRANTED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
-
+        mockExactAlarmPermissionGrant(true, true, MODE_ALLOWED);
         assertTrue(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), times(2));
+    }
+
+    @Test
+    public void hasScheduleExactAlarmBinderCallNotDeclared() throws RemoteException {
+        mockExactAlarmPermissionGrant(false, false, MODE_DEFAULT);
+        assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+
+        mockExactAlarmPermissionGrant(false, false, MODE_ALLOWED);
+        assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
+
+        mockExactAlarmPermissionGrant(false, true, MODE_ALLOWED);
+        assertFalse(mBinder.hasScheduleExactAlarm(TEST_CALLING_PACKAGE, TEST_CALLING_USER));
     }
 
     @Test
@@ -1884,9 +1892,8 @@
         mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_HEURISTIC, 0,
                 FLAG_ALLOW_WHILE_IDLE, getNewMockPendingIntent(), null, null, null, null);
 
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
+        verify(mService, never()).hasScheduleExactAlarmInternal(TEST_CALLING_PACKAGE,
+                TEST_CALLING_UID);
         verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
     }
 
@@ -1903,7 +1910,8 @@
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(),
                 eq(FLAG_STANDALONE), isNull(), isNull(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
+                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull(),
+                eq(EXACT_ALLOW_REASON_COMPAT));
     }
 
     @Test
@@ -1920,7 +1928,8 @@
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(),
                 eq(FLAG_ALLOW_WHILE_IDLE_COMPAT | FLAG_STANDALONE), isNull(), isNull(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture(),
+                eq(EXACT_ALLOW_REASON_COMPAT));
 
         final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
         final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -1940,7 +1949,8 @@
         final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), anyLong(), eq(0L),
                 eq(alarmPi), isNull(), isNull(), eq(FLAG_ALLOW_WHILE_IDLE_COMPAT), isNull(),
-                isNull(), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+                isNull(), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture(),
+                eq(EXACT_ALLOW_REASON_NOT_APPLICABLE));
 
         final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
         final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -1960,7 +1970,8 @@
 
         verify(mService).setImpl(eq(RTC_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(), eq(FLAG_STANDALONE | FLAG_WAKE_FROM_IDLE),
-                isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
+                isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull(),
+                eq(EXACT_ALLOW_REASON_COMPAT));
     }
 
     @Test
@@ -1969,10 +1980,7 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
 
-        doReturn(PermissionChecker.PERMISSION_GRANTED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ALLOWED);
 
         final PendingIntent alarmPi = getNewMockPendingIntent();
         final AlarmManager.AlarmClockInfo alarmClock = mock(AlarmManager.AlarmClockInfo.class);
@@ -1980,22 +1988,36 @@
                 alarmPi, null, null, null, alarmClock);
 
         // Correct permission checks are invoked.
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        verify(mService).hasScheduleExactAlarmInternal(TEST_CALLING_PACKAGE, TEST_CALLING_UID);
         verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
 
         final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
         verify(mService).setImpl(eq(RTC_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(), eq(FLAG_STANDALONE | FLAG_WAKE_FROM_IDLE),
                 isNull(), eq(alarmClock), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE),
-                bundleCaptor.capture());
+                bundleCaptor.capture(), eq(EXACT_ALLOW_REASON_PERMISSION));
 
         final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
         final int type = idleOptions.getTemporaryAppAllowlistType();
         assertEquals(TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED, type);
     }
 
+    private void mockExactAlarmPermissionGrant(boolean declared, boolean denyList, int mode) {
+        String[] requesters = declared ? new String[]{TEST_CALLING_PACKAGE} : EmptyArray.STRING;
+        when(mPermissionManagerInternal.getAppOpPermissionPackages(SCHEDULE_EXACT_ALARM))
+                .thenReturn(requesters);
+        mService.refreshExactAlarmCandidates();
+
+        if (denyList) {
+            setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, TEST_CALLING_PACKAGE);
+        } else {
+            setDeviceConfigString(KEY_EXACT_ALARM_DENY_LIST, "");
+        }
+
+        when(mAppOpsManager.checkOpNoThrow(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID,
+                TEST_CALLING_PACKAGE)).thenReturn(mode);
+    }
+
     @Test
     public void alarmClockBinderCallWithoutPermission() throws RemoteException {
         setDeviceConfigBoolean(KEY_CRASH_NON_CLOCK_APPS, true);
@@ -2003,10 +2025,7 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
 
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
         when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
 
         final PendingIntent alarmPi = getNewMockPendingIntent();
@@ -2018,9 +2037,6 @@
         } catch (SecurityException se) {
             // Expected.
         }
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
         verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
     }
 
@@ -2030,21 +2046,20 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
 
-        // Permission check is granted by default by the mock.
+        mockExactAlarmPermissionGrant(true, false, MODE_ALLOWED);
         final PendingIntent alarmPi = getNewMockPendingIntent();
         mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
                 0, alarmPi, null, null, null, null);
 
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        verify(mService).hasScheduleExactAlarmInternal(TEST_CALLING_PACKAGE, TEST_CALLING_UID);
         verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
 
         final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(),
                 eq(FLAG_STANDALONE), isNull(), isNull(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture(),
+                eq(EXACT_ALLOW_REASON_PERMISSION));
 
         final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
         final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -2057,25 +2072,20 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
         // If permission is denied, only then allowlist will be checked.
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
         when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
 
         final PendingIntent alarmPi = getNewMockPendingIntent();
         mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
                 0, alarmPi, null, null, null, null);
 
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
         verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(TEST_CALLING_UID));
 
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(),
                 eq(FLAG_STANDALONE), isNull(), isNull(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
+                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull(),
+                eq(EXACT_ALLOW_REASON_ALLOW_LIST));
     }
 
     @Test
@@ -2084,21 +2094,19 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
 
-        // Permission check is granted by default by the mock.
+        mockExactAlarmPermissionGrant(true, false, MODE_ALLOWED);
         final PendingIntent alarmPi = getNewMockPendingIntent();
         mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
                 FLAG_ALLOW_WHILE_IDLE, alarmPi, null, null, null, null);
 
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
         verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
 
         final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(),
                 eq(FLAG_ALLOW_WHILE_IDLE | FLAG_STANDALONE), isNull(), isNull(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture(),
+                eq(EXACT_ALLOW_REASON_PERMISSION));
 
         final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
         final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -2111,26 +2119,21 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
         // If permission is denied, only then allowlist will be checked.
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
         when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
 
         final PendingIntent alarmPi = getNewMockPendingIntent();
         mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 1234, WINDOW_EXACT, 0,
                 FLAG_ALLOW_WHILE_IDLE, alarmPi, null, null, null, null);
 
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
         verify(mDeviceIdleInternal).isAppOnWhitelist(UserHandle.getAppId(TEST_CALLING_UID));
 
         final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(),
                 eq(FLAG_ALLOW_WHILE_IDLE_COMPAT | FLAG_STANDALONE), isNull(), isNull(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture(),
+                eq(EXACT_ALLOW_REASON_ALLOW_LIST));
 
         final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
         final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -2145,10 +2148,7 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
 
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
         when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(false);
 
         final PendingIntent alarmPi = getNewMockPendingIntent();
@@ -2166,9 +2166,6 @@
         } catch (SecurityException se) {
             // Expected.
         }
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), times(2));
         verify(mDeviceIdleInternal, times(2)).isAppOnWhitelist(anyInt());
     }
 
@@ -2184,15 +2181,14 @@
         mBinder.set(TEST_CALLING_PACKAGE, ELAPSED_REALTIME_WAKEUP, 4321, WINDOW_HEURISTIC, 0,
                 FLAG_ALLOW_WHILE_IDLE, alarmPi, null, null, null, null);
 
-        verify(() -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)), never());
+        verify(mService, never()).hasScheduleExactAlarmInternal(anyString(), anyInt());
         verify(mDeviceIdleInternal, never()).isAppOnWhitelist(anyInt());
 
         final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(4321L), anyLong(), eq(0L),
                 eq(alarmPi), isNull(), isNull(), eq(FLAG_ALLOW_WHILE_IDLE_COMPAT), isNull(),
-                isNull(), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture());
+                isNull(), eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), bundleCaptor.capture(),
+                eq(EXACT_ALLOW_REASON_NOT_APPLICABLE));
 
         final BroadcastOptions idleOptions = new BroadcastOptions(bundleCaptor.getValue());
         final int type = idleOptions.getTemporaryAppAllowlistType();
@@ -2205,10 +2201,7 @@
                 () -> CompatChanges.isChangeEnabled(eq(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION),
                         anyString(), any(UserHandle.class)));
 
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
         when(mDeviceIdleInternal.isAppOnWhitelist(anyInt())).thenReturn(true);
         when(mAppStateTracker.isUidPowerSaveUserExempt(TEST_CALLING_UID)).thenReturn(true);
 
@@ -2220,7 +2213,8 @@
         verify(mService).setImpl(eq(ELAPSED_REALTIME_WAKEUP), eq(1234L), eq(WINDOW_EXACT), eq(0L),
                 eq(alarmPi), isNull(), isNull(),
                 eq(FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_STANDALONE), isNull(), isNull(),
-                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull());
+                eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE), isNull(),
+                eq(EXACT_ALLOW_REASON_ALLOW_LIST));
     }
 
     @Test
@@ -2355,10 +2349,7 @@
 
     @Test
     public void opScheduleExactAlarmRevoked() throws Exception {
-        doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
-                () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
-                        eq(Manifest.permission.SCHEDULE_EXACT_ALARM), anyInt(),
-                        eq(TEST_CALLING_UID), eq(TEST_CALLING_PACKAGE)));
+        mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
         mIAppOpsCallback.opChanged(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID, TEST_CALLING_PACKAGE);
         assertAndHandleMessageSync(REMOVE_EXACT_ALARMS);
         verify(mService).removeExactAlarmsOnPermissionRevokedLocked(TEST_CALLING_UID,
@@ -2456,6 +2447,95 @@
         assertEquals(LazyAlarmStore.TAG, mService.mAlarmStore.getName());
     }
 
+    private void registerAppIds(String[] packages, Integer[] ids) {
+        assertEquals(packages.length, ids.length);
+
+        when(mPackageManagerInternal.getPackageUid(anyString(), anyInt(), anyInt())).thenAnswer(
+                invocation -> {
+                    final String pkg = invocation.getArgument(0);
+                    final int index = ArrayUtils.indexOf(packages, pkg);
+                    if (index < 0) {
+                        return index;
+                    }
+                    final int userId = invocation.getArgument(2);
+                    return UserHandle.getUid(userId, ids[index]);
+                });
+    }
+
+    @Test
+    public void refreshExactAlarmCandidatesOnPackageAdded() {
+        final String[] exactAlarmRequesters = new String[]{"p11", "p2", "p9"};
+        final Integer[] appIds = new Integer[]{11, 2, 9};
+        registerAppIds(exactAlarmRequesters, appIds);
+
+        when(mPermissionManagerInternal.getAppOpPermissionPackages(
+                SCHEDULE_EXACT_ALARM)).thenReturn(exactAlarmRequesters);
+
+        final Intent packageAdded = new Intent(Intent.ACTION_PACKAGE_ADDED)
+                .setPackage(TEST_CALLING_PACKAGE);
+        mPackageChangesReceiver.onReceive(mMockContext, packageAdded);
+
+        assertAndHandleMessageSync(REFRESH_EXACT_ALARM_CANDIDATES);
+        assertEquals(new ArraySet<>(appIds), mService.mExactAlarmCandidates);
+    }
+
+    @Test
+    public void refreshExactAlarmCandidatesOnPackageReplaced() {
+        final String[] exactAlarmRequesters = new String[]{"p15", "p21", "p3"};
+        final Integer[] appIds = new Integer[]{15, 21, 3};
+        registerAppIds(exactAlarmRequesters, appIds);
+
+        when(mPermissionManagerInternal.getAppOpPermissionPackages(
+                SCHEDULE_EXACT_ALARM)).thenReturn(exactAlarmRequesters);
+
+        final Intent packageAdded = new Intent(Intent.ACTION_PACKAGE_ADDED)
+                .setPackage(TEST_CALLING_PACKAGE)
+                .putExtra(Intent.EXTRA_REPLACING, true);
+        mPackageChangesReceiver.onReceive(mMockContext, packageAdded);
+
+        assertAndHandleMessageSync(REFRESH_EXACT_ALARM_CANDIDATES);
+        assertEquals(new ArraySet<>(appIds), mService.mExactAlarmCandidates);
+    }
+
+    @Test
+    public void refreshExactAlarmCandidatesOnPackageRemoved() {
+        final String[] exactAlarmRequesters = new String[]{"p99", "p1", "p19"};
+        final Integer[] appIds = new Integer[]{99, 1, 19};
+        registerAppIds(exactAlarmRequesters, appIds);
+
+        when(mPermissionManagerInternal.getAppOpPermissionPackages(
+                SCHEDULE_EXACT_ALARM)).thenReturn(exactAlarmRequesters);
+
+        final Intent packageRemoved = new Intent(Intent.ACTION_PACKAGE_REMOVED)
+                .setPackage(TEST_CALLING_PACKAGE);
+        mPackageChangesReceiver.onReceive(mMockContext, packageRemoved);
+
+        assertAndHandleMessageSync(REFRESH_EXACT_ALARM_CANDIDATES);
+        assertEquals(new ArraySet<>(appIds), mService.mExactAlarmCandidates);
+    }
+
+    @Test
+    public void alarmScheduledAtomPushed() {
+        for (int i = 0; i < 10; i++) {
+            final PendingIntent pi = getNewMockPendingIntent();
+            setTestAlarm(ELAPSED_REALTIME, mNowElapsedTest + i, pi);
+
+            verify(() -> MetricsHelper.pushAlarmScheduled(argThat(a -> a.matches(pi, null))));
+        }
+    }
+
+    @Test
+    public void alarmBatchDeliveredAtomPushed() throws InterruptedException {
+        for (int i = 0; i < 10; i++) {
+            final int type = ((i & 1) == 0) ? ELAPSED_REALTIME : ELAPSED_REALTIME_WAKEUP;
+            setTestAlarm(type, mNowElapsedTest + i, getNewMockPendingIntent());
+        }
+        mNowElapsedTest += 100;
+        mTestTimer.expire();
+
+        verify(() -> MetricsHelper.pushAlarmBatchDelivered(10, 5));
+    }
+
     @After
     public void tearDown() {
         if (mMockingSession != null) {
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmStoreTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmStoreTest.java
index 12894ae..ba0e555 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmStoreTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmStoreTest.java
@@ -18,7 +18,10 @@
 
 import static android.app.AlarmManager.ELAPSED_REALTIME;
 import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
+import static android.app.AlarmManager.RTC;
+import static android.app.AlarmManager.RTC_WAKEUP;
 
+import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_NOT_APPLICABLE;
 import static com.android.server.alarm.Constants.TEST_CALLING_PACKAGE;
 import static com.android.server.alarm.Constants.TEST_CALLING_UID;
 
@@ -33,6 +36,7 @@
 import android.app.PendingIntent;
 import android.platform.test.annotations.Presubmit;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -69,12 +73,13 @@
                 mock(PendingIntent.class));
         return new Alarm(ELAPSED_REALTIME_WAKEUP, whenElapsed, whenElapsed, 0, 0,
                 mock(PendingIntent.class), null, null, null, 0, info, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE, null);
+                TEST_CALLING_PACKAGE, null, EXACT_ALLOW_REASON_NOT_APPLICABLE);
     }
 
     private static Alarm createAlarm(int type, long whenElapsed, long windowLength, int flags) {
         return new Alarm(type, whenElapsed, whenElapsed, windowLength, 0, mock(PendingIntent.class),
-                null, null, null, flags, null, TEST_CALLING_UID, TEST_CALLING_PACKAGE, null);
+                null, null, null, flags, null, TEST_CALLING_UID, TEST_CALLING_PACKAGE, null,
+                EXACT_ALLOW_REASON_NOT_APPLICABLE);
     }
 
     private void addAlarmsToStore(Alarm... alarms) {
@@ -83,6 +88,11 @@
         }
     }
 
+    @Before
+    public void clear() {
+        mAlarmStore.remove(unused -> true);
+    }
+
     @Test
     public void add() {
         final Alarm a1 = createAlarm(1, 0);
@@ -209,7 +219,6 @@
         final Alarm a8 = createAlarm(8, 0);
         final Alarm a10 = createAlarm(10, 0);
         addAlarmsToStore(a8, a10, a5);
-
         assertEquals(5, mAlarmStore.getNextDeliveryTime());
 
         mAlarmStore.updateAlarmDeliveries(a -> {
@@ -241,4 +250,22 @@
         mAlarmStore.remove(alarmClock::equals);
         verify(onRemoved).run();
     }
+
+    @Test
+    public void getCount() {
+        for (int i = 0; i < 10; i++) {
+            mAlarmStore.add(createAlarm(ELAPSED_REALTIME, i, 4, 0));
+        }
+        assertEquals(5, mAlarmStore.getCount(a -> a.getRequestedElapsed() < 5));
+        assertEquals(10, mAlarmStore.getCount(a -> a.windowLength == 4));
+
+        addAlarmsToStore(
+                createAlarm(RTC_WAKEUP, 45, 0, 53),
+                createAlarm(ELAPSED_REALTIME_WAKEUP, 60, 0, 53)
+        );
+
+        assertEquals(2, mAlarmStore.getCount(a -> a.wakeup));
+        assertEquals(2, mAlarmStore.getCount(a -> a.flags == 53));
+        assertEquals(0, mAlarmStore.getCount(a -> a.type == RTC));
+    }
 }
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
index b64528c..f11cba0 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
@@ -55,14 +55,14 @@
     private Alarm createDefaultAlarm(long requestedElapsed, long windowLength, int flags) {
         return new Alarm(ELAPSED_REALTIME, 0, requestedElapsed, windowLength, 0,
                 createAlarmSender(), null, null, null, flags, null, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE, null);
+                TEST_CALLING_PACKAGE, null, 0);
     }
 
     private Alarm createAlarmClock(long requestedRtc) {
         final AlarmManager.AlarmClockInfo info = mock(AlarmManager.AlarmClockInfo.class);
         return new Alarm(RTC_WAKEUP, requestedRtc, requestedRtc, 0, 0, createAlarmSender(),
                 null, null, null, FLAG_WAKE_FROM_IDLE | FLAG_STANDALONE, info, TEST_CALLING_UID,
-                TEST_CALLING_PACKAGE, null);
+                TEST_CALLING_PACKAGE, null, 0);
     }
 
     private PendingIntent createAlarmSender() {
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/BackgroundRestrictedAlarmsTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/BackgroundRestrictedAlarmsTest.java
index 0e795a9..403b4cd 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/BackgroundRestrictedAlarmsTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/BackgroundRestrictedAlarmsTest.java
@@ -45,7 +45,7 @@
         }
         uidAlarms.add(new Alarm(
                 removeIt ? RTC : RTC_WAKEUP,
-                0, 0, 0, 0, null, null, null, null, 0, null, uid, name, null));
+                0, 0, 0, 0, null, null, null, null, 0, null, uid, name, null, 0));
         return all;
     }
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
index ffbcc45..68cb8f9 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
@@ -295,11 +295,11 @@
         doNothing().when(mConnManager).registerNetworkCallback(any(), callbackCaptor.capture());
         final ArgumentCaptor<NetworkCallback> redCallbackCaptor =
                 ArgumentCaptor.forClass(NetworkCallback.class);
-        doNothing().when(mConnManager).registerDefaultNetworkCallbackAsUid(
+        doNothing().when(mConnManager).registerDefaultNetworkCallbackForUid(
                 eq(UID_RED), redCallbackCaptor.capture(), any());
         final ArgumentCaptor<NetworkCallback> blueCallbackCaptor =
                 ArgumentCaptor.forClass(NetworkCallback.class);
-        doNothing().when(mConnManager).registerDefaultNetworkCallbackAsUid(
+        doNothing().when(mConnManager).registerDefaultNetworkCallbackForUid(
                 eq(UID_BLUE), blueCallbackCaptor.capture(), any());
 
         final ConnectivityController controller = new ConnectivityController(mService);
@@ -600,11 +600,11 @@
         doNothing().when(mConnManager).registerNetworkCallback(any(), callback.capture());
         final ArgumentCaptor<NetworkCallback> redCallback =
                 ArgumentCaptor.forClass(NetworkCallback.class);
-        doNothing().when(mConnManager).registerDefaultNetworkCallbackAsUid(
+        doNothing().when(mConnManager).registerDefaultNetworkCallbackForUid(
                 eq(UID_RED), redCallback.capture(), any());
         final ArgumentCaptor<NetworkCallback> blueCallback =
                 ArgumentCaptor.forClass(NetworkCallback.class);
-        doNothing().when(mConnManager).registerDefaultNetworkCallbackAsUid(
+        doNothing().when(mConnManager).registerDefaultNetworkCallbackForUid(
                 eq(UID_BLUE), blueCallback.capture(), any());
 
         final JobStatus networked = createJobStatus(createJob()
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
index 411c31c..72bc77e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
@@ -24,6 +24,7 @@
 import android.testing.TestableLooper
 import android.testing.TestableLooper.RunWithLooper
 import com.android.server.apphibernation.AppHibernationManagerInternal
+import com.android.server.apphibernation.AppHibernationService
 import com.android.server.extendedtestutils.wheneverStatic
 import com.android.server.testutils.whenever
 import org.junit.Assert.assertFalse
@@ -61,6 +62,7 @@
         MockitoAnnotations.initMocks(this)
         wheneverStatic { DeviceConfig.getBoolean(
             NAMESPACE_APP_HIBERNATION, KEY_APP_HIBERNATION_ENABLED, false) }.thenReturn(true)
+        AppHibernationService.sIsServiceEnabled = true
         rule.system().stageNominalSystemState()
         whenever(rule.mocks().injector.getLocalService(AppHibernationManagerInternal::class.java))
             .thenReturn(appHibernationManager)
diff --git a/services/tests/servicestests/res/xml/shortcut_5.xml b/services/tests/servicestests/res/xml/shortcut_5.xml
index 9551100..17c68ee 100644
--- a/services/tests/servicestests/res/xml/shortcut_5.xml
+++ b/services/tests/servicestests/res/xml/shortcut_5.xml
@@ -73,7 +73,7 @@
             android:action="action"
             android:data="http://www/"
             android:targetPackage="abc"
-            android:targetClass=".xyz"
+            android:targetClass="abc.xyz"
             android:mimeType="foo/bar"
             >
             <categories android:name="cat1" />
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerUtilsTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerUtilsTest.java
new file mode 100644
index 0000000..96103e3
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerUtilsTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.am;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.fail;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+@SmallTest
+public class ActivityManagerUtilsTest {
+    @Test
+    public void getAndroidIdHash() {
+        // getAndroidIdHash() essentially returns a random a value. Just make sure it's
+        // non-negative.
+        assertThat(ActivityManagerUtils.getAndroidIdHash()).isAtLeast(0);
+    }
+
+    @Test
+    public void getUnsignedHashCached() {
+        assertThat(ActivityManagerUtils.getUnsignedHashCached("x")).isEqualTo(
+                ActivityManagerUtils.getUnsignedHashCached("x"));
+
+        assertThat(ActivityManagerUtils.getUnsignedHashCached("x")).isNotEqualTo(
+                ActivityManagerUtils.getUnsignedHashCached("y"));
+    }
+
+    @Test
+    public void shouldSamplePackage_sampleNone() {
+        final int numTests = 100000;
+        for (int i = 0; i < numTests; i++) {
+            assertThat(ActivityManagerUtils.shouldSamplePackageForAtom("" + i, 0))
+                    .isFalse();
+        }
+    }
+
+    @Test
+    public void shouldSamplePackage_sampleAll() {
+        final int numTests = 100000;
+
+        for (int i = 0; i < numTests; i++) {
+            assertThat(ActivityManagerUtils.shouldSamplePackageForAtom("" + i, 1))
+                    .isTrue();
+        }
+    }
+
+    /**
+     * Make sure, with the same android ID, an expected rate of the packages are selected.
+     */
+    @Test
+    public void shouldSamplePackage_sampleSome_fixedAndroidId() {
+        checkShouldSamplePackage_fixedAndroidId(0.1f);
+        checkShouldSamplePackage_fixedAndroidId(0.5f);
+        checkShouldSamplePackage_fixedAndroidId(0.9f);
+    }
+
+    /**
+     * Make sure, the same package is selected on an expected rate of the devices.
+     */
+    @Test
+    public void shouldSamplePackage_sampleSome_fixedPackage() {
+        checkShouldSamplePackage_fixedPackage(0.1f);
+        checkShouldSamplePackage_fixedPackage(0.5f);
+        checkShouldSamplePackage_fixedPackage(0.9f);
+    }
+
+    private void checkShouldSamplePackage_fixedPackage(float sampleRate) {
+        checkShouldSamplePackage(sampleRate, sampleRate, true, false);
+    }
+
+    private void checkShouldSamplePackage_fixedAndroidId(float sampleRate) {
+        checkShouldSamplePackage(sampleRate, sampleRate, false, true);
+    }
+
+    @Test
+    public void testSheckShouldSamplePackage() {
+        // Just make sure checkShouldSamplePackage is actually working...
+        try {
+            checkShouldSamplePackage(0.3f, 0.6f, false, true);
+            fail();
+        } catch (AssertionError expected) {
+        }
+        try {
+            checkShouldSamplePackage(0.6f, 0.3f, true, false);
+            fail();
+        } catch (AssertionError expected) {
+        }
+    }
+
+    private void checkShouldSamplePackage(float inputSampleRate, float expectedRate,
+            boolean fixedPackage, boolean fixedAndroidId) {
+        final int numTests = 100000;
+
+        try {
+            int numSampled = 0;
+            for (int i = 0; i < numTests; i++) {
+                final String pkg = fixedPackage ? "fixed-package" : "" + i;
+                ActivityManagerUtils.injectAndroidIdForTest(
+                        fixedAndroidId ? "fixed-android-id" : "" + i);
+
+                if (ActivityManagerUtils.shouldSamplePackageForAtom(pkg, inputSampleRate)) {
+                    numSampled++;
+                }
+                assertThat(ActivityManagerUtils.getUnsignedHashCached(pkg)).isEqualTo(
+                        ActivityManagerUtils.getUnsignedHashCached(pkg));
+            }
+            final double actualSampleRate = ((double) numSampled) / numTests;
+
+            assertThat(actualSampleRate).isWithin(0.05).of(expectedRate);
+        } finally {
+            ActivityManagerUtils.injectAndroidIdForTest(null);
+        }
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/FgsTempAllowListTest.java b/services/tests/servicestests/src/com/android/server/am/FgsTempAllowListTest.java
new file mode 100644
index 0000000..f85f0f8
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/FgsTempAllowListTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.am;
+
+
+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.os.SystemClock;
+import android.platform.test.annotations.Presubmit;
+import android.util.Pair;
+
+import org.junit.Test;
+
+/**
+ * Build/Install/Run:
+ *  atest FrameworksServicesTests:TempAllowListTest
+ */
+@Presubmit
+public class FgsTempAllowListTest {
+
+    /**
+     * This case tests get(), isAllowed(), remove() interfaces.
+     */
+    @Test
+    public void testIsAllowed() {
+        FgsTempAllowList<Integer, String> allowList = new FgsTempAllowList();
+        allowList.add(10001, 2000, "description1");
+        allowList.add(10002, 2000, "description2");
+
+        assertTrue(allowList.isAllowed(10001));
+        Pair<Long, String> entry1 = allowList.get(10001);
+        assertNotNull(entry1);
+        assertEquals(entry1.second, "description1");
+
+        assertTrue(allowList.isAllowed(10002));
+        Pair<Long, String> entry2 = allowList.get(10002);
+        assertNotNull(entry2);
+        assertEquals(entry2.second, "description2");
+
+        allowList.remove(10001);
+        assertFalse(allowList.isAllowed(10001));
+        assertNull(allowList.get(10001));
+    }
+
+    /**
+     * This case tests temp allowlist entry can expire.
+     */
+    @Test
+    public void testExpired() {
+        FgsTempAllowList<Integer, String> allowList = new FgsTempAllowList();
+        // temp allow for 2000ms.
+        allowList.add(10001, 2000, "uid1-2000ms");
+        // sleep for 3000ms.
+        SystemClock.sleep(3000);
+        // entry expired.
+        assertFalse(allowList.isAllowed(10001));
+        assertNull(allowList.get(10001));
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java b/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java
index 6ca1102..8c87506 100644
--- a/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java
@@ -52,7 +52,7 @@
     private static final  EnergyConsumer CONSUMER_OTHER_1 = createEnergyConsumer(
             1, 1, EnergyConsumerType.OTHER, "HPU");
     private static final  EnergyConsumer CONSUMER_OTHER_2 = createEnergyConsumer(
-            436, 2, EnergyConsumerType.OTHER, "IPU");
+            436, 2, EnergyConsumerType.OTHER, "IPU\n&\005");
 
     private static final SparseArray<EnergyConsumer> ALL_ID_CONSUMER_MAP = createIdToConsumerMap(
             CONSUMER_DISPLAY, CONSUMER_OTHER_0, CONSUMER_OTHER_1, CONSUMER_OTHER_2);
@@ -228,7 +228,8 @@
     @Test
     public void testGetOtherOrdinalNames() {
         final MeasuredEnergySnapshot snapshot = new MeasuredEnergySnapshot(ALL_ID_CONSUMER_MAP);
-        assertThat(snapshot.getOtherOrdinalNames()).asList().containsExactly("GPU", "HPU", "IPU");
+        assertThat(snapshot.getOtherOrdinalNames()).asList()
+                .containsExactly("GPU", "HPU", "IPU &_");
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java b/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java
index f280aea..5c7a580 100644
--- a/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java
@@ -16,9 +16,13 @@
 
 package com.android.server.apphibernation;
 
+import static android.app.usage.UsageEvents.Event.ACTIVITY_RESUMED;
+import static android.app.usage.UsageEvents.Event.APP_COMPONENT_USED;
+import static android.app.usage.UsageEvents.Event.USER_INTERACTION;
 import static android.content.pm.PackageManager.MATCH_ANY_USER;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.AdditionalAnswers.returnsArgAt;
 import static org.mockito.ArgumentMatchers.any;
@@ -29,12 +33,17 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 import android.app.IActivityManager;
+import android.app.usage.UsageEvents.Event;
+import android.app.usage.UsageStatsManagerInternal;
+import android.app.usage.UsageStatsManagerInternal.UsageEventListener;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManagerInternal;
@@ -78,6 +87,8 @@
 
     private AppHibernationService mAppHibernationService;
     private BroadcastReceiver mBroadcastReceiver;
+    private UsageEventListener mUsageEventListener;
+
     @Mock
     private Context mContext;
     @Mock
@@ -89,9 +100,15 @@
     @Mock
     private UserManager mUserManager;
     @Mock
+    private HibernationStateDiskStore<UserLevelState> mUserLevelDiskStore;
+    @Mock
+    private UsageStatsManagerInternal mUsageStatsManagerInternal;
+    @Mock
     private HibernationStateDiskStore<UserLevelState> mHibernationStateDiskStore;
     @Captor
     private ArgumentCaptor<BroadcastReceiver> mReceiverCaptor;
+    @Captor
+    private ArgumentCaptor<UsageEventListener> mUsageEventListenerCaptor;
 
     @Before
     public void setUp() throws RemoteException {
@@ -105,6 +122,8 @@
 
         verify(mContext).registerReceiver(mReceiverCaptor.capture(), any());
         mBroadcastReceiver = mReceiverCaptor.getValue();
+        verify(mUsageStatsManagerInternal).registerListener(mUsageEventListenerCaptor.capture());
+        mUsageEventListener = mUsageEventListenerCaptor.getValue();
 
         doReturn(mUserInfos).when(mUserManager).getUsers();
 
@@ -207,6 +226,163 @@
         assertTrue(hibernatingPackages.contains(PACKAGE_NAME_2));
     }
 
+    @Test
+    public void testUserLevelStatesInitializedFromDisk() throws RemoteException {
+        // GIVEN states stored on disk that match with package manager's force-stop states
+        List<UserLevelState> diskStates = new ArrayList<>();
+        diskStates.add(makeUserLevelState(PACKAGE_NAME_1, false /* hibernated */));
+        diskStates.add(makeUserLevelState(PACKAGE_NAME_2, true /* hibernated */));
+        doReturn(diskStates).when(mUserLevelDiskStore).readHibernationStates();
+
+        List<PackageInfo> packageInfos = new ArrayList<>();
+        packageInfos.add(makePackageInfo(PACKAGE_NAME_1));
+        PackageInfo stoppedPkg = makePackageInfo(PACKAGE_NAME_2);
+        stoppedPkg.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED;
+        packageInfos.add(stoppedPkg);
+
+        // WHEN a user is unlocked and the states are initialized
+        UserInfo user2 = addUser(USER_ID_2, packageInfos);
+        doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_2);
+        mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(user2));
+
+        // THEN the hibernation states are initialized to the disk states
+        assertFalse(mAppHibernationService.isHibernatingForUser(PACKAGE_NAME_1, USER_ID_2));
+        assertTrue(mAppHibernationService.isHibernatingForUser(PACKAGE_NAME_2, USER_ID_2));
+    }
+
+    @Test
+    public void testNonForceStoppedAppsNotHibernatedOnUnlock() throws RemoteException {
+        // GIVEN a package that is hibernated on disk but not force-stopped
+        List<UserLevelState> diskStates = new ArrayList<>();
+        diskStates.add(makeUserLevelState(PACKAGE_NAME_1, true /* hibernated */));
+        doReturn(diskStates).when(mUserLevelDiskStore).readHibernationStates();
+
+        // WHEN a user is unlocked and the states are initialized
+        UserInfo user2 = addUser(USER_ID_2, new String[]{PACKAGE_NAME_1});
+        doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_2);
+        mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(user2));
+
+        // THEN the app is not hibernating for the user
+        assertFalse(mAppHibernationService.isHibernatingForUser(PACKAGE_NAME_1, USER_ID_2));
+    }
+
+    @Test
+    public void testUnhibernatedPackageForUserUnhibernatesPackageGloballyOnUnlock()
+            throws RemoteException {
+        // GIVEN a package that is globally hibernating
+        mAppHibernationService.setHibernatingGlobally(PACKAGE_NAME_1, true);
+
+        // WHEN a user is unlocked and the package is not hibernating for the user
+        UserInfo user2 = addUser(USER_ID_2);
+        doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_2);
+        mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(user2));
+
+        // THEN the package is no longer globally hibernating
+        assertFalse(mAppHibernationService.isHibernatingGlobally(PACKAGE_NAME_1));
+    }
+
+    @Test
+    public void testUnhibernatingPackageForUserSendsBootCompleteBroadcast()
+            throws RemoteException {
+        // GIVEN a hibernating package for a user
+        mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_1, USER_ID_1, true);
+
+        // WHEN we unhibernate the package
+        mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_1, USER_ID_1, false);
+
+        // THEN we send the boot complete broadcasts
+        ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mIActivityManager, times(2)).broadcastIntentWithFeature(any(), any(),
+                intentArgumentCaptor.capture(), any(), any(), anyInt(), any(), any(), any(), any(),
+                anyInt(), any(), anyBoolean(), anyBoolean(), eq(USER_ID_1));
+        List<Intent> capturedIntents = intentArgumentCaptor.getAllValues();
+        assertEquals(capturedIntents.get(0).getAction(), Intent.ACTION_LOCKED_BOOT_COMPLETED);
+        assertEquals(capturedIntents.get(1).getAction(), Intent.ACTION_BOOT_COMPLETED);
+    }
+
+    @Test
+    public void testHibernatingPackageIsUnhibernatedForUserWhenUserInteracted() {
+        // GIVEN a package that is currently hibernated for a user
+        mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_1, USER_ID_1, true);
+
+        // WHEN the package is interacted with by user
+        generateUsageEvent(USER_INTERACTION);
+
+        // THEN the package is not hibernating anymore
+        assertFalse(mAppHibernationService.isHibernatingForUser(PACKAGE_NAME_1, USER_ID_1));
+    }
+
+    @Test
+    public void testHibernatingPackageIsUnhibernatedForUserWhenActivityResumed() {
+        // GIVEN a package that is currently hibernated for a user
+        mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_1, USER_ID_1, true);
+
+        // WHEN the package has activity resumed
+        generateUsageEvent(ACTIVITY_RESUMED);
+
+        // THEN the package is not hibernating anymore
+        assertFalse(mAppHibernationService.isHibernatingForUser(PACKAGE_NAME_1, USER_ID_1));
+    }
+
+    @Test
+    public void testHibernatingPackageIsUnhibernatedForUserWhenComponentUsed() {
+        // GIVEN a package that is currently hibernated for a user
+        mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_1, USER_ID_1, true);
+
+        // WHEN a package component is used
+        generateUsageEvent(APP_COMPONENT_USED);
+
+        // THEN the package is not hibernating anymore
+        assertFalse(mAppHibernationService.isHibernatingForUser(PACKAGE_NAME_1, USER_ID_1));
+    }
+
+    @Test
+    public void testHibernatingPackageIsUnhibernatedGloballyWhenUserInteracted() {
+        // GIVEN a package that is currently hibernated globally
+        mAppHibernationService.setHibernatingGlobally(PACKAGE_NAME_1, true);
+
+        // WHEN the user interacts with the package
+        generateUsageEvent(USER_INTERACTION);
+
+        // THEN the package is not hibernating globally anymore
+        assertFalse(mAppHibernationService.isHibernatingGlobally(PACKAGE_NAME_1));
+    }
+
+    @Test
+    public void testHibernatingPackageIsUnhibernatedGloballyWhenActivityResumed() {
+        // GIVEN a package that is currently hibernated globally
+        mAppHibernationService.setHibernatingGlobally(PACKAGE_NAME_1, true);
+
+        // WHEN activity in package resumed
+        generateUsageEvent(ACTIVITY_RESUMED);
+
+        // THEN the package is not hibernating globally anymore
+        assertFalse(mAppHibernationService.isHibernatingGlobally(PACKAGE_NAME_1));
+    }
+
+    @Test
+    public void testHibernatingPackageIsUnhibernatedGloballyWhenComponentUsed() {
+        // GIVEN a package that is currently hibernated globally
+        mAppHibernationService.setHibernatingGlobally(PACKAGE_NAME_1, true);
+
+        // WHEN a package component is used
+        generateUsageEvent(APP_COMPONENT_USED);
+
+        // THEN the package is not hibernating globally anymore
+        assertFalse(mAppHibernationService.isHibernatingGlobally(PACKAGE_NAME_1));
+    }
+
+    /**
+     * Mock a usage event occurring.
+     *
+     * @param usageEventId id of a usage event
+     */
+    private void generateUsageEvent(int usageEventId) {
+        Event event = new Event(usageEventId, 0 /* timestamp */);
+        event.mPackage = PACKAGE_NAME_1;
+        mUsageEventListener.onUsageEvent(USER_ID_1, event);
+    }
+
     /**
      * Add a mock user with one package.
      */
@@ -218,12 +394,19 @@
      * Add a mock user with the packages specified.
      */
     private UserInfo addUser(int userId, String[] packageNames) throws RemoteException {
-        UserInfo userInfo = new UserInfo(userId, "user_" + userId, 0 /* flags */);
-        mUserInfos.add(userInfo);
         List<PackageInfo> userPackages = new ArrayList<>();
         for (String pkgName : packageNames) {
             userPackages.add(makePackageInfo(pkgName));
         }
+        return addUser(userId, userPackages);
+    }
+
+    /**
+     * Add a mock user with the package infos specified.
+     */
+    private UserInfo addUser(int userId, List<PackageInfo> userPackages) throws RemoteException {
+        UserInfo userInfo = new UserInfo(userId, "user_" + userId, 0 /* flags */);
+        mUserInfos.add(userInfo);
         doReturn(new ParceledListSlice<>(userPackages)).when(mIPackageManager)
                 .getInstalledPackages(intThat(arg -> (arg & MATCH_ANY_USER) == 0), eq(userId));
         return userInfo;
@@ -232,9 +415,17 @@
     private static PackageInfo makePackageInfo(String packageName) {
         PackageInfo pkg = new PackageInfo();
         pkg.packageName = packageName;
+        pkg.applicationInfo = new ApplicationInfo();
         return pkg;
     }
 
+    private static UserLevelState makeUserLevelState(String packageName, boolean hibernated) {
+        UserLevelState state = new UserLevelState();
+        state.packageName = packageName;
+        state.hibernated = hibernated;
+        return state;
+    }
+
     private class MockInjector implements AppHibernationService.Injector {
         private final Context mContext;
 
@@ -268,6 +459,11 @@
         }
 
         @Override
+        public UsageStatsManagerInternal getUsageStatsManagerInternal() {
+            return mUsageStatsManagerInternal;
+        }
+
+        @Override
         public Executor getBackgroundExecutor() {
             // Just execute immediately in tests.
             return r -> r.run();
@@ -280,7 +476,7 @@
 
         @Override
         public HibernationStateDiskStore<UserLevelState> getUserLevelDiskStore(int userId) {
-            return mock(HibernationStateDiskStore.class);
+            return mUserLevelDiskStore;
         }
 
         @Override
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java b/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java
index b552fd5..79e5865 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java
@@ -70,7 +70,8 @@
                         mTemporaryFolder.newFolder(),
                         mContext,
                         mContext.getUserId(),
-                        mContext.getPackageName());
+                        mContext.getPackageName(),
+                        /*logger=*/ null);
         mGlobalQuerierUid =
                 mContext.getPackageManager().getPackageUid(mContext.getPackageName(), /*flags=*/ 0);
     }
@@ -117,9 +118,8 @@
         // No query filters specified, global query can retrieve all documents.
         SearchSpec searchSpec =
                 new SearchSpec.Builder().setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY).build();
-        SearchResultPage searchResultPage =
-                mAppSearchImpl.globalQuery(
-                        "", searchSpec, mContext.getPackageName(), mGlobalQuerierUid);
+        SearchResultPage searchResultPage = mAppSearchImpl.globalQuery(
+                "", searchSpec, mContext.getPackageName(), mGlobalQuerierUid, /*logger=*/ null);
         assertThat(searchResultPage.getResults()).hasSize(2);
 
         // Document2 will be first since it got indexed later and has a "better", aka more recent
@@ -174,9 +174,8 @@
                         .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
                         .addFilterPackageNames("package1")
                         .build();
-        SearchResultPage searchResultPage =
-                mAppSearchImpl.globalQuery(
-                        "", searchSpec, mContext.getPackageName(), mGlobalQuerierUid);
+        SearchResultPage searchResultPage = mAppSearchImpl.globalQuery(
+                "", searchSpec, mContext.getPackageName(), mGlobalQuerierUid, /*logger=*/ null);
         assertThat(searchResultPage.getResults()).hasSize(1);
         assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document1);
 
@@ -186,9 +185,8 @@
                         .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
                         .addFilterPackageNames("package2")
                         .build();
-        searchResultPage =
-                mAppSearchImpl.globalQuery(
-                        "", searchSpec, mContext.getPackageName(), mGlobalQuerierUid);
+        searchResultPage = mAppSearchImpl.globalQuery(
+                "", searchSpec, mContext.getPackageName(), mGlobalQuerierUid, /*logger=*/ null);
         assertThat(searchResultPage.getResults()).hasSize(1);
         assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document2);
     }
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/VisibilityStoreTest.java b/services/tests/servicestests/src/com/android/server/appsearch/VisibilityStoreTest.java
index 11ae76b..28955d6 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/VisibilityStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/VisibilityStoreTest.java
@@ -67,7 +67,8 @@
                         mTemporaryFolder.newFolder(),
                         mContext,
                         mContext.getUserId(),
-                        /*globalQuerierPackage=*/ mContext.getPackageName());
+                        /*globalQuerierPackage=*/ mContext.getPackageName(),
+                        /*logger=*/ null);
         mGlobalQuerierUid =
                 mContext.getPackageManager().getPackageUid(mContext.getPackageName(), /*flags=*/ 0);
 
@@ -163,7 +164,8 @@
                         mTemporaryFolder.newFolder(),
                         mContext,
                         mContext.getUserId(),
-                        /*globalQuerierPackage=*/ mContext.getPackageName());
+                        /*globalQuerierPackage=*/ mContext.getPackageName(),
+                        /*logger=*/ null);
         VisibilityStore visibilityStore = appSearchImpl.getVisibilityStoreLocked();
 
         // Use some arbitrary callerUid. If we can't find the global querier's uid though,
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
index 380d9be..b367203 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java
@@ -82,7 +82,8 @@
                         mTemporaryFolder.newFolder(),
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ context.getPackageName());
+                        /*globalQuerierPackage=*/ context.getPackageName(),
+                        /*logger=*/ null);
     }
 
     // TODO(b/175430168) add test to verify reset is working properly.
@@ -307,13 +308,13 @@
     public void testAddDocumentTypePrefix() {
         DocumentProto insideDocument =
                 DocumentProto.newBuilder()
-                        .setUri("inside-uri")
+                        .setUri("inside-id")
                         .setSchema("type")
                         .setNamespace("namespace")
                         .build();
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri")
+                        .setUri("id")
                         .setSchema("type")
                         .setNamespace("namespace")
                         .addProperties(PropertyProto.newBuilder().addDocumentValues(insideDocument))
@@ -321,13 +322,13 @@
 
         DocumentProto expectedInsideDocument =
                 DocumentProto.newBuilder()
-                        .setUri("inside-uri")
+                        .setUri("inside-id")
                         .setSchema("package$databaseName/type")
                         .setNamespace("package$databaseName/namespace")
                         .build();
         DocumentProto expectedDocumentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri")
+                        .setUri("id")
                         .setSchema("package$databaseName/type")
                         .setNamespace("package$databaseName/namespace")
                         .addProperties(
@@ -344,13 +345,13 @@
     public void testRemoveDocumentTypePrefixes() throws Exception {
         DocumentProto insideDocument =
                 DocumentProto.newBuilder()
-                        .setUri("inside-uri")
+                        .setUri("inside-id")
                         .setSchema("package$databaseName/type")
                         .setNamespace("package$databaseName/namespace")
                         .build();
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri")
+                        .setUri("id")
                         .setSchema("package$databaseName/type")
                         .setNamespace("package$databaseName/namespace")
                         .addProperties(PropertyProto.newBuilder().addDocumentValues(insideDocument))
@@ -358,14 +359,14 @@
 
         DocumentProto expectedInsideDocument =
                 DocumentProto.newBuilder()
-                        .setUri("inside-uri")
+                        .setUri("inside-id")
                         .setSchema("type")
                         .setNamespace("namespace")
                         .build();
 
         DocumentProto expectedDocumentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri")
+                        .setUri("id")
                         .setSchema("type")
                         .setNamespace("namespace")
                         .addProperties(
@@ -383,7 +384,7 @@
         // Set two different database names in the document, which should never happen
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri")
+                        .setUri("id")
                         .setSchema("prefix1/type")
                         .setNamespace("prefix2/namespace")
                         .build();
@@ -401,13 +402,13 @@
         // happen.
         DocumentProto insideDocument =
                 DocumentProto.newBuilder()
-                        .setUri("inside-uri")
+                        .setUri("inside-id")
                         .setSchema("prefix1/type")
                         .setNamespace("prefix1/namespace")
                         .build();
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri")
+                        .setUri("id")
                         .setSchema("prefix2/type")
                         .setNamespace("prefix2/namespace")
                         .addProperties(PropertyProto.newBuilder().addDocumentValues(insideDocument))
@@ -441,7 +442,7 @@
                                 + AppSearchImpl.CHECK_OPTIMIZE_INTERVAL;
                 i++) {
             GenericDocument document =
-                    new GenericDocument.Builder<>("namespace", "uri" + i, "type").build();
+                    new GenericDocument.Builder<>("namespace", "id" + i, "type").build();
             mAppSearchImpl.putDocument("package", "database", document, /*logger=*/ null);
         }
 
@@ -452,7 +453,7 @@
         // delete 999 documents, we will reach the threshold to trigger optimize() in next
         // deletion.
         for (int i = 0; i < AppSearchImpl.OPTIMIZE_THRESHOLD_DOC_COUNT - 1; i++) {
-            mAppSearchImpl.remove("package", "database", "namespace", "uri" + i);
+            mAppSearchImpl.remove("package", "database", "namespace", "id" + i);
         }
 
         // Updates the check for optimize counter, checkForOptimize() will be triggered since
@@ -472,7 +473,7 @@
                         < AppSearchImpl.OPTIMIZE_THRESHOLD_DOC_COUNT
                                 + AppSearchImpl.CHECK_OPTIMIZE_INTERVAL;
                 i++) {
-            mAppSearchImpl.remove("package", "database", "namespace", "uri" + i);
+            mAppSearchImpl.remove("package", "database", "namespace", "id" + i);
         }
         // updates the check for optimize counter, will reach both CHECK_OPTIMIZE_INTERVAL and
         // OPTIMIZE_THRESHOLD_DOC_COUNT this time and trigger a optimize().
@@ -501,8 +502,7 @@
                 /*version=*/ 0);
 
         // Insert document
-        GenericDocument document =
-                new GenericDocument.Builder<>("namespace", "uri", "type").build();
+        GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type").build();
         mAppSearchImpl.putDocument("package", "database", document, /*logger=*/ null);
 
         // Rewrite SearchSpec
@@ -544,11 +544,11 @@
 
         // Insert documents
         GenericDocument document1 =
-                new GenericDocument.Builder<>("namespace", "uri", "typeA").build();
+                new GenericDocument.Builder<>("namespace", "id", "typeA").build();
         mAppSearchImpl.putDocument("package", "database1", document1, /*logger=*/ null);
 
         GenericDocument document2 =
-                new GenericDocument.Builder<>("namespace", "uri", "typeB").build();
+                new GenericDocument.Builder<>("namespace", "id", "typeB").build();
         mAppSearchImpl.putDocument("package", "database2", document2, /*logger=*/ null);
 
         // Rewrite SearchSpec
@@ -587,8 +587,7 @@
                 /*version=*/ 0);
 
         // Insert document
-        GenericDocument document =
-                new GenericDocument.Builder<>("namespace", "uri", "type").build();
+        GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type").build();
         mAppSearchImpl.putDocument("package", "database", document, /*logger=*/ null);
 
         // If 'allowedPrefixedSchemas' is empty, this returns false since there's nothing to
@@ -606,7 +605,7 @@
         SearchSpec searchSpec =
                 new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
         SearchResultPage searchResultPage =
-                mAppSearchImpl.query("package", "EmptyDatabase", "", searchSpec);
+                mAppSearchImpl.query("package", "EmptyDatabase", "", searchSpec, /*logger=*/ null);
         assertThat(searchResultPage.getResults()).isEmpty();
     }
 
@@ -642,22 +641,24 @@
 
         // Insert package1 document
         GenericDocument document =
-                new GenericDocument.Builder<>("namespace", "uri", "schema1").build();
+                new GenericDocument.Builder<>("namespace", "id", "schema1").build();
         mAppSearchImpl.putDocument("package1", "database1", document, /*logger=*/ null);
 
         // No query filters specified, package2 shouldn't be able to query for package1's documents.
         SearchSpec searchSpec =
                 new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
         SearchResultPage searchResultPage =
-                mAppSearchImpl.query("package2", "database2", "", searchSpec);
+                mAppSearchImpl.query("package2", "database2", "", searchSpec, /*logger=*/ null);
         assertThat(searchResultPage.getResults()).isEmpty();
 
         // Insert package2 document
-        document = new GenericDocument.Builder<>("namespace", "uri", "schema2").build();
+        document = new GenericDocument.Builder<>("namespace", "id", "schema2").build();
         mAppSearchImpl.putDocument("package2", "database2", document, /*logger=*/ null);
 
         // No query filters specified. package2 should only get its own documents back.
-        searchResultPage = mAppSearchImpl.query("package2", "database2", "", searchSpec);
+        searchResultPage =
+                mAppSearchImpl.query("package2", "database2", "", searchSpec, /*logger=
+         */ null);
         assertThat(searchResultPage.getResults()).hasSize(1);
         assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document);
     }
@@ -694,7 +695,7 @@
 
         // Insert package1 document
         GenericDocument document =
-                new GenericDocument.Builder<>("namespace", "uri", "schema1").build();
+                new GenericDocument.Builder<>("namespace", "id", "schema1").build();
         mAppSearchImpl.putDocument("package1", "database1", document, /*logger=*/ null);
 
         // "package1" filter specified, but package2 shouldn't be able to query for package1's
@@ -705,11 +706,11 @@
                         .addFilterPackageNames("package1")
                         .build();
         SearchResultPage searchResultPage =
-                mAppSearchImpl.query("package2", "database2", "", searchSpec);
+                mAppSearchImpl.query("package2", "database2", "", searchSpec, /*logger=*/ null);
         assertThat(searchResultPage.getResults()).isEmpty();
 
         // Insert package2 document
-        document = new GenericDocument.Builder<>("namespace", "uri", "schema2").build();
+        document = new GenericDocument.Builder<>("namespace", "id", "schema2").build();
         mAppSearchImpl.putDocument("package2", "database2", document, /*logger=*/ null);
 
         // "package2" filter specified, package2 should only get its own documents back.
@@ -718,7 +719,9 @@
                         .setTermMatch(TermMatchType.Code.PREFIX_VALUE)
                         .addFilterPackageNames("package2")
                         .build();
-        searchResultPage = mAppSearchImpl.query("package2", "database2", "", searchSpec);
+        searchResultPage =
+                mAppSearchImpl.query("package2", "database2", "", searchSpec, /*logger=
+         */ null);
         assertThat(searchResultPage.getResults()).hasSize(1);
         assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document);
     }
@@ -729,7 +732,11 @@
                 new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
         SearchResultPage searchResultPage =
                 mAppSearchImpl.globalQuery(
-                        "", searchSpec, /*callerPackageName=*/ "", /*callerUid=*/ 0);
+                        "",
+                        searchSpec,
+                        /*callerPackageName=*/ "",
+                        /*callerUid=*/ 0,
+                        /*logger=*/ null);
         assertThat(searchResultPage.getResults()).isEmpty();
     }
 
@@ -1028,14 +1035,19 @@
 
         // Insert package document
         GenericDocument document =
-                new GenericDocument.Builder<>("namespace", "uri", "schema").build();
+                new GenericDocument.Builder<>("namespace", "id", "schema").build();
         mAppSearchImpl.putDocument("package", "database", document, /*logger=*/ null);
 
         // Verify the document is indexed.
         SearchSpec searchSpec =
                 new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
         SearchResultPage searchResultPage =
-                mAppSearchImpl.query("package", "database", /*queryExpression=*/ "", searchSpec);
+                mAppSearchImpl.query(
+                        "package",
+                        "database",
+                        /*queryExpression=*/ "",
+                        searchSpec,
+                        /*logger=*/ null);
         assertThat(searchResultPage.getResults()).hasSize(1);
         assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document);
 
@@ -1044,7 +1056,12 @@
 
         // Verify the document is cleared.
         searchResultPage =
-                mAppSearchImpl.query("package2", "database2", /*queryExpression=*/ "", searchSpec);
+                mAppSearchImpl.query(
+                        "package2",
+                        "database2",
+                        /*queryExpression=*/ "",
+                        searchSpec,
+                        /*logger=*/ null);
         assertThat(searchResultPage.getResults()).isEmpty();
 
         // Verify the schema is cleared.
@@ -1135,14 +1152,14 @@
                         + PrefixUtil.PACKAGE_DELIMITER
                         + "databaseName"
                         + PrefixUtil.DATABASE_DELIMITER;
-        final String uri = "uri";
+        final String id = "id";
         final String namespace = prefix + "namespace";
         final String schemaType = prefix + "schema";
 
         // Building the SearchResult received from query.
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri(uri)
+                        .setUri(id)
                         .setNamespace(namespace)
                         .setSchema(schemaType)
                         .build();
@@ -1185,32 +1202,32 @@
 
         // Insert two docs
         GenericDocument document1 =
-                new GenericDocument.Builder<>("namespace", "uri1", "type").build();
+                new GenericDocument.Builder<>("namespace", "id1", "type").build();
         GenericDocument document2 =
-                new GenericDocument.Builder<>("namespace", "uri2", "type").build();
+                new GenericDocument.Builder<>("namespace", "id2", "type").build();
         mAppSearchImpl.putDocument("package", "database", document1, /*logger=*/ null);
         mAppSearchImpl.putDocument("package", "database", document2, /*logger=*/ null);
 
-        // Report some usages. uri1 has 2 app and 1 system usage, uri2 has 1 app and 2 system usage.
+        // Report some usages. id1 has 2 app and 1 system usage, id2 has 1 app and 2 system usage.
         mAppSearchImpl.reportUsage(
                 "package",
                 "database",
                 "namespace",
-                "uri1",
+                "id1",
                 /*usageTimestampMillis=*/ 10,
                 /*systemUsage=*/ false);
         mAppSearchImpl.reportUsage(
                 "package",
                 "database",
                 "namespace",
-                "uri1",
+                "id1",
                 /*usageTimestampMillis=*/ 20,
                 /*systemUsage=*/ false);
         mAppSearchImpl.reportUsage(
                 "package",
                 "database",
                 "namespace",
-                "uri1",
+                "id1",
                 /*usageTimestampMillis=*/ 1000,
                 /*systemUsage=*/ true);
 
@@ -1218,25 +1235,25 @@
                 "package",
                 "database",
                 "namespace",
-                "uri2",
+                "id2",
                 /*usageTimestampMillis=*/ 100,
                 /*systemUsage=*/ false);
         mAppSearchImpl.reportUsage(
                 "package",
                 "database",
                 "namespace",
-                "uri2",
+                "id2",
                 /*usageTimestampMillis=*/ 200,
                 /*systemUsage=*/ true);
         mAppSearchImpl.reportUsage(
                 "package",
                 "database",
                 "namespace",
-                "uri2",
+                "id2",
                 /*usageTimestampMillis=*/ 150,
                 /*systemUsage=*/ true);
 
-        // Sort by app usage count: uri1 should win
+        // Sort by app usage count: id1 should win
         List<SearchResult> page =
                 mAppSearchImpl
                         .query(
@@ -1246,13 +1263,14 @@
                                 new SearchSpec.Builder()
                                         .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
                                         .setRankingStrategy(SearchSpec.RANKING_STRATEGY_USAGE_COUNT)
-                                        .build())
+                                        .build(),
+                                /*logger=*/ null)
                         .getResults();
         assertThat(page).hasSize(2);
-        assertThat(page.get(0).getGenericDocument().getUri()).isEqualTo("uri1");
-        assertThat(page.get(1).getGenericDocument().getUri()).isEqualTo("uri2");
+        assertThat(page.get(0).getGenericDocument().getId()).isEqualTo("id1");
+        assertThat(page.get(1).getGenericDocument().getId()).isEqualTo("id2");
 
-        // Sort by app usage timestamp: uri2 should win
+        // Sort by app usage timestamp: id2 should win
         page =
                 mAppSearchImpl
                         .query(
@@ -1264,13 +1282,14 @@
                                         .setRankingStrategy(
                                                 SearchSpec
                                                         .RANKING_STRATEGY_USAGE_LAST_USED_TIMESTAMP)
-                                        .build())
+                                        .build(),
+                                /*logger=*/ null)
                         .getResults();
         assertThat(page).hasSize(2);
-        assertThat(page.get(0).getGenericDocument().getUri()).isEqualTo("uri2");
-        assertThat(page.get(1).getGenericDocument().getUri()).isEqualTo("uri1");
+        assertThat(page.get(0).getGenericDocument().getId()).isEqualTo("id2");
+        assertThat(page.get(1).getGenericDocument().getId()).isEqualTo("id1");
 
-        // Sort by system usage count: uri2 should win
+        // Sort by system usage count: id2 should win
         page =
                 mAppSearchImpl
                         .query(
@@ -1281,13 +1300,14 @@
                                         .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
                                         .setRankingStrategy(
                                                 SearchSpec.RANKING_STRATEGY_SYSTEM_USAGE_COUNT)
-                                        .build())
+                                        .build(),
+                                /*logger=*/ null)
                         .getResults();
         assertThat(page).hasSize(2);
-        assertThat(page.get(0).getGenericDocument().getUri()).isEqualTo("uri2");
-        assertThat(page.get(1).getGenericDocument().getUri()).isEqualTo("uri1");
+        assertThat(page.get(0).getGenericDocument().getId()).isEqualTo("id2");
+        assertThat(page.get(1).getGenericDocument().getId()).isEqualTo("id1");
 
-        // Sort by system usage timestamp: uri1 should win
+        // Sort by system usage timestamp: id1 should win
         page =
                 mAppSearchImpl
                         .query(
@@ -1299,11 +1319,12 @@
                                         .setRankingStrategy(
                                                 SearchSpec
                                                         .RANKING_STRATEGY_SYSTEM_USAGE_LAST_USED_TIMESTAMP)
-                                        .build())
+                                        .build(),
+                                /*logger=*/ null)
                         .getResults();
         assertThat(page).hasSize(2);
-        assertThat(page.get(0).getGenericDocument().getUri()).isEqualTo("uri1");
-        assertThat(page.get(1).getGenericDocument().getUri()).isEqualTo("uri2");
+        assertThat(page.get(0).getGenericDocument().getId()).isEqualTo("id1");
+        assertThat(page.get(1).getGenericDocument().getId()).isEqualTo("id2");
     }
 
     @Test
@@ -1353,7 +1374,7 @@
 
         // Insert document for "package1"
         GenericDocument document =
-                new GenericDocument.Builder<>("namespace", "uri1", "type").build();
+                new GenericDocument.Builder<>("namespace", "id1", "type").build();
         mAppSearchImpl.putDocument("package1", "database", document, /*logger=*/ null);
 
         // Insert schema for "package2"
@@ -1367,9 +1388,9 @@
                 /*version=*/ 0);
 
         // Insert two documents for "package2"
-        document = new GenericDocument.Builder<>("namespace", "uri1", "type").build();
+        document = new GenericDocument.Builder<>("namespace", "id1", "type").build();
         mAppSearchImpl.putDocument("package2", "database", document, /*logger=*/ null);
-        document = new GenericDocument.Builder<>("namespace", "uri2", "type").build();
+        document = new GenericDocument.Builder<>("namespace", "id2", "type").build();
         mAppSearchImpl.putDocument("package2", "database", document, /*logger=*/ null);
 
         StorageInfo storageInfo = mAppSearchImpl.getStorageInfoForPackage("package1");
@@ -1467,13 +1488,13 @@
 
         // Add a document for "package1", "database1"
         GenericDocument document =
-                new GenericDocument.Builder<>("namespace1", "uri1", "type").build();
+                new GenericDocument.Builder<>("namespace1", "id1", "type").build();
         mAppSearchImpl.putDocument("package1", "database1", document, /*logger=*/ null);
 
         // Add two documents for "package1", "database2"
-        document = new GenericDocument.Builder<>("namespace1", "uri1", "type").build();
+        document = new GenericDocument.Builder<>("namespace1", "id1", "type").build();
         mAppSearchImpl.putDocument("package1", "database2", document, /*logger=*/ null);
-        document = new GenericDocument.Builder<>("namespace1", "uri2", "type").build();
+        document = new GenericDocument.Builder<>("namespace1", "id2", "type").build();
         mAppSearchImpl.putDocument("package1", "database2", document, /*logger=*/ null);
 
         StorageInfo storageInfo = mAppSearchImpl.getStorageInfoForDatabase("package1", "database1");
@@ -1501,7 +1522,9 @@
                         mTemporaryFolder.newFolder(),
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ "");
+                        /*globalQuerierPackage=*/ "",
+                        /*logger
+                        =*/ null);
 
         // Initial check that we could do something at first.
         List<AppSearchSchema> schemas =
@@ -1543,7 +1566,7 @@
                     appSearchImpl.putDocument(
                             "package",
                             "database",
-                            new GenericDocument.Builder<>("namespace", "uri", "type").build(),
+                            new GenericDocument.Builder<>("namespace", "id", "type").build(),
                             /*logger=*/ null);
                 });
 
@@ -1551,7 +1574,7 @@
                 IllegalStateException.class,
                 () -> {
                     appSearchImpl.getDocument(
-                            "package", "database", "namespace", "uri", Collections.emptyMap());
+                            "package", "database", "namespace", "id", Collections.emptyMap());
                 });
 
         expectThrows(
@@ -1563,7 +1586,8 @@
                             "query",
                             new SearchSpec.Builder()
                                     .setTermMatch(TermMatchType.Code.PREFIX_VALUE)
-                                    .build());
+                                    .build(),
+                            /*logger=*/ null);
                 });
 
         expectThrows(
@@ -1575,7 +1599,8 @@
                                     .setTermMatch(TermMatchType.Code.PREFIX_VALUE)
                                     .build(),
                             "package",
-                            /*callerUid=*/ 1);
+                            /*callerUid=*/ 1,
+                            /*logger=*/ null);
                 });
 
         expectThrows(
@@ -1597,7 +1622,7 @@
                             "package",
                             "database",
                             "namespace",
-                            "uri",
+                            "id",
                             /*usageTimestampMillis=*/ 1000L,
                             /*systemUsage=*/ false);
                 });
@@ -1605,7 +1630,7 @@
         expectThrows(
                 IllegalStateException.class,
                 () -> {
-                    appSearchImpl.remove("package", "database", "namespace", "uri");
+                    appSearchImpl.remove("package", "database", "namespace", "id");
                 });
 
         expectThrows(
@@ -1649,7 +1674,8 @@
                         appsearchDir,
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ "");
+                        /*globalQuerierPackage=*/ "",
+                        /*logger=*/ null);
 
         List<AppSearchSchema> schemas =
                 Collections.singletonList(new AppSearchSchema.Builder("type").build());
@@ -1664,13 +1690,13 @@
 
         // Add a document and persist it.
         GenericDocument document =
-                new GenericDocument.Builder<>("namespace1", "uri1", "type").build();
+                new GenericDocument.Builder<>("namespace1", "id1", "type").build();
         appSearchImpl.putDocument("package", "database", document, /*logger=*/ null);
         appSearchImpl.persistToDisk(PersistType.Code.LITE);
 
         GenericDocument getResult =
                 appSearchImpl.getDocument(
-                        "package", "database", "namespace1", "uri1", Collections.emptyMap());
+                        "package", "database", "namespace1", "id1", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document);
 
         // That document should be visible even from another instance.
@@ -1679,10 +1705,11 @@
                         appsearchDir,
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ "");
+                        /*globalQuerierPackage=*/ "",
+                        /*logger=*/ null);
         getResult =
                 appSearchImpl2.getDocument(
-                        "package", "database", "namespace1", "uri1", Collections.emptyMap());
+                        "package", "database", "namespace1", "id1", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document);
     }
 
@@ -1696,7 +1723,8 @@
                         appsearchDir,
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ "");
+                        /*globalQuerierPackage=*/ "",
+                        /*logger=*/ null);
 
         List<AppSearchSchema> schemas =
                 Collections.singletonList(new AppSearchSchema.Builder("type").build());
@@ -1711,24 +1739,24 @@
 
         // Add two documents and persist them.
         GenericDocument document1 =
-                new GenericDocument.Builder<>("namespace1", "uri1", "type").build();
+                new GenericDocument.Builder<>("namespace1", "id1", "type").build();
         appSearchImpl.putDocument("package", "database", document1, /*logger=*/ null);
         GenericDocument document2 =
-                new GenericDocument.Builder<>("namespace1", "uri2", "type").build();
+                new GenericDocument.Builder<>("namespace1", "id2", "type").build();
         appSearchImpl.putDocument("package", "database", document2, /*logger=*/ null);
         appSearchImpl.persistToDisk(PersistType.Code.LITE);
 
         GenericDocument getResult =
                 appSearchImpl.getDocument(
-                        "package", "database", "namespace1", "uri1", Collections.emptyMap());
+                        "package", "database", "namespace1", "id1", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document1);
         getResult =
                 appSearchImpl.getDocument(
-                        "package", "database", "namespace1", "uri2", Collections.emptyMap());
+                        "package", "database", "namespace1", "id2", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document2);
 
         // Delete the first document
-        appSearchImpl.remove("package", "database", "namespace1", "uri1");
+        appSearchImpl.remove("package", "database", "namespace1", "id1");
         appSearchImpl.persistToDisk(PersistType.Code.LITE);
         expectThrows(
                 AppSearchException.class,
@@ -1737,11 +1765,11 @@
                                 "package",
                                 "database",
                                 "namespace1",
-                                "uri1",
+                                "id1",
                                 Collections.emptyMap()));
         getResult =
                 appSearchImpl.getDocument(
-                        "package", "database", "namespace1", "uri2", Collections.emptyMap());
+                        "package", "database", "namespace1", "id2", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document2);
 
         // Only the second document should be retrievable from another instance.
@@ -1750,7 +1778,8 @@
                         appsearchDir,
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ "");
+                        /*globalQuerierPackage=*/ "",
+                        /*logger=*/ null);
         expectThrows(
                 AppSearchException.class,
                 () ->
@@ -1758,11 +1787,11 @@
                                 "package",
                                 "database",
                                 "namespace1",
-                                "uri1",
+                                "id1",
                                 Collections.emptyMap()));
         getResult =
                 appSearchImpl2.getDocument(
-                        "package", "database", "namespace1", "uri2", Collections.emptyMap());
+                        "package", "database", "namespace1", "id2", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document2);
     }
 
@@ -1776,7 +1805,8 @@
                         appsearchDir,
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ "");
+                        /*globalQuerierPackage=*/ "",
+                        /*logger=*/ null);
 
         List<AppSearchSchema> schemas =
                 Collections.singletonList(new AppSearchSchema.Builder("type").build());
@@ -1791,20 +1821,20 @@
 
         // Add two documents and persist them.
         GenericDocument document1 =
-                new GenericDocument.Builder<>("namespace1", "uri1", "type").build();
+                new GenericDocument.Builder<>("namespace1", "id1", "type").build();
         appSearchImpl.putDocument("package", "database", document1, /*logger=*/ null);
         GenericDocument document2 =
-                new GenericDocument.Builder<>("namespace2", "uri2", "type").build();
+                new GenericDocument.Builder<>("namespace2", "id2", "type").build();
         appSearchImpl.putDocument("package", "database", document2, /*logger=*/ null);
         appSearchImpl.persistToDisk(PersistType.Code.LITE);
 
         GenericDocument getResult =
                 appSearchImpl.getDocument(
-                        "package", "database", "namespace1", "uri1", Collections.emptyMap());
+                        "package", "database", "namespace1", "id1", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document1);
         getResult =
                 appSearchImpl.getDocument(
-                        "package", "database", "namespace2", "uri2", Collections.emptyMap());
+                        "package", "database", "namespace2", "id2", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document2);
 
         // Delete the first document
@@ -1824,11 +1854,11 @@
                                 "package",
                                 "database",
                                 "namespace1",
-                                "uri1",
+                                "id1",
                                 Collections.emptyMap()));
         getResult =
                 appSearchImpl.getDocument(
-                        "package", "database", "namespace2", "uri2", Collections.emptyMap());
+                        "package", "database", "namespace2", "id2", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document2);
 
         // Only the second document should be retrievable from another instance.
@@ -1837,7 +1867,8 @@
                         appsearchDir,
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ "");
+                        /*globalQuerierPackage=*/ "",
+                        /*logger=*/ null);
         expectThrows(
                 AppSearchException.class,
                 () ->
@@ -1845,11 +1876,11 @@
                                 "package",
                                 "database",
                                 "namespace1",
-                                "uri1",
+                                "id1",
                                 Collections.emptyMap()));
         getResult =
                 appSearchImpl2.getDocument(
-                        "package", "database", "namespace2", "uri2", Collections.emptyMap());
+                        "package", "database", "namespace2", "id2", Collections.emptyMap());
         assertThat(getResult).isEqualTo(document2);
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java
index 673b7ee..5989bb6 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java
@@ -23,13 +23,21 @@
 import android.app.appsearch.AppSearchResult;
 import android.app.appsearch.AppSearchSchema;
 import android.app.appsearch.GenericDocument;
+import android.app.appsearch.SearchResultPage;
+import android.app.appsearch.SearchSpec;
 import android.content.Context;
 
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.server.appsearch.external.localstorage.stats.CallStats;
+import com.android.server.appsearch.external.localstorage.stats.InitializeStats;
 import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats;
+import com.android.server.appsearch.external.localstorage.stats.SearchStats;
+import com.android.server.appsearch.proto.InitializeStatsProto;
 import com.android.server.appsearch.proto.PutDocumentStatsProto;
+import com.android.server.appsearch.proto.QueryStatsProto;
+import com.android.server.appsearch.proto.ScoringSpecProto;
+import com.android.server.appsearch.proto.TermMatchType;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -54,23 +62,93 @@
                         mTemporaryFolder.newFolder(),
                         context,
                         VisibilityStore.NO_OP_USER_ID,
-                        /*globalQuerierPackage=*/ context.getPackageName());
+                        /*globalQuerierPackage=*/ context.getPackageName(),
+                        /*logger=*/ null);
         mLogger = new TestLogger();
     }
 
     // Test only not thread safe.
     public class TestLogger implements AppSearchLogger {
+        @Nullable CallStats mCallStats;
         @Nullable PutDocumentStats mPutDocumentStats;
+        @Nullable InitializeStats mInitializeStats;
+        @Nullable SearchStats mSearchStats;
 
         @Override
         public void logStats(@NonNull CallStats stats) {
-            throw new UnsupportedOperationException();
+            mCallStats = stats;
         }
 
         @Override
         public void logStats(@NonNull PutDocumentStats stats) {
             mPutDocumentStats = stats;
         }
+
+        @Override
+        public void logStats(@NonNull InitializeStats stats) {
+            mInitializeStats = stats;
+        }
+
+        @Override
+        public void logStats(@NonNull SearchStats stats) {
+            mSearchStats = stats;
+        }
+    }
+
+    @Test
+    public void testAppSearchLoggerHelper_testCopyNativeStats_initialize() {
+        int nativeLatencyMillis = 3;
+        int nativeDocumentStoreRecoveryCause = InitializeStatsProto.RecoveryCause.DATA_LOSS_VALUE;
+        int nativeIndexRestorationCause =
+                InitializeStatsProto.RecoveryCause.INCONSISTENT_WITH_GROUND_TRUTH_VALUE;
+        int nativeSchemaStoreRecoveryCause =
+                InitializeStatsProto.RecoveryCause.TOTAL_CHECKSUM_MISMATCH_VALUE;
+        int nativeDocumentStoreRecoveryLatencyMillis = 7;
+        int nativeIndexRestorationLatencyMillis = 8;
+        int nativeSchemaStoreRecoveryLatencyMillis = 9;
+        int nativeDocumentStoreDataStatus =
+                InitializeStatsProto.DocumentStoreDataStatus.NO_DATA_LOSS_VALUE;
+        int nativeNumDocuments = 11;
+        int nativeNumSchemaTypes = 12;
+        InitializeStatsProto.Builder nativeInitBuilder =
+                InitializeStatsProto.newBuilder()
+                        .setLatencyMs(nativeLatencyMillis)
+                        .setDocumentStoreRecoveryCause(
+                                InitializeStatsProto.RecoveryCause.forNumber(
+                                        nativeDocumentStoreRecoveryCause))
+                        .setIndexRestorationCause(
+                                InitializeStatsProto.RecoveryCause.forNumber(
+                                        nativeIndexRestorationCause))
+                        .setSchemaStoreRecoveryCause(
+                                InitializeStatsProto.RecoveryCause.forNumber(
+                                        nativeSchemaStoreRecoveryCause))
+                        .setDocumentStoreRecoveryLatencyMs(nativeDocumentStoreRecoveryLatencyMillis)
+                        .setIndexRestorationLatencyMs(nativeIndexRestorationLatencyMillis)
+                        .setSchemaStoreRecoveryLatencyMs(nativeSchemaStoreRecoveryLatencyMillis)
+                        .setDocumentStoreDataStatus(
+                                InitializeStatsProto.DocumentStoreDataStatus.forNumber(
+                                        nativeDocumentStoreDataStatus))
+                        .setNumDocuments(nativeNumDocuments)
+                        .setNumSchemaTypes(nativeNumSchemaTypes);
+        InitializeStats.Builder initBuilder = new InitializeStats.Builder();
+
+        AppSearchLoggerHelper.copyNativeStats(nativeInitBuilder.build(), initBuilder);
+
+        InitializeStats iStats = initBuilder.build();
+        assertThat(iStats.getNativeLatencyMillis()).isEqualTo(nativeLatencyMillis);
+        assertThat(iStats.getDocumentStoreRecoveryCause())
+                .isEqualTo(nativeDocumentStoreRecoveryCause);
+        assertThat(iStats.getIndexRestorationCause()).isEqualTo(nativeIndexRestorationCause);
+        assertThat(iStats.getSchemaStoreRecoveryCause()).isEqualTo(nativeSchemaStoreRecoveryCause);
+        assertThat(iStats.getDocumentStoreRecoveryLatencyMillis())
+                .isEqualTo(nativeDocumentStoreRecoveryLatencyMillis);
+        assertThat(iStats.getIndexRestorationLatencyMillis())
+                .isEqualTo(nativeIndexRestorationLatencyMillis);
+        assertThat(iStats.getSchemaStoreRecoveryLatencyMillis())
+                .isEqualTo(nativeSchemaStoreRecoveryLatencyMillis);
+        assertThat(iStats.getDocumentStoreDataStatus()).isEqualTo(nativeDocumentStoreDataStatus);
+        assertThat(iStats.getDocumentCount()).isEqualTo(nativeNumDocuments);
+        assertThat(iStats.getSchemaTypeCount()).isEqualTo(nativeNumSchemaTypes);
     }
 
     @Test
@@ -111,10 +189,97 @@
         assertThat(pStats.getNativeExceededMaxNumTokens()).isEqualTo(nativeExceededMaxNumTokens);
     }
 
+    @Test
+    public void testAppSearchLoggerHelper_testCopyNativeStats_search() {
+        int nativeLatencyMillis = 4;
+        int nativeNumTerms = 5;
+        // TODO(b/185804196) query length needs to be added in the native stats.
+        // int nativeQueryLength = 6;
+        int nativeNumNamespacesFiltered = 7;
+        int nativeNumSchemaTypesFiltered = 8;
+        int nativeRequestedPageSize = 9;
+        int nativeNumResultsReturnedCurrentPage = 10;
+        boolean nativeIsFirstPage = true;
+        int nativeParseQueryLatencyMillis = 11;
+        int nativeRankingStrategy = ScoringSpecProto.RankingStrategy.Code.CREATION_TIMESTAMP_VALUE;
+        int nativeNumDocumentsScored = 13;
+        int nativeScoringLatencyMillis = 14;
+        int nativeRankingLatencyMillis = 15;
+        int nativeNumResultsWithSnippets = 16;
+        int nativeDocumentRetrievingLatencyMillis = 17;
+        QueryStatsProto nativeQueryStats =
+                QueryStatsProto.newBuilder()
+                        .setLatencyMs(nativeLatencyMillis)
+                        .setNumTerms(nativeNumTerms)
+                        .setNumNamespacesFiltered(nativeNumNamespacesFiltered)
+                        .setNumSchemaTypesFiltered(nativeNumSchemaTypesFiltered)
+                        .setRequestedPageSize(nativeRequestedPageSize)
+                        .setNumResultsReturnedCurrentPage(nativeNumResultsReturnedCurrentPage)
+                        .setIsFirstPage(nativeIsFirstPage)
+                        .setParseQueryLatencyMs(nativeParseQueryLatencyMillis)
+                        .setRankingStrategy(
+                                ScoringSpecProto.RankingStrategy.Code.forNumber(
+                                        nativeRankingStrategy))
+                        .setNumDocumentsScored(nativeNumDocumentsScored)
+                        .setScoringLatencyMs(nativeScoringLatencyMillis)
+                        .setRankingLatencyMs(nativeRankingLatencyMillis)
+                        .setNumResultsWithSnippets(nativeNumResultsWithSnippets)
+                        .setDocumentRetrievalLatencyMs(nativeDocumentRetrievingLatencyMillis)
+                        .build();
+        SearchStats.Builder qBuilder =
+                new SearchStats.Builder(SearchStats.VISIBILITY_SCOPE_LOCAL, "packageName")
+                        .setDatabase("database");
+
+        AppSearchLoggerHelper.copyNativeStats(nativeQueryStats, qBuilder);
+
+        SearchStats sStats = qBuilder.build();
+        assertThat(sStats.getNativeLatencyMillis()).isEqualTo(nativeLatencyMillis);
+        assertThat(sStats.getTermCount()).isEqualTo(nativeNumTerms);
+        // assertThat(sStats.getNativeQueryLength()).isEqualTo(nativeQueryLength);
+        assertThat(sStats.getFilteredNamespaceCount()).isEqualTo(nativeNumNamespacesFiltered);
+        assertThat(sStats.getFilteredSchemaTypeCount()).isEqualTo(nativeNumSchemaTypesFiltered);
+        assertThat(sStats.getRequestedPageSize()).isEqualTo(nativeRequestedPageSize);
+        assertThat(sStats.getCurrentPageReturnedResultCount())
+                .isEqualTo(nativeNumResultsReturnedCurrentPage);
+        assertThat(sStats.isFirstPage()).isTrue();
+        assertThat(sStats.getParseQueryLatencyMillis()).isEqualTo(nativeParseQueryLatencyMillis);
+        assertThat(sStats.getRankingStrategy()).isEqualTo(nativeRankingStrategy);
+        assertThat(sStats.getScoredDocumentCount()).isEqualTo(nativeNumDocumentsScored);
+        assertThat(sStats.getScoringLatencyMillis()).isEqualTo(nativeScoringLatencyMillis);
+        assertThat(sStats.getRankingLatencyMillis()).isEqualTo(nativeRankingLatencyMillis);
+        assertThat(sStats.getResultWithSnippetsCount()).isEqualTo(nativeNumResultsWithSnippets);
+        assertThat(sStats.getDocumentRetrievingLatencyMillis())
+                .isEqualTo(nativeDocumentRetrievingLatencyMillis);
+    }
+
     //
     // Testing actual logging
     //
     @Test
+    public void testLoggingStats_initialize() throws Exception {
+        Context context = ApplicationProvider.getApplicationContext();
+
+        AppSearchImpl appSearchImpl =
+                AppSearchImpl.create(
+                        mTemporaryFolder.newFolder(),
+                        context,
+                        VisibilityStore.NO_OP_USER_ID,
+                        /*globalQuerierPackage=*/ context.getPackageName(),
+                        mLogger);
+
+        InitializeStats iStats = mLogger.mInitializeStats;
+        assertThat(iStats).isNotNull();
+        assertThat(iStats.getStatusCode()).isEqualTo(AppSearchResult.RESULT_OK);
+        assertThat(iStats.getTotalLatencyMillis()).isGreaterThan(0);
+        assertThat(iStats.hasDeSync()).isFalse();
+        assertThat(iStats.getNativeLatencyMillis()).isGreaterThan(0);
+        assertThat(iStats.getDocumentStoreDataStatus())
+                .isEqualTo(InitializeStatsProto.DocumentStoreDataStatus.NO_DATA_LOSS_VALUE);
+        assertThat(iStats.getDocumentCount()).isEqualTo(0);
+        assertThat(iStats.getSchemaTypeCount()).isEqualTo(0);
+    }
+
+    @Test
     public void testLoggingStats_putDocument() throws Exception {
         // Insert schema
         final String testPackageName = "testPackage";
@@ -129,8 +294,7 @@
                 /*schemasPackageAccessible=*/ Collections.emptyMap(),
                 /*forceOverride=*/ false,
                 /*version=*/ 0);
-        GenericDocument document =
-                new GenericDocument.Builder<>("namespace", "uri", "type").build();
+        GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type").build();
 
         mAppSearchImpl.putDocument(testPackageName, testDatabase, document, mLogger);
 
@@ -142,4 +306,53 @@
         // The rest of native stats have been tested in testCopyNativeStats
         assertThat(pStats.getNativeDocumentSizeBytes()).isGreaterThan(0);
     }
+
+    @Test
+    public void testLoggingStats_search() throws Exception {
+        // Insert schema
+        final String testPackageName = "testPackage";
+        final String testDatabase = "testDatabase";
+        List<AppSearchSchema> schemas =
+                Collections.singletonList(new AppSearchSchema.Builder("type").build());
+        mAppSearchImpl.setSchema(
+                testPackageName,
+                testDatabase,
+                schemas,
+                /*schemasNotPlatformSurfaceable=*/ Collections.emptyList(),
+                /*schemasPackageAccessible=*/ Collections.emptyMap(),
+                /*forceOverride=*/ false,
+                /*version=*/ 0);
+        GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type").build();
+        mAppSearchImpl.putDocument(testPackageName, testDatabase, document, mLogger);
+
+        // No query filters specified. package2 should only get its own documents back.
+        SearchSpec searchSpec =
+                new SearchSpec.Builder().setTermMatch(TermMatchType.Code.PREFIX_VALUE).build();
+        SearchResultPage searchResultPage =
+                mAppSearchImpl.query(
+                        testPackageName,
+                        testDatabase,
+                        /*QueryExpression=*/ "",
+                        searchSpec,
+                        /*logger=*/ mLogger);
+
+        assertThat(searchResultPage.getResults()).hasSize(1);
+        assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document);
+
+        SearchStats sStats = mLogger.mSearchStats;
+
+        assertThat(sStats).isNotNull();
+        assertThat(sStats.getPackageName()).isEqualTo(testPackageName);
+        assertThat(sStats.getDatabase()).isEqualTo(testDatabase);
+        assertThat(sStats.getStatusCode()).isEqualTo(AppSearchResult.RESULT_OK);
+        assertThat(sStats.getTotalLatencyMillis()).isGreaterThan(0);
+        assertThat(sStats.getVisibilityScope()).isEqualTo(SearchStats.VISIBILITY_SCOPE_LOCAL);
+        assertThat(sStats.getTermCount()).isEqualTo(0);
+        // assertThat(sStats.getNativeQueryLength()).isEqualTo(0);
+        assertThat(sStats.getFilteredNamespaceCount()).isEqualTo(1);
+        assertThat(sStats.getFilteredSchemaTypeCount()).isEqualTo(1);
+        assertThat(sStats.getCurrentPageReturnedResultCount()).isEqualTo(1);
+        assertThat(sStats.isFirstPage()).isTrue();
+        assertThat(sStats.getScoredDocumentCount()).isEqualTo(1);
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverterTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverterTest.java
index 63f031722..ada49ff 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverterTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/GenericDocumentToProtoConverterTest.java
@@ -64,7 +64,7 @@
     public void testDocumentProtoConvert() {
         GenericDocument document =
                 new GenericDocument.Builder<GenericDocument.Builder<?>>(
-                                "namespace", "uri1", SCHEMA_TYPE_1)
+                                "namespace", "id1", SCHEMA_TYPE_1)
                         .setCreationTimestampMillis(5L)
                         .setScore(1)
                         .setTtlMillis(1L)
@@ -80,7 +80,7 @@
         // Create the Document proto. Need to sort the property order by key.
         DocumentProto.Builder documentProtoBuilder =
                 DocumentProto.newBuilder()
-                        .setUri("uri1")
+                        .setUri("id1")
                         .setSchema(SCHEMA_TYPE_1)
                         .setCreationTimestampMs(5L)
                         .setScore(1)
@@ -140,7 +140,7 @@
         String emptyStringPropertyName = "emptyStringProperty";
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri1")
+                        .setUri("id1")
                         .setSchema(SCHEMA_TYPE_1)
                         .setCreationTimestampMs(5L)
                         .setNamespace("namespace")
@@ -167,7 +167,7 @@
 
         GenericDocument expectedDocument =
                 new GenericDocument.Builder<GenericDocument.Builder<?>>(
-                                "namespace", "uri1", SCHEMA_TYPE_1)
+                                "namespace", "id1", SCHEMA_TYPE_1)
                         .setCreationTimestampMillis(5L)
                         .setPropertyString(emptyStringPropertyName)
                         .build();
@@ -181,7 +181,7 @@
         String documentPropertyName = "documentProperty";
         DocumentProto nestedDocumentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri2")
+                        .setUri("id2")
                         .setSchema(SCHEMA_TYPE_2)
                         .setCreationTimestampMs(5L)
                         .setNamespace("namespace")
@@ -190,7 +190,7 @@
                         .build();
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri("uri1")
+                        .setUri("id1")
                         .setSchema(SCHEMA_TYPE_1)
                         .setCreationTimestampMs(5L)
                         .setNamespace("namespace")
@@ -236,12 +236,12 @@
 
         GenericDocument expectedDocument =
                 new GenericDocument.Builder<GenericDocument.Builder<?>>(
-                                "namespace", "uri1", SCHEMA_TYPE_1)
+                                "namespace", "id1", SCHEMA_TYPE_1)
                         .setCreationTimestampMillis(5L)
                         .setPropertyDocument(
                                 documentPropertyName,
                                 new GenericDocument.Builder<GenericDocument.Builder<?>>(
-                                                "namespace", "uri2", SCHEMA_TYPE_2)
+                                                "namespace", "id2", SCHEMA_TYPE_2)
                                         .setCreationTimestampMillis(5L)
                                         .setPropertyString(emptyStringPropertyName)
                                         .build())
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java
index 26fac49..d0ce317 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/converter/SnippetTest.java
@@ -54,22 +54,19 @@
                 "A commonly used fake word is foo.\n"
                         + "   Another nonsense word that’s used a lot\n"
                         + "   is bar.\n";
-        final String uri = "uri1";
-        final String searchWord = "foo";
+        final String id = "id1";
         final String exactMatch = "foo";
         final String window = "is foo";
 
         // Building the SearchResult received from query.
-        PropertyProto property =
-                PropertyProto.newBuilder()
-                        .setName(propertyKeyString)
-                        .addStringValues(propertyValueString)
-                        .build();
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri(uri)
+                        .setUri(id)
                         .setSchema(SCHEMA_TYPE)
-                        .addProperties(property)
+                        .addProperties(
+                                PropertyProto.newBuilder()
+                                        .setName(propertyKeyString)
+                                        .addStringValues(propertyValueString))
                         .build();
         SnippetProto snippetProto =
                 SnippetProto.newBuilder()
@@ -81,17 +78,15 @@
                                                         .setExactMatchPosition(29)
                                                         .setExactMatchBytes(3)
                                                         .setWindowPosition(26)
-                                                        .setWindowBytes(6)
-                                                        .build())
-                                        .build())
-                        .build();
-        SearchResultProto.ResultProto resultProto =
-                SearchResultProto.ResultProto.newBuilder()
-                        .setDocument(documentProto)
-                        .setSnippet(snippetProto)
+                                                        .setWindowBytes(6)))
                         .build();
         SearchResultProto searchResultProto =
-                SearchResultProto.newBuilder().addResults(resultProto).build();
+                SearchResultProto.newBuilder()
+                        .addResults(
+                                SearchResultProto.ResultProto.newBuilder()
+                                        .setDocument(documentProto)
+                                        .setSnippet(snippetProto))
+                        .build();
 
         // Making ResultReader and getting Snippet values.
         SearchResultPage searchResultPage =
@@ -100,50 +95,45 @@
                         Collections.singletonList(PACKAGE_NAME),
                         Collections.singletonList(DATABASE_NAME),
                         SCHEMA_MAP);
-        for (SearchResult result : searchResultPage.getResults()) {
-            SearchResult.MatchInfo match = result.getMatches().get(0);
-            assertThat(match.getPropertyPath()).isEqualTo(propertyKeyString);
-            assertThat(match.getFullText()).isEqualTo(propertyValueString);
-            assertThat(match.getExactMatch()).isEqualTo(exactMatch);
-            assertThat(match.getExactMatchRange())
-                    .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 29, /*upper=*/ 32));
-            assertThat(match.getFullText()).isEqualTo(propertyValueString);
-            assertThat(match.getSnippetRange())
-                    .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 26, /*upper=*/ 32));
-            assertThat(match.getSnippet()).isEqualTo(window);
-        }
+        assertThat(searchResultPage.getResults()).hasSize(1);
+        SearchResult.MatchInfo match = searchResultPage.getResults().get(0).getMatches().get(0);
+        assertThat(match.getPropertyPath()).isEqualTo(propertyKeyString);
+        assertThat(match.getFullText()).isEqualTo(propertyValueString);
+        assertThat(match.getExactMatch()).isEqualTo(exactMatch);
+        assertThat(match.getExactMatchRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 29, /*upper=*/ 32));
+        assertThat(match.getFullText()).isEqualTo(propertyValueString);
+        assertThat(match.getSnippetRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 26, /*upper=*/ 32));
+        assertThat(match.getSnippet()).isEqualTo(window);
     }
 
     // TODO(tytytyww): Add tests for Double and Long Snippets.
     @Test
-    public void testNoSnippets() throws Exception {
-
+    public void testNoSnippets() {
         final String propertyKeyString = "content";
         final String propertyValueString =
                 "A commonly used fake word is foo.\n"
                         + "   Another nonsense word that’s used a lot\n"
                         + "   is bar.\n";
-        final String uri = "uri1";
-        final String searchWord = "foo";
-        final String exactMatch = "foo";
-        final String window = "is foo";
+        final String id = "id1";
 
         // Building the SearchResult received from query.
-        PropertyProto property =
-                PropertyProto.newBuilder()
-                        .setName(propertyKeyString)
-                        .addStringValues(propertyValueString)
-                        .build();
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
-                        .setUri(uri)
+                        .setUri(id)
                         .setSchema(SCHEMA_TYPE)
-                        .addProperties(property)
+                        .addProperties(
+                                PropertyProto.newBuilder()
+                                        .setName(propertyKeyString)
+                                        .addStringValues(propertyValueString))
                         .build();
-        SearchResultProto.ResultProto resultProto =
-                SearchResultProto.ResultProto.newBuilder().setDocument(documentProto).build();
         SearchResultProto searchResultProto =
-                SearchResultProto.newBuilder().addResults(resultProto).build();
+                SearchResultProto.newBuilder()
+                        .addResults(
+                                SearchResultProto.ResultProto.newBuilder()
+                                        .setDocument(documentProto))
+                        .build();
 
         SearchResultPage searchResultPage =
                 SearchResultToProtoConverter.toSearchResultPage(
@@ -151,32 +141,108 @@
                         Collections.singletonList(PACKAGE_NAME),
                         Collections.singletonList(DATABASE_NAME),
                         SCHEMA_MAP);
-        for (SearchResult result : searchResultPage.getResults()) {
-            assertThat(result.getMatches()).isEmpty();
-        }
+        assertThat(searchResultPage.getResults()).hasSize(1);
+        assertThat(searchResultPage.getResults().get(0).getMatches()).isEmpty();
     }
 
     @Test
-    public void testMultipleStringSnippet() throws Exception {
-        final String searchWord = "Test";
-
+    public void testMultipleStringSnippet() {
         // Building the SearchResult received from query.
-        PropertyProto property1 =
-                PropertyProto.newBuilder()
-                        .setName("sender.name")
-                        .addStringValues("Test Name Jr.")
-                        .build();
-        PropertyProto property2 =
-                PropertyProto.newBuilder()
-                        .setName("sender.email")
-                        .addStringValues("TestNameJr@gmail.com")
-                        .build();
         DocumentProto documentProto =
                 DocumentProto.newBuilder()
                         .setUri("uri1")
                         .setSchema(SCHEMA_TYPE)
-                        .addProperties(property1)
-                        .addProperties(property2)
+                        .addProperties(
+                                PropertyProto.newBuilder()
+                                        .setName("senderName")
+                                        .addStringValues("Test Name Jr."))
+                        .addProperties(
+                                PropertyProto.newBuilder()
+                                        .setName("senderEmail")
+                                        .addStringValues("TestNameJr@gmail.com"))
+                        .build();
+        SnippetProto snippetProto =
+                SnippetProto.newBuilder()
+                        .addEntries(
+                                SnippetProto.EntryProto.newBuilder()
+                                        .setPropertyName("senderName")
+                                        .addSnippetMatches(
+                                                SnippetMatchProto.newBuilder()
+                                                        .setExactMatchPosition(0)
+                                                        .setExactMatchBytes(4)
+                                                        .setWindowPosition(0)
+                                                        .setWindowBytes(9)))
+                        .addEntries(
+                                SnippetProto.EntryProto.newBuilder()
+                                        .setPropertyName("senderEmail")
+                                        .addSnippetMatches(
+                                                SnippetMatchProto.newBuilder()
+                                                        .setExactMatchPosition(0)
+                                                        .setExactMatchBytes(20)
+                                                        .setWindowPosition(0)
+                                                        .setWindowBytes(20)))
+                        .build();
+        SearchResultProto searchResultProto =
+                SearchResultProto.newBuilder()
+                        .addResults(
+                                SearchResultProto.ResultProto.newBuilder()
+                                        .setDocument(documentProto)
+                                        .setSnippet(snippetProto))
+                        .build();
+
+        // Making ResultReader and getting Snippet values.
+        SearchResultPage searchResultPage =
+                SearchResultToProtoConverter.toSearchResultPage(
+                        searchResultProto,
+                        Collections.singletonList(PACKAGE_NAME),
+                        Collections.singletonList(DATABASE_NAME),
+                        SCHEMA_MAP);
+        assertThat(searchResultPage.getResults()).hasSize(1);
+        SearchResult.MatchInfo match1 = searchResultPage.getResults().get(0).getMatches().get(0);
+        assertThat(match1.getPropertyPath()).isEqualTo("senderName");
+        assertThat(match1.getFullText()).isEqualTo("Test Name Jr.");
+        assertThat(match1.getExactMatchRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 4));
+        assertThat(match1.getExactMatch()).isEqualTo("Test");
+        assertThat(match1.getSnippetRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 9));
+        assertThat(match1.getSnippet()).isEqualTo("Test Name");
+
+        SearchResult.MatchInfo match2 = searchResultPage.getResults().get(0).getMatches().get(1);
+        assertThat(match2.getPropertyPath()).isEqualTo("senderEmail");
+        assertThat(match2.getFullText()).isEqualTo("TestNameJr@gmail.com");
+        assertThat(match2.getExactMatchRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 20));
+        assertThat(match2.getExactMatch()).isEqualTo("TestNameJr@gmail.com");
+        assertThat(match2.getSnippetRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 20));
+        assertThat(match2.getSnippet()).isEqualTo("TestNameJr@gmail.com");
+    }
+
+    @Test
+    public void testNestedDocumentSnippet() {
+        // Building the SearchResult received from query.
+        DocumentProto documentProto =
+                DocumentProto.newBuilder()
+                        .setUri("id1")
+                        .setSchema(SCHEMA_TYPE)
+                        .addProperties(
+                                PropertyProto.newBuilder()
+                                        .setName("sender")
+                                        .addDocumentValues(
+                                                DocumentProto.newBuilder()
+                                                        .addProperties(
+                                                                PropertyProto.newBuilder()
+                                                                        .setName("name")
+                                                                        .addStringValues(
+                                                                                "Test Name Jr."))
+                                                        .addProperties(
+                                                                PropertyProto.newBuilder()
+                                                                        .setName("email")
+                                                                        .addStringValues(
+                                                                                "TestNameJr@gmail.com")
+                                                                        .addStringValues(
+                                                                                "TestNameJr2@gmail.com"))))
                         .build();
         SnippetProto snippetProto =
                 SnippetProto.newBuilder()
@@ -188,28 +254,24 @@
                                                         .setExactMatchPosition(0)
                                                         .setExactMatchBytes(4)
                                                         .setWindowPosition(0)
-                                                        .setWindowBytes(9)
-                                                        .build())
-                                        .build())
+                                                        .setWindowBytes(9)))
                         .addEntries(
                                 SnippetProto.EntryProto.newBuilder()
-                                        .setPropertyName("sender.email")
+                                        .setPropertyName("sender.email[1]")
                                         .addSnippetMatches(
                                                 SnippetMatchProto.newBuilder()
                                                         .setExactMatchPosition(0)
-                                                        .setExactMatchBytes(20)
+                                                        .setExactMatchBytes(21)
                                                         .setWindowPosition(0)
-                                                        .setWindowBytes(20)
-                                                        .build())
-                                        .build())
-                        .build();
-        SearchResultProto.ResultProto resultProto =
-                SearchResultProto.ResultProto.newBuilder()
-                        .setDocument(documentProto)
-                        .setSnippet(snippetProto)
+                                                        .setWindowBytes(21)))
                         .build();
         SearchResultProto searchResultProto =
-                SearchResultProto.newBuilder().addResults(resultProto).build();
+                SearchResultProto.newBuilder()
+                        .addResults(
+                                SearchResultProto.ResultProto.newBuilder()
+                                        .setDocument(documentProto)
+                                        .setSnippet(snippetProto))
+                        .build();
 
         // Making ResultReader and getting Snippet values.
         SearchResultPage searchResultPage =
@@ -218,27 +280,25 @@
                         Collections.singletonList(PACKAGE_NAME),
                         Collections.singletonList(DATABASE_NAME),
                         SCHEMA_MAP);
-        for (SearchResult result : searchResultPage.getResults()) {
+        assertThat(searchResultPage.getResults()).hasSize(1);
+        SearchResult.MatchInfo match1 = searchResultPage.getResults().get(0).getMatches().get(0);
+        assertThat(match1.getPropertyPath()).isEqualTo("sender.name");
+        assertThat(match1.getFullText()).isEqualTo("Test Name Jr.");
+        assertThat(match1.getExactMatchRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 4));
+        assertThat(match1.getExactMatch()).isEqualTo("Test");
+        assertThat(match1.getSnippetRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 9));
+        assertThat(match1.getSnippet()).isEqualTo("Test Name");
 
-            SearchResult.MatchInfo match1 = result.getMatches().get(0);
-            assertThat(match1.getPropertyPath()).isEqualTo("sender.name");
-            assertThat(match1.getFullText()).isEqualTo("Test Name Jr.");
-            assertThat(match1.getExactMatchRange())
-                    .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 4));
-            assertThat(match1.getExactMatch()).isEqualTo("Test");
-            assertThat(match1.getSnippetRange())
-                    .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 9));
-            assertThat(match1.getSnippet()).isEqualTo("Test Name");
-
-            SearchResult.MatchInfo match2 = result.getMatches().get(1);
-            assertThat(match2.getPropertyPath()).isEqualTo("sender.email");
-            assertThat(match2.getFullText()).isEqualTo("TestNameJr@gmail.com");
-            assertThat(match2.getExactMatchRange())
-                    .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 20));
-            assertThat(match2.getExactMatch()).isEqualTo("TestNameJr@gmail.com");
-            assertThat(match2.getSnippetRange())
-                    .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 20));
-            assertThat(match2.getSnippet()).isEqualTo("TestNameJr@gmail.com");
-        }
+        SearchResult.MatchInfo match2 = searchResultPage.getResults().get(0).getMatches().get(1);
+        assertThat(match2.getPropertyPath()).isEqualTo("sender.email[1]");
+        assertThat(match2.getFullText()).isEqualTo("TestNameJr2@gmail.com");
+        assertThat(match2.getExactMatchRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 21));
+        assertThat(match2.getExactMatch()).isEqualTo("TestNameJr2@gmail.com");
+        assertThat(match2.getSnippetRange())
+                .isEqualTo(new SearchResult.MatchRange(/*lower=*/ 0, /*upper=*/ 21));
+        assertThat(match2.getSnippet()).isEqualTo("TestNameJr2@gmail.com");
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java
index 8dbf249..5c7ccfc 100644
--- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java
+++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java
@@ -134,4 +134,135 @@
         assertThat(pStats.getNativeNumTokensIndexed()).isEqualTo(nativeNumTokensIndexed);
         assertThat(pStats.getNativeExceededMaxNumTokens()).isEqualTo(nativeExceededMaxNumTokens);
     }
+
+    @Test
+    public void testAppSearchStats_InitializeStats() {
+        int prepareSchemaAndNamespacesLatencyMillis = 1;
+        int prepareVisibilityFileLatencyMillis = 2;
+        int nativeLatencyMillis = 3;
+        int nativeDocumentStoreRecoveryCause = 4;
+        int nativeIndexRestorationCause = 5;
+        int nativeSchemaStoreRecoveryCause = 6;
+        int nativeDocumentStoreRecoveryLatencyMillis = 7;
+        int nativeIndexRestorationLatencyMillis = 8;
+        int nativeSchemaStoreRecoveryLatencyMillis = 9;
+        int nativeDocumentStoreDataStatus = 10;
+        int nativeNumDocuments = 11;
+        int nativeNumSchemaTypes = 12;
+
+        final InitializeStats.Builder iStatsBuilder =
+                new InitializeStats.Builder()
+                        .setStatusCode(TEST_STATUS_CODE)
+                        .setTotalLatencyMillis(TEST_TOTAL_LATENCY_MILLIS)
+                        .setHasDeSync(/* hasDeSyncs= */ true)
+                        .setPrepareSchemaAndNamespacesLatencyMillis(
+                                prepareSchemaAndNamespacesLatencyMillis)
+                        .setPrepareVisibilityStoreLatencyMillis(prepareVisibilityFileLatencyMillis)
+                        .setNativeLatencyMillis(nativeLatencyMillis)
+                        .setDocumentStoreRecoveryCause(nativeDocumentStoreRecoveryCause)
+                        .setIndexRestorationCause(nativeIndexRestorationCause)
+                        .setSchemaStoreRecoveryCause(nativeSchemaStoreRecoveryCause)
+                        .setDocumentStoreRecoveryLatencyMillis(
+                                nativeDocumentStoreRecoveryLatencyMillis)
+                        .setIndexRestorationLatencyMillis(nativeIndexRestorationLatencyMillis)
+                        .setSchemaStoreRecoveryLatencyMillis(nativeSchemaStoreRecoveryLatencyMillis)
+                        .setDocumentStoreDataStatus(nativeDocumentStoreDataStatus)
+                        .setDocumentCount(nativeNumDocuments)
+                        .setSchemaTypeCount(nativeNumSchemaTypes);
+        final InitializeStats iStats = iStatsBuilder.build();
+
+        assertThat(iStats.getStatusCode()).isEqualTo(TEST_STATUS_CODE);
+        assertThat(iStats.getTotalLatencyMillis()).isEqualTo(TEST_TOTAL_LATENCY_MILLIS);
+        assertThat(iStats.hasDeSync()).isTrue();
+        assertThat(iStats.getPrepareSchemaAndNamespacesLatencyMillis())
+                .isEqualTo(prepareSchemaAndNamespacesLatencyMillis);
+        assertThat(iStats.getPrepareVisibilityStoreLatencyMillis())
+                .isEqualTo(prepareVisibilityFileLatencyMillis);
+        assertThat(iStats.getNativeLatencyMillis()).isEqualTo(nativeLatencyMillis);
+        assertThat(iStats.getDocumentStoreRecoveryCause())
+                .isEqualTo(nativeDocumentStoreRecoveryCause);
+        assertThat(iStats.getIndexRestorationCause()).isEqualTo(nativeIndexRestorationCause);
+        assertThat(iStats.getSchemaStoreRecoveryCause()).isEqualTo(nativeSchemaStoreRecoveryCause);
+        assertThat(iStats.getDocumentStoreRecoveryLatencyMillis())
+                .isEqualTo(nativeDocumentStoreRecoveryLatencyMillis);
+        assertThat(iStats.getIndexRestorationLatencyMillis())
+                .isEqualTo(nativeIndexRestorationLatencyMillis);
+        assertThat(iStats.getSchemaStoreRecoveryLatencyMillis())
+                .isEqualTo(nativeSchemaStoreRecoveryLatencyMillis);
+        assertThat(iStats.getDocumentStoreDataStatus()).isEqualTo(nativeDocumentStoreDataStatus);
+        assertThat(iStats.getDocumentCount()).isEqualTo(nativeNumDocuments);
+        assertThat(iStats.getSchemaTypeCount()).isEqualTo(nativeNumSchemaTypes);
+    }
+
+    @Test
+    public void testAppSearchStats_SearchStats() {
+        int rewriteSearchSpecLatencyMillis = 1;
+        int rewriteSearchResultLatencyMillis = 2;
+        int visibilityScope = SearchStats.VISIBILITY_SCOPE_LOCAL;
+        int nativeLatencyMillis = 4;
+        int nativeNumTerms = 5;
+        int nativeQueryLength = 6;
+        int nativeNumNamespacesFiltered = 7;
+        int nativeNumSchemaTypesFiltered = 8;
+        int nativeRequestedPageSize = 9;
+        int nativeNumResultsReturnedCurrentPage = 10;
+        boolean nativeIsFirstPage = true;
+        int nativeParseQueryLatencyMillis = 11;
+        int nativeRankingStrategy = 12;
+        int nativeNumDocumentsScored = 13;
+        int nativeScoringLatencyMillis = 14;
+        int nativeRankingLatencyMillis = 15;
+        int nativeNumResultsSnippeted = 16;
+        int nativeDocumentRetrievingLatencyMillis = 17;
+        final SearchStats.Builder sStatsBuilder =
+                new SearchStats.Builder(visibilityScope, TEST_PACKAGE_NAME)
+                        .setDatabase(TEST_DATA_BASE)
+                        .setStatusCode(TEST_STATUS_CODE)
+                        .setTotalLatencyMillis(TEST_TOTAL_LATENCY_MILLIS)
+                        .setRewriteSearchSpecLatencyMillis(rewriteSearchSpecLatencyMillis)
+                        .setRewriteSearchResultLatencyMillis(rewriteSearchResultLatencyMillis)
+                        .setNativeLatencyMillis(nativeLatencyMillis)
+                        .setTermCount(nativeNumTerms)
+                        .setQueryLength(nativeQueryLength)
+                        .setFilteredNamespaceCount(nativeNumNamespacesFiltered)
+                        .setFilteredSchemaTypeCount(nativeNumSchemaTypesFiltered)
+                        .setRequestedPageSize(nativeRequestedPageSize)
+                        .setCurrentPageReturnedResultCount(nativeNumResultsReturnedCurrentPage)
+                        .setIsFirstPage(nativeIsFirstPage)
+                        .setParseQueryLatencyMillis(nativeParseQueryLatencyMillis)
+                        .setRankingStrategy(nativeRankingStrategy)
+                        .setScoredDocumentCount(nativeNumDocumentsScored)
+                        .setScoringLatencyMillis(nativeScoringLatencyMillis)
+                        .setRankingLatencyMillis(nativeRankingLatencyMillis)
+                        .setResultWithSnippetsCount(nativeNumResultsSnippeted)
+                        .setDocumentRetrievingLatencyMillis(nativeDocumentRetrievingLatencyMillis);
+        final SearchStats sStats = sStatsBuilder.build();
+
+        assertThat(sStats.getPackageName()).isEqualTo(TEST_PACKAGE_NAME);
+        assertThat(sStats.getDatabase()).isEqualTo(TEST_DATA_BASE);
+        assertThat(sStats.getStatusCode()).isEqualTo(TEST_STATUS_CODE);
+        assertThat(sStats.getTotalLatencyMillis()).isEqualTo(TEST_TOTAL_LATENCY_MILLIS);
+        assertThat(sStats.getRewriteSearchSpecLatencyMillis())
+                .isEqualTo(rewriteSearchSpecLatencyMillis);
+        assertThat(sStats.getRewriteSearchResultLatencyMillis())
+                .isEqualTo(rewriteSearchResultLatencyMillis);
+        assertThat(sStats.getVisibilityScope()).isEqualTo(visibilityScope);
+        assertThat(sStats.getNativeLatencyMillis()).isEqualTo(nativeLatencyMillis);
+        assertThat(sStats.getTermCount()).isEqualTo(nativeNumTerms);
+        assertThat(sStats.getQueryLength()).isEqualTo(nativeQueryLength);
+        assertThat(sStats.getFilteredNamespaceCount()).isEqualTo(nativeNumNamespacesFiltered);
+        assertThat(sStats.getFilteredSchemaTypeCount()).isEqualTo(nativeNumSchemaTypesFiltered);
+        assertThat(sStats.getRequestedPageSize()).isEqualTo(nativeRequestedPageSize);
+        assertThat(sStats.getCurrentPageReturnedResultCount())
+                .isEqualTo(nativeNumResultsReturnedCurrentPage);
+        assertThat(sStats.isFirstPage()).isTrue();
+        assertThat(sStats.getParseQueryLatencyMillis()).isEqualTo(nativeParseQueryLatencyMillis);
+        assertThat(sStats.getRankingStrategy()).isEqualTo(nativeRankingStrategy);
+        assertThat(sStats.getScoredDocumentCount()).isEqualTo(nativeNumDocumentsScored);
+        assertThat(sStats.getScoringLatencyMillis()).isEqualTo(nativeScoringLatencyMillis);
+        assertThat(sStats.getRankingLatencyMillis()).isEqualTo(nativeRankingLatencyMillis);
+        assertThat(sStats.getResultWithSnippetsCount()).isEqualTo(nativeNumResultsSnippeted);
+        assertThat(sStats.getDocumentRetrievingLatencyMillis())
+                .isEqualTo(nativeDocumentRetrievingLatencyMillis);
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
index 10a7a50..6f0c8e1 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
@@ -31,11 +31,14 @@
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
 import android.hardware.biometrics.IBiometricService;
 import android.hardware.biometrics.IBiometricServiceReceiver;
 import android.hardware.biometrics.PromptInfo;
+import android.hardware.face.FaceSensorPropertiesInternal;
 import android.hardware.face.IFaceService;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.hardware.fingerprint.IFingerprintService;
 import android.hardware.iris.IIrisService;
 import android.os.Binder;
@@ -45,11 +48,17 @@
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
+import com.android.internal.R;
+
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.List;
+
 @Presubmit
 @SmallTest
 public class AuthServiceTest {
@@ -62,6 +71,8 @@
     @Mock
     private Context mContext;
     @Mock
+    private Resources mResources;
+    @Mock
     private PackageManager mPackageManager;
     @Mock
     IBiometricServiceReceiver mReceiver;
@@ -77,6 +88,10 @@
     IFaceService mFaceService;
     @Mock
     AppOpsManager mAppOpsManager;
+    @Captor
+    private ArgumentCaptor<List<FingerprintSensorPropertiesInternal>> mFingerprintPropsCaptor;
+    @Captor
+    private ArgumentCaptor<List<FaceSensorPropertiesInternal>> mFacePropsCaptor;
 
     @Before
     public void setUp() {
@@ -89,7 +104,16 @@
                 "2:8:15", // ID2:Face:Strong
         };
 
+        when(mResources.getIntArray(eq(R.array.config_udfps_sensor_props))).thenReturn(new int[0]);
+        when(mResources.getBoolean(eq(R.bool.config_is_powerbutton_fps))).thenReturn(false);
+        when(mResources.getInteger(eq(R.integer.config_fingerprintMaxTemplatesPerUser))).thenReturn(
+                1);
+        when(mResources.getBoolean(eq(R.bool.config_faceAuthSupportsSelfIllumination))).thenReturn(
+                false);
+        when(mResources.getInteger(eq(R.integer.config_faceMaxTemplatesPerUser))).thenReturn(1);
+
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mContext.getResources()).thenReturn(mResources);
         when(mInjector.getBiometricService()).thenReturn(mBiometricService);
         when(mInjector.getConfiguration(any())).thenReturn(config);
         when(mInjector.getFingerprintService()).thenReturn(mFingerprintService);
@@ -119,11 +143,18 @@
     }
 
     @Test
-    public void testRegisterAuthenticator_initializesConfiguration() throws Exception {
+    public void testRegisterAuthenticator_registerAuthenticators() throws Exception {
+        final int fingerprintId = 0;
+        final int fingerprintStrength = 15;
+
+        final int faceId = 1;
+        final int faceStrength = 4095;
 
         final String[] config = {
-                "0:2:15", // ID0:Fingerprint:Strong
-                "1:8:4095", // ID2:Face:Convenience
+                // ID0:Fingerprint:Strong
+                String.format("%d:2:%d", fingerprintId, fingerprintStrength),
+                // ID2:Face:Convenience
+                String.format("%d:8:%d", faceId, faceStrength)
         };
 
         when(mInjector.getConfiguration(any())).thenReturn(config);
@@ -131,15 +162,18 @@
         mAuthService = new AuthService(mContext, mInjector);
         mAuthService.onStart();
 
-        final int fingerprintId = 0;
-        final int faceId = 1;
+        verify(mFingerprintService).registerAuthenticators(mFingerprintPropsCaptor.capture());
+        final FingerprintSensorPropertiesInternal fingerprintProp =
+                mFingerprintPropsCaptor.getValue().get(0);
+        assertEquals(fingerprintProp.sensorId, fingerprintId);
+        assertEquals(fingerprintProp.sensorStrength,
+                Utils.authenticatorStrengthToPropertyStrength(fingerprintStrength));
 
-        final int fingerprintStrength = 15;
-        final int faceStrength = 4095;
-
-        verify(mFingerprintService).initializeConfiguration(eq(fingerprintId),
-                eq(fingerprintStrength));
-        verify(mFaceService).initializeConfiguration(eq(faceId), eq(faceStrength));
+        verify(mFaceService).registerAuthenticators(mFacePropsCaptor.capture());
+        final FaceSensorPropertiesInternal faceProp = mFacePropsCaptor.getValue().get(0);
+        assertEquals(faceProp.sensorId, faceId);
+        assertEquals(faceProp.sensorStrength,
+                Utils.authenticatorStrengthToPropertyStrength(faceStrength));
     }
 
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
index c5ed20a..4d1f241 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
@@ -37,6 +37,7 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
+import android.testing.TestableContext;
 
 import androidx.annotation.NonNull;
 import androidx.test.InstrumentationRegistry;
@@ -47,6 +48,7 @@
 import com.android.server.biometrics.sensors.BiometricScheduler.Operation;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -63,10 +65,12 @@
     private IBinder mToken;
 
     @Mock
-    private Context mContext;
-    @Mock
     private IBiometricService mBiometricService;
 
+    @Rule
+    public final TestableContext mContext =
+            new TestableContext(InstrumentationRegistry.getContext(), null);
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/hidl/Face10Test.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/hidl/Face10Test.java
index 392535e..0b59be6 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/hidl/Face10Test.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/hidl/Face10Test.java
@@ -22,7 +22,10 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.hardware.biometrics.BiometricManager;
+import android.hardware.biometrics.ComponentInfoInternal;
+import android.hardware.biometrics.SensorProperties;
+import android.hardware.face.FaceSensorProperties;
+import android.hardware.face.FaceSensorPropertiesInternal;
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.UserManager;
@@ -40,6 +43,7 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.ArrayList;
+import java.util.List;
 
 @Presubmit
 @SmallTest
@@ -71,9 +75,18 @@
         when(mUserManager.getAliveUsers()).thenReturn(new ArrayList<>());
 
         mLockoutResetDispatcher = new LockoutResetDispatcher(mContext);
-        mFace10 = new Face10(mContext, SENSOR_ID, BiometricManager.Authenticators.BIOMETRIC_STRONG,
-                mLockoutResetDispatcher, false /* supportsSelfIllumination */,
-                1 /* maxTemplatesAllowed */, mScheduler);
+
+        final int maxEnrollmentsPerUser = 1;
+        final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+        final boolean supportsFaceDetection = false;
+        final boolean supportsSelfIllumination = false;
+        final boolean resetLockoutRequiresChallenge = false;
+        final FaceSensorPropertiesInternal sensorProps = new FaceSensorPropertiesInternal(SENSOR_ID,
+                SensorProperties.STRENGTH_STRONG, maxEnrollmentsPerUser, componentInfo,
+                FaceSensorProperties.TYPE_UNKNOWN, supportsFaceDetection, supportsSelfIllumination,
+                resetLockoutRequiresChallenge);
+
+        mFace10 = new Face10(mContext, sensorProps, mLockoutResetDispatcher, mScheduler);
         mBinder = new Binder();
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java
index 904ade8..0a0dcc9 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21Test.java
@@ -25,8 +25,10 @@
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.hardware.biometrics.BiometricManager;
+import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
+import android.hardware.fingerprint.FingerprintSensorProperties;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.UserManager;
@@ -46,6 +48,7 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.ArrayList;
+import java.util.List;
 
 @Presubmit
 @SmallTest
@@ -83,10 +86,18 @@
                 .thenReturn(5);
 
         mLockoutResetDispatcher = new LockoutResetDispatcher(mContext);
-        mFingerprint21 = new TestableFingerprint21(mContext, mScheduler,
-                new Handler(Looper.getMainLooper()), SENSOR_ID,
-                BiometricManager.Authenticators.BIOMETRIC_WEAK, mLockoutResetDispatcher,
-                mHalResultController);
+
+        final int maxEnrollmentsPerUser = 1;
+        final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+        final boolean resetLockoutRequiresHardwareAuthToken = false;
+        final FingerprintSensorPropertiesInternal sensorProps =
+                new FingerprintSensorPropertiesInternal(SENSOR_ID,
+                        FingerprintSensorProperties.STRENGTH_WEAK, maxEnrollmentsPerUser,
+                        componentInfo, FingerprintSensorProperties.TYPE_UNKNOWN,
+                        resetLockoutRequiresHardwareAuthToken);
+
+        mFingerprint21 = new TestableFingerprint21(mContext, sensorProps, mScheduler,
+                new Handler(Looper.getMainLooper()), mLockoutResetDispatcher, mHalResultController);
     }
 
     @Test
@@ -107,12 +118,11 @@
     private static class TestableFingerprint21 extends Fingerprint21 {
 
         TestableFingerprint21(@NonNull Context context,
-                @NonNull BiometricScheduler scheduler,
-                @NonNull Handler handler, int sensorId, int strength,
+                @NonNull FingerprintSensorPropertiesInternal sensorProps,
+                @NonNull BiometricScheduler scheduler, @NonNull Handler handler,
                 @NonNull LockoutResetDispatcher lockoutResetDispatcher,
                 @NonNull HalResultController controller) {
-            super(context, scheduler, handler, sensorId, strength, lockoutResetDispatcher,
-                    controller);
+            super(context, sensorProps, scheduler, handler, lockoutResetDispatcher, controller);
         }
 
         @Override
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 2fcc021..2e00468 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
@@ -287,6 +287,12 @@
     }
 
     @Override
+    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions,
+            Bundle options) {
+        spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions, options);
+    }
+
+    @Override
     public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
             String[] receiverPermissions) {
         spiedContext.sendBroadcastAsUserMultiplePermissions(intent, user, receiverPermissions);
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 7cd6028..f156779 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -93,9 +93,10 @@
     private static final long SHORT_DEFAULT_DISPLAY_TIMEOUT_MILLIS = 10;
     private static final String VIRTUAL_DISPLAY_NAME = "Test Virtual Display";
     private static final String PACKAGE_NAME = "com.android.frameworks.servicestests";
-    private static final long ALL_DISPLAY_EVENTS = DisplayManager.EVENT_FLAG_DISPLAY_ADDED
+    private static final long STANDARD_DISPLAY_EVENTS = DisplayManager.EVENT_FLAG_DISPLAY_ADDED
                     | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
                     | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED;
+
     @Rule
     public TestRule compatChangeRule = new PlatformCompatChangeRule();
 
@@ -764,7 +765,8 @@
 
         // register display listener callback
         FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback();
-        displayManagerBinderService.registerCallbackWithEventMask(callback, ALL_DISPLAY_EVENTS);
+        displayManagerBinderService.registerCallbackWithEventMask(
+                callback, STANDARD_DISPLAY_EVENTS);
 
         waitForIdleHandler(handler);
 
@@ -793,7 +795,7 @@
 
         // register display listener callback
         FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback();
-        long allEventsExceptDisplayAdded = ALL_DISPLAY_EVENTS
+        long allEventsExceptDisplayAdded = STANDARD_DISPLAY_EVENTS
                 & ~DisplayManager.EVENT_FLAG_DISPLAY_ADDED;
         displayManagerBinderService.registerCallbackWithEventMask(callback,
                 allEventsExceptDisplayAdded);
@@ -862,7 +864,7 @@
         waitForIdleHandler(handler);
 
         FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback();
-        long allEventsExceptDisplayRemoved = ALL_DISPLAY_EVENTS
+        long allEventsExceptDisplayRemoved = STANDARD_DISPLAY_EVENTS
                 & ~DisplayManager.EVENT_FLAG_DISPLAY_REMOVED;
         displayManagerBinderService.registerCallbackWithEventMask(callback,
                 allEventsExceptDisplayRemoved);
@@ -1032,7 +1034,8 @@
 
         // register display listener callback
         FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback(displayId);
-        displayManagerBinderService.registerCallbackWithEventMask(callback, ALL_DISPLAY_EVENTS);
+        displayManagerBinderService.registerCallbackWithEventMask(
+                callback, STANDARD_DISPLAY_EVENTS);
         return callback;
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java
new file mode 100644
index 0000000..88a21b4
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display;
+
+import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
+import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT;
+
+import static org.junit.Assert.assertEquals;
+
+import android.os.Handler;
+import android.os.Message;
+import android.os.test.TestLooper;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.display.DisplayDeviceConfig.HighBrightnessModeData;
+import com.android.server.testutils.OffsettableClock;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class HighBrightnessModeControllerTest {
+
+    private static final int MINIMUM_LUX = 100;
+    private static final float TRANSITION_POINT = 0.763f;
+    private static final long TIME_WINDOW_MILLIS = 55 * 1000;
+    private static final long TIME_ALLOWED_IN_WINDOW_MILLIS = 12 * 1000;
+    private static final long TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS = 5 * 1000;
+
+    private static final float DEFAULT_MIN = 0.01f;
+    private static final float DEFAULT_MAX = 0.80f;
+
+    private static final float EPSILON = 0.000001f;
+
+    private OffsettableClock mClock;
+    private TestLooper mTestLooper;
+    private Handler mHandler;
+
+    private static final HighBrightnessModeData DEFAULT_HBM_DATA =
+            new HighBrightnessModeData(MINIMUM_LUX, TRANSITION_POINT, TIME_WINDOW_MILLIS,
+                    TIME_ALLOWED_IN_WINDOW_MILLIS, TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS);
+
+    @Before
+    public void setUp() {
+        mClock = new OffsettableClock.Stopped();
+        mTestLooper = new TestLooper(mClock::now);
+        mHandler = new Handler(mTestLooper.getLooper(), new Handler.Callback() {
+            @Override
+            public boolean handleMessage(Message msg) {
+                return true;
+            }
+        });
+    }
+
+    /////////////////
+    // Test Methods
+    /////////////////
+
+    @Test
+    public void testNoHbmData() {
+        final HighBrightnessModeController hbmc = new HighBrightnessModeController(
+                mClock::now, mHandler, DEFAULT_MIN, DEFAULT_MAX, null, () -> {});
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    @Test
+    public void testNoHbmData_Enabled() {
+        final HighBrightnessModeController hbmc = new HighBrightnessModeController(
+                mClock::now, mHandler, DEFAULT_MIN, DEFAULT_MAX, null, () -> {});
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    @Test
+    public void testOffByDefault() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    @Test
+    public void testAutoBrightnessEnabled_NoLux() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    @Test
+    public void testAutoBrightnessEnabled_LowLux() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    @Test
+    public void testAutoBrightnessEnabled_HighLux() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+    }
+
+    @Test
+    public void testAutoBrightnessEnabled_HighLux_ThenDisable() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+        hbmc.setAutoBrightnessEnabled(false);
+
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    @Test
+    public void testWithinHighRange_thenOverTime_thenEarnBackTime() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
+
+        // Verify we are in HBM
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        // Use up all the time in the window.
+        advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS);
+
+        // Verify we are not out of HBM
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        // Shift time so that the HBM event is at the beginning of the current window
+        advanceTime(TIME_WINDOW_MILLIS - TIME_ALLOWED_IN_WINDOW_MILLIS);
+        // Shift time again so that we are just below the minimum allowable
+        advanceTime(TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS - 1);
+
+        // Verify we are not out of HBM
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        // Advance the necessary millisecond
+        advanceTime(1);
+
+        // Verify we are allowed HBM again.
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+    }
+
+    @Test
+    public void testInHBM_ThenLowLux() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
+
+        // Verify we are in HBM
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2);
+
+        // Verify we are in HBM
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        hbmc.onAmbientLuxChange(1);
+        advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2 + 1);
+
+        // Verify we are out of HBM
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+
+    }
+
+    @Test
+    public void testInHBM_TestMultipleEvents_DueToAutoBrightness() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
+        advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2);
+
+        // Verify we are in HBM
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT - 0.01f);
+        advanceTime(1);
+
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
+        advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2);
+
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        advanceTime(2);
+
+        // Now we should be out again.
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    @Test
+    public void testInHBM_TestMultipleEvents_DueToLux() {
+        final HighBrightnessModeController hbmc = createDefaultHbm();
+
+        hbmc.setAutoBrightnessEnabled(true);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+
+        // Go into HBM for half the allowed window
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f);
+        advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2);
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        // Move lux below threshold (ending first event);
+        hbmc.onAmbientLuxChange(MINIMUM_LUX - 1);
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT);
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+
+        // Move up some amount of time so that there's still time in the window even after a
+        // second event.
+        advanceTime((TIME_WINDOW_MILLIS - TIME_ALLOWED_IN_WINDOW_MILLIS) / 2);
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+
+        // Go into HBM for just under the second half of allowed window
+        hbmc.onAmbientLuxChange(MINIMUM_LUX + 1);
+        hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 1);
+        advanceTime((TIME_ALLOWED_IN_WINDOW_MILLIS / 2) - 1);
+
+        assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT);
+
+        // Now exhaust the time
+        advanceTime(2);
+        assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF);
+    }
+
+    private void assertState(HighBrightnessModeController hbmc,
+            float brightnessMin, float brightnessMax, int hbmMode) {
+        assertEquals(brightnessMin, hbmc.getCurrentBrightnessMin(), EPSILON);
+        assertEquals(brightnessMax, hbmc.getCurrentBrightnessMax(), EPSILON);
+        assertEquals(hbmMode, hbmc.getHighBrightnessMode());
+    }
+
+    // Creates instance with standard initialization values.
+    private HighBrightnessModeController createDefaultHbm() {
+        return new HighBrightnessModeController(mClock::now, mHandler, DEFAULT_MIN, DEFAULT_MAX,
+                DEFAULT_HBM_DATA, () -> {});
+    }
+
+    private void advanceTime(long timeMs) {
+        mClock.fastForward(timeMs);
+        mTestLooper.dispatchAll();
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
index d784a22..8279624 100644
--- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java
@@ -27,17 +27,20 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.app.PropertyInvalidatedCache;
 import android.content.Context;
+import android.content.res.Resources;
+import android.os.Handler;
 import android.os.Parcel;
 import android.os.Process;
+import android.os.test.TestLooper;
 import android.platform.test.annotations.Presubmit;
 import android.view.Display;
 import android.view.DisplayAddress;
 import android.view.DisplayInfo;
 
-import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
@@ -61,9 +64,12 @@
 
     private DisplayDeviceRepository mDisplayDeviceRepo;
     private LogicalDisplayMapper mLogicalDisplayMapper;
-    private Context mContext;
+    private TestLooper mLooper;
+    private Handler mHandler;
 
     @Mock LogicalDisplayMapper.Listener mListenerMock;
+    @Mock Context mContextMock;
+    @Mock Resources mResourcesMock;
 
     @Captor ArgumentCaptor<LogicalDisplay> mDisplayCaptor;
 
@@ -73,7 +79,6 @@
         System.setProperty("dexmaker.share_classloader", "true");
         MockitoAnnotations.initMocks(this);
 
-        mContext = InstrumentationRegistry.getContext();
         mDisplayDeviceRepo = new DisplayDeviceRepository(
                 new DisplayManagerService.SyncRoot(),
                 new PersistentDataStore(new PersistentDataStore.Injector() {
@@ -94,7 +99,15 @@
         // Disable binder caches in this process.
         PropertyInvalidatedCache.disableForTestMode();
 
-        mLogicalDisplayMapper = new LogicalDisplayMapper(mDisplayDeviceRepo, mListenerMock);
+        when(mContextMock.getResources()).thenReturn(mResourcesMock);
+        when(mResourcesMock.getBoolean(
+                com.android.internal.R.bool.config_supportsConcurrentInternalDisplays))
+                .thenReturn(true);
+
+        mLooper = new TestLooper();
+        mHandler = new Handler(mLooper.getLooper());
+        mLogicalDisplayMapper = new LogicalDisplayMapper(mContextMock, mDisplayDeviceRepo,
+                mListenerMock, new DisplayManagerService.SyncRoot(), mHandler);
     }
 
 
@@ -299,7 +312,7 @@
         private DisplayDeviceInfo mSentInfo;
 
         TestDisplayDevice() {
-            super(null, null, "test_display_" + sUniqueTestDisplayId++, mContext);
+            super(null, null, "test_display_" + sUniqueTestDisplayId++, mContextMock);
             mInfo = new DisplayDeviceInfo();
         }
 
diff --git a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
index 8e5136d..b1582be 100644
--- a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
+++ b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
@@ -24,7 +24,9 @@
 import android.content.Context;
 import android.graphics.FontListParser;
 import android.graphics.fonts.FontManager;
+import android.graphics.fonts.FontStyle;
 import android.graphics.fonts.FontUpdateRequest;
+import android.graphics.fonts.SystemFonts;
 import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
 import android.platform.test.annotations.Presubmit;
@@ -56,6 +58,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -73,8 +76,7 @@
         @Override
         public String getPostScriptName(File file) throws IOException {
             String content = FileUtils.readTextFile(file, 100, "");
-            String filename = content.split(",")[0];
-            return filename.substring(0, filename.length() - 4);
+            return content.split(",")[2];
         }
 
         @Override
@@ -86,7 +88,6 @@
         @Override
         public long getRevision(File file) throws IOException {
             String content = FileUtils.readTextFile(file, 100, "");
-            android.util.Log.e("Debug", "content: " + content);
             return Long.parseLong(content.split(",")[1]);
         }
     }
@@ -135,6 +136,8 @@
     private File mConfigFile;
     private List<File> mPreinstalledFontDirs;
     private Supplier<Long> mCurrentTimeSupplier = () -> CURRENT_TIME;
+    private Function<Map<String, File>, FontConfig> mConfigSupplier =
+            (map) -> SystemFonts.getSystemFontConfig(map, 0, 0);
 
     @SuppressWarnings("ResultOfMethodCallIgnored")
     @Before
@@ -168,16 +171,16 @@
         config.lastModifiedMillis = expectedModifiedDate;
         writeConfig(config, mConfigFile);
         UpdatableFontDir dirForPreparation = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dirForPreparation.loadFontFileMap();
         assertThat(dirForPreparation.getSystemFontConfig().getLastModifiedTimeMillis())
                 .isEqualTo(expectedModifiedDate);
         dirForPreparation.update(Arrays.asList(
-                newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,2", GOOD_SIGNATURE),
-                newFontUpdateRequest("foo.ttf,3", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,4", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,1,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,2,bar", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,3,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,4,bar", GOOD_SIGNATURE),
                 newAddFontFamilyRequest("<family name='foobar'>"
                         + "  <font>foo.ttf</font>"
                         + "  <font>bar.ttf</font>"
@@ -191,13 +194,13 @@
                 .isNotEqualTo(expectedModifiedDate);
 
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
-        assertThat(dir.getFontFileMap()).containsKey("foo.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("foo.ttf"))).isEqualTo(3);
-        assertThat(dir.getFontFileMap()).containsKey("bar.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("bar.ttf"))).isEqualTo(4);
+        assertThat(dir.getPostScriptMap()).containsKey("foo");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("foo"))).isEqualTo(3);
+        assertThat(dir.getPostScriptMap()).containsKey("bar");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("bar"))).isEqualTo(4);
         // Outdated font dir should be deleted.
         assertThat(mUpdatableFontFilesDir.list()).hasLength(2);
         assertNamedFamilyExists(dir.getSystemFontConfig(), "foobar");
@@ -205,9 +208,9 @@
         FontConfig.FontFamily foobar = dir.getFontFamilyMap().get("foobar");
         assertThat(foobar.getFontList()).hasSize(2);
         assertThat(foobar.getFontList().get(0).getFile())
-                .isEqualTo(dir.getFontFileMap().get("foo.ttf"));
+                .isEqualTo(dir.getPostScriptMap().get("foo"));
         assertThat(foobar.getFontList().get(1).getFile())
-                .isEqualTo(dir.getFontFileMap().get("bar.ttf"));
+                .isEqualTo(dir.getPostScriptMap().get("bar"));
     }
 
     @Test
@@ -215,10 +218,10 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
         assertThat(dir.getFontFamilyMap()).isEmpty();
     }
 
@@ -227,14 +230,14 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dirForPreparation = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dirForPreparation.loadFontFileMap();
         dirForPreparation.update(Arrays.asList(
-                newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,2", GOOD_SIGNATURE),
-                newFontUpdateRequest("foo.ttf,3", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,4", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,1,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,2,bar", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,3,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,4,bar", GOOD_SIGNATURE),
                 newAddFontFamilyRequest("<family name='foobar'>"
                         + "  <font>foo.ttf</font>"
                         + "  <font>bar.ttf</font>"
@@ -243,12 +246,12 @@
         assertThat(mUpdatableFontFilesDir.list()).hasLength(4);
 
         fakeFsverityUtil.remove(
-                dirForPreparation.getFontFileMap().get("foo.ttf").getAbsolutePath());
+                dirForPreparation.getPostScriptMap().get("foo").getAbsolutePath());
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
         // All font dirs (including dir for "bar.ttf") should be deleted.
         assertThat(mUpdatableFontFilesDir.list()).hasLength(0);
         assertThat(dir.getFontFamilyMap()).isEmpty();
@@ -259,14 +262,14 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dirForPreparation = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dirForPreparation.loadFontFileMap();
         dirForPreparation.update(Arrays.asList(
-                newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,2", GOOD_SIGNATURE),
-                newFontUpdateRequest("foo.ttf,3", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,4", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,1,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,2,bar", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,3,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,4,bar", GOOD_SIGNATURE),
                 newAddFontFamilyRequest("<family name='foobar'>"
                         + "  <font>foo.ttf</font>"
                         + "  <font>bar.ttf</font>"
@@ -275,13 +278,13 @@
         assertThat(mUpdatableFontFilesDir.list()).hasLength(4);
 
         // Overwrite "foo.ttf" with wrong contents.
-        FileUtils.stringToFile(dirForPreparation.getFontFileMap().get("foo.ttf"), "bar,4");
+        FileUtils.stringToFile(dirForPreparation.getPostScriptMap().get("foo"), "bar,4");
 
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
         // All font dirs (including dir for "bar.ttf") should be deleted.
         assertThat(mUpdatableFontFilesDir.list()).hasLength(0);
         assertThat(dir.getFontFamilyMap()).isEmpty();
@@ -291,15 +294,30 @@
     public void construct_olderThanPreinstalledFont() throws Exception {
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
+        Function<Map<String, File>, FontConfig> configSupplier = (map) -> {
+            FontConfig.Font fooFont = new FontConfig.Font(
+                    new File(mPreinstalledFontDirs.get(0), "foo.ttf"), null, "foo",
+                    new FontStyle(400, FontStyle.FONT_SLANT_UPRIGHT), 0, null, null);
+            FontConfig.Font barFont = new FontConfig.Font(
+                    new File(mPreinstalledFontDirs.get(1), "bar.ttf"), null, "bar",
+                    new FontStyle(400, FontStyle.FONT_SLANT_UPRIGHT), 0, null, null);
+
+            FontConfig.FontFamily family = new FontConfig.FontFamily(
+                    Arrays.asList(fooFont, barFont), "sans-serif", null,
+                    FontConfig.FontFamily.VARIANT_DEFAULT);
+            return new FontConfig(Collections.singletonList(family),
+                    Collections.emptyList(), 0, 1);
+        };
+
         UpdatableFontDir dirForPreparation = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, configSupplier);
         dirForPreparation.loadFontFileMap();
         dirForPreparation.update(Arrays.asList(
-                newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,2", GOOD_SIGNATURE),
-                newFontUpdateRequest("foo.ttf,3", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,4", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,1,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,2,bar", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,3,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,4,bar", GOOD_SIGNATURE),
                 newAddFontFamilyRequest("<family name='foobar'>"
                         + "  <font>foo.ttf</font>"
                         + "  <font>bar.ttf</font>"
@@ -308,18 +326,18 @@
         assertThat(mUpdatableFontFilesDir.list()).hasLength(4);
 
         // Add preinstalled fonts.
-        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "foo.ttf"), "foo,5");
-        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "bar.ttf"), "bar,1");
-        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(1), "bar.ttf"), "bar,2");
+        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "foo.ttf"), "foo,5,foo");
+        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(1), "bar.ttf"), "bar,1,bar");
+        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(1), "bar.ttf"), "bar,2,bar");
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, configSupplier);
         dir.loadFontFileMap();
         // For foo.ttf, preinstalled font (revision 5) should be used.
-        assertThat(dir.getFontFileMap()).doesNotContainKey("foo.ttf");
+        assertThat(dir.getPostScriptMap()).doesNotContainKey("foo");
         // For bar.ttf, updated font (revision 4) should be used.
-        assertThat(dir.getFontFileMap()).containsKey("bar.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("bar.ttf"))).isEqualTo(4);
+        assertThat(dir.getPostScriptMap()).containsKey("bar");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("bar"))).isEqualTo(4);
         // Outdated font dir should be deleted.
         // We don't delete bar.ttf in this case, because it's normal that OTA updates preinstalled
         // fonts.
@@ -333,10 +351,10 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                new File("/dev/null"), mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                new File("/dev/null"), mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
         assertThat(dir.getFontFamilyMap()).isEmpty();
     }
 
@@ -345,18 +363,18 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dirForPreparation = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dirForPreparation.loadFontFileMap();
         dirForPreparation.update(Arrays.asList(
-                newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE),
+                newFontUpdateRequest("foo.ttf,1,foo", GOOD_SIGNATURE),
                 newAddFontFamilyRequest("<family name='foobar'>"
                         + "  <font>foo.ttf</font>"
                         + "</family>")));
         try {
             dirForPreparation.update(Arrays.asList(
-                    newFontUpdateRequest("foo.ttf,2", GOOD_SIGNATURE),
-                    newFontUpdateRequest("bar.ttf,2", "Invalid signature"),
+                    newFontUpdateRequest("foo.ttf,2,foo", GOOD_SIGNATURE),
+                    newFontUpdateRequest("bar.ttf,2,bar", "Invalid signature"),
                     newAddFontFamilyRequest("<family name='foobar'>"
                             + "  <font>foo.ttf</font>"
                             + "  <font>bar.ttf</font>"
@@ -367,17 +385,33 @@
         }
 
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
         // The state should be rolled back as a whole if one of the update requests fail.
-        assertThat(dir.getFontFileMap()).containsKey("foo.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("foo.ttf"))).isEqualTo(1);
+        assertThat(dir.getPostScriptMap()).containsKey("foo");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("foo"))).isEqualTo(1);
         assertThat(dir.getFontFamilyMap()).containsKey("foobar");
         FontConfig.FontFamily foobar = dir.getFontFamilyMap().get("foobar");
         assertThat(foobar.getFontList()).hasSize(1);
         assertThat(foobar.getFontList().get(0).getFile())
-                .isEqualTo(dir.getFontFileMap().get("foo.ttf"));
+                .isEqualTo(dir.getPostScriptMap().get("foo"));
+    }
+
+    @Test
+    public void loadFontFileMap_twice() throws Exception {
+        FakeFontFileParser parser = new FakeFontFileParser();
+        FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
+        UpdatableFontDir dir = new UpdatableFontDir(
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
+        dir.loadFontFileMap();
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("test");
+        File fontFile = dir.getPostScriptMap().get("test");
+        dir.loadFontFileMap();
+        assertThat(dir.getPostScriptMap().get("test")).isEqualTo(fontFile);
     }
 
     @Test
@@ -385,14 +419,15 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
-        assertThat(dir.getFontFileMap()).containsKey("test.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(1);
-        File fontFile = dir.getFontFileMap().get("test.ttf");
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("test");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("test"))).isEqualTo(1);
+        File fontFile = dir.getPostScriptMap().get("test");
         assertThat(Os.stat(fontFile.getAbsolutePath()).st_mode & 0777).isEqualTo(0644);
         File fontDir = fontFile.getParentFile();
         assertThat(Os.stat(fontDir.getAbsolutePath()).st_mode & 0777).isEqualTo(0711);
@@ -403,22 +438,58 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
-        Map<String, File> mapBeforeUpgrade = dir.getFontFileMap();
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2", GOOD_SIGNATURE)));
-        assertThat(dir.getFontFileMap()).containsKey("test.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(2);
-        assertThat(mapBeforeUpgrade).containsKey("test.ttf");
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
+                GOOD_SIGNATURE)));
+        Map<String, File> mapBeforeUpgrade = dir.getPostScriptMap();
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2,test",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("test");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("test"))).isEqualTo(2);
+        assertThat(mapBeforeUpgrade).containsKey("test");
         assertWithMessage("Older fonts should not be deleted until next loadFontFileMap")
-                .that(parser.getRevision(mapBeforeUpgrade.get("test.ttf"))).isEqualTo(1);
+                .that(parser.getRevision(mapBeforeUpgrade.get("test"))).isEqualTo(1);
         // Check that updatedFontDirs is pruned.
         assertWithMessage("config.updatedFontDirs should only list latest active dirs")
                 .that(readConfig(mConfigFile).updatedFontDirs)
-                .containsExactly(dir.getFontFileMap().get("test.ttf").getParentFile().getName());
+                .containsExactly(dir.getPostScriptMap().get("test").getParentFile().getName());
+    }
+
+    @Test
+    public void installFontFile_systemFontHasPSNameDifferentFromFileName() throws Exception {
+        FakeFontFileParser parser = new FakeFontFileParser();
+        FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
+
+        // Setup the environment that the system installed font file named "foo.ttf" has PostScript
+        // name "bar".
+        File file = new File(mPreinstalledFontDirs.get(0), "foo.ttf");
+        FileUtils.stringToFile(file, "foo.ttf,1,bar");
+        UpdatableFontDir dir = new UpdatableFontDir(
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, (map) -> {
+            FontConfig.Font font = new FontConfig.Font(
+                    file, null, "bar", new FontStyle(400, FontStyle.FONT_SLANT_UPRIGHT),
+                    0, null, null);
+            FontConfig.FontFamily family = new FontConfig.FontFamily(
+                    Collections.singletonList(font), "sans-serif", null,
+                    FontConfig.FontFamily.VARIANT_DEFAULT);
+            return new FontConfig(Collections.singletonList(family),
+                    Collections.emptyList(), 0, 1);
+        });
+        dir.loadFontFileMap();
+
+        dir.update(Collections.singletonList(newFontUpdateRequest("bar.ttf,2,bar",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("bar");
+        assertThat(dir.getPostScriptMap().size()).isEqualTo(1);
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("bar"))).isEqualTo(2);
+        File fontFile = dir.getPostScriptMap().get("bar");
+        assertThat(Os.stat(fontFile.getAbsolutePath()).st_mode & 0777).isEqualTo(0644);
+        File fontDir = fontFile.getParentFile();
+        assertThat(Os.stat(fontDir.getAbsolutePath()).st_mode & 0777).isEqualTo(0711);
     }
 
     @Test
@@ -426,14 +497,16 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
-        assertThat(dir.getFontFileMap()).containsKey("test.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(1);
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
+                GOOD_SIGNATURE)));
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("test");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("test"))).isEqualTo(1);
     }
 
     @Test
@@ -441,25 +514,26 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2", GOOD_SIGNATURE)));
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2,test",
+                GOOD_SIGNATURE)));
         try {
-            dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1",
+            dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
                     GOOD_SIGNATURE)));
             fail("Expect SystemFontException");
         } catch (FontManagerService.SystemFontException e) {
             assertThat(e.getErrorCode()).isEqualTo(FontManager.RESULT_ERROR_DOWNGRADING);
         }
-        assertThat(dir.getFontFileMap()).containsKey("test.ttf");
+        assertThat(dir.getPostScriptMap()).containsKey("test");
         assertWithMessage("Font should not be downgraded to an older revision")
-                .that(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(2);
+                .that(parser.getRevision(dir.getPostScriptMap().get("test"))).isEqualTo(2);
         // Check that updatedFontDirs is not updated.
         assertWithMessage("config.updatedFontDirs should only list latest active dirs")
                 .that(readConfig(mConfigFile).updatedFontDirs)
-                .containsExactly(dir.getFontFileMap().get("test.ttf").getParentFile().getName());
+                .containsExactly(dir.getPostScriptMap().get("test").getParentFile().getName());
     }
 
     @Test
@@ -467,16 +541,18 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE)));
-        dir.update(Collections.singletonList(newFontUpdateRequest("bar.ttf,2", GOOD_SIGNATURE)));
-        assertThat(dir.getFontFileMap()).containsKey("foo.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("foo.ttf"))).isEqualTo(1);
-        assertThat(dir.getFontFileMap()).containsKey("bar.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("bar.ttf"))).isEqualTo(2);
+        dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1,foo",
+                GOOD_SIGNATURE)));
+        dir.update(Collections.singletonList(newFontUpdateRequest("bar.ttf,2,bar",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("foo");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("foo"))).isEqualTo(1);
+        assertThat(dir.getPostScriptMap()).containsKey("bar");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("bar"))).isEqualTo(2);
     }
 
     @Test
@@ -484,17 +560,17 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         dir.update(Arrays.asList(
-                newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE),
-                newFontUpdateRequest("bar.ttf,2", GOOD_SIGNATURE)));
-        assertThat(dir.getFontFileMap()).containsKey("foo.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("foo.ttf"))).isEqualTo(1);
-        assertThat(dir.getFontFileMap()).containsKey("bar.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("bar.ttf"))).isEqualTo(2);
+                newFontUpdateRequest("foo.ttf,1,foo", GOOD_SIGNATURE),
+                newFontUpdateRequest("bar.ttf,2,bar", GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("foo");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("foo"))).isEqualTo(1);
+        assertThat(dir.getPostScriptMap()).containsKey("bar");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("bar"))).isEqualTo(2);
     }
 
     @Test
@@ -502,70 +578,83 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         try {
             dir.update(
-                    Collections.singletonList(newFontUpdateRequest("test.ttf,1",
+                    Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
                             "Invalid signature")));
             fail("Expect SystemFontException");
         } catch (FontManagerService.SystemFontException e) {
             assertThat(e.getErrorCode())
                     .isEqualTo(FontManager.RESULT_ERROR_VERIFICATION_FAILURE);
         }
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
     }
 
     @Test
     public void installFontFile_preinstalled_upgrade() throws Exception {
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
-        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,1");
+        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"),
+                "test.ttf,1,test");
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2", GOOD_SIGNATURE)));
-        assertThat(dir.getFontFileMap()).containsKey("test.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(2);
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,2,test",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("test");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("test"))).isEqualTo(2);
     }
 
     @Test
     public void installFontFile_preinstalled_sameVersion() throws Exception {
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
-        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,1");
+        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"),
+                "test.ttf,1,test");
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE)));
-        assertThat(dir.getFontFileMap()).containsKey("test.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("test.ttf"))).isEqualTo(1);
+        dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
+                GOOD_SIGNATURE)));
+        assertThat(dir.getPostScriptMap()).containsKey("test");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("test"))).isEqualTo(1);
     }
 
     @Test
     public void installFontFile_preinstalled_downgrade() throws Exception {
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
-        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,2");
+        File file = new File(mPreinstalledFontDirs.get(0), "test.ttf");
+        FileUtils.stringToFile(file, "test.ttf,2,test");
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, (map) -> {
+            FontConfig.Font font = new FontConfig.Font(
+                    file, null, "test", new FontStyle(400, FontStyle.FONT_SLANT_UPRIGHT), 0, null,
+                    null);
+            FontConfig.FontFamily family = new FontConfig.FontFamily(
+                    Collections.singletonList(font), "sans-serif", null,
+                    FontConfig.FontFamily.VARIANT_DEFAULT);
+            return new FontConfig(Collections.singletonList(family), Collections.emptyList(), 0, 1);
+        });
         dir.loadFontFileMap();
 
         try {
-            dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1",
+            dir.update(Collections.singletonList(newFontUpdateRequest("test.ttf,1,test",
                     GOOD_SIGNATURE)));
             fail("Expect SystemFontException");
         } catch (FontManagerService.SystemFontException e) {
             assertThat(e.getErrorCode()).isEqualTo(FontManager.RESULT_ERROR_DOWNGRADING);
         }
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
     }
 
     @Test
@@ -573,7 +662,8 @@
         long expectedModifiedDate = 1234567890;
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
-        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"), "test.ttf,1");
+        FileUtils.stringToFile(new File(mPreinstalledFontDirs.get(0), "test.ttf"),
+                "test.ttf,1,test");
 
         File readonlyDir = new File(mCacheDir, "readonly");
         assertThat(readonlyDir.mkdir()).isTrue();
@@ -586,13 +676,13 @@
         assertThat(readonlyDir.setWritable(false, false)).isTrue();
         try {
             UpdatableFontDir dir = new UpdatableFontDir(
-                    mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                    readonlyFile, mCurrentTimeSupplier);
+                    mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                    readonlyFile, mCurrentTimeSupplier, mConfigSupplier);
             dir.loadFontFileMap();
 
             try {
                 dir.update(
-                        Collections.singletonList(newFontUpdateRequest("test.ttf,2",
+                        Collections.singletonList(newFontUpdateRequest("test.ttf,2,test",
                                 GOOD_SIGNATURE)));
             } catch (FontManagerService.SystemFontException e) {
                 assertThat(e.getErrorCode())
@@ -600,7 +690,7 @@
             }
             assertThat(dir.getSystemFontConfig().getLastModifiedTimeMillis())
                     .isEqualTo(expectedModifiedDate);
-            assertThat(dir.getFontFileMap()).isEmpty();
+            assertThat(dir.getPostScriptMap()).isEmpty();
         } finally {
             assertThat(readonlyDir.setWritable(true, true)).isTrue();
         }
@@ -610,7 +700,7 @@
     public void installFontFile_failedToParsePostScript() throws Exception {
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs,
+                mUpdatableFontFilesDir,
                 new UpdatableFontDir.FontFileParser() {
 
                     @Override
@@ -627,25 +717,25 @@
                     public long getRevision(File file) throws IOException {
                         return 0;
                     }
-                }, fakeFsverityUtil, mConfigFile, mCurrentTimeSupplier);
+                }, fakeFsverityUtil, mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         try {
-            dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1",
+            dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1,foo",
                     GOOD_SIGNATURE)));
             fail("Expect SystemFontException");
         } catch (FontManagerService.SystemFontException e) {
             assertThat(e.getErrorCode())
                     .isEqualTo(FontManager.RESULT_ERROR_INVALID_FONT_NAME);
         }
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
     }
 
     @Test
     public void installFontFile_failedToParsePostScriptName_invalidFont() throws Exception {
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs,
+                mUpdatableFontFilesDir,
                 new UpdatableFontDir.FontFileParser() {
                     @Override
                     public String getPostScriptName(File file) throws IOException {
@@ -661,18 +751,18 @@
                     public long getRevision(File file) throws IOException {
                         return 0;
                     }
-                }, fakeFsverityUtil, mConfigFile, mCurrentTimeSupplier);
+                }, fakeFsverityUtil, mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         try {
-            dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1",
+            dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1,foo",
                     GOOD_SIGNATURE)));
             fail("Expect SystemFontException");
         } catch (FontManagerService.SystemFontException e) {
             assertThat(e.getErrorCode())
                     .isEqualTo(FontManager.RESULT_ERROR_INVALID_FONT_FILE);
         }
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
     }
 
     @Test
@@ -697,19 +787,19 @@
         };
         FakeFontFileParser parser = new FakeFontFileParser();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         try {
-            dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1",
+            dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1,foo",
                     GOOD_SIGNATURE)));
             fail("Expect SystemFontException");
         } catch (FontManagerService.SystemFontException e) {
             assertThat(e.getErrorCode())
                     .isEqualTo(FontManager.RESULT_ERROR_FAILED_TO_WRITE_FONT_FILE);
         }
-        assertThat(dir.getFontFileMap()).isEmpty();
+        assertThat(dir.getPostScriptMap()).isEmpty();
     }
 
     @Test
@@ -717,22 +807,23 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
-        dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1", GOOD_SIGNATURE)));
+        dir.update(Collections.singletonList(newFontUpdateRequest("foo.ttf,1,foo",
+                GOOD_SIGNATURE)));
         try {
             dir.update(Arrays.asList(
-                    newFontUpdateRequest("foo.ttf,2", GOOD_SIGNATURE),
-                    newFontUpdateRequest("bar.ttf,2", "Invalid signature")));
+                    newFontUpdateRequest("foo.ttf,2,foo", GOOD_SIGNATURE),
+                    newFontUpdateRequest("bar.ttf,2,bar", "Invalid signature")));
             fail("Batch update with invalid signature should fail");
         } catch (FontManagerService.SystemFontException e) {
             // Expected
         }
         // The state should be rolled back as a whole if one of the update requests fail.
-        assertThat(dir.getFontFileMap()).containsKey("foo.ttf");
-        assertThat(parser.getRevision(dir.getFontFileMap().get("foo.ttf"))).isEqualTo(1);
+        assertThat(dir.getPostScriptMap()).containsKey("foo");
+        assertThat(parser.getRevision(dir.getPostScriptMap().get("foo"))).isEqualTo(1);
     }
 
     @Test
@@ -740,21 +831,21 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         dir.update(Arrays.asList(
-                newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE),
+                newFontUpdateRequest("test.ttf,1,test", GOOD_SIGNATURE),
                 newAddFontFamilyRequest("<family name='test'>"
                         + "  <font>test.ttf</font>"
                         + "</family>")));
-        assertThat(dir.getFontFileMap()).containsKey("test.ttf");
+        assertThat(dir.getPostScriptMap()).containsKey("test");
         assertThat(dir.getFontFamilyMap()).containsKey("test");
         FontConfig.FontFamily test = dir.getFontFamilyMap().get("test");
         assertThat(test.getFontList()).hasSize(1);
         assertThat(test.getFontList().get(0).getFile())
-                .isEqualTo(dir.getFontFileMap().get("test.ttf"));
+                .isEqualTo(dir.getPostScriptMap().get("test"));
     }
 
     @Test
@@ -762,13 +853,13 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         try {
             dir.update(Arrays.asList(
-                    newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE),
+                    newFontUpdateRequest("test.ttf,1,test", GOOD_SIGNATURE),
                     newAddFontFamilyRequest("<family lang='en'>"
                             + "  <font>test.ttf</font>"
                             + "</family>")));
@@ -783,8 +874,8 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
 
         try {
@@ -803,14 +894,14 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
         // We assume we have monospace.
         assertNamedFamilyExists(dir.getSystemFontConfig(), "monospace");
 
         dir.update(Arrays.asList(
-                newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE),
+                newFontUpdateRequest("test.ttf,1,test", GOOD_SIGNATURE),
                 // Updating an existing font family.
                 newAddFontFamilyRequest("<family name='monospace'>"
                         + "  <font>test.ttf</font>"
@@ -824,7 +915,7 @@
         FontConfig.FontFamily monospace = getLastFamily(fontConfig, "monospace");
         assertThat(monospace.getFontList()).hasSize(1);
         assertThat(monospace.getFontList().get(0).getFile())
-                .isEqualTo(dir.getFontFileMap().get("test.ttf"));
+                .isEqualTo(dir.getPostScriptMap().get("test"));
         assertNamedFamilyExists(fontConfig, "test");
         assertThat(getLastFamily(fontConfig, "test").getFontList())
                 .isEqualTo(monospace.getFontList());
@@ -835,15 +926,15 @@
         FakeFontFileParser parser = new FakeFontFileParser();
         FakeFsverityUtil fakeFsverityUtil = new FakeFsverityUtil();
         UpdatableFontDir dir = new UpdatableFontDir(
-                mUpdatableFontFilesDir, mPreinstalledFontDirs, parser, fakeFsverityUtil,
-                mConfigFile, mCurrentTimeSupplier);
+                mUpdatableFontFilesDir, parser, fakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
         dir.loadFontFileMap();
         assertThat(dir.getSystemFontConfig().getFontFamilies()).isNotEmpty();
         FontConfig.FontFamily firstFontFamily = dir.getSystemFontConfig().getFontFamilies().get(0);
         assertThat(firstFontFamily.getName()).isNotEmpty();
 
         dir.update(Arrays.asList(
-                newFontUpdateRequest("test.ttf,1", GOOD_SIGNATURE),
+                newFontUpdateRequest("test.ttf,1,test", GOOD_SIGNATURE),
                 newAddFontFamilyRequest("<family name='" + firstFontFamily.getName() + "'>"
                         + "  <font>test.ttf</font>"
                         + "</family>")));
@@ -853,7 +944,7 @@
         FontConfig.FontFamily updated = getLastFamily(fontConfig, firstFontFamily.getName());
         assertThat(updated.getFontList()).hasSize(1);
         assertThat(updated.getFontList().get(0).getFile())
-                .isEqualTo(dir.getFontFileMap().get("test.ttf"));
+                .isEqualTo(dir.getPostScriptMap().get("test"));
         assertThat(updated).isNotEqualTo(firstFontFamily);
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java
index ef7b274..011b8f8 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/DevicePowerStatusActionTest.java
@@ -138,6 +138,7 @@
         mDevicePowerStatusAction = DevicePowerStatusAction.create(mPlaybackDevice, ADDR_TV,
                 mCallbackMock);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
index 80da696..a29a76b 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
@@ -60,6 +60,7 @@
 @RunWith(JUnit4.class)
 /** Tests for {@link HdmiCecLocalDevicePlayback} class. */
 public class HdmiCecLocalDevicePlaybackTest {
+    private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
 
     private static final int PORT_1 = 1;
     private static final HdmiDeviceInfo INFO_TV = new HdmiDeviceInfo(
@@ -1045,6 +1046,10 @@
         assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
         // 4. DUT turned off.
         mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
+        // TODO(b/184939731): remove waiting times once pending actions no longer block <Standby>
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
+        mTestLooper.dispatchAll();
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
         mTestLooper.dispatchAll();
         HdmiCecMessage standbyMessageBroadcast = HdmiCecMessageBuilder.buildStandby(
                 mHdmiCecLocalDevicePlayback.mAddress, ADDR_BROADCAST);
@@ -1502,6 +1507,7 @@
 
     @Test
     public void queryDisplayStatus() {
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
         mHdmiControlService.queryDisplayStatus(new IHdmiControlCallback.Stub() {
             @Override
             public void onComplete(int result) {
@@ -1618,6 +1624,12 @@
 
     @Test
     public void shouldHandleTvPowerKey_CecDisabled() {
+        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+        HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
+                Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
+        mNativeWrapper.onCecMessage(reportPowerStatusMessage);
+        mTestLooper.dispatchAll();
+
         mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
                 HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
                 HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
@@ -1626,6 +1638,12 @@
 
     @Test
     public void shouldHandleTvPowerKey_PowerControlModeNone() {
+        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+        HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
+                Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
+        mNativeWrapper.onCecMessage(reportPowerStatusMessage);
+        mTestLooper.dispatchAll();
+
         mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
                 HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
                 HdmiControlManager.POWER_CONTROL_MODE_NONE);
@@ -1633,7 +1651,22 @@
     }
 
     @Test
+    public void shouldHandleTvPowerKey_CecNotAvailable() {
+        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+        // TV doesn't report its power status
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
+        mTestLooper.dispatchAll();
+        assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
+    }
+
+    @Test
     public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() {
+        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+        HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
+                Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
+        mNativeWrapper.onCecMessage(reportPowerStatusMessage);
+        mTestLooper.dispatchAll();
+
         mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
                 HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
                 HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
index 950b8a2..c7a508a 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -61,6 +61,7 @@
 @RunWith(JUnit4.class)
 /** Tests for {@link HdmiCecLocalDeviceTv} class. */
 public class HdmiCecLocalDeviceTvTest {
+    private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
 
     private HdmiControlService mHdmiControlService;
     private HdmiCecController mHdmiCecController;
@@ -294,6 +295,10 @@
                 HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED);
         mTestLooper.dispatchAll();
         mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
+        // TODO(184939731): remove waiting times once pending actions no longer block <Standby>
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
+        mTestLooper.dispatchAll();
+        mTestLooper.moveTimeForward(TIMEOUT_MS);
         mTestLooper.dispatchAll();
         HdmiCecMessage standby = HdmiCecMessageBuilder.buildStandby(ADDR_TV, ADDR_BROADCAST);
         assertThat(mNativeWrapper.getResultMessages()).contains(standby);
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
index 5b01920..2307a85 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
@@ -392,9 +392,9 @@
     @Test
     public void isValid_giveFeatures() {
         assertMessageValidity("40:A5").isEqualTo(OK);
+        assertMessageValidity("F0:A5").isEqualTo(OK);
 
         assertMessageValidity("4F:A5").isEqualTo(ERROR_DESTINATION);
-        assertMessageValidity("F0:A5").isEqualTo(ERROR_SOURCE);
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java
index d74bff2..4893173 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java
@@ -142,6 +142,7 @@
         mPhysicalAddress = 0x2000;
         mNativeWrapper.setPhysicalAddress(mPhysicalAddress);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
     }
 
     private OneTouchPlayAction createOneTouchPlayAction(HdmiCecLocalDevicePlayback device,
@@ -161,6 +162,7 @@
         mLocalDevices.add(playbackDevice);
         mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
 
         TestActionTimer actionTimer = new TestActionTimer();
         TestCallback callback = new TestCallback();
@@ -203,6 +205,7 @@
         mLocalDevices.add(playbackDevice);
         mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
 
         TestActionTimer actionTimer = new TestActionTimer();
         TestCallback callback = new TestCallback();
@@ -245,6 +248,7 @@
         mLocalDevices.add(playbackDevice);
         mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
 
         TestActionTimer actionTimer = new TestActionTimer();
         TestCallback callback = new TestCallback();
@@ -297,6 +301,7 @@
         mLocalDevices.add(playbackDevice);
         mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
 
         TestActionTimer actionTimer = new TestActionTimer();
         TestCallback callback = new TestCallback();
@@ -342,6 +347,7 @@
         mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV,
                 HdmiControlManager.POWER_STATUS_ON);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
 
         TestActionTimer actionTimer = new TestActionTimer();
         TestCallback callback = new TestCallback();
@@ -376,6 +382,7 @@
         mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV,
                 HdmiControlManager.POWER_STATUS_UNKNOWN);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
 
         TestActionTimer actionTimer = new TestActionTimer();
         TestCallback callback = new TestCallback();
@@ -420,6 +427,7 @@
         mHdmiControlService.getHdmiCecNetwork().updateDevicePowerStatus(ADDR_TV,
                 HdmiControlManager.POWER_STATUS_STANDBY);
         mTestLooper.dispatchAll();
+        mNativeWrapper.clearResultMessages();
 
         TestActionTimer actionTimer = new TestActionTimer();
         TestCallback callback = new TestCallback();
diff --git a/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java b/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
index 68a6e60..d91a748 100644
--- a/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
@@ -91,12 +91,12 @@
                     case ACTION_JOB_STARTED:
                         mTestJobStatus.running = true;
                         mTestJobStatus.jobId = params.getJobId();
-                        mTestJobStatus.stopReason = JobParameters.REASON_CANCELED;
+                        mTestJobStatus.stopReason = JobParameters.STOP_REASON_UNDEFINED;
                         break;
                     case ACTION_JOB_STOPPED:
                         mTestJobStatus.running = false;
                         mTestJobStatus.jobId = params.getJobId();
-                        mTestJobStatus.stopReason = params.getLegacyStopReason();
+                        mTestJobStatus.stopReason = params.getStopReason();
                         break;
                 }
             }
@@ -142,7 +142,8 @@
         setAppOpsModeAllowed(false);
         mIActivityManager.makePackageIdle(TEST_APP_PACKAGE, UserHandle.USER_CURRENT);
         assertTrue("Job did not stop after putting app under bg-restriction",
-                awaitJobStop(DEFAULT_WAIT_TIMEOUT));
+                awaitJobStop(DEFAULT_WAIT_TIMEOUT,
+                        JobParameters.STOP_REASON_BACKGROUND_RESTRICTION));
 
         setPowerExemption(true);
         scheduleTestJob();
@@ -152,7 +153,8 @@
 
         setPowerExemption(false);
         assertTrue("Job did not stop after removing from the power exemption list",
-                awaitJobStop(DEFAULT_WAIT_TIMEOUT));
+                awaitJobStop(DEFAULT_WAIT_TIMEOUT,
+                        JobParameters.STOP_REASON_BACKGROUND_RESTRICTION));
 
         scheduleTestJob();
         Thread.sleep(TestJobActivity.JOB_MINIMUM_LATENCY);
@@ -170,7 +172,7 @@
         setAppOpsModeAllowed(false);
         mIActivityManager.makePackageIdle(TEST_APP_PACKAGE, UserHandle.USER_CURRENT);
         assertFalse("Job stopped even when feature flag was disabled",
-                awaitJobStop(DEFAULT_WAIT_TIMEOUT));
+                awaitJobStop(DEFAULT_WAIT_TIMEOUT, JobParameters.STOP_REASON_UNDEFINED));
     }
 
     @After
@@ -208,11 +210,13 @@
         });
     }
 
-    private boolean awaitJobStop(long timeout) throws InterruptedException {
+    private boolean awaitJobStop(long timeout, @JobParameters.StopReason int expectedStopReason)
+            throws InterruptedException {
         return waitUntilTrue(timeout, () -> {
             synchronized (mTestJobStatus) {
-                return (mTestJobStatus.jobId == mTestJobId) && !mTestJobStatus.running &&
-                        mTestJobStatus.stopReason == JobParameters.REASON_CONSTRAINTS_NOT_SATISFIED;
+                return (mTestJobStatus.jobId == mTestJobId) && !mTestJobStatus.running
+                        && (expectedStopReason == JobParameters.STOP_REASON_UNDEFINED
+                        || mTestJobStatus.stopReason == expectedStopReason);
             }
         });
     }
diff --git a/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java b/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java
index f0a9a00..75aacd1 100644
--- a/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/lights/LightsServiceTest.java
@@ -47,6 +47,9 @@
 @SmallTest
 public class LightsServiceTest {
 
+    private static final int HIGH_PRIORITY = Integer.MAX_VALUE;
+    private static final int DEFAULT_PRIORITY = 0;
+
     private final ILights mHal = new ILights.Stub() {
         @Override
         public void setLightState(int id, HwLightState state) {
@@ -188,4 +191,30 @@
         // Then the light should turn back off.
         assertThat(manager.getLightState(micLight).getColor()).isEqualTo(0);
     }
+
+    @Test
+    public void testControlLights_higherPriorityCallerWinsContention() throws Exception {
+        LightsService service = new LightsService(mContext, () -> mHal, Looper.getMainLooper());
+        LightsManager manager = new SystemLightsManager(mContext, service.mManagerService);
+        Light micLight = manager.getLights().get(0);
+
+        // The light should begin by being off.
+        assertThat(manager.getLightState(micLight).getColor()).isEqualTo(TRANSPARENT);
+
+        try (LightsManager.LightsSession session1 = manager.openSession(DEFAULT_PRIORITY)) {
+            try (LightsManager.LightsSession session2 = manager.openSession(HIGH_PRIORITY)) {
+                // When session1 and session2 both request the same light:
+                session1.requestLights(
+                        new Builder().addLight(micLight, new LightState(BLUE)).build());
+                session2.requestLights(
+                        new Builder().addLight(micLight, new LightState(WHITE)).build());
+                // Then session2 should win because it has a higher priority.
+                assertThat(manager.getLightState(micLight).getColor()).isEqualTo(WHITE);
+            }
+            // Then session1 should have its request go into effect.
+            assertThat(manager.getLightState(micLight).getColor()).isEqualTo(BLUE);
+        }
+        // Then the light should turn off because there are no more sessions.
+        assertThat(manager.getLightState(micLight).getColor()).isEqualTo(TRANSPARENT);
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
index 5d60a89..807ead3 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
@@ -155,7 +155,8 @@
         }
 
         @Override
-        public ManagedProfilePasswordCache getManagedProfilePasswordCache() {
+        public ManagedProfilePasswordCache getManagedProfilePasswordCache(
+                java.security.KeyStore ks) {
             return mock(ManagedProfilePasswordCache.class);
         }
 
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index b9f70da..3581206 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -704,36 +704,36 @@
             final String key = getKey(userId, databaseName);
             Map<String, GenericDocument> docMap = mDocumentMap.get(key);
             for (GenericDocument doc : docs) {
-                builder.setSuccess(doc.getUri(), null);
+                builder.setSuccess(doc.getId(), null);
                 if (docMap == null) {
                     docMap = new ArrayMap<>(1);
                     mDocumentMap.put(key, docMap);
                 }
-                docMap.put(doc.getUri(), doc);
+                docMap.put(doc.getId(), doc);
             }
             callback.onResult(builder.build());
         }
 
         @Override
         public void getDocuments(String packageName, String databaseName, String namespace,
-                List<String> uris, Map<String, List<String>> typePropertyPaths, int userId,
+                List<String> ids, Map<String, List<String>> typePropertyPaths, int userId,
                 IAppSearchBatchResultCallback callback) throws RemoteException {
             final AppSearchBatchResult.Builder<String, Bundle> builder =
                     new AppSearchBatchResult.Builder<>();
             final String key = getKey(userId, databaseName);
             if (!mDocumentMap.containsKey(key)) {
-                for (String uri : uris) {
-                    builder.setFailure(uri, AppSearchResult.RESULT_NOT_FOUND,
-                            key + " not found when getting: " + uri);
+                for (String id : ids) {
+                    builder.setFailure(id, AppSearchResult.RESULT_NOT_FOUND,
+                            key + " not found when getting: " + id);
                 }
             } else {
                 final Map<String, GenericDocument> docs = mDocumentMap.get(key);
-                for (String uri : uris) {
-                    if (docs.containsKey(uri)) {
-                        builder.setSuccess(uri, docs.get(uri).getBundle());
+                for (String id : ids) {
+                    if (docs.containsKey(id)) {
+                        builder.setSuccess(id, docs.get(id).getBundle());
                     } else {
-                        builder.setFailure(uri, AppSearchResult.RESULT_NOT_FOUND,
-                                "shortcut not found: " + uri);
+                        builder.setFailure(id, AppSearchResult.RESULT_NOT_FOUND,
+                                "shortcut not found: " + id);
                     }
                 }
             }
@@ -805,33 +805,33 @@
 
         @Override
         public void reportUsage(String packageName, String databaseName, String namespace,
-                String uri, long usageTimeMillis, boolean systemUsage, int userId,
+                String documentId, long usageTimestampMillis, boolean systemUsage, int userId,
                 IAppSearchResultCallback callback)
                 throws RemoteException {
             ignore(callback);
         }
 
         @Override
-        public void removeByUri(String packageName, String databaseName, String namespace,
-                List<String> uris, int userId, IAppSearchBatchResultCallback callback)
+        public void removeByDocumentId(String packageName, String databaseName, String namespace,
+                List<String> ids, int userId, IAppSearchBatchResultCallback callback)
                 throws RemoteException {
             final AppSearchBatchResult.Builder<String, Void> builder =
                     new AppSearchBatchResult.Builder<>();
             final String key = getKey(userId, databaseName);
             if (!mDocumentMap.containsKey(key)) {
-                for (String uri : uris) {
-                    builder.setFailure(uri, AppSearchResult.RESULT_NOT_FOUND,
-                            "package " + key + " not found when removing " + uri);
+                for (String id : ids) {
+                    builder.setFailure(id, AppSearchResult.RESULT_NOT_FOUND,
+                            "package " + key + " not found when removing " + id);
                 }
             } else {
                 final Map<String, GenericDocument> docs = mDocumentMap.get(key);
-                for (String uri : uris) {
-                    if (docs.containsKey(uri)) {
-                        docs.remove(uri);
-                        builder.setSuccess(uri, null);
+                for (String id : ids) {
+                    if (docs.containsKey(id)) {
+                        docs.remove(id);
+                        builder.setSuccess(id, null);
                     } else {
-                        builder.setFailure(uri, AppSearchResult.RESULT_NOT_FOUND,
-                                "shortcut not found when removing " + uri);
+                        builder.setFailure(id, AppSearchResult.RESULT_NOT_FOUND,
+                                "shortcut not found when removing " + id);
                     }
                 }
             }
diff --git a/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java b/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java
deleted file mode 100644
index 7b9a00d..0000000
--- a/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java
+++ /dev/null
@@ -1,164 +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.pm;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.content.pm.PackageManager;
-import android.os.ConditionVariable;
-import android.os.incremental.IStorageHealthListener;
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Unit tests for {@link IncrementalStates}.
- * Run with: atest -c FrameworksServicesTests:com.android.server.pm.IncrementalStatesTest
- */
-@Presubmit
-@RunWith(AndroidJUnit4.class)
-@MediumTest
-public class IncrementalStatesTest {
-    private IncrementalStates mIncrementalStates;
-    private ConditionVariable mUnstartableCalled = new ConditionVariable();
-    private ConditionVariable mFullyLoadedCalled = new ConditionVariable();
-    private AtomicInteger mUnstartableReason = new AtomicInteger(0);
-    private static final int WAIT_TIMEOUT_MILLIS = 1000; /* 1 second */
-    private IncrementalStates.Callback mCallback = new IncrementalStates.Callback() {
-        @Override
-        public void onPackageUnstartable(int reason) {
-            mUnstartableCalled.open();
-            mUnstartableReason.set(reason);
-        }
-
-        @Override
-        public void onPackageStartable() {
-        }
-
-        @Override
-        public void onPackageFullyLoaded() {
-            mFullyLoadedCalled.open();
-        }
-    };
-
-    /**
-     * Setup the tests as if the package has just been committed.
-     * By default the package is now startable and is loading.
-     */
-    @Before
-    public void setUp() {
-        mIncrementalStates = new IncrementalStates();
-        assertFalse(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-        mIncrementalStates.setCallback(mCallback);
-        mIncrementalStates.onCommit(true);
-        // Test that package is now startable and loading
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isLoading());
-        mUnstartableCalled.close();
-        mFullyLoadedCalled.close();
-    }
-
-    /**
-     * Test that the package is still startable when Incremental Storage is unhealthy.
-     */
-    @Test
-    public void testStartableTransition_IncrementalStorageUnhealthy() {
-        mIncrementalStates.onStorageHealthStatusChanged(
-                IStorageHealthListener.HEALTH_STATUS_UNHEALTHY);
-        // Test that package is still startable
-        assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-        assertEquals(PackageManager.UNSTARTABLE_REASON_UNKNOWN, mUnstartableReason.get());
-    }
-
-    /**
-     * Test that the package is still startable when Incremental Storage has pending reads.
-     */
-    @Test
-    public void testStartableTransition_IncrementalStorageReadsPending()
-            throws InterruptedException {
-        mIncrementalStates.onStorageHealthStatusChanged(
-                IStorageHealthListener.HEALTH_STATUS_READS_PENDING);
-        // Test that package is still startable
-        assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-    }
-
-    /**
-     * Test that the package is still startable when health status indicate storage issues.
-     */
-    @Test
-    public void testStartableTransition_IncrementalStorageBlocked() {
-        mIncrementalStates.onStorageHealthStatusChanged(
-                IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_STORAGE);
-        // Test that package is still startable
-        assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-        assertEquals(PackageManager.UNSTARTABLE_REASON_UNKNOWN,
-                mUnstartableReason.get());
-    }
-
-    /**
-     * Test that the package is still startable when health status indicates transport issues.
-     */
-    @Test
-    public void testStartableTransition_DataLoaderIntegrityError() {
-        mIncrementalStates.onStorageHealthStatusChanged(
-                IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_TRANSPORT);
-        // Test that package is still startable
-        assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-        assertEquals(PackageManager.UNSTARTABLE_REASON_UNKNOWN,
-                mUnstartableReason.get());
-    }
-
-    /**
-     * Test that when loading progress is 1, the package becomes fully loaded, and the change of
-     * Incremental Storage health status does not affect the startable state.
-     */
-    @Test
-    public void testStartableTransition_HealthStatusChangeWhenFullyLoaded()
-            throws InterruptedException {
-        mIncrementalStates.setProgress(1.0f);
-        // Test that package is now fully loaded
-        assertTrue(mFullyLoadedCalled.block(WAIT_TIMEOUT_MILLIS));
-        assertFalse(mIncrementalStates.getIncrementalStatesInfo().isLoading());
-        mIncrementalStates.onStorageHealthStatusChanged(
-                IStorageHealthListener.HEALTH_STATUS_UNHEALTHY);
-        // Test that package is still startable
-        assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-    }
-
-    /**
-     * Test startability transitions if app crashes or anrs
-     */
-    @Test
-    public void testStartableTransition_AppCrashOrAnr() {
-        mIncrementalStates.onCrashOrAnr();
-        assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
-    }
-}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index c16e498..ec5228f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -108,6 +108,7 @@
 import com.android.server.pm.ShortcutUser.PackageWithUser;
 
 import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -416,8 +417,11 @@
         mManager.pushDynamicShortcut(s1);
         assertShortcutIds(assertAllNotKeyFieldsOnly(mManager.getDynamicShortcuts()), "s1");
         assertEquals(0, getCallerShortcut("s1").getRank());
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s1"), eq(USER_0));
 
         // Test push when other shortcuts exist
+        Mockito.reset(mMockUsageStatsManagerInternal);
         assertTrue(mManager.setDynamicShortcuts(list(s1, s2)));
         assertShortcutIds(assertAllNotKeyFieldsOnly(mManager.getDynamicShortcuts()), "s1", "s2");
         mManager.pushDynamicShortcut(s3);
@@ -426,25 +430,38 @@
         assertEquals(0, getCallerShortcut("s3").getRank());
         assertEquals(1, getCallerShortcut("s1").getRank());
         assertEquals(2, getCallerShortcut("s2").getRank());
+        verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s1"), eq(USER_0));
+        verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s2"), eq(USER_0));
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s3"), eq(USER_0));
 
         mInjectedCurrentTimeMillis += INTERVAL; // reset
 
         // Push with set rank
+        Mockito.reset(mMockUsageStatsManagerInternal);
         s4.setRank(2);
         mManager.pushDynamicShortcut(s4);
         assertEquals(2, getCallerShortcut("s4").getRank());
         assertEquals(3, getCallerShortcut("s2").getRank());
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s4"), eq(USER_0));
 
         // Push existing shortcut with set rank
+        Mockito.reset(mMockUsageStatsManagerInternal);
         final ShortcutInfo s4_2 = makeShortcut("s4");
         s4_2.setRank(4);
         mManager.pushDynamicShortcut(s4_2);
         assertEquals(2, getCallerShortcut("s2").getRank());
         assertEquals(3, getCallerShortcut("s4").getRank());
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s4"), eq(USER_0));
 
         mInjectedCurrentTimeMillis += INTERVAL; // reset
 
         // Test push as last
+        Mockito.reset(mMockUsageStatsManagerInternal);
         mManager.pushDynamicShortcut(s5);
         assertShortcutIds(assertAllNotKeyFieldsOnly(mManager.getDynamicShortcuts()),
                 "s1", "s2", "s3", "s4", "s5");
@@ -453,25 +470,34 @@
         assertEquals(2, getCallerShortcut("s1").getRank());
         assertEquals(3, getCallerShortcut("s2").getRank());
         assertEquals(4, getCallerShortcut("s4").getRank());
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s5"), eq(USER_0));
 
         // Push when max has already reached
+        Mockito.reset(mMockUsageStatsManagerInternal);
         mManager.pushDynamicShortcut(s6);
         assertShortcutIds(assertAllNotKeyFieldsOnly(mManager.getDynamicShortcuts()),
                 "s1", "s2", "s3", "s5", "s6");
         assertEquals(0, getCallerShortcut("s6").getRank());
         assertEquals(1, getCallerShortcut("s5").getRank());
         assertEquals(4, getCallerShortcut("s2").getRank());
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s6"), eq(USER_0));
 
         mInjectedCurrentTimeMillis += INTERVAL; // reset
 
         // Push with different activity
+        Mockito.reset(mMockUsageStatsManagerInternal);
         s7.setActivity(makeComponent(ShortcutActivity2.class));
         mManager.pushDynamicShortcut(s7);
         assertEquals(makeComponent(ShortcutActivity2.class),
                 getCallerShortcut("s7").getActivity());
         assertEquals(0, getCallerShortcut("s7").getRank());
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s7"), eq(USER_0));
 
         // Push to update shortcut with different activity
+        Mockito.reset(mMockUsageStatsManagerInternal);
         final ShortcutInfo s1_2 = makeShortcut("s1");
         s1_2.setActivity(makeComponent(ShortcutActivity2.class));
         s1_2.setRank(1);
@@ -482,10 +508,13 @@
         assertEquals(1, getCallerShortcut("s5").getRank());
         assertEquals(2, getCallerShortcut("s3").getRank());
         assertEquals(3, getCallerShortcut("s2").getRank());
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s1"), eq(USER_0));
 
         mInjectedCurrentTimeMillis += INTERVAL; // reset
 
         // Test push when dropped shortcut is cached
+        Mockito.reset(mMockUsageStatsManagerInternal);
         s8.setLongLived();
         s8.setRank(100);
         mManager.pushDynamicShortcut(s8);
@@ -494,14 +523,19 @@
             mInjectCheckAccessShortcutsPermission = true;
             mLauncherApps.cacheShortcuts(CALLING_PACKAGE_1, list("s8"), HANDLE_USER_0,
                     CACHE_OWNER_0);
+            verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                    eq(CALLING_PACKAGE_1), eq("s8"), eq(USER_0));
         });
 
+        Mockito.reset(mMockUsageStatsManagerInternal);
         mManager.pushDynamicShortcut(s9);
         assertShortcutIds(assertAllNotKeyFieldsOnly(mManager.getDynamicShortcuts()),
                 "s1", "s2", "s3", "s5", "s6", "s7", "s9");
         // Verify s13 stayed as cached
         assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED),
                 "s8");
+        verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
+                eq(CALLING_PACKAGE_1), eq("s9"), eq(USER_0));
     }
 
     public void testUnlimitedCalls() {
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java
index fd3e7a8..478aa41 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java
@@ -15,6 +15,8 @@
  */
 package com.android.server.pm;
 
+import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI;
+
 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list;
 
 import android.app.PendingIntent;
@@ -22,6 +24,9 @@
 import android.content.pm.AppSearchShortcutInfo;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.provider.DeviceConfig;
+
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 
 import java.util.Random;
 
@@ -33,7 +38,12 @@
 public class ShortcutManagerTest12 extends BaseShortcutManagerTest {
 
     public void testUpdateShortcutVisibility_updatesShortcutSchema() {
-
+        if (!DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI,
+                SystemUiDeviceConfigFlags.DARK_LAUNCH_REMOTE_PREDICTION_SERVICE_ENABLED,
+                false)) {
+            // no-op if app-search integration is disabled.
+            return;
+        }
         final byte[] cert = new byte[20];
         new Random().nextBytes(cert);
 
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index ca77049..7241fa0 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -2138,7 +2138,6 @@
             mManager.reportShortcutUsed("s2");
             verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
                     eq(CALLING_PACKAGE_1), eq("s2"), eq(USER_10));
-
         });
         runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
             // Try with a different package.
@@ -2158,7 +2157,6 @@
             mManager.reportShortcutUsed("s3");
             verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
                     eq(CALLING_PACKAGE_2), eq("s3"), eq(USER_10));
-
         });
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index fc26611..b76c279 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -175,7 +175,7 @@
         final Context userContext = mContext.createPackageContextAsUser("system", 0,
                 UserHandle.of(userInfo.id));
         assertThat(userContext.getSystemService(
-                UserManager.class).sharesMediaWithParent()).isTrue();
+                UserManager.class).isMediaSharedWithParent()).isTrue();
 
         List<UserInfo> list = mUserManager.getUsers();
         List<UserInfo> cloneUsers = list.stream().filter(
diff --git a/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java
index 4f6441f..acd3fca 100644
--- a/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java
@@ -27,7 +27,9 @@
 import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.os.Build;
 import android.os.Process;
 
 import androidx.test.InstrumentationRegistry;
@@ -46,8 +48,12 @@
     private static final int APP_UID = Process.FIRST_APPLICATION_UID;
     private static final int APP_PID = 5678;
 
+    private static final String CHECK_DEVICE_IDENTIFIER_MESSAGE = "testCheckDeviceIdentifierAccess";
+    private static final String CHECK_PHONE_NUMBER_MESSAGE = "testCheckPhoneNumberAccess";
+
     private LegacyPermissionManagerService mLegacyPermissionManagerService;
     private Context mContext;
+    private String mPackageName;
 
     @Mock
     private LegacyPermissionManagerService.Injector mInjector;
@@ -63,6 +69,7 @@
         MockitoAnnotations.initMocks(this);
 
         mContext = InstrumentationRegistry.getContext();
+        mPackageName = mContext.getPackageName();
         mLegacyPermissionManagerService = new LegacyPermissionManagerService(mContext, mInjector);
     }
 
@@ -74,7 +81,7 @@
 
         assertThrows(SecurityException.class,
                 () -> mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
-                        mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null,
+                        mPackageName, CHECK_DEVICE_IDENTIFIER_MESSAGE, null,
                         APP_PID, SYSTEM_UID));
     }
 
@@ -86,7 +93,7 @@
 
         assertThrows(SecurityException.class,
                 () -> mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
-                        mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null,
+                        mPackageName, CHECK_DEVICE_IDENTIFIER_MESSAGE, null,
                         SYSTEM_PID, APP_UID));
     }
 
@@ -97,7 +104,7 @@
         setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID);
 
         int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
-                mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+                mPackageName, CHECK_DEVICE_IDENTIFIER_MESSAGE, null, APP_PID,
                 APP_UID);
 
         assertEquals(PackageManager.PERMISSION_DENIED, result);
@@ -108,7 +115,7 @@
         // The system UID should always have access to device identifiers.
         setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
         int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
-                mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, SYSTEM_PID,
+                mPackageName, CHECK_DEVICE_IDENTIFIER_MESSAGE, null, SYSTEM_PID,
                 SYSTEM_UID);
 
         assertEquals(PackageManager.PERMISSION_GRANTED, result);
@@ -123,7 +130,7 @@
                 APP_PID, APP_UID)).thenReturn(PackageManager.PERMISSION_GRANTED);
 
         int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
-                mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+                mPackageName, CHECK_DEVICE_IDENTIFIER_MESSAGE, null, APP_PID,
                 APP_UID);
 
         assertEquals(PackageManager.PERMISSION_GRANTED, result);
@@ -135,11 +142,11 @@
         // device identifiers.
         setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
         when(mAppOpsManager.noteOpNoThrow(eq(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS),
-                eq(APP_UID), eq(mContext.getPackageName()), any(), any())).thenReturn(
+                eq(APP_UID), eq(mPackageName), any(), any())).thenReturn(
                 AppOpsManager.MODE_ALLOWED);
 
         int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
-                mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+                mPackageName, CHECK_DEVICE_IDENTIFIER_MESSAGE, null, APP_PID,
                 APP_UID);
 
         assertEquals(PackageManager.PERMISSION_GRANTED, result);
@@ -150,32 +157,228 @@
         // Apps that pass a DevicePolicyManager device / profile owner check should have access to
         // device identifiers.
         setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
-        when(mDevicePolicyManager.hasDeviceIdentifierAccess(mContext.getPackageName(), APP_PID,
+        when(mDevicePolicyManager.hasDeviceIdentifierAccess(mPackageName, APP_PID,
                 APP_UID)).thenReturn(true);
 
         int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
-                mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+                mPackageName, CHECK_DEVICE_IDENTIFIER_MESSAGE, null, APP_PID,
                 APP_UID);
 
         assertEquals(PackageManager.PERMISSION_GRANTED, result);
     }
 
+    @Test
+    public void checkPhoneNumberAccess_callingAppUidMismatch_throwsException() throws Exception {
+        // An app can check its own phone number access, but an exception should be
+        // thrown if an app attempts to check the phone number access of another app's UID.
+        setupCheckPhoneNumberAccessTest(APP_PID, APP_UID);
+
+        assertThrows(SecurityException.class,
+                () -> mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                        mPackageName, CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID,
+                        SYSTEM_UID));
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_callingAppPidMismatch_throwsException() throws Exception {
+        // An app can check its own phone number access, but an exception should be
+        // thrown if an app attempts to check the phone number access of another app's PID.
+        setupCheckPhoneNumberAccessTest(APP_PID, APP_UID);
+
+        assertThrows(SecurityException.class,
+                () -> mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                        mPackageName, CHECK_PHONE_NUMBER_MESSAGE, null, SYSTEM_PID,
+                        APP_UID));
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_callingAppIdWithoutAccess_returnsDenied() throws Exception {
+        // Since an app can check its own phone number access, this test verifies all checks
+        // are performed and the expected result is returned when an app does not have access.
+        setupCheckPhoneNumberAccessTest(APP_PID, APP_UID);
+
+        int result = mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                mPackageName, CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(PackageManager.PERMISSION_DENIED, result);
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_nullPackageName_returnsDenied() throws Exception {
+        // While a null value can be provided for the package name only the privileged
+        // permission test would be able to proceed. Verify that a null value results in a
+        // denied response instead of a NullPointerException.
+        setupCheckPhoneNumberAccessTest(APP_PID, APP_UID);
+
+        int result = mLegacyPermissionManagerService.checkPhoneNumberAccess(mPackageName,
+                CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(PackageManager.PERMISSION_DENIED, result);
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_hasPrivilegedPermission_returnsGranted() throws Exception {
+        // An app with the READ_PRIVILEGED_PHONE_STATE should have access to the phone number.
+        setupCheckPhoneNumberAccessTest(SYSTEM_PID, SYSTEM_UID);
+        when(mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+                APP_PID, APP_UID)).thenReturn(PackageManager.PERMISSION_GRANTED);
+
+        int result = mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                null, CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(PackageManager.PERMISSION_GRANTED, result);
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_targetPreRWithReadPhoneState_returnsGranted()
+            throws Exception {
+        // Prior to R an app could access the phone number with the READ_PHONE_STATE permission, but
+        // both the permission and the appop must be granted. If the permission is granted but the
+        // appop is not then AppOpsManager#MODE_IGNORED should be returned to indicate that this
+        // should be a silent failure.
+        setupCheckPhoneNumberAccessTest(SYSTEM_PID, SYSTEM_UID);
+        setPackageTargetSdk(Build.VERSION_CODES.Q);
+
+        grantPermissionAndAppop(android.Manifest.permission.READ_PHONE_STATE, null);
+        int resultWithoutAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                mPackageName, CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+        grantPermissionAndAppop(android.Manifest.permission.READ_PHONE_STATE,
+                AppOpsManager.OPSTR_READ_PHONE_STATE);
+        int resultWithAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(mPackageName,
+                CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(AppOpsManager.MODE_IGNORED, resultWithoutAppop);
+        assertEquals(PackageManager.PERMISSION_GRANTED, resultWithAppop);
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_targetRWithReadPhoneState_returnsDenied() throws Exception {
+        // Apps targeting R+ with just the READ_PHONE_STATE permission granted should not have
+        // access to the phone number; PERMISSION_DENIED should be returned both with and without
+        // the appop granted since this check should be skipped for target SDK R+.
+        setupCheckPhoneNumberAccessTest(SYSTEM_PID, SYSTEM_UID);
+
+        grantPermissionAndAppop(android.Manifest.permission.READ_PHONE_STATE, null);
+        int resultWithoutAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                mPackageName, CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+        grantPermissionAndAppop(android.Manifest.permission.READ_PHONE_STATE,
+                AppOpsManager.OPSTR_READ_PHONE_STATE);
+        int resultWithAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(mPackageName,
+                CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(PackageManager.PERMISSION_DENIED, resultWithoutAppop);
+        assertEquals(PackageManager.PERMISSION_DENIED, resultWithAppop);
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_smsHandler_returnsGranted() throws Exception {
+        // The default SMS handler should have the WRITE_SMS appop granted and have access to the
+        // phone number.
+        setupCheckPhoneNumberAccessTest(APP_PID, APP_UID);
+        grantPermissionAndAppop(null, AppOpsManager.OPSTR_WRITE_SMS);
+
+        int result = mLegacyPermissionManagerService.checkPhoneNumberAccess(mPackageName,
+                CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(PackageManager.PERMISSION_GRANTED, result);
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_readPhoneNumbersGranted_returnsGranted()
+            throws Exception {
+        // Access to the phone number should be granted to an app with the READ_PHONE_NUMBERS
+        // permission and appop set.
+        setupCheckPhoneNumberAccessTest(APP_PID, APP_UID);
+
+        grantPermissionAndAppop(android.Manifest.permission.READ_PHONE_NUMBERS, null);
+        int resultWithoutAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                mPackageName, CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+        grantPermissionAndAppop(android.Manifest.permission.READ_PHONE_NUMBERS,
+                AppOpsManager.OPSTR_READ_PHONE_NUMBERS);
+        int resultWithAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(mPackageName,
+                CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(PackageManager.PERMISSION_DENIED, resultWithoutAppop);
+        assertEquals(PackageManager.PERMISSION_GRANTED, resultWithAppop);
+    }
+
+    @Test
+    public void checkPhoneNumberAccess_readSmsGranted_returnsGranted() throws Exception {
+        // Access to the phone number should be granted to an app with the READ_SMS permission and
+        // appop set.
+        setupCheckPhoneNumberAccessTest(APP_PID, APP_UID);
+
+        grantPermissionAndAppop(android.Manifest.permission.READ_SMS, null);
+        int resultWithoutAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(
+                mPackageName, CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+        grantPermissionAndAppop(android.Manifest.permission.READ_SMS, AppOpsManager.OPSTR_READ_SMS);
+        int resultWithAppop = mLegacyPermissionManagerService.checkPhoneNumberAccess(mPackageName,
+                CHECK_PHONE_NUMBER_MESSAGE, null, APP_PID, APP_UID);
+
+        assertEquals(PackageManager.PERMISSION_DENIED, resultWithoutAppop);
+        assertEquals(PackageManager.PERMISSION_GRANTED, resultWithAppop);
+    }
+
+    /**
+     * Configures device identifier access tests to fail; tests verifying access should individually
+     * set an access check to succeed to verify access when that condition is met.
+     */
     private void setupCheckDeviceIdentifierAccessTest(int callingPid, int callingUid) {
+        setupAccessTest(callingPid, callingUid);
+
+        when(mDevicePolicyManager.hasDeviceIdentifierAccess(anyString(), anyInt(),
+                anyInt())).thenReturn(false);
+        when(mInjector.getSystemService(eq(Context.DEVICE_POLICY_SERVICE))).thenReturn(
+                mDevicePolicyManager);
+    }
+
+    /**
+     * Configures phone number access tests to fail; tests verifying access should individually set
+     * an access check to succeed to verify access when that condition is met.
+     */
+    private void setupCheckPhoneNumberAccessTest(int callingPid, int callingUid) throws Exception {
+        setupAccessTest(callingPid, callingUid);
+        setPackageTargetSdk(Build.VERSION_CODES.R);
+    }
+
+    /**
+     * Configures the common mocks for any access tests using the provided {@code callingPid}
+     * and {@code callingUid}.
+     */
+    private void setupAccessTest(int callingPid, int callingUid) {
         when(mInjector.getCallingPid()).thenReturn(callingPid);
         when(mInjector.getCallingUid()).thenReturn(callingUid);
 
-        // Configure the checkDeviceIdentifierAccess tests to fail all access checks, then each test
-        // can individually set the access check to pass for verification.
         when(mInjector.checkPermission(anyString(), anyInt(), anyInt())).thenReturn(
                 PackageManager.PERMISSION_DENIED);
 
         when(mAppOpsManager.noteOpNoThrow(anyString(), anyInt(), anyString(), any(),
                 any())).thenReturn(AppOpsManager.MODE_DEFAULT);
         when(mInjector.getSystemService(eq(Context.APP_OPS_SERVICE))).thenReturn(mAppOpsManager);
+    }
 
-        when(mDevicePolicyManager.hasDeviceIdentifierAccess(anyString(), anyInt(),
-                anyInt())).thenReturn(false);
-        when(mInjector.getSystemService(eq(Context.DEVICE_POLICY_SERVICE))).thenReturn(
-                mDevicePolicyManager);
+    /**
+     * Sets the returned {@code targetSdkVersion} for the package under test.
+     */
+    private void setPackageTargetSdk(int targetSdkVersion) throws Exception {
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.targetSdkVersion = targetSdkVersion;
+        when(mInjector.getApplicationInfo(eq(mPackageName), eq(APP_UID))).thenReturn(appInfo);
+    }
+
+    /**
+     * Configures the mocks to return {@code PackageManager.PERMISSION_GRANTED} for the specified
+     * {@code permission} and {@code AppOpsManager.MODE_ALLOWED} for the provided {@code appop}
+     * when queried for the package under test.
+     */
+    private void grantPermissionAndAppop(String permission, String appop) {
+        if (permission != null) {
+            when(mInjector.checkPermission(permission, APP_PID, APP_UID)).thenReturn(
+                    PackageManager.PERMISSION_GRANTED);
+        }
+        if (appop != null) {
+            when(mAppOpsManager.noteOpNoThrow(eq(appop), eq(APP_UID), eq(mPackageName), any(),
+                    any())).thenReturn(AppOpsManager.MODE_ALLOWED);
+        }
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java b/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java
index d13687c..4d2d2f1 100644
--- a/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java
@@ -307,6 +307,56 @@
         assertEquals(1, mIntegerCaptor.getValue().intValue());
     }
 
+    @Test
+    public void create_invalidSensor() throws Exception {
+        Sensor sensor = newSensor("sensor", Sensor.STRING_TYPE_HINGE_ANGLE);
+        when(mSensorManager.getSensorList(anyInt())).thenReturn(List.of());
+
+        String configString = "<device-state-config>\n"
+                + "    <device-state>\n"
+                + "        <identifier>1</identifier>\n"
+                + "        <name>CLOSED</name>\n"
+                + "        <conditions>\n"
+                + "            <sensor>\n"
+                + "                <type>" + sensor.getStringType() + "</type>\n"
+                + "                <name>" + sensor.getName() + "</name>\n"
+                + "                <value>\n"
+                + "                    <max>90</max>\n"
+                + "                </value>\n"
+                + "            </sensor>\n"
+                + "        </conditions>\n"
+                + "    </device-state>\n"
+                + "    <device-state>\n"
+                + "        <identifier>2</identifier>\n"
+                + "        <name>HALF_OPENED</name>\n"
+                + "        <conditions>\n"
+                + "            <sensor>\n"
+                + "                <type>" + sensor.getStringType() + "</type>\n"
+                + "                <name>" + sensor.getName() + "</name>\n"
+                + "                <value>\n"
+                + "                    <min-inclusive>90</min-inclusive>\n"
+                + "                    <max>180</max>\n"
+                + "                </value>\n"
+                + "            </sensor>\n"
+                + "        </conditions>\n"
+                + "    </device-state>\n"
+                + "</device-state-config>\n";
+        DeviceStateProviderImpl.ReadableConfig config = new TestReadableConfig(configString);
+        DeviceStateProviderImpl provider = DeviceStateProviderImpl.createFromConfig(mContext,
+                config);
+
+        DeviceStateProvider.Listener listener = mock(DeviceStateProvider.Listener.class);
+        provider.setListener(listener);
+
+        verify(listener).onSupportedDeviceStatesChanged(mDeviceStateArrayCaptor.capture());
+        assertArrayEquals(
+                new DeviceState[]{ new DeviceState(1, "CLOSED"), new DeviceState(2, "HALF_OPENED"),
+                        }, mDeviceStateArrayCaptor.getValue());
+        // onStateChanged() should be called because the provider could not find the sensor.
+        verify(listener).onStateChanged(mIntegerCaptor.capture());
+        assertEquals(1, mIntegerCaptor.getValue().intValue());
+    }
+
     private static Sensor newSensor(String name, String type) throws Exception {
         Constructor<Sensor> constructor = Sensor.class.getDeclaredConstructor();
         constructor.setAccessible(true);
diff --git a/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java b/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
index b64810b..5234bb7 100644
--- a/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
@@ -95,6 +95,8 @@
         mUncryptUpdateFileWriter = mock(FileWriter.class);
         mLockSettingsInternal = mock(LockSettingsInternal.class);
 
+        doReturn(true).when(mLockSettingsInternal).prepareRebootEscrow();
+        doReturn(true).when(mLockSettingsInternal).clearRebootEscrow();
         doReturn(LockSettingsInternal.ARM_REBOOT_ERROR_NONE).when(mLockSettingsInternal)
                 .armRebootEscrow();
 
@@ -254,7 +256,6 @@
                 + RecoverySystemService.REQUEST_LSKF_TIMESTAMP_PREF_SUFFIX), eq(100_000L));
     }
 
-
     @Test
     public void requestLskf_success() throws Exception {
         IntentSender intentSender = mock(IntentSender.class);
@@ -299,6 +300,14 @@
     }
 
     @Test
+    public void requestLskf_lockSettingsError() throws Exception {
+        IntentSender intentSender = mock(IntentSender.class);
+
+        doReturn(false).when(mLockSettingsInternal).prepareRebootEscrow();
+        assertFalse(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender));
+    }
+
+    @Test
     public void isLskfCaptured_requestedButNotPrepared() throws Exception {
         IntentSender intentSender = mock(IntentSender.class);
         assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
diff --git a/services/tests/servicestests/src/com/android/server/recoverysystem/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/recoverysystem/TEST_MAPPING
new file mode 100644
index 0000000..4d1e405
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/recoverysystem/TEST_MAPPING
@@ -0,0 +1,15 @@
+{
+    "presubmit": [
+        {
+            "name": "FrameworksServicesTests",
+            "options": [
+                {
+                    "include-filter": "com.android.server.recoverysystem."
+                },
+                {
+                    "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/ConfigurationInternalTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/ConfigurationInternalTest.java
index aa46e7e..117680b 100644
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/ConfigurationInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/ConfigurationInternalTest.java
@@ -67,10 +67,10 @@
             TimeZoneCapabilities capabilities = capabilitiesAndConfig.getCapabilities();
             assertEquals(CAPABILITY_POSSESSED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_POSSESSED,
-                    capabilities.getConfigureGeoDetectionEnabledCapability());
             assertEquals(CAPABILITY_NOT_APPLICABLE,
                     capabilities.getSuggestManualTimeZoneCapability());
+            assertEquals(CAPABILITY_POSSESSED,
+                    capabilities.getConfigureGeoDetectionEnabledCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertTrue(configuration.isAutoDetectionEnabled());
@@ -92,10 +92,10 @@
             TimeZoneCapabilities capabilities = capabilitiesAndConfig.getCapabilities();
             assertEquals(CAPABILITY_POSSESSED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_NOT_APPLICABLE,
-                    capabilities.getConfigureGeoDetectionEnabledCapability());
             assertEquals(CAPABILITY_POSSESSED,
                     capabilities.getSuggestManualTimeZoneCapability());
+            assertEquals(CAPABILITY_NOT_APPLICABLE,
+                    capabilities.getConfigureGeoDetectionEnabledCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertFalse(configuration.isAutoDetectionEnabled());
@@ -130,9 +130,10 @@
             assertEquals(CAPABILITY_NOT_ALLOWED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
             assertEquals(CAPABILITY_NOT_ALLOWED,
-                    capabilities.getConfigureGeoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_NOT_ALLOWED,
                     capabilities.getSuggestManualTimeZoneCapability());
+            // This has user privacy implications so it is not restricted in the same way as others.
+            assertEquals(CAPABILITY_POSSESSED,
+                    capabilities.getConfigureGeoDetectionEnabledCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertTrue(configuration.isAutoDetectionEnabled());
@@ -155,9 +156,10 @@
             assertEquals(CAPABILITY_NOT_ALLOWED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
             assertEquals(CAPABILITY_NOT_ALLOWED,
-                    capabilities.getConfigureGeoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_NOT_ALLOWED,
                     capabilities.getSuggestManualTimeZoneCapability());
+            // This has user privacy implications so it is not restricted in the same way as others.
+            assertEquals(CAPABILITY_NOT_APPLICABLE,
+                    capabilities.getConfigureGeoDetectionEnabledCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertFalse(configuration.isAutoDetectionEnabled());
@@ -191,9 +193,9 @@
             TimeZoneCapabilities capabilities = capabilitiesAndConfig.getCapabilities();
             assertEquals(CAPABILITY_NOT_SUPPORTED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
+            assertEquals(CAPABILITY_POSSESSED, capabilities.getSuggestManualTimeZoneCapability());
             assertEquals(CAPABILITY_NOT_SUPPORTED,
                     capabilities.getConfigureGeoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_POSSESSED, capabilities.getSuggestManualTimeZoneCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertTrue(configuration.isAutoDetectionEnabled());
@@ -214,9 +216,9 @@
             TimeZoneCapabilities capabilities = capabilitiesAndConfig.getCapabilities();
             assertEquals(CAPABILITY_NOT_SUPPORTED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
+            assertEquals(CAPABILITY_POSSESSED, capabilities.getSuggestManualTimeZoneCapability());
             assertEquals(CAPABILITY_NOT_SUPPORTED,
                     capabilities.getConfigureGeoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_POSSESSED, capabilities.getSuggestManualTimeZoneCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertFalse(configuration.isAutoDetectionEnabled());
@@ -253,10 +255,10 @@
             TimeZoneCapabilities capabilities = capabilitiesAndConfig.getCapabilities();
             assertEquals(CAPABILITY_POSSESSED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_NOT_SUPPORTED,
-                    capabilities.getConfigureGeoDetectionEnabledCapability());
             assertEquals(CAPABILITY_NOT_APPLICABLE,
                     capabilities.getSuggestManualTimeZoneCapability());
+            assertEquals(CAPABILITY_NOT_SUPPORTED,
+                    capabilities.getConfigureGeoDetectionEnabledCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertTrue(configuration.isAutoDetectionEnabled());
@@ -277,9 +279,9 @@
             TimeZoneCapabilities capabilities = capabilitiesAndConfig.getCapabilities();
             assertEquals(CAPABILITY_POSSESSED,
                     capabilities.getConfigureAutoDetectionEnabledCapability());
+            assertEquals(CAPABILITY_POSSESSED, capabilities.getSuggestManualTimeZoneCapability());
             assertEquals(CAPABILITY_NOT_SUPPORTED,
                     capabilities.getConfigureGeoDetectionEnabledCapability());
-            assertEquals(CAPABILITY_POSSESSED, capabilities.getSuggestManualTimeZoneCapability());
 
             TimeZoneConfiguration configuration = capabilitiesAndConfig.getConfiguration();
             assertFalse(configuration.isAutoDetectionEnabled());
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
index f91ce87..47475a6 100644
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyImplTest.java
@@ -237,12 +237,17 @@
         // The settings should not have been changed: user shouldn't have the capabilities.
         script.verifyConfigurationNotChanged();
 
-        // Try to update the configuration to enable geolocation time zone detection.
+        // Try to update the configuration to enable geolocation time zone detection: this should
+        // succeed, the geolocation time zone detection setting is not covered by the restriction).
         script.simulateUpdateConfiguration(
-                USER_ID, CONFIG_GEO_DETECTION_ENABLED,  false /* expectedResult */);
+                USER_ID, CONFIG_GEO_DETECTION_DISABLED,  true /* expectedResult */);
 
-        // The settings should not have been changed: user shouldn't have the capabilities.
-        script.verifyConfigurationNotChanged();
+        // The settings should have been changed.
+        ConfigurationInternal expectedConfig = new ConfigurationInternal.Builder(
+                CONFIG_INT_USER_RESTRICTED_AUTO_ENABLED)
+                .setGeoDetectionEnabled(false)
+                .build();
+        script.verifyConfigurationChangedAndReset(expectedConfig);
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 916a278..a246917 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -59,11 +59,14 @@
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
 import static org.mockito.AdditionalMatchers.not;
+import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Matchers.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;
 
 import android.annotation.NonNull;
 import android.app.ActivityManager;
@@ -77,6 +80,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.hardware.display.DisplayManager;
 import android.os.Handler;
 import android.os.Looper;
@@ -92,6 +96,7 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.internal.util.ArrayUtils;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
 import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
@@ -101,6 +106,8 @@
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -194,6 +201,8 @@
     }
 
     static class MyInjector extends AppStandbyController.Injector {
+        @Mock
+        private PackageManagerInternal mPackageManagerInternal;
         long mElapsedRealtime;
         boolean mIsAppIdleEnabled = true;
         boolean mIsCharging;
@@ -222,6 +231,7 @@
 
         MyInjector(Context context, Looper looper) {
             super(context, looper);
+            MockitoAnnotations.initMocks(this);
         }
 
         @Override
@@ -269,6 +279,11 @@
         }
 
         @Override
+        PackageManagerInternal getPackageManagerInternal() {
+            return mPackageManagerInternal;
+        }
+
+        @Override
         void updatePowerWhitelistCache() {
         }
 
@@ -491,6 +506,37 @@
                         mInjector.mElapsedRealtime, false));
     }
 
+    @Test
+    public void testGetIdleUidsForUser() {
+        final AppStandbyController controllerUnderTest = spy(mController);
+
+        final int userIdForTest = 325;
+        final int[] uids = new int[]{129, 23, 129, 129, 44, 23, 41, 751};
+        final boolean[] idle = new boolean[]{true, true, false, true, false, true, false, true};
+        // Based on uids[] and idle[], the only two uids that have all true's in idle[].
+        final int[] expectedIdleUids = new int[]{23, 751};
+
+        final List<ApplicationInfo> installedApps = new ArrayList<>();
+        for (int i = 0; i < uids.length; i++) {
+            final ApplicationInfo ai = mock(ApplicationInfo.class);
+            ai.uid = uids[i];
+            ai.packageName = "example.package.name." + i;
+            installedApps.add(ai);
+            when(controllerUnderTest.isAppIdleFiltered(eq(ai.packageName),
+                    eq(UserHandle.getAppId(ai.uid)), eq(userIdForTest), anyLong()))
+                    .thenReturn(idle[i]);
+        }
+        when(mInjector.mPackageManagerInternal.getInstalledApplications(anyInt(), eq(userIdForTest),
+                anyInt())).thenReturn(installedApps);
+        final int[] returnedIdleUids = controllerUnderTest.getIdleUidsForUser(userIdForTest);
+
+        assertEquals(expectedIdleUids.length, returnedIdleUids.length);
+        for (final int uid : expectedIdleUids) {
+            assertTrue("Idle uid: " + uid + " not found in result: " + Arrays.toString(
+                    returnedIdleUids), ArrayUtils.contains(returnedIdleUids, uid));
+        }
+    }
+
     private static class TestParoleListener extends AppIdleStateChangeListener {
         private boolean mIsParoleOn = false;
         private CountDownLatch mLatch;
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
index 7d86961..b2e5ea0 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
@@ -21,13 +21,21 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
+import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.app.usage.UsageStatsManagerInternal;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.UserHandle;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.LargeTest;
 import androidx.test.runner.AndroidJUnit4;
 
@@ -35,6 +43,9 @@
 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.io.PrintWriter;
 import java.io.StringWriter;
@@ -89,6 +100,8 @@
 
     private AppTimeLimitController mController;
 
+    @Mock private AlarmManager mMockAlarmManager;
+
     private HandlerThread mThread;
 
     private long mElapsedTime;
@@ -112,7 +125,12 @@
     class MyAppTimeLimitController extends AppTimeLimitController {
         MyAppTimeLimitController(AppTimeLimitController.TimeLimitCallbackListener listener,
                 Looper looper) {
-            super(listener, looper);
+            super(InstrumentationRegistry.getContext(), listener, looper);
+        }
+
+        @Override
+        protected AlarmManager getAlarmManager() {
+            return mMockAlarmManager;
         }
 
         @Override
@@ -146,6 +164,8 @@
         mThread = new HandlerThread("Test");
         mThread.start();
         mController = new MyAppTimeLimitController(mListener, mThread.getLooper());
+
+        MockitoAnnotations.initMocks(this);
     }
 
     @After
@@ -486,9 +506,14 @@
         setTime(6_000L);
         assertTrue(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
         stopUsage(PKG_SOC1);
+        final ArgumentCaptor<AlarmManager.OnAlarmListener> onAlarmListenerArgumentCaptor =
+                ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
+        verify(mMockAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
+                anyString(), onAlarmListenerArgumentCaptor.capture(), any());
         // Usage has stopped, Session should end in a second. Verify session end occurs in a second
         // (+/- 100ms, which is hopefully not too slim a margin)
         assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+        onAlarmListenerArgumentCaptor.getValue().onAlarm();
         assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
         // Verify that the observer was not removed
         assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
@@ -597,9 +622,14 @@
         // Should call back by 11 seconds (6 earlier + 5 now)
         assertTrue(mLimitReachedLatch.await(5_000L, TimeUnit.MILLISECONDS));
         stopUsage(PKG_SOC1);
+        final ArgumentCaptor<AlarmManager.OnAlarmListener> onAlarmListenerArgumentCaptor =
+                ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
+        verify(mMockAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
+                anyString(), onAlarmListenerArgumentCaptor.capture(), any());
         // Usage has stopped, Session should end in a second. Verify session end occurs in a second
         // (+/- 100ms, which is hopefully not too slim a margin)
         assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+        onAlarmListenerArgumentCaptor.getValue().onAlarm();
         assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
         // Verify that the observer was removed
         assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
@@ -849,9 +879,14 @@
         setTime(12_000L);
         assertTrue(mLimitReachedLatch.await(1_000L, TimeUnit.MILLISECONDS));
         stopUsage(PKG_SOC1);
+        final ArgumentCaptor<AlarmManager.OnAlarmListener> onAlarmListenerArgumentCaptor =
+                ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
+        verify(mMockAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
+                anyString(), onAlarmListenerArgumentCaptor.capture(), any());
         // Usage has stopped, Session should end in 2 seconds. Verify session end occurs
         // (+/- 100ms, which is hopefully not too slim a margin)
         assertFalse(mSessionEndLatch.await(1_900L, TimeUnit.MILLISECONDS));
+        onAlarmListenerArgumentCaptor.getValue().onAlarm();
         assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
         // Verify that the observer was not removed
         assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
@@ -882,9 +917,14 @@
         setTime(18_000L);
         assertTrue(mLimitReachedLatch.await(2000L, TimeUnit.MILLISECONDS));
         stopUsage(PKG_SOC1);
+        final ArgumentCaptor<AlarmManager.OnAlarmListener> onAlarmListenerArgumentCaptor =
+                ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
+        verify(mMockAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
+                anyString(), onAlarmListenerArgumentCaptor.capture(), any());
         // Usage has stopped, Session should end in 2 seconds. Verify session end occurs
         // (+/- 100ms, which is hopefully not too slim a margin)
         assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+        onAlarmListenerArgumentCaptor.getValue().onAlarm();
         assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
         // Verify that the observer was not removed
         assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
@@ -903,9 +943,14 @@
         setTime(11_000L);
         assertTrue(mLimitReachedLatch.await(2_000L, TimeUnit.MILLISECONDS));
         stopUsage(PKG_SOC1);
+        final ArgumentCaptor<AlarmManager.OnAlarmListener> onAlarmListenerArgumentCaptor =
+                ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
+        verify(mMockAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
+                anyString(), onAlarmListenerArgumentCaptor.capture(), any());
         // Usage has stopped, Session should end in 1 seconds. Verify session end occurs
         // (+/- 100ms, which is hopefully not too slim a margin)
         assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+        onAlarmListenerArgumentCaptor.getValue().onAlarm();
         assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
 
         // Rearm the countdown latches
@@ -921,7 +966,10 @@
         setTime(31_000L);
         assertTrue(mLimitReachedLatch.await(2_000L, TimeUnit.MILLISECONDS));
         stopUsage(PKG_SOC1);
+        verify(mMockAlarmManager, times(2)).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
+                anyString(), onAlarmListenerArgumentCaptor.capture(), any());
         assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+        onAlarmListenerArgumentCaptor.getValue().onAlarm();
         assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
         assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
     }
diff --git a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java
index 2f5a5cc..11554c7 100644
--- a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java
@@ -16,6 +16,8 @@
 
 package com.android.server.uwb;
 
+import static android.Manifest.permission.UWB_PRIVILEGED;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.fail;
@@ -24,11 +26,13 @@
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doThrow;
 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.AttributionSource;
 import android.content.Context;
 import android.os.IBinder;
 import android.os.PersistableBundle;
@@ -58,6 +62,11 @@
 @SmallTest
 @Presubmit
 public class UwbServiceImplTest {
+    private static final int UID = 343453;
+    private static final String PACKAGE_NAME = "com.uwb.test";
+    private static final AttributionSource ATTRIBUTION_SOURCE =
+            new AttributionSource.Builder(UID).setPackageName(PACKAGE_NAME).build();
+
     @Mock private IUwbAdapter mVendorService;
     @Mock private IBinder mVendorServiceBinder;
     @Mock private Context mContext;
@@ -72,6 +81,7 @@
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
         when(mUwbInjector.getVendorService()).thenReturn(mVendorService);
+        when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(true);
         when(mVendorService.asBinder()).thenReturn(mVendorServiceBinder);
         mUwbServiceImpl = new UwbServiceImpl(mContext, mUwbInjector);
     }
@@ -129,10 +139,11 @@
         final IBinder cbBinder = mock(IBinder.class);
         when(cb.asBinder()).thenReturn(cbBinder);
 
-        mUwbServiceImpl.openRanging(sessionHandle, cb, parameters);
+        mUwbServiceImpl.openRanging(ATTRIBUTION_SOURCE, sessionHandle, cb, parameters);
 
         verify(mVendorService).openRanging(
-                eq(sessionHandle), mRangingCbCaptor.capture(), eq(parameters));
+                eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
+                eq(parameters));
         assertThat(mRangingCbCaptor.getValue()).isNotNull();
     }
 
@@ -182,10 +193,11 @@
         final IBinder cbBinder = mock(IBinder.class);
         when(cb.asBinder()).thenReturn(cbBinder);
 
-        mUwbServiceImpl.openRanging(sessionHandle, cb, parameters);
+        mUwbServiceImpl.openRanging(ATTRIBUTION_SOURCE, sessionHandle, cb, parameters);
 
         verify(mVendorService).openRanging(
-                eq(sessionHandle), mRangingCbCaptor.capture(), eq(parameters));
+                eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
+                eq(parameters));
         assertThat(mRangingCbCaptor.getValue()).isNotNull();
 
         // Invoke vendor service callbacks and ensure that the corresponding app callback is
@@ -242,10 +254,11 @@
         final IBinder cbBinder = mock(IBinder.class);
         when(cb.asBinder()).thenReturn(cbBinder);
 
-        mUwbServiceImpl.openRanging(sessionHandle, cb, parameters);
+        mUwbServiceImpl.openRanging(ATTRIBUTION_SOURCE, sessionHandle, cb, parameters);
 
         verify(mVendorService).openRanging(
-                eq(sessionHandle), mRangingCbCaptor.capture(), eq(parameters));
+                eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
+                eq(parameters));
         assertThat(mRangingCbCaptor.getValue()).isNotNull();
 
         verify(cbBinder).linkToDeath(mClientDeathCaptor.capture(), anyInt());
@@ -275,13 +288,14 @@
         final IBinder cbBinder = mock(IBinder.class);
         when(cb.asBinder()).thenReturn(cbBinder);
 
-        mUwbServiceImpl.openRanging(sessionHandle, cb, parameters);
+        mUwbServiceImpl.openRanging(ATTRIBUTION_SOURCE, sessionHandle, cb, parameters);
 
         verify(mVendorServiceBinder).linkToDeath(mVendorServiceDeathCaptor.capture(), anyInt());
         assertThat(mVendorServiceDeathCaptor.getValue()).isNotNull();
 
         verify(mVendorService).openRanging(
-                eq(sessionHandle), mRangingCbCaptor.capture(), eq(parameters));
+                eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
+                eq(parameters));
         assertThat(mRangingCbCaptor.getValue()).isNotNull();
 
         clearInvocations(cb);
@@ -296,4 +310,56 @@
                 eq(sessionHandle), eq(RangingSession.Callback.REASON_UNKNOWN),
                 argThat((p) -> p.isEmpty()));
     }
+
+    @Test
+    public void testThrowSecurityExceptionWhenCalledWithoutUwbPrivilegedPermission()
+            throws Exception {
+        doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
+                eq(UWB_PRIVILEGED), any());
+        final IUwbAdapterStateCallbacks cb = mock(IUwbAdapterStateCallbacks.class);
+        try {
+            mUwbServiceImpl.registerAdapterStateCallbacks(cb);
+            fail();
+        } catch (SecurityException e) { /* pass */ }
+    }
+
+    @Test
+    public void testThrowSecurityExceptionWhenOpenRangingCalledWithoutUwbRangingPermission()
+            throws Exception {
+        doThrow(new SecurityException()).when(mUwbInjector).enforceUwbRangingPermissionForPreflight(
+                any());
+
+        final SessionHandle sessionHandle = new SessionHandle(5);
+        final IUwbRangingCallbacks cb = mock(IUwbRangingCallbacks.class);
+        final PersistableBundle parameters = new PersistableBundle();
+        final IBinder cbBinder = mock(IBinder.class);
+        when(cb.asBinder()).thenReturn(cbBinder);
+        try {
+            mUwbServiceImpl.openRanging(ATTRIBUTION_SOURCE, sessionHandle, cb, parameters);
+            fail();
+        } catch (SecurityException e) { /* pass */ }
+    }
+
+    @Test
+    public void testOnRangingResultCallbackNotSentWithoutUwbRangingPermission() throws Exception {
+        final SessionHandle sessionHandle = new SessionHandle(5);
+        final IUwbRangingCallbacks cb = mock(IUwbRangingCallbacks.class);
+        final PersistableBundle parameters = new PersistableBundle();
+        final IBinder cbBinder = mock(IBinder.class);
+        when(cb.asBinder()).thenReturn(cbBinder);
+
+        mUwbServiceImpl.openRanging(ATTRIBUTION_SOURCE, sessionHandle, cb, parameters);
+
+        verify(mVendorService).openRanging(
+                eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
+                eq(parameters));
+        assertThat(mRangingCbCaptor.getValue()).isNotNull();
+
+        when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(false);
+
+        // Ensure the ranging cb is not delivered to the client.
+        final RangingReport rangingReport = new RangingReport.Builder().build();
+        mRangingCbCaptor.getValue().onRangingResult(sessionHandle, rangingReport);
+        verify(cb, never()).onRangingResult(sessionHandle, rangingReport);
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java
index 1d715c8..0585758 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java
@@ -156,7 +156,7 @@
                     mMinFrequency, mResonantFrequency, mFrequencyResolution,
                     suggestedFrequencyRange, mMaxAmplitudes);
             return new VibratorInfo(vibratorId, mCapabilities, mSupportedEffects, mSupportedBraking,
-                    mSupportedPrimitives, mQFactor, frequencyMapping);
+                    mSupportedPrimitives, null, mQFactor, frequencyMapping);
         }
 
         private void applyLatency() {
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index b4c1de1..ea2dc0a 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -468,28 +468,33 @@
     @Test
     public void vibrate_withRingtone_usesRingtoneSettings() throws Exception {
         mockVibrators(1);
+        FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
         mVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
-        mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
+        fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
 
         setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0);
         VibratorManagerService service = createSystemReadyService();
-        vibrate(service, VibrationEffect.createOneShot(40, 1), RINGTONE_ATTRS);
+        vibrate(service, VibrationEffect.createOneShot(1, 1), RINGTONE_ATTRS);
+        // Wait before checking it never played.
+        assertFalse(waitUntil(s -> !fakeVibrator.getEffectSegments().isEmpty(),
+                service, /* timeout= */ 50));
 
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 1);
         service = createSystemReadyService();
-        vibrate(service, VibrationEffect.createOneShot(40, 10), RINGTONE_ATTRS);
-        assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
+        vibrate(service, VibrationEffect.createOneShot(1, 10), RINGTONE_ATTRS);
+        assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 1,
+                service, TEST_TIMEOUT_MILLIS));
 
         setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
         setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0);
         service = createSystemReadyService();
-        vibrate(service, VibrationEffect.createOneShot(40, 100), RINGTONE_ATTRS);
-        assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
+        vibrate(service, VibrationEffect.createOneShot(1, 100), RINGTONE_ATTRS);
+        assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 2,
+                service, TEST_TIMEOUT_MILLIS));
 
-        assertEquals(2, mVibratorProviders.get(1).getEffectSegments().size());
         assertEquals(Arrays.asList(10 / 255f, 100 / 255f),
                 mVibratorProviders.get(1).getAmplitudes());
     }
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java
index 8c92a47..0e615a6 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java
@@ -51,8 +51,6 @@
     private InputSensorInfo mMockInputSensorInfo;
     @Mock
     private SensorManager mMockSensorManager;
-    @Mock
-    private WindowManagerService mMockWindowManagerService;
 
     private TestableRotationResolver mFakeRotationResolverInternal;
     private com.android.server.wm.WindowOrientationListener mWindowOrientationListener;
@@ -69,7 +67,7 @@
         mFakeRotationResolverInternal = new TestableRotationResolver();
         doReturn(mMockSensorManager).when(mMockContext).getSystemService(Context.SENSOR_SERVICE);
         mWindowOrientationListener = new TestableWindowOrientationListener(mMockContext,
-                mMockHandler, mMockWindowManagerService);
+                mMockHandler);
         mWindowOrientationListener.mRotationResolverService = mFakeRotationResolverInternal;
 
         mFakeSensor = new Sensor(mMockInputSensorInfo);
@@ -115,9 +113,8 @@
 
     final class TestableWindowOrientationListener extends WindowOrientationListener {
 
-        TestableWindowOrientationListener(Context context, Handler handler,
-                WindowManagerService service) {
-            super(context, handler, service);
+        TestableWindowOrientationListener(Context context, Handler handler) {
+            super(context, handler);
             this.mOrientationJudge = new OrientationSensorJudge();
         }
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
index a2ad89e..a05fea2 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
@@ -144,15 +144,21 @@
     @Test
     public void testRemoveChannelNotifications() {
         List<String> expected = new ArrayList<>();
-        for (int i = 0; i < SIZE; i++) {
+        // Add one extra notification to the beginning to test when 2 adjacent notifications will be
+        // removed in the same pass.
+        StatusBarNotification sbn0 = getNotification("pkg", 0, UserHandle.of(USER_CURRENT));
+        mArchive.record(sbn0, REASON_CANCEL);
+        for (int i = 0; i < SIZE - 1; i++) {
             StatusBarNotification sbn = getNotification("pkg", i, UserHandle.of(USER_CURRENT));
             mArchive.record(sbn, REASON_CANCEL);
-            if (i != 3) {
-                // Will delete notification for this user in channel "test3".
+            if (i != 0 && i != SIZE - 2) {
+                // Will delete notification for this user in channel "test0", and also the last
+                // element in the list.
                 expected.add(sbn.getKey());
             }
         }
-        mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test3");
+        mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test0");
+        mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test" + (SIZE - 2));
         List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
         assertThat(actual).hasSize(expected.size());
         for (StatusBarNotification sbn : actual) {
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 162b2c4..9dffed2 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
@@ -154,7 +154,7 @@
     }
 
     void setUpBubblesEnabled(boolean feature, int app, int channel) {
-        when(mConfig.bubblesEnabled()).thenReturn(feature);
+        when(mConfig.bubblesEnabled(mUser)).thenReturn(feature);
         when(mConfig.getBubblePreference(anyString(), anyInt())).thenReturn(app);
         mChannel.setAllowBubbles(channel);
     }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
index 9433bf2..6a8f602 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
@@ -22,12 +22,15 @@
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.app.Person;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -72,6 +75,7 @@
     private NotificationRecord mRecordMinCallNonInterruptive;
     private NotificationRecord mRecordMinCall;
     private NotificationRecord mRecordHighCall;
+    private NotificationRecord mRecordHighCallStyle;
     private NotificationRecord mRecordEmail;
     private NotificationRecord mRecordInlineReply;
     private NotificationRecord mRecordSms;
@@ -90,9 +94,12 @@
         int userId = UserHandle.myUserId();
 
         when(mContext.getResources()).thenReturn(getContext().getResources());
+        when(mContext.getTheme()).thenReturn(getContext().getTheme());
         when(mContext.getContentResolver()).thenReturn(getContext().getContentResolver());
         when(mContext.getPackageManager()).thenReturn(mPm);
         when(mContext.getSystemService(eq(Context.TELECOM_SERVICE))).thenReturn(mTm);
+        when(mContext.getString(anyInt())).thenCallRealMethod();
+        when(mContext.getColor(anyInt())).thenCallRealMethod();
         when(mTm.getDefaultDialerPackage()).thenReturn(callPkg);
         final ApplicationInfo legacy = new ApplicationInfo();
         legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
@@ -137,6 +144,19 @@
                 new UserHandle(userId), "", 1999), getDefaultChannel());
         mRecordHighCall.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
 
+        Notification nHighCallStyle = new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                .setStyle(Notification.CallStyle.forOngoingCall(
+                        new Person.Builder().setName("caller").build(),
+                        mock(PendingIntent.class)
+                ))
+                .setFlag(Notification.FLAG_FOREGROUND_SERVICE, true)
+                .build();
+        mRecordHighCallStyle = new NotificationRecord(mContext, new StatusBarNotification(callPkg,
+                callPkg, 1, "highCallStyle", callUid, callUid, nHighCallStyle,
+                new UserHandle(userId), "", 2000), getDefaultChannel());
+        mRecordHighCallStyle.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
+        mRecordHighCallStyle.setInterruptive(true);
+
         Notification n4 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
                 .setStyle(new Notification.MessagingStyle("sender!")).build();
         mRecordInlineReply = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
@@ -236,6 +256,7 @@
         final List<NotificationRecord> expected = new ArrayList<>();
         expected.add(mRecordColorizedCall);
         expected.add(mRecordColorized);
+        expected.add(mRecordHighCallStyle);
         expected.add(mRecordHighCall);
         expected.add(mRecordInlineReply);
         if (mRecordSms != null) {
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 a810acc..537bc2c 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -684,10 +684,11 @@
 
     private void setUpPrefsForBubbles(String pkg, int uid, boolean globalEnabled,
             int pkgPref, boolean channelEnabled) {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.NOTIFICATION_BUBBLES, globalEnabled ? 1 : 0);
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.NOTIFICATION_BUBBLES, globalEnabled ? 1 : 0);
         mService.mPreferencesHelper.updateBubblesEnabled();
-        assertEquals(globalEnabled, mService.mPreferencesHelper.bubblesEnabled());
+        assertEquals(globalEnabled, mService.mPreferencesHelper.bubblesEnabled(
+                mock(UserHandle.class)));
         try {
             mBinderService.setBubblesAllowed(pkg, uid, pkgPref);
         } catch (RemoteException e) {
@@ -4729,6 +4730,22 @@
     }
 
     @Test
+    public void testMaybeRecordInterruptionLocked_smallIconsRequiredForHistory()
+            throws RemoteException {
+        final NotificationRecord r = generateNotificationRecord(
+                mTestNotificationChannel, 1, null, true);
+        r.setInterruptive(true);
+        r.getSbn().getNotification().setSmallIcon(null);
+        mService.addNotification(r);
+
+        mService.maybeRecordInterruptionLocked(r);
+
+        verify(mAppUsageStats, times(1)).reportInterruptiveNotification(
+                anyString(), anyString(), anyInt());
+        verify(mHistoryManager, never()).addNotification(any());
+    }
+
+    @Test
     public void testBubble() throws Exception {
         mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_NONE);
         assertFalse(mBinderService.areBubblesAllowed(PKG));
@@ -4764,8 +4781,8 @@
 
     @Test
     public void testAreBubblesEnabled_false() throws Exception {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.NOTIFICATION_BUBBLES, 0);
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.NOTIFICATION_BUBBLES, 0);
         mService.mPreferencesHelper.updateBubblesEnabled();
         assertFalse(mBinderService.areBubblesEnabled(UserHandle.getUserHandleForUid(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 04c144a..1b26352 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -87,7 +87,6 @@
 import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
-import android.os.Process;
 import android.os.RemoteCallback;
 import android.os.RemoteException;
 import android.os.UserHandle;
@@ -110,7 +109,6 @@
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
-import com.android.internal.util.FastXmlSerializer;
 import com.android.server.UiServiceTestCase;
 
 import org.json.JSONArray;
@@ -120,8 +118,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlSerializer;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -202,7 +198,8 @@
         contentResolver.setFallbackToExisting(false);
         Secure.putIntForUser(contentResolver,
                 Secure.NOTIFICATION_BADGING, 1, UserHandle.getUserId(UID_N_MR1));
-        Global.putInt(contentResolver, Global.NOTIFICATION_BUBBLES, 1);
+        Secure.putIntForUser(contentResolver, Secure.NOTIFICATION_BUBBLES, 1,
+                UserHandle.getUserId(UID_N_MR1));
 
         ContentProvider testContentProvider = mock(ContentProvider.class);
         mTestIContentProvider = mock(IContentProvider.class, invocation -> {
@@ -2131,18 +2128,33 @@
 
     @Test
     public void testBubblesOverrideTrue() {
-        Global.putInt(getContext().getContentResolver(),
-                Global.NOTIFICATION_BUBBLES, 1);
+        Secure.putIntForUser(getContext().getContentResolver(),
+                Secure.NOTIFICATION_BUBBLES, 1,
+                USER.getIdentifier());
         mHelper.updateBubblesEnabled(); // would be called by settings observer
-        assertTrue(mHelper.bubblesEnabled());
+        assertTrue(mHelper.bubblesEnabled(USER));
     }
 
     @Test
     public void testBubblesOverrideFalse() {
-        Global.putInt(getContext().getContentResolver(),
-                Global.NOTIFICATION_BUBBLES, 0);
+        Secure.putIntForUser(getContext().getContentResolver(),
+                Secure.NOTIFICATION_BUBBLES, 0,
+                USER.getIdentifier());
         mHelper.updateBubblesEnabled(); // would be called by settings observer
-        assertFalse(mHelper.bubblesEnabled());
+        assertFalse(mHelper.bubblesEnabled(USER));
+    }
+
+    @Test
+    public void testBubblesOverrideUserIsolation() throws Exception {
+        Secure.putIntForUser(getContext().getContentResolver(),
+                Secure.NOTIFICATION_BUBBLES, 0,
+                USER.getIdentifier());
+        Secure.putIntForUser(getContext().getContentResolver(),
+                Secure.NOTIFICATION_BUBBLES, 1,
+                USER2.getIdentifier());
+        mHelper.updateBubblesEnabled(); // would be called by settings observer
+        assertFalse(mHelper.bubblesEnabled(USER));
+        assertTrue(mHelper.bubblesEnabled(USER2));
     }
 
     @Test
diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml
index 0ed037c..04db686 100644
--- a/services/tests/wmtests/AndroidManifest.xml
+++ b/services/tests/wmtests/AndroidManifest.xml
@@ -66,6 +66,18 @@
         <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ResumeWhilePausingActivity"
                   android:resumeWhilePausing="true"/>
         <activity android:name="com.android.server.wm.ActivityLeakTests$DetectLeakActivity" />
+        <!--
+            Simulate the common trampoline task that uses floating/translucent theme to avoid double
+            starting windows and animations of task open.
+        -->
+        <activity android:name="com.android.server.wm.ActivityOptionsTest$TrampolineActivity"
+                  android:taskAffinity="com.android.frameworks.wmtests.trampoline"
+                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
+                  android:turnScreenOn="true"
+                  android:showWhenLocked="true" />
+        <activity android:name="com.android.server.wm.ActivityOptionsTest$MainActivity"
+                  android:turnScreenOn="true"
+                  android:showWhenLocked="true" />
     </application>
 
     <instrumentation
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java b/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
index 8983b4e..b4fbf5f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityOptionsTest.java
@@ -20,17 +20,36 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
 
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
 import static org.junit.Assert.assertEquals;
+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 android.app.Activity;
+import android.app.ActivityManager.RunningTaskInfo;
 import android.app.ActivityOptions;
+import android.app.Instrumentation;
+import android.app.Instrumentation.ActivityMonitor;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
 import android.os.Bundle;
+import android.os.IBinder;
 import android.platform.test.annotations.Presubmit;
+import android.view.SurfaceControl;
+import android.window.TaskOrganizer;
 
 import androidx.test.filters.MediumTest;
 
 import org.junit.Test;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 /**
  * Build/Install/Run:
  *  atest WmTests:ActivityOptionsTest
@@ -70,4 +89,78 @@
         assertTrue(restoredOpts.getTaskOverlay());
         assertTrue(restoredOpts.canTaskOverlayResume());
     }
+
+    @Test
+    public void testTransferLaunchCookie() {
+        final Binder cookie = new Binder();
+        final ActivityOptions options = ActivityOptions.makeBasic();
+        options.setLaunchCookie(cookie);
+        final Instrumentation instrumentation = getInstrumentation();
+        final Context context = instrumentation.getContext();
+        final ComponentName trampoline = new ComponentName(context, TrampolineActivity.class);
+        final ComponentName main = new ComponentName(context, MainActivity.class);
+        final Intent intent = new Intent().setComponent(trampoline)
+                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final ActivityMonitor monitor = new ActivityMonitor(main.getClassName(),
+                null /* result */, false /* block */);
+        instrumentation.addMonitor(monitor);
+        final CountDownLatch mainLatch = new CountDownLatch(1);
+        final IBinder[] appearedCookies = new IBinder[2];
+        final TaskOrganizer organizer = new TaskOrganizer() {
+            @Override
+            public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) {
+                try (SurfaceControl.Transaction t = new SurfaceControl.Transaction()) {
+                    t.setVisibility(leash, true /* visible */).apply();
+                }
+                int cookieIndex = -1;
+                if (trampoline.equals(taskInfo.baseActivity)) {
+                    cookieIndex = 0;
+                } else if (main.equals(taskInfo.baseActivity)) {
+                    cookieIndex = 1;
+                    mainLatch.countDown();
+                }
+                if (cookieIndex >= 0) {
+                    appearedCookies[cookieIndex] = taskInfo.launchCookies.isEmpty()
+                            ? null : taskInfo.launchCookies.get(0);
+                }
+            }
+        };
+        Activity mainActivity = null;
+        try {
+            organizer.registerOrganizer();
+            context.startActivity(intent, options.toBundle());
+            try {
+                mainLatch.await(10, TimeUnit.SECONDS);
+            } catch (InterruptedException ignored) {
+            }
+            mainActivity = monitor.getLastActivity();
+
+            assertNotNull(mainActivity);
+            assertNotEquals(TrampolineActivity.sTaskId, mainActivity.getTaskId());
+            assertNull("Trampoline task must not have cookie", appearedCookies[0]);
+            assertEquals("Main task must get the same cookie", cookie, appearedCookies[1]);
+        } finally {
+            organizer.unregisterOrganizer();
+            instrumentation.removeMonitor(monitor);
+            if (mainActivity != null) {
+                mainActivity.finish();
+            }
+        }
+    }
+
+    public static class TrampolineActivity extends Activity {
+        static int sTaskId;
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            sTaskId = getTaskId();
+            startActivity(new Intent(this, MainActivity.class)
+                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+            finish();
+        }
+    }
+
+    public static class MainActivity extends Activity {
+    }
 }
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 8cede6d..bd143f8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -387,6 +387,27 @@
     }
 
     @Test
+    public void testRelaunchClearTopWaitingTranslucent() {
+        final ActivityRecord activity = createActivityWithTask();
+        final Task task = activity.getTask();
+        activity.setState(Task.ActivityState.RESUMED, "Testing");
+
+        task.onRequestedOverrideConfigurationChanged(task.getConfiguration());
+        activity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(),
+                activity.getConfiguration()));
+
+        activity.info.configChanges &= ~CONFIG_ORIENTATION;
+        final Configuration newConfig = new Configuration(task.getConfiguration());
+        newConfig.orientation = newConfig.orientation == ORIENTATION_PORTRAIT
+                ? ORIENTATION_LANDSCAPE
+                : ORIENTATION_PORTRAIT;
+        task.onRequestedOverrideConfigurationChanged(newConfig);
+        task.mTranslucentActivityWaiting = activity;
+        ensureActivityConfiguration(activity);
+        assertNull(task.mTranslucentActivityWaiting);
+    }
+
+    @Test
     public void testSetsRelaunchReason_NonResizeConfigChanges() {
         final ActivityRecord activity = createActivityWithTask();
         final Task task = activity.getTask();
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 37bc23e..e6ac52d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -339,8 +339,8 @@
             // Direct starter to use spy stack.
             doReturn(stack).when(mRootWindowContainer)
                     .getLaunchRootTask(any(), any(), any(), anyBoolean());
-            doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(),
-                    anyBoolean(), any(), anyInt(), anyInt());
+            doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(), any(),
+                    anyBoolean(), any(), anyInt(), anyInt(), anyInt());
         }
 
         // Set up mock package manager internal and make sure no unmocked methods are called
@@ -1119,8 +1119,8 @@
 
         stack.addChild(targetRecord);
 
-        doReturn(stack).when(mRootWindowContainer)
-                .getLaunchRootTask(any(), any(), any(), anyBoolean(), any(), anyInt(), anyInt());
+        doReturn(stack).when(mRootWindowContainer).getLaunchRootTask(any(), any(), any(), any(),
+                anyBoolean(), any(), anyInt(), anyInt(), anyInt());
 
         starter.mStartActivity = new ActivityBuilder(mAtm).build();
 
@@ -1142,4 +1142,38 @@
         verify(targetRecord).makeVisibleIfNeeded(null, true);
         assertTrue(targetRecord.mVisibleRequested);
     }
+
+    @Test
+    public void testLaunchCookie_newAndExistingTask() {
+        final ActivityStarter starter = prepareStarter(0, false);
+
+        // Put an activity on default display as the top focused activity.
+        ActivityRecord r = new ActivityBuilder(mAtm).setCreateTask(true).build();
+
+        // Start an activity with a launch cookie
+        final Binder cookie = new Binder();
+        final ActivityOptions options = ActivityOptions.makeBasic();
+        options.setLaunchCookie(cookie);
+        final Intent intent = new Intent();
+        intent.setComponent(ActivityBuilder.getDefaultComponent());
+        starter.setReason("testLaunchCookie_newTask")
+                .setIntent(intent)
+                .setActivityOptions(options.toBundle())
+                .execute();
+
+        // Verify the cookie is set
+        assertTrue(mRootWindowContainer.topRunningActivity().mLaunchCookie == cookie);
+
+        // Relaunch the activity to bring the task forward
+        final Binder newCookie = new Binder();
+        final ActivityOptions newOptions = ActivityOptions.makeBasic();
+        newOptions.setLaunchCookie(newCookie);
+        starter.setReason("testLaunchCookie_existingTask")
+                .setIntent(intent)
+                .setActivityOptions(newOptions.toBundle())
+                .execute();
+
+        // Verify the cookie is updated
+        assertTrue(mRootWindowContainer.topRunningActivity().mLaunchCookie == newCookie);
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
index 7df17fd..31d4612 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java
@@ -586,10 +586,13 @@
                         .setTaskDisplayAreas(Lists.newArrayList(mTda2)))
                 .build(mWms);
 
-        final WindowToken token = new WindowToken(mWms, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                false /* fromClientToken */, null /* options */);
+        final WindowToken token = new WindowToken.Builder(mWms, mock(IBinder.class),
+                TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .build();
+
         policy.addWindow(token);
 
         // By default, window are always added to the root.
@@ -600,10 +603,13 @@
         // When the window has options for target root id, attach it to the target root.
         final Bundle options = new Bundle();
         options.putInt(KEY_ROOT_DISPLAY_AREA_ID, mGroupRoot2.mFeatureId);
-        final WindowToken token2 = new WindowToken(mWms, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                false /* fromClientToken */, options);
+        final WindowToken token2 = new WindowToken.Builder(mWms, mock(IBinder.class),
+                TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .setOptions(options)
+                .build();
         policy.addWindow(token2);
 
         assertThat(token2.isDescendantOf(mGroupRoot2)).isTrue();
@@ -631,14 +637,18 @@
                 })
                 .build(mWms);
 
-        final WindowToken token1 = new WindowToken(mWms, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                false /* fromClientToken */, null /* options */);
-        final WindowToken token2 = new WindowToken(mWms, mock(IBinder.class),
-                TYPE_WALLPAPER, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                false /* fromClientToken */, null /* options */);
+        final WindowToken token1 = new WindowToken.Builder(mWms, mock(IBinder.class),
+                TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .build();
+        final WindowToken token2 = new WindowToken.Builder(mWms, mock(IBinder.class),
+                TYPE_WALLPAPER)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .build();
         policy.addWindow(token1);
         policy.addWindow(token2);
 
@@ -682,18 +692,26 @@
         options1.putInt("HIERARCHY_ROOT_ID", mGroupRoot1.mFeatureId);
         final Bundle options2 = new Bundle();
         options2.putInt("HIERARCHY_ROOT_ID", mGroupRoot2.mFeatureId);
-        final WindowToken token0 = new WindowToken(mWms, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                false /* fromClientToken */, null /* options */);
-        final WindowToken token1 = new WindowToken(mWms, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                false /* fromClientToken */, options1);
-        final WindowToken token2 = new WindowToken(mWms, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, false /* roundedCornerOverlay */,
-                false /* fromClientToken */, options2);
+        final WindowToken token0 = new WindowToken.Builder(mWms, mock(IBinder.class),
+                TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .build();
+        final WindowToken token1 = new WindowToken.Builder(mWms, mock(IBinder.class),
+                TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .setOptions(options1)
+                .build();
+        final WindowToken token2 = new WindowToken.Builder(mWms, mock(IBinder.class),
+                TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .setOptions(options2)
+                .build();
 
         policy.addWindow(token0);
         policy.addWindow(token1);
@@ -787,9 +805,8 @@
     }
 
     private WindowToken tokenOfType(int type) {
-        WindowToken token = new WindowToken(mWms, new Binder(), type, false /* persistOnEmpty */,
-                mDisplayContent, false /* ownerCanManageAppTokens */);
-        return token;
+        return new WindowToken.Builder(mWms, new Binder(), type)
+                .setDisplayContent(mDisplayContent).build();
     }
 
     private static void assertMatchLayerOrder(List<DisplayArea<?>> actualOrder,
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java
index 2a55083..147a44f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java
@@ -28,6 +28,7 @@
 
 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.Mockito.mock;
 
@@ -48,6 +49,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Tests for the {@link DisplayAreaPolicy}.
@@ -183,6 +185,43 @@
                 taskDisplayArea5, taskDisplayArea1);
     }
 
+    @Test
+    public void testTaskDisplayAreasCanHostHomeTask() {
+        final WindowManagerService wms = mWm;
+        final DisplayContent displayContent = mock(DisplayContent.class);
+        doReturn(true).when(displayContent).isTrusted();
+        doReturn(true).when(displayContent).supportsSystemDecorations();
+        final RootDisplayArea root = new SurfacelessDisplayAreaRoot(wms);
+        final TaskDisplayArea taskDisplayAreaWithHome = new TaskDisplayArea(displayContent, wms,
+                "Tasks1", FEATURE_DEFAULT_TASK_CONTAINER);
+        final TaskDisplayArea taskDisplayAreaWithNoHome = new TaskDisplayArea(displayContent, wms,
+                "Tasks2", FEATURE_VENDOR_FIRST + 1, false, false);
+        final DisplayArea.Tokens ime = new DisplayArea.Tokens(wms, ABOVE_TASKS, "Ime");
+        final DisplayAreaPolicy policy = new DisplayAreaPolicyBuilder()
+                .setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(root)
+                        .setImeContainer(ime)
+                        .setTaskDisplayAreas(Lists.newArrayList(taskDisplayAreaWithHome,
+                                taskDisplayAreaWithNoHome))
+                )
+                .build(wms);
+        assertTaskDisplayAreaPresentAndCanHaveHome(policy, FEATURE_DEFAULT_TASK_CONTAINER, true);
+        assertTaskDisplayAreaPresentAndCanHaveHome(policy, FEATURE_VENDOR_FIRST + 1, false);
+        final Task stackHome = taskDisplayAreaWithHome.getOrCreateRootHomeTask(true);
+        final Task stackNoHome = taskDisplayAreaWithNoHome.getOrCreateRootHomeTask(true);
+        assertNotNull(stackHome);
+        assertNull(stackNoHome);
+    }
+
+    private void assertTaskDisplayAreaPresentAndCanHaveHome(DisplayAreaPolicy policy,
+                                                            int featureId,
+                                                            boolean canHaveHome) {
+        Optional<DisplayArea> optionalDisplayArea = policy.mRoot.mChildren
+                .stream().filter(displayArea -> displayArea.mFeatureId == featureId)
+                .findAny();
+        assertTrue(optionalDisplayArea.isPresent());
+        assertEquals(canHaveHome, optionalDisplayArea.get().asTaskDisplayArea().canHostHomeTask());
+    }
+
     private void assertTaskDisplayAreasOrder(DisplayAreaPolicy policy,
             TaskDisplayArea... expectTdaOrder) {
         List<TaskDisplayArea> expectOrder = new ArrayList<>();
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
index d4c956d..d5628fc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java
@@ -586,8 +586,6 @@
     }
 
     private WindowToken createWindowToken(int type) {
-        return new WindowToken(mWm, new Binder(),
-                type, false /* persist */, null /* displayContent */,
-                false /* canManageTokens */);
+        return new WindowToken.Builder(mWm, new Binder(), type).build();
     }
 }
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 2f52352..e1eef76 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -1244,7 +1244,6 @@
         final DisplayContent displayContent = createNewDisplay();
         Mockito.doReturn(mockLogger).when(displayContent).getMetricsLogger();
         Mockito.doReturn(oldConfig).doReturn(newConfig).when(displayContent).getConfiguration();
-        doNothing().when(displayContent).preOnConfigurationChanged();
 
         displayContent.onConfigurationChanged(newConfig);
 
@@ -1292,7 +1291,8 @@
         assertNull(displayContent.getFadeRotationAnimationController());
     }
 
-    @UseTestDisplay(addWindows = { W_ACTIVITY, W_WALLPAPER, W_STATUS_BAR, W_NAVIGATION_BAR })
+    @UseTestDisplay(addWindows = { W_ACTIVITY, W_WALLPAPER, W_STATUS_BAR, W_NAVIGATION_BAR,
+            W_NOTIFICATION_SHADE })
     @Test
     public void testApplyTopFixedRotationTransform() {
         final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
@@ -1300,6 +1300,7 @@
         doReturn(false).when(displayPolicy).navigationBarCanMove();
         displayPolicy.addWindowLw(mStatusBarWindow, mStatusBarWindow.mAttrs);
         displayPolicy.addWindowLw(mNavBarWindow, mNavBarWindow.mAttrs);
+        displayPolicy.addWindowLw(mNotificationShadeWindow, mNotificationShadeWindow.mAttrs);
         makeWindowVisible(mStatusBarWindow, mNavBarWindow);
         final Configuration config90 = new Configuration();
         mDisplayContent.computeScreenConfiguration(config90, ROTATION_90);
@@ -1319,15 +1320,17 @@
         app.setRequestedOrientation(newOrientation);
 
         assertTrue(app.isFixedRotationTransforming());
+        assertTrue(mAppWindow.matchesDisplayAreaBounds());
+        assertFalse(mAppWindow.isLetterboxedAppWindow());
         assertTrue(mDisplayContent.getDisplayRotation().shouldRotateSeamlessly(
                 ROTATION_0 /* oldRotation */, ROTATION_90 /* newRotation */,
                 false /* forceUpdate */));
 
         assertNotNull(mDisplayContent.getFadeRotationAnimationController());
-        assertTrue(mStatusBarWindow.getParent().isAnimating(WindowContainer.AnimationFlags.PARENTS,
-                ANIMATION_TYPE_FIXED_TRANSFORM));
-        assertTrue(mNavBarWindow.getParent().isAnimating(WindowContainer.AnimationFlags.PARENTS,
-                ANIMATION_TYPE_FIXED_TRANSFORM));
+        assertTrue(mStatusBarWindow.isAnimating(PARENTS, ANIMATION_TYPE_FIXED_TRANSFORM));
+        assertTrue(mNavBarWindow.isAnimating(PARENTS, ANIMATION_TYPE_FIXED_TRANSFORM));
+        // Notification shade may have its own view animation in real case so do not fade out it.
+        assertFalse(mNotificationShadeWindow.isAnimating(PARENTS, ANIMATION_TYPE_FIXED_TRANSFORM));
 
         // If the visibility of insets state is changed, the rotated state should be updated too.
         final InsetsState rotatedState = app.getFixedRotationTransformInsetsState();
@@ -1456,54 +1459,51 @@
     public void testFixedRotationWithPip() {
         final DisplayContent displayContent = mDefaultDisplay;
         unblockDisplayRotation(displayContent);
+        // Unblock the condition in PinnedTaskController#continueOrientationChangeIfNeeded.
+        doNothing().when(displayContent).prepareAppTransition(anyInt());
         // Make resume-top really update the activity state.
-        setBooted(mWm.mAtmService);
-        // Speed up the test by a few seconds.
-        mWm.mAtmService.deferWindowLayout();
-        doNothing().when(mWm).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt());
-
-        final Configuration displayConfig = displayContent.getConfiguration();
-        final ActivityRecord pinnedActivity = createActivityRecord(displayContent,
-                WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD);
-        final Task pinnedTask = pinnedActivity.getRootTask();
-        final ActivityRecord homeActivity = createActivityRecord(displayContent);
-        if (displayConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
-            homeActivity.setOrientation(SCREEN_ORIENTATION_PORTRAIT);
-            pinnedActivity.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
-        } else {
-            homeActivity.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
-            pinnedActivity.setOrientation(SCREEN_ORIENTATION_PORTRAIT);
-        }
-        final int homeConfigOrientation = homeActivity.getRequestedConfigurationOrientation();
-        final int pinnedConfigOrientation = pinnedActivity.getRequestedConfigurationOrientation();
-
-        assertEquals(homeConfigOrientation, displayConfig.orientation);
-
+        setBooted(mAtm);
         clearInvocations(mWm);
+        // Speed up the test by a few seconds.
+        mAtm.deferWindowLayout();
+
+        final ActivityRecord homeActivity = createActivityRecord(
+                displayContent.getDefaultTaskDisplayArea().getRootHomeTask());
+        final ActivityRecord pinnedActivity = new ActivityBuilder(mAtm).setCreateTask(true).build();
+        final Task pinnedTask = pinnedActivity.getRootTask();
+        doReturn((displayContent.getRotation() + 1) % 4).when(displayContent)
+                .rotationForActivityInDifferentOrientation(eq(homeActivity));
+        // Enter PiP from fullscreen.
+        pinnedTask.setWindowingMode(WINDOWING_MODE_PINNED);
+
+        assertTrue(displayContent.hasTopFixedRotationLaunchingApp());
+        assertTrue(displayContent.mPinnedTaskController.shouldDeferOrientationChange());
+        verify(mWm, never()).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt());
+        clearInvocations(pinnedTask);
+
+        // Assume that the PiP enter animation is done then the new bounds are set. Expect the
+        // orientation update is no longer deferred.
+        displayContent.mPinnedTaskController.setEnterPipBounds(pinnedTask.getBounds());
+        // The Task Configuration was frozen to skip the change of orientation.
+        verify(pinnedTask, never()).onConfigurationChanged(any());
+        assertFalse(displayContent.mPinnedTaskController.shouldDeferOrientationChange());
+        assertFalse(displayContent.hasTopFixedRotationLaunchingApp());
+        assertEquals(homeActivity.getConfiguration().orientation,
+                displayContent.getConfiguration().orientation);
+
+        doReturn((displayContent.getRotation() + 1) % 4).when(displayContent)
+                .rotationForActivityInDifferentOrientation(eq(pinnedActivity));
         // Leave PiP to fullscreen. Simulate the step of PipTaskOrganizer that sets the activity
         // to fullscreen, so fixed rotation will apply on it.
         pinnedActivity.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
-        homeActivity.setState(Task.ActivityState.STOPPED, "test");
-
         assertTrue(displayContent.hasTopFixedRotationLaunchingApp());
-        verify(mWm, never()).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt());
-        assertNotEquals(pinnedConfigOrientation, displayConfig.orientation);
 
         // Assume the animation of PipTaskOrganizer is done and then commit fullscreen to task.
         pinnedTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
         displayContent.continueUpdateOrientationForDiffOrienLaunchingApp();
-        assertFalse(displayContent.getPinnedTaskController().isPipActiveOrWindowingModeChanging());
-        assertEquals(pinnedConfigOrientation, displayConfig.orientation);
-
-        clearInvocations(mWm);
-        // Enter PiP from fullscreen. The orientation can be updated from
-        // ensure-visibility/resume-focused-stack -> ActivityRecord#makeActiveIfNeeded -> resume.
-        pinnedTask.setWindowingMode(WINDOWING_MODE_PINNED);
-
-        assertFalse(displayContent.hasTopFixedRotationLaunchingApp());
-        verify(mWm, atLeastOnce()).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt());
-        assertEquals(homeConfigOrientation, displayConfig.orientation);
-        assertTrue(displayContent.getPinnedTaskController().isPipActiveOrWindowingModeChanging());
+        assertFalse(displayContent.mPinnedTaskController.isFreezingTaskConfig(pinnedTask));
+        assertEquals(pinnedActivity.getConfiguration().orientation,
+                displayContent.getConfiguration().orientation);
     }
 
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
index c163ef1..2ca7853 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
@@ -156,6 +156,7 @@
                 opaque, dimmingNonImTarget, imeNonDrawNavBar, NAV_BAR_BOTTOM));
     }
 
+    @UseTestDisplay(addWindows = { W_NAVIGATION_BAR })
     @Test
     public void testUpdateLightNavigationBarLw() {
         DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
@@ -167,7 +168,19 @@
         final WindowState imeDrawDarkNavBar = createInputMethodWindow(true, true, false);
         final WindowState imeDrawLightNavBar = createInputMethodWindow(true, true, true);
 
-        assertEquals(APPEARANCE_LIGHT_NAVIGATION_BARS,
+        mDisplayContent.setLayoutNeeded();
+        mDisplayContent.performLayout(true /* initial */, false /* updateImeWindows */);
+
+        final InsetsSource navSource = new InsetsSource(ITYPE_NAVIGATION_BAR);
+        navSource.setFrame(mNavBarWindow.getFrame());
+        opaqueDarkNavBar.mAboveInsetsState.addSource(navSource);
+        opaqueLightNavBar.mAboveInsetsState.addSource(navSource);
+        dimming.mAboveInsetsState.addSource(navSource);
+        imeDrawDarkNavBar.mAboveInsetsState.addSource(navSource);
+        imeDrawLightNavBar.mAboveInsetsState.addSource(navSource);
+
+        // If there is no window, APPEARANCE_LIGHT_NAVIGATION_BARS is not allowed.
+        assertEquals(0,
                 displayPolicy.updateLightNavigationBarLw(
                         APPEARANCE_LIGHT_NAVIGATION_BARS, null, null,
                         null, null));
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
index 2321a73..e1aca55 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java
@@ -121,8 +121,6 @@
         sMockWm = mock(WindowManagerService.class);
         sMockWm.mPowerManagerInternal = mock(PowerManagerInternal.class);
         sMockWm.mPolicy = mock(WindowManagerPolicy.class);
-        sMockWm.mConstants = mock(WindowManagerConstants.class);
-        sMockWm.mConstants.mRawSensorLoggingEnabled = true;
     }
 
     @AfterClass
diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
index e9907c1..2c3f52e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
@@ -91,7 +91,7 @@
         doReturn(policyProvider).when(mWm).getDisplayAreaPolicyProvider();
 
         // Display: 1920x1200 (landscape). First and second display are both 860x1200 (portrait).
-        mDisplay = (DualDisplayContent) new DualDisplayContent.Builder(mAtm, 1920, 1200).build();
+        mDisplay = new DualDisplayContent.Builder(mAtm, 1920, 1200).build();
         mFirstRoot = mDisplay.mFirstRoot;
         mSecondRoot = mDisplay.mSecondRoot;
         mFirstTda = mDisplay.getTaskDisplayArea(FEATURE_FIRST_TASK_CONTAINER);
@@ -390,12 +390,12 @@
     }
 
     private WindowToken tokenOfType(int type) {
-        return new WindowToken(mWm, new Binder(), type, false /* persistOnEmpty */,
-                mDisplay, false /* ownerCanManageAppTokens */);
+        return new WindowToken.Builder(mWm, new Binder(), type)
+                .setDisplayContent(mDisplay).build();
     }
 
     /** Display with two {@link DisplayAreaGroup}. Each of them take half of the screen. */
-    private static class DualDisplayContent extends TestDisplayContent {
+    static class DualDisplayContent extends TestDisplayContent {
         final DisplayAreaGroup mFirstRoot;
         final DisplayAreaGroup mSecondRoot;
         final Rect mLastDisplayBounds;
@@ -476,11 +476,15 @@
             TestDisplayContent createInternal(Display display) {
                 return new DualDisplayContent(mService.mRootWindowContainer, display);
             }
+
+            DualDisplayContent build() {
+                return (DualDisplayContent) super.build();
+            }
         }
     }
 
     /** Policy to create a dual {@link DisplayAreaGroup} policy in test. */
-    private static class DualDisplayTestPolicyProvider implements DisplayAreaPolicy.Provider {
+    static class DualDisplayTestPolicyProvider implements DisplayAreaPolicy.Provider {
 
         @Override
         public DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content,
diff --git a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
index 1b9308d..f2418c6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
@@ -47,6 +47,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mockito;
 
 // TODO(b/157888351): Move the test to inputmethod package once we find the way to test the
 //  scenario there.
@@ -59,10 +60,15 @@
 public class InputMethodMenuControllerTest extends WindowTestsBase {
 
     private InputMethodMenuController mController;
-    private TestDisplayContent mSecondaryDisplay;
+    private DualDisplayAreaGroupPolicyTest.DualDisplayContent mSecondaryDisplay;
 
     @Before
     public void setUp() throws Exception {
+        // Let the Display to be created with the DualDisplay policy.
+        final DisplayAreaPolicy.Provider policyProvider =
+                new DualDisplayAreaGroupPolicyTest.DualDisplayTestPolicyProvider();
+        Mockito.doReturn(policyProvider).when(mWm).getDisplayAreaPolicyProvider();
+
         mController = new InputMethodMenuController(mock(InputMethodManagerService.class));
 
         // Mock addWindowTokenWithOptions to create a test window token.
@@ -80,7 +86,8 @@
         }).when(wms).attachWindowContextToDisplayArea(any(), eq(TYPE_INPUT_METHOD_DIALOG),
                 anyInt(), any());
 
-        mSecondaryDisplay = new TestDisplayContent.Builder(mAtm, 1000, 1000).build();
+        mSecondaryDisplay = new DualDisplayAreaGroupPolicyTest.DualDisplayContent
+                .Builder(mAtm, 1000, 1000).build();
 
         // Mock DisplayManagerGlobal to return test display when obtaining Display instance.
         final int displayId = mSecondaryDisplay.getDisplayId();
@@ -105,6 +112,22 @@
         assertImeSwitchContextMetricsValidity(contextOnSecondaryDisplay, mSecondaryDisplay);
     }
 
+    @Test
+    public void testGetSettingsContextOnDualDisplayContent() {
+        final Context context = mController.getSettingsContext(mSecondaryDisplay.getDisplayId());
+
+        final DisplayArea.Tokens imeContainer = mSecondaryDisplay.getImeContainer();
+        assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay);
+
+        mSecondaryDisplay.mFirstRoot.placeImeContainer(imeContainer);
+        assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay.mFirstRoot);
+        assertImeSwitchContextMetricsValidity(context, mSecondaryDisplay);
+
+        mSecondaryDisplay.mSecondRoot.placeImeContainer(imeContainer);
+        assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay.mSecondRoot);
+        assertImeSwitchContextMetricsValidity(context, mSecondaryDisplay);
+    }
+
     private void assertImeSwitchContextMetricsValidity(Context context, DisplayContent dc) {
         assertThat(context.getDisplayId()).isEqualTo(dc.getDisplayId());
 
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 ee01b7f..647a898 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxTest.java
@@ -66,12 +66,6 @@
         mTransaction = spy(StubTransaction.class);
     }
 
-    @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)));
-    }
-
     private static final int TOP_BAR = 0x1;
     private static final int BOTTOM_BAR = 0x2;
     private static final int LEFT_BAR = 0x4;
@@ -227,15 +221,6 @@
     }
 
     @Test
-    public void testIsOverlappingWith_cornersRounded_doesNotCheckSurfaceBehind() {
-        mAreCornersRounded = true;
-        mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(0, 0));
-        mLetterbox.applySurfaceChanges(mTransaction);
-
-        assertFalse(mLetterbox.isOverlappingWith(new Rect(1, 2, 9, 9)));
-    }
-
-    @Test
     public void testNotIntersectsOrFullyContains_cornersRounded_doesNotCheckSurfaceBehind() {
         mAreCornersRounded = true;
         mLetterbox.layout(new Rect(0, 0, 10, 10), new Rect(0, 1, 10, 10), new Point(0, 0));
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
index 73404eb..95b5afc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -1418,12 +1418,10 @@
         public boolean mLastAllowed;
 
         @Override
-        void getTasks(int maxNum, List<RunningTaskInfo> list, boolean filterOnlyVisibleRecents,
-                RootWindowContainer root, int callingUid, boolean allowed, boolean crossUser,
-                ArraySet<Integer> profileIds) {
-            mLastAllowed = allowed;
-            super.getTasks(maxNum, list, filterOnlyVisibleRecents, root, callingUid, allowed,
-                    crossUser, profileIds);
+        void getTasks(int maxNum, List<RunningTaskInfo> list, int flags,
+                RootWindowContainer root, int callingUid, ArraySet<Integer> profileIds) {
+            mLastAllowed = (flags & FLAG_ALLOWED) == FLAG_ALLOWED;
+            super.getTasks(maxNum, list, flags, root, callingUid, profileIds);
         }
     }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index 37da529..b6cfa8e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -177,7 +177,7 @@
                 mFinishedCallback);
         mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
 
-        mClock.fastForward(2500);
+        mClock.fastForward(10500);
         mHandler.timeAdvance();
 
         verify(mMockRunner).onAnimationCancelled();
@@ -198,12 +198,12 @@
                     mFinishedCallback);
             mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
 
-            mClock.fastForward(2500);
+            mClock.fastForward(10500);
             mHandler.timeAdvance();
 
             verify(mMockRunner, never()).onAnimationCancelled();
 
-            mClock.fastForward(10000);
+            mClock.fastForward(52500);
             mHandler.timeAdvance();
 
             verify(mMockRunner).onAnimationCancelled();
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 0bf237d..4f5511b5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -980,7 +980,8 @@
         doReturn(true).when(mSupervisor).canPlaceEntityOnDisplay(secondaryDisplay.mDisplayId,
                 300 /* test realCallerPid */, 300 /* test realCallerUid */, r.info);
         final Task result = mRootWindowContainer.getLaunchRootTask(r, options,
-                null /* task */, true /* onTop */, null, 300 /* test realCallerPid */,
+                null /* task */, null /* sourceTask */, true /* onTop */, null /* launchParams */,
+                0 /* launchFlags */, 300 /* test realCallerPid */,
                 300 /* test realCallerUid */);
 
         // Assert that the root task is returned as expected.
diff --git a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java
index e2be39b..c44c22f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java
@@ -16,9 +16,14 @@
 
 package com.android.server.wm;
 
+import static com.android.server.wm.RunningTasks.FLAG_ALLOWED;
+import static com.android.server.wm.RunningTasks.FLAG_CROSS_USERS;
+import static com.android.server.wm.RunningTasks.FLAG_KEEP_INTENT_EXTRA;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import android.app.ActivityManager.RunningTaskInfo;
@@ -83,8 +88,8 @@
         // collected from all tasks across all the stacks
         final int numFetchTasks = 5;
         ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
-        mRunningTasks.getTasks(5, tasks, false /* filterOnlyVisibleRecents */, mRootWindowContainer,
-                -1 /* callingUid */, true /* allowed */, true /*crossUser */, PROFILE_IDS);
+        mRunningTasks.getTasks(5, tasks, FLAG_ALLOWED | FLAG_CROSS_USERS, mRootWindowContainer,
+                -1 /* callingUid */, PROFILE_IDS);
         assertThat(tasks).hasSize(numFetchTasks);
         for (int i = 0; i < numFetchTasks; i++) {
             assertEquals(numTasks - i - 1, tasks.get(i).id);
@@ -93,9 +98,8 @@
         // Ensure that requesting more than the total number of tasks only returns the subset
         // and does not crash
         tasks.clear();
-        mRunningTasks.getTasks(100, tasks, false /* filterOnlyVisibleRecents */,
-                mRootWindowContainer, -1 /* callingUid */, true /* allowed */, true /* crossUser */,
-                PROFILE_IDS);
+        mRunningTasks.getTasks(100, tasks, FLAG_ALLOWED | FLAG_CROSS_USERS,
+                mRootWindowContainer, -1 /* callingUid */, PROFILE_IDS);
         assertThat(tasks).hasSize(numTasks);
         for (int i = 0; i < numTasks; i++) {
             assertEquals(numTasks - i - 1, tasks.get(i).id);
@@ -103,7 +107,7 @@
     }
 
     @Test
-    public void testTaskInfo_expectNoExtras() {
+    public void testTaskInfo_expectNoExtrasByDefault() {
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2500).build();
         final int numTasks = 10;
         for (int i = 0; i < numTasks; i++) {
@@ -118,9 +122,8 @@
 
         final int numFetchTasks = 5;
         final ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
-        mRunningTasks.getTasks(numFetchTasks, tasks, false /* filterOnlyVisibleRecents */,
-                mRootWindowContainer, -1 /* callingUid */, true /* allowed */, true /*crossUser */,
-                PROFILE_IDS);
+        mRunningTasks.getTasks(numFetchTasks, tasks, FLAG_ALLOWED | FLAG_CROSS_USERS,
+                mRootWindowContainer, -1 /* callingUid */, PROFILE_IDS);
         assertThat(tasks).hasSize(numFetchTasks);
         for (int i = 0; i < tasks.size(); i++) {
             final Bundle extras = tasks.get(i).baseIntent.getExtras();
@@ -128,6 +131,32 @@
         }
     }
 
+    @Test
+    public void testTaskInfo_expectExtrasWithKeepExtraFlag() {
+        final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2500).build();
+        final int numTasks = 10;
+        for (int i = 0; i < numTasks; i++) {
+            final Task stack = new TaskBuilder(mSupervisor)
+                    .setDisplay(display)
+                    .setOnTop(true)
+                    .build();
+            final Bundle data = new Bundle();
+            data.putInt("key", 100);
+            createTask(stack, ".Task" + i, i, i, data);
+        }
+
+        final int numFetchTasks = 5;
+        final ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
+        mRunningTasks.getTasks(numFetchTasks, tasks,
+                FLAG_ALLOWED | FLAG_CROSS_USERS | FLAG_KEEP_INTENT_EXTRA, mRootWindowContainer,
+                -1 /* callingUid */, PROFILE_IDS);
+        assertThat(tasks).hasSize(numFetchTasks);
+        for (int i = 0; i < tasks.size(); i++) {
+            final Bundle extras = tasks.get(i).baseIntent.getExtras();
+            assertNotNull(extras);
+            assertEquals(100, extras.getInt("key"));
+        }
+    }
 
     /**
      * Create a task with a single activity in it, with the given last active time.
@@ -145,6 +174,7 @@
                 .setComponent(new ComponentName(mContext.getPackageName(), ".TaskActivity"))
                 .setIntentExtras(extras)
                 .build();
+        task.intent = activity.intent;
         return task;
     }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index 95b7443..221c8b9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -60,6 +60,7 @@
 import android.compat.testing.PlatformCompatChangeRule;
 import android.content.ComponentName;
 import android.content.pm.ActivityInfo;
+import android.content.pm.ActivityInfo.ScreenOrientation;
 import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.platform.test.annotations.Presubmit;
@@ -67,6 +68,7 @@
 
 import androidx.test.filters.MediumTest;
 
+import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
 import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
 
 import org.junit.Rule;
@@ -662,15 +664,8 @@
         mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
 
         // Create an activity on the same task.
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setTask(mTask)
-                .setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE)
-                .setSupportsSizeChanges(true)
-                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
-                .setComponent(ComponentName.createRelative(mContext,
-                        SizeCompatTests.class.getName()))
-                .setUid(android.os.Process.myUid())
-                .build();
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */true,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         assertFalse(activity.shouldCreateCompatDisplayInsets());
     }
 
@@ -682,15 +677,8 @@
         mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
 
         // Create an activity on the same task.
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setTask(mTask)
-                .setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE)
-                .setSupportsSizeChanges(false)
-                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
-                .setComponent(ComponentName.createRelative(mContext,
-                        SizeCompatTests.class.getName()))
-                .setUid(android.os.Process.myUid())
-                .build();
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         assertTrue(activity.shouldCreateCompatDisplayInsets());
     }
 
@@ -702,15 +690,8 @@
         mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
 
         // Create an activity on the same task.
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setTask(mTask)
-                .setResizeMode(ActivityInfo.RESIZE_MODE_RESIZEABLE)
-                .setSupportsSizeChanges(false)
-                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
-                .setComponent(ComponentName.createRelative(mContext,
-                        SizeCompatTests.class.getName()))
-                .setUid(android.os.Process.myUid())
-                .build();
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_RESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         assertFalse(activity.shouldCreateCompatDisplayInsets());
     }
 
@@ -723,15 +704,8 @@
         mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
 
         // Create an activity on the same task.
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setTask(mTask)
-                .setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE)
-                .setSupportsSizeChanges(false)
-                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
-                .setComponent(ComponentName.createRelative(mContext,
-                        SizeCompatTests.class.getName()))
-                .setUid(android.os.Process.myUid())
-                .build();
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
         assertFalse(activity.shouldCreateCompatDisplayInsets());
     }
 
@@ -744,15 +718,8 @@
         mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
 
         // Create an activity on the same task.
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setTask(mTask)
-                .setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE)
-                .setSupportsSizeChanges(false)
-                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
-                .setComponent(ComponentName.createRelative(mContext,
-                        SizeCompatTests.class.getName()))
-                .setUid(android.os.Process.myUid())
-                .build();
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         assertFalse(activity.shouldCreateCompatDisplayInsets());
     }
 
@@ -765,15 +732,8 @@
         mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
 
         // Create an activity on the same task.
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setTask(mTask)
-                .setResizeMode(ActivityInfo.RESIZE_MODE_RESIZEABLE)
-                .setSupportsSizeChanges(true)
-                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
-                .setComponent(ComponentName.createRelative(mContext,
-                        SizeCompatTests.class.getName()))
-                .setUid(android.os.Process.myUid())
-                .build();
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */true,
+                RESIZE_MODE_RESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         assertTrue(activity.shouldCreateCompatDisplayInsets());
     }
 
@@ -786,19 +746,111 @@
         mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
 
         // Create an activity on the same task.
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setTask(mTask)
-                .setResizeMode(ActivityInfo.RESIZE_MODE_RESIZEABLE)
-                .setSupportsSizeChanges(true)
-                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
-                .setComponent(ComponentName.createRelative(mContext,
-                        SizeCompatTests.class.getName()))
-                .setUid(android.os.Process.myUid())
-                .build();
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */true,
+                RESIZE_MODE_RESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
         assertTrue(activity.shouldCreateCompatDisplayInsets());
     }
 
     @Test
+    @EnableCompatChanges({ActivityInfo.NEVER_SANDBOX_DISPLAY_APIS})
+    public void testNeverSandboxDisplayApis_configEnabled_sandboxingNotApplied() {
+        setUpDisplaySizeWithApp(1000, 1200);
+
+        // Make the task root resizable.
+        mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
+
+        // Create an activity with a max aspect ratio on the same task.
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+        activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        prepareUnresizable(activity, /* maxAspect=*/ 1.5f, SCREEN_ORIENTATION_LANDSCAPE);
+
+        // Activity max bounds should not be sandboxed, even though it is letterboxed.
+        assertTrue(activity.isLetterboxedForFixedOrientationAndAspectRatio());
+        assertThat(activity.getConfiguration().windowConfiguration.getMaxBounds())
+                .isEqualTo(activity.getDisplayArea().getBounds());
+    }
+
+    @Test
+    @DisableCompatChanges({ActivityInfo.NEVER_SANDBOX_DISPLAY_APIS})
+    public void testNeverSandboxDisplayApis_configDisabled_sandboxingApplied() {
+        setUpDisplaySizeWithApp(1000, 1200);
+
+        // Make the task root resizable.
+        mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
+
+        // Create an activity with a max aspect ratio on the same task.
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+        activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        prepareUnresizable(activity, /* maxAspect=*/ 1.5f, SCREEN_ORIENTATION_LANDSCAPE);
+
+        // Activity max bounds should be sandboxed due to letterboxed and the config being disabled.
+        assertActivityMaxBoundsSandboxed(activity);
+    }
+
+    @Test
+    @EnableCompatChanges({ActivityInfo.ALWAYS_SANDBOX_DISPLAY_APIS})
+    public void testAlwaysSandboxDisplayApis_configEnabled_sandboxingApplied_unresizable() {
+        setUpDisplaySizeWithApp(1000, 1200);
+
+        // Make the task root resizable.
+        mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
+
+        // Create an activity with a max aspect ratio on the same task.
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+        activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        prepareUnresizable(activity, /* maxAspect=*/ 1.5f, SCREEN_ORIENTATION_LANDSCAPE);
+
+        // Activity max bounds should be sandboxed due to letterboxed and the config being enabled.
+        assertActivityMaxBoundsSandboxed(activity);
+    }
+
+    @Test
+    @DisableCompatChanges({ActivityInfo.ALWAYS_SANDBOX_DISPLAY_APIS})
+    public void testAlwaysSandboxDisplayApis_configDisabled_sandboxingNotApplied() {
+        setUpDisplaySizeWithApp(1000, 1200);
+
+        // Make the task root resizable.
+        mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
+
+        // Create an activity with a max aspect ratio on the same task.
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_UNRESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+        activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        prepareUnresizable(activity, /* maxAspect=*/ 1.5f, SCREEN_ORIENTATION_LANDSCAPE);
+
+        // Activity max bounds be sandboxed due to letterbox and the config being disabled.
+        assertActivityMaxBoundsSandboxed(activity);
+    }
+
+    @Test
+    @EnableCompatChanges({ActivityInfo.ALWAYS_SANDBOX_DISPLAY_APIS})
+    public void testAlwaysSandboxDisplayApis_configEnabled_sandboxingApplied_resizableSplit() {
+        setUpDisplaySizeWithApp(1000, 2800);
+        mActivity.info.resizeMode = RESIZE_MODE_RESIZEABLE;
+        final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */false,
+                RESIZE_MODE_RESIZEABLE, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+        final TestSplitOrganizer organizer =
+                new TestSplitOrganizer(mAtm, activity.getDisplayContent());
+
+        // Activity max bounds should be sandboxed due the config being enabled.
+        assertFalse(activity.inSizeCompatMode());
+        assertActivityMaxBoundsSandboxed(activity);
+
+        // Move activity to split screen which takes half of the screen.
+        mTask.reparent(organizer.mPrimary, POSITION_TOP,
+                false /*moveParents*/, "test");
+        organizer.mPrimary.setBounds(0, 0, 1000, 1400);
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, mTask.getWindowingMode());
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, activity.getWindowingMode());
+
+        // Resizable activity is sandboxed due to config being enabled.
+        assertActivityMaxBoundsSandboxed(activity);
+    }
+
+    @Test
     @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO,
             ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM})
     public void testOverrideMinAspectRatioMedium() {
@@ -1200,9 +1252,11 @@
 
         // Task and display bounds should be equal while activity should be letterboxed and
         // has 700x1400 bounds with the ratio as the display.
-        assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+        assertTrue(newActivity.isLetterboxedForFixedOrientationAndAspectRatio());
         assertFalse(newActivity.inSizeCompatMode());
-        assertActivityMaxBoundsSandboxed();
+        // Activity max bounds are sandboxed due to size compat mode.
+        assertThat(newActivity.getConfiguration().windowConfiguration.getMaxBounds())
+                .isEqualTo(newActivity.getWindowConfiguration().getBounds());
         assertEquals(taskBounds, displayBounds);
         assertEquals(displayBounds.height(), newActivityBounds.height());
         assertEquals(displayBounds.height() * displayBounds.height() / displayBounds.width(),
@@ -1360,7 +1414,7 @@
     }
 
     @Test
-    public void testSandboxDisplayApis_letterboxAppNotSandboxed() {
+    public void testSandboxDisplayApis_unresizableAppNotSandboxed() {
         // Set up a display in landscape with an unresizable app.
         setUpDisplaySizeWithApp(2500, 1000);
         mActivity.mDisplayContent.setSandboxDisplayApis(false /* sandboxDisplayApis */);
@@ -1368,11 +1422,11 @@
         assertFitted();
 
         // Activity max bounds not be sandboxed since sandboxing is disabled.
-        assertThat(mActivity.getMaxBounds()).isEqualTo(mActivity.mDisplayContent.getBounds());
+        assertMaxBoundsInheritDisplayAreaBounds();
     }
 
     @Test
-    public void testSandboxDisplayApis_letterboxAppSandboxed() {
+    public void testSandboxDisplayApis_unresizableAppSandboxed() {
         // Set up a display in landscape with an unresizable app.
         setUpDisplaySizeWithApp(2500, 1000);
         mActivity.mDisplayContent.setSandboxDisplayApis(true /* sandboxDisplayApis */);
@@ -1383,6 +1437,89 @@
         assertActivityMaxBoundsSandboxed();
     }
 
+    @Test
+    public void testResizableApp_notSandboxed() {
+        // Set up a display in landscape with a fully resizable app.
+        setUpDisplaySizeWithApp(2500, 1000);
+        prepareLimitedBounds(mActivity, /* maxAspect= */ -1,
+                SCREEN_ORIENTATION_UNSPECIFIED, /* isUnresizable= */ false);
+        assertFitted();
+
+        // Activity max bounds not be sandboxed since app is fully resizable.
+        assertMaxBoundsInheritDisplayAreaBounds();
+    }
+
+    @Test
+    public void testResizableMaxAspectApp_notSandboxed() {
+        // Set up a display in landscape with a fully resizable app.
+        setUpDisplaySizeWithApp(2500, 1000);
+        prepareLimitedBounds(mActivity, /* maxAspect= */ 1,
+                SCREEN_ORIENTATION_UNSPECIFIED, /* isUnresizable= */ false);
+        assertFitted();
+
+        // Activity max bounds not be sandboxed since app is fully resizable.
+        assertMaxBoundsInheritDisplayAreaBounds();
+    }
+
+    @Test
+    public void testResizableOrientationRequestApp_notSandboxed() {
+        // Set up a display in landscape with a fully resizable app.
+        setUpDisplaySizeWithApp(2500, 1000);
+        prepareLimitedBounds(mActivity, /* maxAspect= */ -1,
+                SCREEN_ORIENTATION_PORTRAIT, /* isUnresizable= */ false);
+        mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        assertFitted();
+
+        // Activity max bounds not be sandboxed since app is fully resizable.
+        assertMaxBoundsInheritDisplayAreaBounds();
+    }
+
+    @Test
+    public void testResizableMaxAspectOrientationRequestApp_notSandboxed() {
+        // Set up a display in landscape with a fully resizable app.
+        setUpDisplaySizeWithApp(2500, 1000);
+        prepareLimitedBounds(mActivity, /* maxAspect= */ 1,
+                SCREEN_ORIENTATION_PORTRAIT, /* isUnresizable= */ false);
+        mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        assertFitted();
+
+        // Activity max bounds not be sandboxed since app is fully resizable.
+        assertMaxBoundsInheritDisplayAreaBounds();
+    }
+
+    @Test
+    public void testUnresizableApp_isSandboxed() {
+        // Set up a display in landscape with a fully resizable app.
+        setUpDisplaySizeWithApp(2500, 1000);
+        prepareLimitedBounds(mActivity, /* maxAspect= */ -1,
+                SCREEN_ORIENTATION_UNSPECIFIED, /* isUnresizable= */ true);
+        assertFitted();
+
+        // Activity max bounds are sandboxed since app may enter size compat mode.
+        assertActivityMaxBoundsSandboxed();
+        assertFalse(mActivity.inSizeCompatMode());
+    }
+
+    @Test
+    public void testUnresizableMaxAspectApp_isSandboxed() {
+        // Set up a display in landscape with a fully resizable app.
+        setUpDisplaySizeWithApp(2500, 1000);
+        prepareLimitedBounds(mActivity, /* maxAspect= */ 1,
+                SCREEN_ORIENTATION_UNSPECIFIED, /* isUnresizable= */ true);
+        assertFitted();
+
+        // Activity max bounds are sandboxed since app may enter size compat mode.
+        assertActivityMaxBoundsSandboxed();
+        assertFalse(mActivity.inSizeCompatMode());
+        assertTrue(mActivity.shouldCreateCompatDisplayInsets());
+
+        // Resize display to half the width.
+        resizeDisplay(mActivity.getDisplayContent(), 500, 1000);
+
+        // Activity now in size compat mode.
+        assertActivityMaxBoundsSandboxed();
+        assertTrue(mActivity.inSizeCompatMode());
+    }
 
     @Test
     public void testTaskDisplayAreaNotFillDisplay() {
@@ -1675,6 +1812,24 @@
         displayPolicy.layoutWindowLw(statusBar, null, displayContent.mDisplayFrames);
     }
 
+    /**
+     * Returns an ActivityRecord instance with the specified attributes on the same task. By
+     * constructing the ActivityRecord, forces {@link ActivityInfo} to be loaded with the compat
+     * config settings.
+     */
+    private ActivityRecord buildActivityRecord(boolean supportsSizeChanges, int resizeMode,
+            @ScreenOrientation int screenOrientation) {
+        return new ActivityBuilder(mAtm)
+                .setTask(mTask)
+                .setResizeMode(resizeMode)
+                .setSupportsSizeChanges(supportsSizeChanges)
+                .setScreenOrientation(screenOrientation)
+                .setComponent(ComponentName.createRelative(mContext,
+                        SizeCompatTests.class.getName()))
+                .setUid(android.os.Process.myUid())
+                .build();
+    }
+
     static void prepareUnresizable(ActivityRecord activity, int screenOrientation) {
         prepareUnresizable(activity, -1 /* maxAspect */, screenOrientation);
     }
@@ -1743,9 +1898,17 @@
      * bounds are sandboxed.
      */
     private void assertActivityMaxBoundsSandboxed() {
+        assertActivityMaxBoundsSandboxed(mActivity);
+    }
+
+    /**
+     * Asserts activity-level letterbox or size compat mode size compat mode on the specified
+     * activity, so activity max bounds are sandboxed.
+     */
+    private void assertActivityMaxBoundsSandboxed(ActivityRecord activity) {
         // Activity max bounds are sandboxed due to size compat mode.
-        assertThat(mActivity.getConfiguration().windowConfiguration.getMaxBounds())
-                .isEqualTo(mActivity.getWindowConfiguration().getBounds());
+        assertThat(activity.getConfiguration().windowConfiguration.getMaxBounds())
+                .isEqualTo(activity.getWindowConfiguration().getBounds());
     }
 
     static Configuration rotateDisplay(DisplayContent display, int rotation) {
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 92d4ede..9289ce4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
@@ -28,6 +28,7 @@
 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.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
 import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
 import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
@@ -75,6 +76,52 @@
 public class TaskDisplayAreaTests extends WindowTestsBase {
 
     @Test
+    public void getLaunchRootTask_checksLaunchAdjacentFlagRoot() {
+        final Task rootTask = createTask(
+                mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
+        rootTask.mCreatedByOrganizer = true;
+        final Task adjacentRootTask = createTask(
+                mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
+        adjacentRootTask.mCreatedByOrganizer = true;
+        final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea();
+        adjacentRootTask.mAdjacentTask = rootTask;
+        rootTask.mAdjacentTask = adjacentRootTask;
+
+        taskDisplayArea.setLaunchAdjacentFlagRootTask(adjacentRootTask);
+        Task actualRootTask = taskDisplayArea.getLaunchRootTask(
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */,
+                null /* sourceTask */, FLAG_ACTIVITY_LAUNCH_ADJACENT);
+        assertSame(adjacentRootTask, actualRootTask.getRootTask());
+
+        taskDisplayArea.setLaunchAdjacentFlagRootTask(null);
+        actualRootTask = taskDisplayArea.getLaunchRootTask(WINDOWING_MODE_UNDEFINED,
+                ACTIVITY_TYPE_STANDARD, null /* options */, null /* sourceTask */,
+                FLAG_ACTIVITY_LAUNCH_ADJACENT);
+        assertNull(actualRootTask);
+    }
+
+    @Test
+    public void getLaunchRootTask_fromLaunchAdjacentFlagRoot_checksAdjacentRoot() {
+        final ActivityRecord activity = createNonAttachedActivityRecord(mDisplayContent);
+        final Task rootTask = createTask(
+                mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
+        rootTask.mCreatedByOrganizer = true;
+        final Task adjacentRootTask = createTask(
+                mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
+        adjacentRootTask.mCreatedByOrganizer = true;
+        final TaskDisplayArea taskDisplayArea = rootTask.getDisplayArea();
+        adjacentRootTask.mAdjacentTask = rootTask;
+        rootTask.mAdjacentTask = adjacentRootTask;
+
+        taskDisplayArea.setLaunchAdjacentFlagRootTask(adjacentRootTask);
+        final Task actualRootTask = taskDisplayArea.getLaunchRootTask(
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, null /* options */,
+                adjacentRootTask /* sourceTask */, FLAG_ACTIVITY_LAUNCH_ADJACENT);
+
+        assertSame(rootTask, actualRootTask.getRootTask());
+    }
+
+    @Test
     public void getOrCreateLaunchRootRespectsResolvedWindowingMode() {
         final Task rootTask = createTask(
                 mDisplayContent, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
@@ -90,8 +137,8 @@
         launchParams.mWindowingMode = WINDOWING_MODE_FREEFORM;
 
         final Task actualRootTask = taskDisplayArea.getOrCreateRootTask(
-                activity, null /* options */, candidateRootTask,
-                launchParams, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+                activity, null /* options */, candidateRootTask, null /* sourceTask */,
+                launchParams, 0 /* launchFlags */, ACTIVITY_TYPE_STANDARD, true /* onTop */);
         assertSame(rootTask, actualRootTask.getRootTask());
     }
 
@@ -111,8 +158,9 @@
         options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
 
         final Task actualRootTask = taskDisplayArea.getOrCreateRootTask(
-                activity, options, candidateRootTask,
-                null /* launchParams */, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+                activity, options, candidateRootTask, null /* sourceTask */,
+                null /* launchParams */, 0 /* launchFlags */, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
         assertSame(rootTask, actualRootTask.getRootTask());
     }
 
@@ -458,8 +506,8 @@
             boolean reuseCandidate) {
         final TaskDisplayArea taskDisplayArea = candidateTask.getDisplayArea();
         final Task rootTask = taskDisplayArea.getOrCreateRootTask(windowingMode, activityType,
-                false /* onTop */, null /* intent */, candidateTask /* candidateTask */,
-                null /* activityOptions */);
+                false /* onTop */, candidateTask /* candidateTask */, null /* sourceTask */,
+                null /* activityOptions */, 0 /* launchFlags */);
         assertEquals(reuseCandidate, rootTask == candidateTask);
     }
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 6919c4c..00f3d8b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
@@ -634,6 +635,22 @@
     }
 
     @Test
+    public void testSetOrientation() {
+        final TestWindowContainer root = spy(new TestWindowContainerBuilder(mWm).build());
+        final TestWindowContainer child = spy(root.addChildWindow());
+        doReturn(true).when(root).handlesOrientationChangeFromDescendant();
+        child.getWindowConfiguration().setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        child.setOrientation(SCREEN_ORIENTATION_PORTRAIT);
+        // The ancestor should decide whether to dispatch the configuration change.
+        verify(child, never()).onConfigurationChanged(any());
+
+        doReturn(false).when(root).handlesOrientationChangeFromDescendant();
+        child.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
+        // The ancestor doesn't handle the request so the descendant applies the change directly.
+        verify(child).onConfigurationChanged(any());
+    }
+
+    @Test
     public void testCompareTo() {
         final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
         final TestWindowContainer root = builder.setLayer(0).build();
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerThumbnailTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerThumbnailTest.java
index 212ffd5..0b1b877 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerThumbnailTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerThumbnailTest.java
@@ -18,14 +18,13 @@
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-import static org.mockito.ArgumentMatchers.any;
 
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
 
 import android.hardware.HardwareBuffer;
 import android.platform.test.annotations.Presubmit;
-import android.view.Surface;
 
 import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
@@ -51,8 +50,8 @@
         when(mockAr.getPendingTransaction()).thenReturn(new StubTransaction());
         when(mockAr.makeChildSurface(any())).thenReturn(new MockSurfaceControlBuilder());
         when(mockAr.makeSurface()).thenReturn(new MockSurfaceControlBuilder());
-        return new WindowContainerThumbnail(new StubTransaction(), mockAr,
-                buffer, false, mock(Surface.class), mock(SurfaceAnimator.class));
+        return new WindowContainerThumbnail(new StubTransaction(), mockAr, buffer,
+                mock(SurfaceAnimator.class));
     }
 
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java
index 73b9173..5d0fe17 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContextListenerControllerTests.java
@@ -17,8 +17,11 @@
 package com.android.server.wm;
 
 import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 
+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;
@@ -162,6 +165,26 @@
                 false /* callerCanManagerAppTokens */, ANOTHER_UID);
     }
 
+    @Test
+    public void testWindowContextCreatedWindowTokenRemoved_SwitchToListenToDA() {
+        WindowToken windowContextCreatedToken = new WindowToken.Builder(mWm, mClientToken,
+                TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY)
+                .setDisplayContent(mDefaultDisplay)
+                .setFromClientToken(true)
+                .build();
+        final DisplayArea da = windowContextCreatedToken.getDisplayArea();
+
+        mController.registerWindowContainerListener(mClientToken, windowContextCreatedToken,
+                TEST_UID, TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, null /* options */);
+
+        assertThat(mController.getContainer(mClientToken)).isEqualTo(windowContextCreatedToken);
+
+        // Remove WindowToken
+        windowContextCreatedToken.removeImmediately();
+
+        assertThat(mController.getContainer(mClientToken)).isEqualTo(da);
+    }
+
     private class TestWindowTokenClient extends IWindowToken.Stub {
         private Configuration mConfiguration;
         private int mDisplayId;
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
index 6d55220..83f41e3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -543,33 +543,7 @@
 
     @Test
     public void testTileAddRemoveChild() {
-        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
-            @Override
-            public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
-
-            }
-
-            @Override
-            public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
-                    boolean playRevealAnimation) { }
-
-            @Override
-            public void copySplashScreenView(int taskId) { }
-
-            @Override
-            public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
-
-            @Override
-            public void onTaskVanished(RunningTaskInfo container) { }
-
-            @Override
-            public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
-            }
-
-            @Override
-            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
-            }
-        };
+        final StubOrganizer listener = new StubOrganizer();
         mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener);
         Task task = mWm.mAtmService.mTaskOrganizerController.createRootTask(
                 mDisplayContent, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, null);
@@ -612,31 +586,12 @@
     public void testTaskInfoCallback() {
         final ArrayList<RunningTaskInfo> lastReportedTiles = new ArrayList<>();
         final boolean[] called = {false};
-        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
+        final StubOrganizer listener = new StubOrganizer() {
             @Override
-            public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
-
-            }
-            @Override
-            public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
-                    boolean playRevealAnimation) { }
-            @Override
-            public void copySplashScreenView(int taskId) { }
-            @Override
-            public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
-
-            @Override
-            public void onTaskVanished(RunningTaskInfo container) { }
-
-            @Override
-            public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
+            public void onTaskInfoChanged(RunningTaskInfo info) {
                 lastReportedTiles.add(info);
                 called[0] = true;
             }
-
-            @Override
-            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
-            }
         };
         mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener);
         Task task = mWm.mAtmService.mTaskOrganizerController.createRootTask(
@@ -689,31 +644,11 @@
     @Test
     public void testHierarchyTransaction() {
         final ArrayMap<IBinder, RunningTaskInfo> lastReportedTiles = new ArrayMap<>();
-        ITaskOrganizer listener = new ITaskOrganizer.Stub() {
-            @Override
-            public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
-
-            }
-
-            @Override
-            public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
-                    boolean playRevealAnimation) { }
-            @Override
-            public void copySplashScreenView(int taskId) { }
-            @Override
-            public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
-
-            @Override
-            public void onTaskVanished(RunningTaskInfo container) { }
-
+        final StubOrganizer listener = new StubOrganizer() {
             @Override
             public void onTaskInfoChanged(RunningTaskInfo info) {
                 lastReportedTiles.put(info.token.asBinder(), info);
             }
-
-            @Override
-            public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
-            }
         };
         mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener);
 
@@ -838,7 +773,7 @@
         verify(transactionListener).onTransactionReady(anyInt(), any());
     }
 
-    class StubOrganizer extends ITaskOrganizer.Stub {
+    static class StubOrganizer extends ITaskOrganizer.Stub {
         RunningTaskInfo mInfo;
 
         @Override
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 bfbe203..8d067be 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -17,6 +17,7 @@
 package com.android.server.wm;
 
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+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;
 import static android.view.InsetsState.ITYPE_STATUS_BAR;
@@ -47,6 +48,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
 import static com.android.server.wm.WindowContainer.SYNC_STATE_WAITING_FOR_DRAW;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -877,4 +879,30 @@
         mDisplayContent.getInsetsStateController().notifyInsetsChanged();
         verify(app).notifyInsetsChanged();
     }
+
+    @UseTestDisplay(addWindows = { W_ACTIVITY })
+    @Test
+    public void testUpdateImeControlTargetWhenLeavingMultiWindow() {
+        WindowState app = createWindow(null, TYPE_BASE_APPLICATION,
+                mAppWindow.mToken, "app");
+        mDisplayContent.setRemoteInsetsController(createDisplayWindowInsetsController());
+
+        spyOn(app);
+        mDisplayContent.setImeInputTarget(mAppWindow);
+        mDisplayContent.setImeLayeringTarget(mAppWindow);
+
+        // Simulate entering multi-window mode and verify if the IME control target is remote.
+        app.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+        assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, app.getWindowingMode());
+        assertEquals(mDisplayContent.mRemoteInsetsControlTarget,
+                mDisplayContent.computeImeControlTarget());
+
+        // Simulate exiting multi-window mode and verify if the IME control target changed
+        // to the app window.
+        spyOn(app.getDisplayContent());
+        app.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+
+        verify(app.getDisplayContent()).updateImeControlTarget();
+        assertEquals(mAppWindow, mDisplayContent.getImeTarget(IME_TARGET_CONTROL).getWindow());
+    }
 }
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 2d4e4ef..9b5d352 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -92,7 +92,6 @@
 import android.view.View;
 import android.view.WindowManager;
 import android.view.WindowManager.DisplayImePolicy;
-import android.window.ITaskOrganizer;
 import android.window.ITransitionPlayer;
 import android.window.StartingWindowInfo;
 import android.window.TransitionInfo;
@@ -1216,7 +1215,7 @@
         }
     }
 
-    static class TestStartingWindowOrganizer extends ITaskOrganizer.Stub {
+    static class TestStartingWindowOrganizer extends WindowOrganizerTests.StubOrganizer {
         private final ActivityTaskManagerService mAtm;
         private final WindowManagerService mWMService;
         private final WindowState.PowerManagerWrapper mPowerManagerWrapper;
@@ -1281,24 +1280,9 @@
                 }
             }
         }
-        @Override
-        public void copySplashScreenView(int taskId) {
-        }
-        @Override
-        public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) {
-        }
-        @Override
-        public void onTaskVanished(ActivityManager.RunningTaskInfo info) {
-        }
-        @Override
-        public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
-        }
-        @Override
-        public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) {
-        }
     }
 
-    static class TestSplitOrganizer extends ITaskOrganizer.Stub {
+    static class TestSplitOrganizer extends WindowOrganizerTests.StubOrganizer {
         final ActivityTaskManagerService mService;
         Task mPrimary;
         Task mSecondary;
@@ -1332,22 +1316,7 @@
         public void setMoveToSecondaryOnEnter(boolean move) {
             mMoveToSecondaryOnEnter = move;
         }
-        @Override
-        public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
-        }
-        @Override
-        public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
-                boolean playRevealAnimation) {
-        }
-        @Override
-        public void copySplashScreenView(int taskId) {
-        }
-        @Override
-        public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) {
-        }
-        @Override
-        public void onTaskVanished(ActivityManager.RunningTaskInfo info) {
-        }
+
         @Override
         public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
             if (mInSplit) {
@@ -1374,9 +1343,6 @@
                 }
             });
         }
-        @Override
-        public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) {
-        }
     }
 
     static TestWindowToken createTestWindowToken(int type, DisplayContent dc) {
@@ -1462,7 +1428,8 @@
 
         @Override
         public void onTransitionReady(IBinder transitToken, TransitionInfo transitionInfo,
-                SurfaceControl.Transaction transaction) throws RemoteException {
+                SurfaceControl.Transaction transaction, SurfaceControl.Transaction finishT)
+                throws RemoteException {
             mLastTransit = Transition.fromBinder(transitToken);
             mLastReady = transitionInfo;
         }
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
index ed5f1d8..d048f1842 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java
@@ -184,49 +184,28 @@
     }
 
     /**
-     * Test that {@link WindowToken} constructor parameters is set with expectation.
-     */
-    @Test
-    public void testWindowTokenConstructorValidity() {
-        WindowToken token = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class),
-                TYPE_TOAST, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */);
-        assertFalse(token.mRoundedCornerOverlay);
-        assertFalse(token.isFromClient());
-
-        token = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class), TYPE_TOAST,
-                true /* persistOnEmpty */, mDisplayContent, true /* ownerCanManageAppTokens */,
-                true /* roundedCornerOverlay */);
-        assertTrue(token.mRoundedCornerOverlay);
-        assertFalse(token.isFromClient());
-
-        token = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class), TYPE_TOAST,
-                true /* persistOnEmpty */, mDisplayContent, true /* ownerCanManageAppTokens */,
-                true /* roundedCornerOverlay */, true /* fromClientToken */, null /* options */);
-        assertTrue(token.mRoundedCornerOverlay);
-        assertTrue(token.isFromClient());
-    }
-
-    /**
      * Test that {@link android.view.SurfaceControl} should not be created for the
      * {@link WindowToken} which was created for {@link WindowContext} initially, the
      * surface should be create after addWindow for this token.
      */
     @Test
     public void testSurfaceCreatedForWindowToken() {
-        final WindowToken fromClientToken = new WindowToken(mDisplayContent.mWmService,
-                mock(IBinder.class), TYPE_APPLICATION_OVERLAY, true /* persistOnEmpty */,
-                mDisplayContent, true /* ownerCanManageAppTokens */,
-                true /* roundedCornerOverlay */, true /* fromClientToken */, null /* options */);
+        final WindowToken fromClientToken = new WindowToken.Builder(mDisplayContent.mWmService,
+                mock(IBinder.class), TYPE_APPLICATION_OVERLAY)
+                .setDisplayContent(mDisplayContent)
+                .setFromClientToken(true)
+                .build();
+
         assertNull(fromClientToken.mSurfaceControl);
 
         createWindow(null, TYPE_APPLICATION_OVERLAY, fromClientToken, "window");
         assertNotNull(fromClientToken.mSurfaceControl);
 
-        final WindowToken nonClientToken = new WindowToken(mDisplayContent.mWmService,
-                mock(IBinder.class), TYPE_TOAST, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, true /* roundedCornerOverlay */,
-                false /* fromClientToken */, null /* options */);
+        final WindowToken nonClientToken = new WindowToken.Builder(mDisplayContent.mWmService,
+                mock(IBinder.class), TYPE_APPLICATION_OVERLAY)
+                .setDisplayContent(mDisplayContent)
+                .setFromClientToken(false)
+                .build();
         assertNotNull(nonClientToken.mSurfaceControl);
     }
 
@@ -237,18 +216,23 @@
                         .mSelectRootForWindowFunc;
         spyOn(selectFunc);
 
-        final WindowToken token1 = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, true /* roundedCornerOverlay */,
-                false /* fromClientToken */, null /* options */);
+        final WindowToken token1 = new WindowToken.Builder(mDisplayContent.mWmService,
+                mock(IBinder.class), TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .build();
 
         verify(selectFunc).apply(token1.windowType, null);
 
         final Bundle options = new Bundle();
-        final WindowToken token2 = new WindowToken(mDisplayContent.mWmService, mock(IBinder.class),
-                TYPE_STATUS_BAR, true /* persistOnEmpty */, mDisplayContent,
-                true /* ownerCanManageAppTokens */, true /* roundedCornerOverlay */,
-                false /* fromClientToken */, options /* options */);
+        final WindowToken token2 = new WindowToken.Builder(mDisplayContent.mWmService,
+                mock(IBinder.class), TYPE_STATUS_BAR)
+                .setDisplayContent(mDisplayContent)
+                .setPersistOnEmpty(true)
+                .setOwnerCanManageAppTokens(true)
+                .setOptions(options)
+                .build();
 
         verify(selectFunc).apply(token2.windowType, options);
     }
diff --git a/services/translation/java/com/android/server/translation/RemoteTranslationService.java b/services/translation/java/com/android/server/translation/RemoteTranslationService.java
index 82cb728..c77396d 100644
--- a/services/translation/java/com/android/server/translation/RemoteTranslationService.java
+++ b/services/translation/java/com/android/server/translation/RemoteTranslationService.java
@@ -20,6 +20,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.os.IBinder;
 import android.os.ResultReceiver;
 import android.service.translation.ITranslationService;
 import android.service.translation.TranslationService;
@@ -44,8 +45,10 @@
     private final int mRequestTimeoutMs;
     private final ComponentName mComponentName;
 
+    private final IBinder mRemoteCallback;
+
     RemoteTranslationService(Context context, ComponentName serviceName,
-            int userId, boolean bindInstantServiceAllowed) {
+            int userId, boolean bindInstantServiceAllowed, IBinder callback) {
         super(context,
                 new Intent(TranslationService.SERVICE_INTERFACE).setComponent(serviceName),
                 bindInstantServiceAllowed ? Context.BIND_ALLOW_INSTANT : 0,
@@ -53,7 +56,7 @@
         mIdleUnbindTimeoutMs = TIMEOUT_IDLE_UNBIND_MS;
         mRequestTimeoutMs = TIMEOUT_REQUEST_MS;
         mComponentName = serviceName;
-
+        mRemoteCallback = callback;
         // Bind right away.
         connect();
     }
@@ -67,7 +70,7 @@
             boolean connected) {
         try {
             if (connected) {
-                service.onConnected();
+                service.onConnected(mRemoteCallback);
             } else {
                 service.onDisconnected();
             }
diff --git a/services/translation/java/com/android/server/translation/TranslationManagerService.java b/services/translation/java/com/android/server/translation/TranslationManagerService.java
index f132b49..628f8cd 100644
--- a/services/translation/java/com/android/server/translation/TranslationManagerService.java
+++ b/services/translation/java/com/android/server/translation/TranslationManagerService.java
@@ -44,6 +44,7 @@
 import android.view.translation.TranslationContext;
 import android.view.translation.TranslationSpec;
 import android.view.translation.UiTranslationManager.UiTranslationState;
+import android.view.translation.UiTranslationSpec;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.os.IResultReceiver;
@@ -170,6 +171,28 @@
         }
 
         @Override
+        public void registerTranslationCapabilityCallback(IRemoteCallback callback, int userId) {
+            TranslationManagerServiceImpl service;
+            synchronized (mLock) {
+                service = getServiceForUserLocked(userId);
+            }
+            if (service != null) {
+                service.registerTranslationCapabilityCallback(callback, Binder.getCallingUid());
+            }
+        }
+
+        @Override
+        public void unregisterTranslationCapabilityCallback(IRemoteCallback callback, int userId) {
+            TranslationManagerServiceImpl service;
+            synchronized (mLock) {
+                service = getServiceForUserLocked(userId);
+            }
+            if (service != null) {
+                service.unregisterTranslationCapabilityCallback(callback);
+            }
+        }
+
+        @Override
         public void onSessionCreated(TranslationContext translationContext,
                 int sessionId, IResultReceiver receiver, int userId) throws RemoteException {
             synchronized (mLock) {
@@ -185,33 +208,16 @@
         }
 
         @Override
-        public void updateUiTranslationStateByTaskId(@UiTranslationState int state,
-                TranslationSpec sourceSpec, TranslationSpec targetSpec, List<AutofillId> viewIds,
-                int taskId, int userId) {
-            // deprecated
-            enforceCallerHasPermission(MANAGE_UI_TRANSLATION);
-            synchronized (mLock) {
-                final TranslationManagerServiceImpl service = getServiceForUserLocked(userId);
-                if (service != null && (isDefaultServiceLocked(userId)
-                        || isCalledByServiceAppLocked(userId,
-                        "updateUiTranslationStateByTaskId"))) {
-                    service.updateUiTranslationStateLocked(state, sourceSpec, targetSpec, viewIds,
-                            taskId);
-                }
-            }
-        }
-
-        @Override
         public void updateUiTranslationState(@UiTranslationState int state,
                 TranslationSpec sourceSpec, TranslationSpec targetSpec, List<AutofillId> viewIds,
-                IBinder token, int taskId, int userId) {
+                IBinder token, int taskId, UiTranslationSpec uiTranslationSpec, int userId) {
             enforceCallerHasPermission(MANAGE_UI_TRANSLATION);
             synchronized (mLock) {
                 final TranslationManagerServiceImpl service = getServiceForUserLocked(userId);
                 if (service != null && (isDefaultServiceLocked(userId)
                         || isCalledByServiceAppLocked(userId, "updateUiTranslationState"))) {
                     service.updateUiTranslationStateLocked(state, sourceSpec, targetSpec, viewIds,
-                            token, taskId);
+                            token, taskId, uiTranslationSpec);
                 }
             }
         }
diff --git a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
index 2cd41ba..4198d3b 100644
--- a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
+++ b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
@@ -16,6 +16,7 @@
 
 package com.android.server.translation;
 
+import static android.view.translation.TranslationManager.EXTRA_CAPABILITIES;
 import static android.view.translation.UiTranslationManager.EXTRA_SOURCE_LOCALE;
 import static android.view.translation.UiTranslationManager.EXTRA_STATE;
 import static android.view.translation.UiTranslationManager.EXTRA_TARGET_LOCALE;
@@ -35,9 +36,12 @@
 import android.util.Slog;
 import android.view.autofill.AutofillId;
 import android.view.inputmethod.InputMethodInfo;
+import android.view.translation.ITranslationServiceCallback;
+import android.view.translation.TranslationCapability;
 import android.view.translation.TranslationContext;
 import android.view.translation.TranslationSpec;
 import android.view.translation.UiTranslationManager.UiTranslationState;
+import android.view.translation.UiTranslationSpec;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.os.IResultReceiver;
@@ -67,6 +71,11 @@
 
     private ActivityTaskManagerInternal mActivityTaskManagerInternal;
 
+    private final TranslationServiceRemoteCallback mRemoteServiceCallback =
+            new TranslationServiceRemoteCallback();
+    private final RemoteCallbackList<IRemoteCallback> mTranslationCapabilityCallbacks =
+            new RemoteCallbackList<>();
+
     protected TranslationManagerServiceImpl(
             @NonNull TranslationManagerService master,
             @NonNull Object lock, int userId, boolean disabled) {
@@ -117,8 +126,8 @@
                 return null;
             }
             final ComponentName serviceComponent = ComponentName.unflattenFromString(serviceName);
-            mRemoteTranslationService = new RemoteTranslationService(getContext(),
-                    serviceComponent, mUserId, /* isInstantAllowed= */ false);
+            mRemoteTranslationService = new RemoteTranslationService(getContext(), serviceComponent,
+                    mUserId, /* isInstantAllowed= */ false, mRemoteServiceCallback);
         }
         return mRemoteTranslationService;
     }
@@ -134,6 +143,15 @@
         }
     }
 
+    public void registerTranslationCapabilityCallback(IRemoteCallback callback, int sourceUid) {
+        mTranslationCapabilityCallbacks.register(callback, sourceUid);
+        ensureRemoteServiceLocked();
+    }
+
+    public void unregisterTranslationCapabilityCallback(IRemoteCallback callback) {
+        mTranslationCapabilityCallbacks.unregister(callback);
+    }
+
     @GuardedBy("mLock")
     void onSessionCreatedLocked(@NonNull TranslationContext translationContext, int sessionId,
             IResultReceiver resultReceiver) {
@@ -146,22 +164,7 @@
     @GuardedBy("mLock")
     public void updateUiTranslationStateLocked(@UiTranslationState int state,
             TranslationSpec sourceSpec, TranslationSpec targetSpec, List<AutofillId> viewIds,
-            int taskId) {
-        // deprecated
-        final ActivityTokens taskTopActivityTokens =
-                mActivityTaskManagerInternal.getTopActivityForTask(taskId);
-        if (taskTopActivityTokens == null) {
-            Slog.w(TAG, "Unknown activity to query for update translation state.");
-            return;
-        }
-        updateUiTranslationStateByActivityTokens(taskTopActivityTokens, state, sourceSpec,
-                targetSpec, viewIds);
-    }
-
-    @GuardedBy("mLock")
-    public void updateUiTranslationStateLocked(@UiTranslationState int state,
-            TranslationSpec sourceSpec, TranslationSpec targetSpec, List<AutofillId> viewIds,
-            IBinder token, int taskId) {
+            IBinder token, int taskId, UiTranslationSpec uiTranslationSpec) {
         // Get top activity for a given task id
         final ActivityTokens taskTopActivityTokens =
                 mActivityTaskManagerInternal.getTopActivityForTask(taskId);
@@ -171,16 +174,11 @@
                     + "translation state for token=" + token + " taskId=" + taskId);
             return;
         }
-        updateUiTranslationStateByActivityTokens(taskTopActivityTokens, state, sourceSpec,
-                targetSpec, viewIds);
-    }
-
-    private void updateUiTranslationStateByActivityTokens(ActivityTokens tokens,
-            @UiTranslationState int state, TranslationSpec sourceSpec, TranslationSpec targetSpec,
-            List<AutofillId> viewIds) {
         try {
-            tokens.getApplicationThread().updateUiTranslationState(tokens.getActivityToken(), state,
-                    sourceSpec, targetSpec, viewIds);
+            // TODO: Pipe uiTranslationSpec through to the UiTranslationController.
+            taskTopActivityTokens.getApplicationThread().updateUiTranslationState(
+                    taskTopActivityTokens.getActivityToken(), state, sourceSpec, targetSpec,
+                    viewIds);
         } catch (RemoteException e) {
             Slog.w(TAG, "Update UiTranslationState fail: " + e);
         }
@@ -193,8 +191,8 @@
         res.putInt(EXTRA_STATE, state);
         // TODO(177500482): Store the locale pair so it can be sent for RESUME events.
         if (sourceSpec != null) {
-            res.putString(EXTRA_SOURCE_LOCALE, sourceSpec.getLanguage());
-            res.putString(EXTRA_TARGET_LOCALE, targetSpec.getLanguage());
+            res.putSerializable(EXTRA_SOURCE_LOCALE, sourceSpec.getLocale());
+            res.putSerializable(EXTRA_TARGET_LOCALE, targetSpec.getLocale());
         }
         // TODO(177500482): Only support the *current* Input Method.
         List<InputMethodInfo> enabledInputMethods =
@@ -242,4 +240,29 @@
         final String packageName = mTranslationServiceInfo.getServiceInfo().packageName;
         return new ComponentName(packageName, activityName);
     }
+
+    private void notifyClientsTranslationCapability(TranslationCapability capability) {
+        final Bundle res = new Bundle();
+        res.putParcelable(EXTRA_CAPABILITIES, capability);
+        mTranslationCapabilityCallbacks.broadcast((callback, uid) -> {
+            try {
+                callback.sendResult(res);
+            } catch (RemoteException e) {
+                Slog.w(TAG, "Failed to invoke UiTranslationStateCallback: " + e);
+            }
+        });
+    }
+
+    private final class TranslationServiceRemoteCallback extends
+            ITranslationServiceCallback.Stub {
+
+        @Override
+        public void updateTranslationCapability(TranslationCapability capability) {
+            if (capability == null) {
+                Slog.wtf(TAG, "received a null TranslationCapability from TranslationService.");
+                return;
+            }
+            notifyClientsTranslationCapability(capability);
+        }
+    }
 }
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index 1dc1e77..f169926 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -17,8 +17,10 @@
 package com.android.server.usage;
 
 import android.annotation.UserIdInt;
+import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.app.usage.UsageStatsManagerInternal;
+import android.content.Context;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -58,6 +60,10 @@
 
     private final MyHandler mHandler;
 
+    private final Context mContext;
+
+    private AlarmManager mAlarmManager;
+
     private TimeLimitCallbackListener mListener;
 
     private static final long MAX_OBSERVER_PER_UID = 1000;
@@ -434,7 +440,7 @@
         }
     }
 
-    class SessionUsageGroup extends UsageGroup {
+    class SessionUsageGroup extends UsageGroup implements AlarmManager.OnAlarmListener {
         private long mNewSessionThresholdMs;
         private PendingIntent mSessionEndCallback;
 
@@ -466,7 +472,7 @@
                     // New session has started, clear usage time.
                     mUsageTimeMs = 0;
                 }
-                AppTimeLimitController.this.cancelInformSessionEndListener(this);
+                getAlarmManager().cancel(this);
             }
             super.noteUsageStart(startTimeMs, currentTimeMs);
         }
@@ -479,10 +485,9 @@
                 if (mUsageTimeMs >= mTimeLimitMs) {
                     // Usage has ended. Schedule the session end callback to be triggered once
                     // the new session threshold has been reached
-                    AppTimeLimitController.this.postInformSessionEndListenerLocked(this,
-                            mNewSessionThresholdMs);
+                    getAlarmManager().setExact(AlarmManager.ELAPSED_REALTIME,
+                            getElapsedRealtime() + mNewSessionThresholdMs, TAG, this, mHandler);
                 }
-
             }
         }
 
@@ -499,6 +504,13 @@
         }
 
         @Override
+        public void onAlarm() {
+            synchronized (mLock) {
+                onSessionEnd();
+            }
+        }
+
+        @Override
         @GuardedBy("mLock")
         void dump(PrintWriter pw) {
             super.dump(pw);
@@ -546,7 +558,6 @@
     private class MyHandler extends Handler {
         static final int MSG_CHECK_TIMEOUT = 1;
         static final int MSG_INFORM_LIMIT_REACHED_LISTENER = 2;
-        static final int MSG_INFORM_SESSION_END = 3;
 
         MyHandler(Looper looper) {
             super(looper);
@@ -565,11 +576,6 @@
                         ((UsageGroup) msg.obj).onLimitReached();
                     }
                     break;
-                case MSG_INFORM_SESSION_END:
-                    synchronized (mLock) {
-                        ((SessionUsageGroup) msg.obj).onSessionEnd();
-                    }
-                    break;
                 default:
                     super.handleMessage(msg);
                     break;
@@ -577,13 +583,24 @@
         }
     }
 
-    public AppTimeLimitController(TimeLimitCallbackListener listener, Looper looper) {
+    public AppTimeLimitController(Context context, TimeLimitCallbackListener listener,
+            Looper looper) {
+        mContext = context;
         mHandler = new MyHandler(looper);
         mListener = listener;
     }
 
     /** Overrideable by a test */
     @VisibleForTesting
+    protected AlarmManager getAlarmManager() {
+        if (mAlarmManager == null) {
+            mAlarmManager = mContext.getSystemService(AlarmManager.class);
+        }
+        return mAlarmManager;
+    }
+
+    /** Overrideable by a test */
+    @VisibleForTesting
     protected long getElapsedRealtime() {
         return SystemClock.elapsedRealtime();
     }
@@ -985,18 +1002,6 @@
     }
 
     @GuardedBy("mLock")
-    private void postInformSessionEndListenerLocked(SessionUsageGroup group, long timeout) {
-        mHandler.sendMessageDelayed(
-                mHandler.obtainMessage(MyHandler.MSG_INFORM_SESSION_END, group),
-                timeout);
-    }
-
-    @GuardedBy("mLock")
-    private void cancelInformSessionEndListener(SessionUsageGroup group) {
-        mHandler.removeMessages(MyHandler.MSG_INFORM_SESSION_END, group);
-    }
-
-    @GuardedBy("mLock")
     private void postCheckTimeoutLocked(UsageGroup group, long timeout) {
         mHandler.sendMessageDelayed(mHandler.obtainMessage(MyHandler.MSG_CHECK_TIMEOUT, group),
                 timeout);
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 309673d..f7e6375 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -252,7 +252,7 @@
 
         mAppStandby = mInjector.getAppStandbyController(getContext());
 
-        mAppTimeLimit = new AppTimeLimitController(
+        mAppTimeLimit = new AppTimeLimitController(getContext(),
                 new AppTimeLimitController.TimeLimitCallbackListener() {
                     @Override
                     public void onLimitReached(int observerId, int userId, long timeLimit,
diff --git a/services/uwb/java/com/android/server/uwb/UwbInjector.java b/services/uwb/java/com/android/server/uwb/UwbInjector.java
index 00c0aca..64f1da1 100644
--- a/services/uwb/java/com/android/server/uwb/UwbInjector.java
+++ b/services/uwb/java/com/android/server/uwb/UwbInjector.java
@@ -16,8 +16,13 @@
 
 package com.android.server.uwb;
 
+import static android.Manifest.permission.UWB_RANGING;
+import static android.content.PermissionChecker.PERMISSION_GRANTED;
+
 import android.annotation.NonNull;
+import android.content.AttributionSource;
 import android.content.Context;
+import android.content.PermissionChecker;
 import android.os.IBinder;
 import android.os.ServiceManager;
 import android.uwb.IUwbAdapter;
@@ -45,4 +50,34 @@
         if (b == null) return null;
         return IUwbAdapter.Stub.asInterface(b);
     }
+
+    /**
+     * Throws security exception if the UWB_RANGING permission is not granted for the calling app.
+     *
+     * <p>Should be used in situations where the app op should not be noted.
+     */
+    public void enforceUwbRangingPermissionForPreflight(
+            @NonNull AttributionSource attributionSource) {
+        if (!attributionSource.checkCallingUid()) {
+            throw new SecurityException("Invalid attribution source " + attributionSource);
+        }
+        int permissionCheckResult = PermissionChecker.checkPermissionForPreflight(
+                mContext, UWB_RANGING, attributionSource);
+        if (permissionCheckResult != PERMISSION_GRANTED) {
+            throw new SecurityException("Caller does not hold UWB_RANGING permission");
+        }
+    }
+
+    /**
+     * Returns true if the UWB_RANGING permission is granted for the calling app.
+     *
+     * <p>Should be used in situations where data will be delivered and hence the app op should
+     * be noted.
+     */
+    public boolean checkUwbRangingPermissionForDataDelivery(
+            @NonNull AttributionSource attributionSource, @NonNull String message) {
+        int permissionCheckResult = PermissionChecker.checkPermissionForDataDelivery(
+                mContext, UWB_RANGING, -1, attributionSource, message);
+        return permissionCheckResult == PERMISSION_GRANTED;
+    }
 }
diff --git a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java
index 70bd20e..f34567f 100644
--- a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java
+++ b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java
@@ -17,6 +17,7 @@
 package com.android.server.uwb;
 
 import android.annotation.NonNull;
+import android.content.AttributionSource;
 import android.content.Context;
 import android.os.IBinder;
 import android.os.PersistableBundle;
@@ -60,13 +61,16 @@
      * Access to these callbacks are synchronized.
      */
     private class UwbRangingCallbacksWrapper extends IUwbRangingCallbacks.Stub
-            implements IBinder.DeathRecipient{
+            implements IBinder.DeathRecipient {
+        private final AttributionSource mAttributionSource;
         private final SessionHandle mSessionHandle;
         private final IUwbRangingCallbacks mExternalCb;
         private boolean mIsValid;
 
-        UwbRangingCallbacksWrapper(@NonNull SessionHandle sessionHandle,
+        UwbRangingCallbacksWrapper(@NonNull AttributionSource attributionSource,
+                @NonNull SessionHandle sessionHandle,
                 @NonNull IUwbRangingCallbacks externalCb) {
+            mAttributionSource = attributionSource;
             mSessionHandle = sessionHandle;
             mExternalCb = externalCb;
             mIsValid = true;
@@ -167,7 +171,12 @@
                 RangingReport rangingReport)
                 throws RemoteException {
             if (!mIsValid) return;
-            // TODO: Perform permission checks and noteOp.
+            if (!mUwbInjector.checkUwbRangingPermissionForDataDelivery(
+                    mAttributionSource, "uwb ranging result")) {
+                Log.e(TAG, "Not delivering ranging result because of permission denial"
+                        + mSessionHandle);
+                return;
+            }
             mExternalCb.onRangingResult(sessionHandle, rangingReport);
         }
 
@@ -229,60 +238,85 @@
         mUwbInjector = uwbInjector;
     }
 
+    private void enforceUwbPrivilegedPermission() {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.UWB_PRIVILEGED,
+                "UwbService");
+    }
+
     @Override
     public void registerAdapterStateCallbacks(IUwbAdapterStateCallbacks adapterStateCallbacks)
             throws RemoteException {
+        enforceUwbPrivilegedPermission();
         getVendorUwbAdapter().registerAdapterStateCallbacks(adapterStateCallbacks);
     }
 
     @Override
     public void unregisterAdapterStateCallbacks(IUwbAdapterStateCallbacks adapterStateCallbacks)
             throws RemoteException {
+        enforceUwbPrivilegedPermission();
         getVendorUwbAdapter().unregisterAdapterStateCallbacks(adapterStateCallbacks);
     }
 
     @Override
     public long getTimestampResolutionNanos() throws RemoteException {
+        enforceUwbPrivilegedPermission();
         return getVendorUwbAdapter().getTimestampResolutionNanos();
     }
 
     @Override
     public PersistableBundle getSpecificationInfo() throws RemoteException {
+        enforceUwbPrivilegedPermission();
         return getVendorUwbAdapter().getSpecificationInfo();
     }
 
     @Override
-    public void openRanging(SessionHandle sessionHandle, IUwbRangingCallbacks rangingCallbacks,
+    public void openRanging(AttributionSource attributionSource,
+            SessionHandle sessionHandle, IUwbRangingCallbacks rangingCallbacks,
             PersistableBundle parameters) throws RemoteException {
+        enforceUwbPrivilegedPermission();
+        mUwbInjector.enforceUwbRangingPermissionForPreflight(attributionSource);
+
         UwbRangingCallbacksWrapper wrapperCb =
-                new UwbRangingCallbacksWrapper(sessionHandle, rangingCallbacks);
+                new UwbRangingCallbacksWrapper(attributionSource, sessionHandle, rangingCallbacks);
         synchronized (mCallbacksMap) {
             mCallbacksMap.put(sessionHandle, wrapperCb);
         }
-        getVendorUwbAdapter().openRanging(sessionHandle, wrapperCb, parameters);
+        getVendorUwbAdapter().openRanging(attributionSource, sessionHandle, wrapperCb, parameters);
     }
 
     @Override
     public void startRanging(SessionHandle sessionHandle, PersistableBundle parameters)
             throws RemoteException {
-        // TODO: Perform permission checks.
+        enforceUwbPrivilegedPermission();
         getVendorUwbAdapter().startRanging(sessionHandle, parameters);
     }
 
     @Override
     public void reconfigureRanging(SessionHandle sessionHandle, PersistableBundle parameters)
             throws RemoteException {
+        enforceUwbPrivilegedPermission();
         getVendorUwbAdapter().reconfigureRanging(sessionHandle, parameters);
     }
 
     @Override
     public void stopRanging(SessionHandle sessionHandle) throws RemoteException {
+        enforceUwbPrivilegedPermission();
         getVendorUwbAdapter().stopRanging(sessionHandle);
     }
 
     @Override
     public void closeRanging(SessionHandle sessionHandle) throws RemoteException {
+        enforceUwbPrivilegedPermission();
         getVendorUwbAdapter().closeRanging(sessionHandle);
     }
 
+    @Override
+    public synchronized int getAdapterState() throws RemoteException {
+        return getVendorUwbAdapter().getAdapterState();
+    }
+
+    @Override
+    public synchronized void setEnabled(boolean enabled) throws RemoteException {
+        getVendorUwbAdapter().setEnabled(enabled);
+    }
 }
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index ba7aaab..3fbd40f 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -65,7 +65,6 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -235,19 +234,32 @@
             Slog.d(TAG, "startListeningFromMic");
         }
 
-        AudioRecord audioRecord = createMicAudioRecord(audioFormat);
-        if (audioRecord == null) {
-            // TODO: Callback.onError();
-            return;
-        }
+        // TODO: consider making this a non-anonymous class.
+        IDspHotwordDetectionCallback internalCallback = new IDspHotwordDetectionCallback.Stub() {
+            @Override
+            public void onDetected(HotwordDetectedResult result) throws RemoteException {
+                if (DEBUG) {
+                    Slog.d(TAG, "onDetected");
+                }
+                callback.onDetected(result, null, null);
+            }
 
-        handleSoftwareHotwordDetection(
-                audioFormat,
-                AudioReader.createFromAudioRecord(audioRecord),
-                AUDIO_SOURCE_MICROPHONE,
-                // TODO: handle bundles better.
-                new PersistableBundle(),
-                callback);
+            @Override
+            public void onRejected(HotwordRejectedResult result) throws RemoteException {
+                if (DEBUG) {
+                    Slog.d(TAG, "onRejected");
+                }
+                // onRejected isn't allowed here
+            }
+        };
+
+        mRemoteHotwordDetectionService.run(
+                service -> service.detectFromMicrophoneSource(
+                        null,
+                        AUDIO_SOURCE_MICROPHONE,
+                        null,
+                        null,
+                        internalCallback));
     }
 
     public void startListeningFromExternalSource(
@@ -284,55 +296,52 @@
         }
     }
 
+    void triggerHardwareRecognitionEventForTestLocked(
+            SoundTrigger.KeyphraseRecognitionEvent event,
+            IHotwordRecognitionStatusCallback callback) {
+        if (DEBUG) {
+            Slog.d(TAG, "triggerHardwareRecognitionEventForTestLocked");
+        }
+        detectFromDspSourceForTest(event, callback);
+    }
+
+    private void detectFromDspSourceForTest(SoundTrigger.KeyphraseRecognitionEvent recognitionEvent,
+            IHotwordRecognitionStatusCallback externalCallback) {
+        if (DEBUG) {
+            Slog.d(TAG, "detectFromDspSourceForTest");
+        }
+        IDspHotwordDetectionCallback internalCallback = new IDspHotwordDetectionCallback.Stub() {
+            @Override
+            public void onDetected(HotwordDetectedResult result) throws RemoteException {
+                if (DEBUG) {
+                    Slog.d(TAG, "onDetected");
+                }
+                externalCallback.onKeyphraseDetected(recognitionEvent);
+            }
+
+            @Override
+            public void onRejected(HotwordRejectedResult result) throws RemoteException {
+                if (DEBUG) {
+                    Slog.d(TAG, "onRejected");
+                }
+                externalCallback.onRejected(result);
+            }
+        };
+
+        mRemoteHotwordDetectionService.run(
+                service -> service.detectFromDspSource(
+                        recognitionEvent,
+                        recognitionEvent.getCaptureFormat(),
+                        VALIDATION_TIMEOUT_MILLIS,
+                        internalCallback));
+    }
+
     private void detectFromDspSource(SoundTrigger.KeyphraseRecognitionEvent recognitionEvent,
             IHotwordRecognitionStatusCallback externalCallback) {
         if (DEBUG) {
             Slog.d(TAG, "detectFromDspSource");
         }
 
-        AudioRecord record = createAudioRecord(recognitionEvent);
-
-        Pair<ParcelFileDescriptor, ParcelFileDescriptor> clientPipe = createPipe();
-
-        if (clientPipe == null) {
-            // Error.
-            // Need to propagate as unknown error or something?
-            return;
-        }
-        ParcelFileDescriptor audioSink = clientPipe.second;
-        ParcelFileDescriptor clientRead = clientPipe.first;
-
-        record.startRecording();
-
-        mAudioCopyExecutor.execute(() -> {
-            try (OutputStream fos =
-                         new ParcelFileDescriptor.AutoCloseOutputStream(audioSink)) {
-                byte[] buffer = new byte[1024];
-
-                while (true) {
-                    int bytesRead = record.read(buffer, 0, 1024);
-
-                    if (bytesRead < 0) {
-                        break;
-                    }
-
-                    fos.write(buffer, 0, bytesRead);
-                }
-            } catch (IOException e) {
-                Slog.w(TAG, "Failed supplying audio data to validator", e);
-            }
-        });
-
-        Runnable cancellingJob = () -> {
-            record.stop();
-            bestEffortClose(audioSink);
-            // TODO: consider calling externalCallback.onRejected(ERROR_TIMEOUT).
-        };
-
-        ScheduledFuture<?> cancelingFuture =
-                mScheduledExecutorService.schedule(
-                        cancellingJob, VALIDATION_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
-
         // TODO: consider making this a non-anonymous class.
         IDspHotwordDetectionCallback internalCallback = new IDspHotwordDetectionCallback.Stub() {
             @Override
@@ -340,18 +349,6 @@
                 if (DEBUG) {
                     Slog.d(TAG, "onDetected");
                 }
-                bestEffortClose(audioSink);
-                cancelingFuture.cancel(true);
-
-                // Give 2 more seconds for the interactor to start consuming the mic. If it fails to
-                // do so under the given time, we'll force-close the mic to make sure resources are
-                // freed up.
-                // TODO: consider modelling these 2 seconds in the API.
-                mScheduledExecutorService.schedule(
-                        cancellingJob,
-                        VOICE_INTERACTION_TIMEOUT_TO_OPEN_MIC_MILLIS,
-                        TimeUnit.MILLISECONDS);
-
                 // TODO: Propagate the HotwordDetectedResult.
                 externalCallback.onKeyphraseDetected(recognitionEvent);
             }
@@ -361,18 +358,16 @@
                 if (DEBUG) {
                     Slog.d(TAG, "onRejected");
                 }
-                cancelingFuture.cancel(true);
                 externalCallback.onRejected(result);
             }
         };
 
         mRemoteHotwordDetectionService.run(
                 service -> service.detectFromDspSource(
-                        clientRead,
+                        recognitionEvent,
                         recognitionEvent.getCaptureFormat(),
                         VALIDATION_TIMEOUT_MILLIS,
                         internalCallback));
-        bestEffortClose(clientRead);
     }
 
     static final class SoundTriggerCallback extends IRecognitionStatusCallback.Stub {
@@ -470,6 +465,37 @@
         }
     }
 
+    @Nullable
+    private AudioRecord createFakeAudioRecord() {
+        if (DEBUG) {
+            Slog.i(TAG, "#createFakeAudioRecord");
+        }
+        try {
+            AudioRecord audioRecord = new AudioRecord.Builder()
+                    .setAudioFormat(new AudioFormat.Builder()
+                            .setSampleRate(32000)
+                            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+                            .setChannelMask(AudioFormat.CHANNEL_IN_MONO).build())
+                    .setAudioAttributes(new AudioAttributes.Builder()
+                            .setInternalCapturePreset(MediaRecorder.AudioSource.HOTWORD).build())
+                    .setBufferSizeInBytes(
+                            AudioRecord.getMinBufferSize(32000,
+                                    AudioFormat.CHANNEL_IN_MONO,
+                                    AudioFormat.ENCODING_PCM_16BIT) * 2)
+                    .build();
+
+            if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
+                Slog.w(TAG, "Failed to initialize AudioRecord");
+                audioRecord.release();
+                return null;
+            }
+            return audioRecord;
+        } catch (IllegalArgumentException e) {
+            Slog.e(TAG, "Failed to create AudioRecord", e);
+        }
+        return null;
+    }
+
     /**
      * Returns the number of bytes required to store {@code bufferLengthSeconds} of audio sampled at
      * {@code sampleRate} Hz, using the format returned by DSP audio capture.
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 9aded89..92cfe49 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -1130,6 +1130,29 @@
             }
         }
 
+        @Override
+        public void triggerHardwareRecognitionEventForTest(
+                SoundTrigger.KeyphraseRecognitionEvent event,
+                IHotwordRecognitionStatusCallback callback)
+                throws RemoteException {
+            enforceCallingPermission(Manifest.permission.RECORD_AUDIO);
+            enforceCallingPermission(Manifest.permission.CAPTURE_AUDIO_HOTWORD);
+            synchronized (this) {
+                enforceIsCurrentVoiceInteractionService();
+
+                if (mImpl == null) {
+                    Slog.w(TAG, "triggerHardwareRecognitionEventForTest without running"
+                            + " voice interaction service");
+                    return;
+                }
+                final long caller = Binder.clearCallingIdentity();
+                try {
+                    mImpl.triggerHardwareRecognitionEventForTestLocked(event, callback);
+                } finally {
+                    Binder.restoreCallingIdentity(caller);
+                }
+            }
+        }
         //----------------- Model management APIs --------------------------------//
 
         @Override
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
index 6922ccc..0552841 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
@@ -40,6 +40,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
 import android.hardware.soundtrigger.IRecognitionStatusCallback;
+import android.hardware.soundtrigger.SoundTrigger;
 import android.media.AudioFormat;
 import android.os.Bundle;
 import android.os.Handler;
@@ -493,6 +494,20 @@
         mHotwordDetectionConnection.stopListening();
     }
 
+    public void triggerHardwareRecognitionEventForTestLocked(
+            SoundTrigger.KeyphraseRecognitionEvent event,
+            IHotwordRecognitionStatusCallback callback) {
+        if (DEBUG) {
+            Slog.d(TAG, "triggerHardwareRecognitionEventForTestLocked");
+        }
+        if (mHotwordDetectionConnection == null) {
+            Slog.w(TAG, "triggerHardwareRecognitionEventForTestLocked() called but connection"
+                    + " isn't established");
+            return;
+        }
+        mHotwordDetectionConnection.triggerHardwareRecognitionEventForTestLocked(event, callback);
+    }
+
     public IRecognitionStatusCallback createSoundTriggerCallbackLocked(
             IHotwordRecognitionStatusCallback callback) {
         if (DEBUG) {
diff --git a/telecomm/java/android/telecom/BluetoothCallQualityReport.java b/telecomm/java/android/telecom/BluetoothCallQualityReport.java
index 8703d84..78dba6a 100644
--- a/telecomm/java/android/telecom/BluetoothCallQualityReport.java
+++ b/telecomm/java/android/telecom/BluetoothCallQualityReport.java
@@ -66,7 +66,9 @@
     }
 
     /**
-     * @return {@code true} if bluetooth hardware detects voice is choppy
+     * When the bluetooth controller detects factors that cause choppy voice,
+     * the controller reports an (e)SCO Voice Choppy event to the host
+     * @return {@code true} when we receive (e)SCO Voice Choppy event from the controller
      */
     public boolean isChoppyVoice() {
         return mChoppyVoice;
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index d8bd6a5..c5fc436 100755
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -3448,4 +3448,13 @@
     public Handler getHandler() {
         return mHandler;
     }
+
+    /**
+     * Sets this {@link ConnectionService} ready for testing purposes.
+     * @hide
+     */
+    @VisibleForTesting
+    public void setReadyForTest() {
+        mAreAccountsInitialized = true;
+    }
 }
diff --git a/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java b/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java
index 179248d..33b0bbd2 100644
--- a/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java
+++ b/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java
@@ -81,6 +81,15 @@
     }
 
     /**
+     * @return true if the SIP message start line is considered a response.
+     */
+    public static boolean isSipResponse(String startLine) {
+        String[] splitLine = splitStartLineAndVerify(startLine);
+        if (splitLine == null) return false;
+        return verifySipResponse(splitLine);
+    }
+
+    /**
      * Return the via branch parameter, which is used to identify the transaction ID (request and
      * response pair) in a SIP transaction.
      * @param headerString The string containing the headers of the SIP message.
@@ -140,7 +149,12 @@
         return !headers.isEmpty() ? headers.get(0).second : null;
     }
 
-    private static String[] splitStartLineAndVerify(String startLine) {
+    /**
+     * Validate that the start line is correct and split into its three segments.
+     * @param startLine The start line to verify and split.
+     * @return The split start line, which will always have three segments.
+     */
+    public static String[] splitStartLineAndVerify(String startLine) {
         String[] splitLine = startLine.split(" ");
         if (isStartLineMalformed(splitLine)) return null;
         return splitLine;
@@ -184,7 +198,7 @@
      *                           (This is internally an equalsIgnoreMatch comparison).
      * @return the matched header keys and values.
      */
-    private static List<Pair<String, String>> parseHeaders(String headerString,
+    public static List<Pair<String, String>> parseHeaders(String headerString,
             boolean stopAtFirstMatch, String... matchingHeaderKeys) {
         // Ensure there is no leading whitespace
         headerString = removeLeadingWhitespace(headerString);
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index d250297..d361db2 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -482,64 +482,25 @@
     public static boolean checkReadPhoneNumber(
             Context context, int subId, int pid, int uid,
             String callingPackage, @Nullable String callingFeatureId, String message) {
-        // First, check if the SDK version is below R
-        boolean preR = false;
-        try {
-            ApplicationInfo info = context.getPackageManager().getApplicationInfoAsUser(
-                    callingPackage, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
-            preR = info.targetSdkVersion <= Build.VERSION_CODES.Q;
-        } catch (PackageManager.NameNotFoundException nameNotFoundException) {
-        }
-        if (preR) {
-            // SDK < R allows READ_PHONE_STATE, READ_PRIVILEGED_PHONE_STATE, or carrier privilege
-            try {
-                return checkReadPhoneState(
-                        context, subId, pid, uid, callingPackage, callingFeatureId, message);
-            } catch (SecurityException readPhoneStateException) {
-            }
-        } else {
-            // SDK >= R allows READ_PRIVILEGED_PHONE_STATE or carrier privilege
-            try {
-                context.enforcePermission(
-                        android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid, uid, message);
-                // Skip checking for runtime permission since caller has privileged permission
-                return true;
-            } catch (SecurityException readPrivilegedPhoneStateException) {
-                if (SubscriptionManager.isValidSubscriptionId(subId)) {
-                    try {
-                        enforceCarrierPrivilege(context, subId, uid, message);
-                        // Skip checking for runtime permission since caller has carrier privilege
-                        return true;
-                    } catch (SecurityException carrierPrivilegeException) {
-                    }
-                }
-            }
-        }
-
-        // Default SMS app can always read it.
-        AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
-        if (appOps.noteOp(AppOpsManager.OPSTR_WRITE_SMS, uid, callingPackage, callingFeatureId,
-                null) == AppOpsManager.MODE_ALLOWED) {
+        LegacyPermissionManager permissionManager = (LegacyPermissionManager)
+                context.getSystemService(Context.LEGACY_PERMISSION_SERVICE);
+        // Apps with target SDK version < R can have the READ_PHONE_STATE permission granted with
+        // the appop denied. If PERMISSION_GRANTED is not received then check if the caller has
+        // carrier privileges; if not and the permission result is MODE_IGNORED then return false
+        // to return null data to the caller.
+        int permissionResult = permissionManager.checkPhoneNumberAccess(callingPackage, message,
+                callingFeatureId, pid, uid);
+        if (permissionResult == PackageManager.PERMISSION_GRANTED) {
             return true;
         }
-        // Can be read with READ_SMS too.
-        try {
-            context.enforcePermission(android.Manifest.permission.READ_SMS, pid, uid, message);
-            if (appOps.noteOp(AppOpsManager.OPSTR_READ_SMS, uid, callingPackage,
-                    callingFeatureId, null) == AppOpsManager.MODE_ALLOWED) {
+        if (SubscriptionManager.isValidSubscriptionId(subId)) {
+            if (TelephonyPermissions.getCarrierPrivilegeStatus(context, subId, uid)
+                    == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
                 return true;
             }
-        } catch (SecurityException readSmsSecurityException) {
         }
-        // Can be read with READ_PHONE_NUMBERS too.
-        try {
-            context.enforcePermission(android.Manifest.permission.READ_PHONE_NUMBERS, pid, uid,
-                    message);
-            if (appOps.noteOp(AppOpsManager.OPSTR_READ_PHONE_NUMBERS, uid, callingPackage,
-                    callingFeatureId, null) == AppOpsManager.MODE_ALLOWED) {
-                return true;
-            }
-        } catch (SecurityException readPhoneNumberSecurityException) {
+        if (permissionResult == AppOpsManager.MODE_IGNORED) {
+            return false;
         }
 
         throw new SecurityException(message + ": Neither user " + uid
diff --git a/telephony/java/android/telephony/CarrierBandwidth.java b/telephony/java/android/telephony/CarrierBandwidth.java
deleted file mode 100644
index 9e1dee0..0000000
--- a/telephony/java/android/telephony/CarrierBandwidth.java
+++ /dev/null
@@ -1,226 +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.telephony;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresFeature;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * Defines downlink and uplink capacity of a network in kbps
- * @hide
- */
-@SystemApi
-public final class CarrierBandwidth implements Parcelable {
-    /**
-     * Any field that is not reported shall be set to INVALID
-     */
-    public static final int INVALID = -1;
-
-    /**
-     * Estimated downlink capacity in kbps of the primary carrier.
-     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
-     * This will be {@link #INVALID} if the network is not connected
-     */
-    private int mPrimaryDownlinkCapacityKbps;
-
-    /**
-     * Estimated uplink capacity in kbps of the primary carrier.
-     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
-     * This will be {@link #INVALID} if the network is not connected
-     */
-    private int mPrimaryUplinkCapacityKbps;
-
-    /**
-     * Estimated downlink capacity in kbps of the secondary carrier in a dual connected network.
-     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
-     * This will be {@link #INVALID} if the network is not connected
-     */
-    private int mSecondaryDownlinkCapacityKbps;
-
-    /**
-     * Estimated uplink capacity in kbps of the secondary carrier in a dual connected network.
-     * This bandwidth estimate shall be the estimated maximum sustainable link bandwidth.
-     * This will be {@link #INVALID} if the network is not connected
-     */
-    private int mSecondaryUplinkCapacityKbps;
-
-    /** @hide **/
-    public CarrierBandwidth(Parcel in) {
-        mPrimaryDownlinkCapacityKbps = in.readInt();
-        mPrimaryUplinkCapacityKbps = in.readInt();
-        mSecondaryDownlinkCapacityKbps = in.readInt();
-        mSecondaryUplinkCapacityKbps = in.readInt();
-    }
-
-    /** @hide **/
-    public CarrierBandwidth() {
-        mPrimaryDownlinkCapacityKbps = INVALID;
-        mPrimaryUplinkCapacityKbps = INVALID;
-        mSecondaryDownlinkCapacityKbps = INVALID;
-        mSecondaryUplinkCapacityKbps = INVALID;
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param primaryDownlinkCapacityKbps Estimated downlink capacity in kbps of
-     *        the primary carrier.
-     * @param primaryUplinkCapacityKbps Estimated uplink capacity in kbps of
-     *        the primary carrier.
-     * @param secondaryDownlinkCapacityKbps Estimated downlink capacity in kbps of
-     *        the secondary carrier
-     * @param secondaryUplinkCapacityKbps Estimated uplink capacity in kbps of
-     *        the secondary carrier
-     */
-    public CarrierBandwidth(int primaryDownlinkCapacityKbps, int primaryUplinkCapacityKbps,
-            int secondaryDownlinkCapacityKbps, int secondaryUplinkCapacityKbps) {
-        mPrimaryDownlinkCapacityKbps = primaryDownlinkCapacityKbps;
-        mPrimaryUplinkCapacityKbps = primaryUplinkCapacityKbps;
-        mSecondaryDownlinkCapacityKbps = secondaryDownlinkCapacityKbps;
-        mSecondaryUplinkCapacityKbps = secondaryUplinkCapacityKbps;
-    }
-
-    /**
-     * Retrieves the upstream bandwidth for the primary network in kbps.  This always only refers to
-     * the estimated first hop transport bandwidth.
-     * This will be {@link #INVALID} if the network is not connected
-     *
-     * @return The estimated first hop upstream (device to network) bandwidth.
-     */
-    public int getPrimaryDownlinkCapacityKbps() {
-        return mPrimaryDownlinkCapacityKbps;
-    }
-
-    /**
-     * Retrieves the downstream bandwidth for the primary network in kbps.  This always only refers
-     * to the estimated first hop transport bandwidth.
-     * This will be {@link #INVALID} if the network is not connected
-     *
-     * @return The estimated first hop downstream (network to device) bandwidth.
-     */
-    public int getPrimaryUplinkCapacityKbps() {
-        return mPrimaryUplinkCapacityKbps;
-    }
-
-    /**
-     * Retrieves the upstream bandwidth for the secondary network in kbps.  This always only refers
-     * to the estimated first hop transport bandwidth.
-     * <p/>
-     * This will be {@link #INVALID} if either are the case:
-     * <ol>
-     *  <li>The network is not connected</li>
-     *  <li>The device does not support
-     * {@link android.telephony.TelephonyManager#CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE}.</li>
-     * </ol>
-     *
-     * @return The estimated first hop upstream (device to network) bandwidth.
-     */
-    @RequiresFeature(
-            enforcement = "android.telephony.TelephonyManager#isRadioInterfaceCapabilitySupported",
-            value = TelephonyManager.CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE)
-    public int getSecondaryDownlinkCapacityKbps() {
-        return mSecondaryDownlinkCapacityKbps;
-    }
-
-    /**
-     * Retrieves the downstream bandwidth for the secondary network in kbps.  This always only
-     * refers to the estimated first hop transport bandwidth.
-     * <p/>
-     * This will be {@link #INVALID} if either are the case:
-     * <ol>
-     *  <li>The network is not connected</li>
-     *  <li>The device does not support
-     * {@link android.telephony.TelephonyManager#CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE}.</li>
-     * </ol>
-     * @return The estimated first hop downstream (network to device) bandwidth.
-     */
-    @RequiresFeature(
-            enforcement = "android.telephony.TelephonyManager#isRadioInterfaceCapabilitySupported",
-            value = TelephonyManager.CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE)
-    public int getSecondaryUplinkCapacityKbps() {
-        return mSecondaryUplinkCapacityKbps;
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return "CarrierBandwidth: {primaryDownlinkCapacityKbps=" + mPrimaryDownlinkCapacityKbps
-                + " primaryUplinkCapacityKbps=" + mPrimaryUplinkCapacityKbps
-                + " secondaryDownlinkCapacityKbps=" + mSecondaryDownlinkCapacityKbps
-                + " secondaryUplinkCapacityKbps=" + mSecondaryUplinkCapacityKbps
-                + "}";
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(
-                mPrimaryDownlinkCapacityKbps,
-                mPrimaryUplinkCapacityKbps,
-                mSecondaryDownlinkCapacityKbps,
-                mSecondaryUplinkCapacityKbps);
-    }
-
-    @Override
-    public boolean equals(@Nullable Object o) {
-        if (o == null || !(o instanceof CallQuality) || hashCode() != o.hashCode()) {
-            return false;
-        }
-        if (this == o) {
-            return true;
-        }
-        CarrierBandwidth s = (CarrierBandwidth) o;
-        return (mPrimaryDownlinkCapacityKbps == s.mPrimaryDownlinkCapacityKbps
-                && mPrimaryUplinkCapacityKbps == s.mPrimaryUplinkCapacityKbps
-                && mSecondaryDownlinkCapacityKbps == s.mSecondaryDownlinkCapacityKbps
-                && mSecondaryDownlinkCapacityKbps == s.mSecondaryDownlinkCapacityKbps);
-    }
-
-    /**
-     * {@link Parcelable#describeContents}
-     */
-    public int describeContents() {
-        return 0;
-    }
-
-    /**
-     * {@link Parcelable#writeToParcel}
-     * @hide
-     */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mPrimaryDownlinkCapacityKbps);
-        dest.writeInt(mPrimaryUplinkCapacityKbps);
-        dest.writeInt(mSecondaryDownlinkCapacityKbps);
-        dest.writeInt(mSecondaryUplinkCapacityKbps);
-    }
-
-    public static final @android.annotation.NonNull Parcelable.Creator<CarrierBandwidth> CREATOR =
-            new Parcelable.Creator() {
-            public CarrierBandwidth createFromParcel(Parcel in) {
-                return new CarrierBandwidth(in);
-            }
-
-            public CarrierBandwidth[] newArray(int size) {
-                return new CarrierBandwidth[size];
-            }
-    };
-}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 8b9fc0f..5716a1d79 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -4929,6 +4929,14 @@
     public static final String KEY_DISPLAY_NO_DATA_NOTIFICATION_ON_PERMANENT_FAILURE_BOOL =
             "display_no_data_notification_on_permanent_failure_bool";
 
+    /**
+     * Determine whether unthrottle data retry when tracking area code (TAC/LAC) from cell changes
+     *
+     * @hide
+     */
+    public static final String KEY_UNTHROTTLE_DATA_RETRY_WHEN_TAC_CHANGES_BOOL =
+            "unthrottle_data_retry_when_tac_changes_bool";
+
     /** The default value for every variable. */
     private final static PersistableBundle sDefaults;
 
@@ -5069,6 +5077,7 @@
                         + "320000:5000,640000:5000,1280000:5000,1800000:5000",
                 "mms:default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000,"
                         + "320000:5000,640000:5000,1280000:5000,1800000:5000",
+                "ims:max_retries=10, 5000, 5000, 5000",
                 "others:max_retries=3, 5000, 5000, 5000"});
         sDefaults.putLong(KEY_CARRIER_DATA_CALL_APN_DELAY_DEFAULT_LONG, 20000);
         sDefaults.putLong(KEY_CARRIER_DATA_CALL_APN_DELAY_FASTER_LONG, 3000);
@@ -5508,6 +5517,7 @@
         sDefaults.putBoolean(KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL, true);
         sDefaults.putString(KEY_CARRIER_PROVISIONING_APP_STRING, "");
         sDefaults.putBoolean(KEY_DISPLAY_NO_DATA_NOTIFICATION_ON_PERMANENT_FAILURE_BOOL, false);
+        sDefaults.putBoolean(KEY_UNTHROTTLE_DATA_RETRY_WHEN_TAC_CHANGES_BOOL, false);
     }
 
     /**
diff --git a/telephony/java/android/telephony/CellIdentityNr.java b/telephony/java/android/telephony/CellIdentityNr.java
index 2d2420d..cdd54cd 100644
--- a/telephony/java/android/telephony/CellIdentityNr.java
+++ b/telephony/java/android/telephony/CellIdentityNr.java
@@ -118,7 +118,7 @@
     @Override
     public @NonNull CellIdentityNr sanitizeLocationInfo() {
         return new CellIdentityNr(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, mNrArfcn,
-                mBands, mMccStr, mMncStr, CellInfo.UNAVAILABLE, mAlphaLong, mAlphaShort,
+                mBands, mMccStr, mMncStr, CellInfo.UNAVAILABLE_LONG, mAlphaLong, mAlphaShort,
                 mAdditionalPlmns);
     }
 
diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java
index 3b28616..8df41fb 100644
--- a/telephony/java/android/telephony/PhysicalChannelConfig.java
+++ b/telephony/java/android/telephony/PhysicalChannelConfig.java
@@ -183,16 +183,6 @@
     }
 
     /**
-     * @return the absolute radio frequency channel number for this physical channel,
-     * {@link #CHANNEL_NUMBER_UNKNOWN} if unknown.
-     * @deprecated Use {@link #getDownlinkChannelNumber()} to get the channel number.
-     */
-    @Deprecated
-    public int getChannelNumber() {
-        return getDownlinkChannelNumber();
-    }
-
-    /**
      * @return the rough frequency range for this physical channel,
      * {@link ServiceState#FREQUENCY_RANGE_UNKNOWN} if unknown.
      * @see {@link ServiceState#FREQUENCY_RANGE_LOW}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 8475cab..05f5d29 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -9147,7 +9147,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("RequiresPermission")
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public int checkCarrierPrivilegesForPackage(String pkgName) {
         try {
             ITelephony telephony = getITelephony();
@@ -9163,7 +9163,7 @@
 
     /** @hide */
     @SystemApi
-    @SuppressLint("RequiresPermission")
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) {
         try {
             ITelephony telephony = getITelephony();
@@ -9185,6 +9185,7 @@
 
     /** @hide */
     @SystemApi
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public List<String> getCarrierPackageNamesForIntentAndPhone(Intent intent, int phoneId) {
         try {
             ITelephony telephony = getITelephony();
@@ -9199,6 +9200,7 @@
     }
 
     /** @hide */
+    @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     public List<String> getPackagesWithCarrierPrivileges() {
         try {
             ITelephony telephony = getITelephony();
@@ -11746,26 +11748,26 @@
     }
 
     /**
-     * Return a list of certs in hex string from loaded carrier privileges access rules.
+     * Return a list of certs as hex strings from loaded carrier privileges access rules.
      *
-     * @return a list of certificate in hex string. return {@code null} if there is no certs
-     * or privilege rules are not loaded yet.
-     *
-     * <p>Requires Permission:
-     * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE}
+     * @return a list of certificates as hex strings, or an empty list if there are no certs or
+     *     privilege rules are not loaded yet.
      * @hide
      */
+    @TestApi
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+    @NonNull
     public List<String> getCertsFromCarrierPrivilegeAccessRules() {
+        List<String> certs = null;
         try {
             ITelephony service = getITelephony();
             if (service != null) {
-                return service.getCertsFromCarrierPrivilegeAccessRules(getSubId());
+                certs = service.getCertsFromCarrierPrivilegeAccessRules(getSubId());
             }
         } catch (RemoteException ex) {
             // This could happen if binder process crashes.
         }
-        return null;
+        return certs == null ? Collections.emptyList() : certs;
     }
 
     /**
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index 08f5613..8b6f2b5 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -1568,16 +1568,6 @@
     }
 
     /**
-     * Same as {@link #getApnTypeString(int)}, but returns "Unknown" instead of an empty string
-     * when provided with an invalid int for compatibility purposes.
-     * @hide
-     */
-    public static @NonNull String getApnTypeStringInternal(@ApnType int apnType) {
-        String result = getApnTypeString(apnType);
-        return TextUtils.isEmpty(result) ? "Unknown" : result;
-    }
-
-    /**
      * Converts the string representation of an APN type to its integer representation.
      *
      * @param apnType APN type as a string
diff --git a/telephony/java/android/telephony/data/TrafficDescriptor.java b/telephony/java/android/telephony/data/TrafficDescriptor.java
index f400a5e..2178fc1 100644
--- a/telephony/java/android/telephony/data/TrafficDescriptor.java
+++ b/telephony/java/android/telephony/data/TrafficDescriptor.java
@@ -125,7 +125,6 @@
      *     .build();
      * </code></pre>
      *
-     * @hide
      */
     public static final class Builder {
         private String mDnn = null;
diff --git a/telephony/java/android/telephony/ims/DelegateStateCallback.java b/telephony/java/android/telephony/ims/DelegateStateCallback.java
index 6bf992e..2b4fb7d 100644
--- a/telephony/java/android/telephony/ims/DelegateStateCallback.java
+++ b/telephony/java/android/telephony/ims/DelegateStateCallback.java
@@ -79,10 +79,30 @@
      * messages routing should be delayed until the {@link SipDelegate} sends the IMS configuration
      * change event to reduce conditions where the remote application is using a stale IMS
      * configuration.
+     * @deprecated This is being removed from API surface, Use
+     * {@link #onConfigurationChanged(SipDelegateConfiguration)} instead.
      */
+    @Deprecated
     void onImsConfigurationChanged(@NonNull SipDelegateImsConfiguration config);
 
     /**
+     * Call to notify the remote application of a configuration change associated with this
+     * {@link SipDelegate}.
+     * <p>
+     * The remote application will not be able to proceed sending SIP messages until after this
+     * configuration is sent the first time, so this configuration should be sent as soon as the
+     * {@link SipDelegate} has access to these configuration parameters.
+     * <p>
+     * Incoming SIP messages should not be routed to the remote application until AFTER this
+     * configuration change is sent to ensure that the remote application can respond correctly.
+     * Similarly, if there is an event that triggers the IMS configuration to change, incoming SIP
+     * messages routing should be delayed until the {@link SipDelegate} sends the IMS configuration
+     * change event to reduce conditions where the remote application is using a stale IMS
+     * configuration.
+     */
+    void onConfigurationChanged(@NonNull SipDelegateConfiguration config);
+
+    /**
      * Call to notify the remote application that the {@link SipDelegate} has modified the IMS
      * registration state of the RCS feature tags that were requested as part of the initial
      * {@link DelegateRequest}.
diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java
index 4b28296..7ba6f36 100644
--- a/telephony/java/android/telephony/ims/ImsMmTelManager.java
+++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java
@@ -714,15 +714,8 @@
      * @see android.telephony.CarrierConfigManager#KEY_CARRIER_IMS_GBA_REQUIRED_BOOL
      * @see #isAvailable(int, int)
      *
-     * @param imsRegTech The IMS registration technology, can be one of the following:
-     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE},
-     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM},
-     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
-     * @param capability The IMS MmTel capability to query, can be one of the following:
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO},
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT},
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS}
+     * @param imsRegTech The IMS registration technology.
+     * @param capability The IMS MmTel capability to query.
      * @return {@code true} if the MmTel IMS capability is capable for this subscription, false
      *         otherwise.
      * @hide
@@ -749,15 +742,8 @@
      *
      * @see #isCapable(int, int)
      *
-     * @param imsRegTech The IMS registration technology, can be one of the following:
-     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE},
-     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM},
-     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
-     * @param capability The IMS MmTel capability to query, can be one of the following:
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO},
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT},
-     *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS}
+     * @param imsRegTech The IMS registration technology.
+     * @param capability The IMS MmTel capability to query.
      * @return {@code true} if the MmTel IMS capability is available for this subscription, false
      *         otherwise.
      * @hide
diff --git a/telephony/java/android/telephony/ims/RcsConfig.java b/telephony/java/android/telephony/ims/RcsConfig.java
index d7c3f98..6867c86 100644
--- a/telephony/java/android/telephony/ims/RcsConfig.java
+++ b/telephony/java/android/telephony/ims/RcsConfig.java
@@ -22,10 +22,10 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
 import android.provider.Telephony.SimInfo;
 import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
 
 import com.android.telephony.Rlog;
 
@@ -36,7 +36,9 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 
@@ -44,27 +46,138 @@
  * RCS config data and methods to process the config
  * @hide
  */
-public final class RcsConfig implements Parcelable {
+public final class RcsConfig {
     private static final String LOG_TAG = "RcsConfig";
     private static final boolean DBG = Build.IS_ENG;
 
     // Tag and attribute defined in RCC.07 A.2
+    private static final String TAG_CHARACTERISTIC = "characteristic";
     private static final String TAG_PARM = "parm";
+    private static final String ATTRIBUTE_TYPE = "type";
     private static final String ATTRIBUTE_NAME = "name";
     private static final String ATTRIBUTE_VALUE = "value";
     // Keyword for Rcs Volte single registration defined in RCC.07 A.1.6.2
     private static final String PARM_SINGLE_REGISTRATION = "rcsVolteSingleRegistration";
 
-    private final HashMap<String, String> mValues = new HashMap<>();
+    /**
+     * Characteristic of the RCS provisioning config
+     */
+    public static class Characteristic {
+        private String mType;
+        private final Map<String, String> mParms = new ArrayMap<>();
+        private final Set<Characteristic> mSubs = new ArraySet<>();
+        private final Characteristic mParent;
 
-    private RcsConfig(HashMap<String, String> values) {
-        mValues.putAll(values);
+        private Characteristic(String type, Characteristic parent) {
+            mType = type;
+            mParent = parent;
+        }
+
+        private String getType() {
+            return mType;
+        }
+
+        private Map<String, String> getParms() {
+            return mParms;
+        }
+
+        private Set<Characteristic> getSubs() {
+            return mSubs;
+        }
+
+        private Characteristic getParent() {
+            return mParent;
+        }
+
+        private Characteristic getSubByType(String type) {
+            if (TextUtils.equals(mType, type)) {
+                return this;
+            }
+            Characteristic result = null;
+            for (Characteristic sub : mSubs) {
+                result = sub.getSubByType(type);
+                if (result != null) {
+                    break;
+                }
+            }
+            return result;
+        }
+
+        private boolean hasSubByType(String type) {
+            return getSubByType(type) != null;
+        }
+
+        private String getParmValue(String name) {
+            String value = mParms.get(name);
+            if (value == null) {
+                for (Characteristic sub : mSubs) {
+                    value = sub.getParmValue(name);
+                    if (value != null) {
+                        break;
+                    }
+                }
+            }
+            return value;
+        }
+
+        boolean hasParm(String name) {
+            if (mParms.containsKey(name)) {
+                return true;
+            }
+
+            for (Characteristic sub : mSubs) {
+                if (sub.hasParm(name)) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        @Override
+        public String toString() {
+            final StringBuilder sb = new StringBuilder();
+            sb.append("[" + mType + "]: ");
+            if (DBG) {
+                sb.append(mParms);
+            }
+            for (Characteristic sub : mSubs) {
+                sb.append("\n");
+                sb.append(sub.toString().replace("\n", "\n\t"));
+            }
+            return sb.toString();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (!(obj instanceof Characteristic)) {
+                return false;
+            }
+
+            Characteristic o = (Characteristic) obj;
+
+            return TextUtils.equals(mType, o.mType) && mParms.equals(o.mParms)
+                    && mSubs.equals(o.mSubs);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mType, mParms, mSubs);
+        }
     }
 
+    private final Characteristic mRoot;
+    private Characteristic mCurrent;
+    private final byte[] mData;
+
     public RcsConfig(byte[] data) throws IllegalArgumentException {
         if (data == null || data.length == 0) {
             throw new IllegalArgumentException("Empty data");
         }
+        mRoot = new Characteristic(null, null);
+        mCurrent = mRoot;
+        mData = data;
+        Characteristic current = mRoot;
         ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
         try {
             XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
@@ -73,36 +186,51 @@
             xpp.setInput(inputStream, null);
             int eventType = xpp.getEventType();
             String tag = null;
-            while (eventType != XmlPullParser.END_DOCUMENT) {
+            while (eventType != XmlPullParser.END_DOCUMENT && current != null) {
                 if (eventType == XmlPullParser.START_TAG) {
                     tag = xpp.getName().trim().toLowerCase();
-                    if (tag.equals(TAG_PARM)) {
+                    if (TAG_CHARACTERISTIC.equals(tag)) {
+                        int count = xpp.getAttributeCount();
+                        String type = null;
+                        if (count > 0) {
+                            for (int i = 0; i < count; i++) {
+                                String name = xpp.getAttributeName(i).trim().toLowerCase();
+                                if (ATTRIBUTE_TYPE.equals(name)) {
+                                    type = xpp.getAttributeValue(xpp.getAttributeNamespace(i),
+                                            name).trim().toLowerCase();
+                                    break;
+                                }
+                            }
+                        }
+                        Characteristic next = new Characteristic(type, current);
+                        current.getSubs().add(next);
+                        current = next;
+                    } else if (TAG_PARM.equals(tag)) {
                         int count = xpp.getAttributeCount();
                         String key = null;
                         String value = null;
                         if (count > 1) {
                             for (int i = 0; i < count; i++) {
                                 String name = xpp.getAttributeName(i).trim().toLowerCase();
-                                if (name.equals(ATTRIBUTE_NAME)) {
+                                if (ATTRIBUTE_NAME.equals(name)) {
                                     key = xpp.getAttributeValue(xpp.getAttributeNamespace(i),
                                             name).trim().toLowerCase();
-                                } else if (name.equals(ATTRIBUTE_VALUE)) {
+                                } else if (ATTRIBUTE_VALUE.equals(name)) {
                                     value = xpp.getAttributeValue(xpp.getAttributeNamespace(i),
                                             name).trim();
                                 }
                             }
                         }
                         if (key != null && value != null) {
-                            mValues.put(key, value);
+                            current.getParms().put(key, value);
                         }
                     }
                 } else if (eventType == XmlPullParser.END_TAG) {
-                    tag = null;
-                } else if (eventType == XmlPullParser.TEXT) {
-                    String value = xpp.getText().trim();
-                    if (!TextUtils.isEmpty(tag) && !TextUtils.isEmpty(value)) {
-                        mValues.put(tag, value);
+                    tag = xpp.getName().trim().toLowerCase();
+                    if (TAG_CHARACTERISTIC.equals(tag)) {
+                        current = current.getParent();
                     }
+                    tag = null;
                 }
                 eventType = xpp.next();
             }
@@ -126,8 +254,8 @@
      * @return Returns the config value if it exists, or defaultVal.
      */
     public @Nullable String getString(@NonNull String tag, @Nullable String defaultVal) {
-        tag = tag.trim().toLowerCase();
-        return mValues.containsKey(tag) ? mValues.get(tag) : defaultVal;
+        String value = mCurrent.getParmValue(tag.trim().toLowerCase());
+        return value != null ?  value : defaultVal;
     }
 
     /**
@@ -139,9 +267,8 @@
      * @return Returns the config value if it exists and is a valid int, or defaultVal.
      */
     public int getInteger(@NonNull String tag, int defaultVal) {
-        tag = tag.trim().toLowerCase();
         try {
-            return Integer.parseInt(mValues.get(tag));
+            return Integer.parseInt(getString(tag, null));
         } catch (NumberFormatException e) {
             logd("error to getInteger for " + tag + " due to " + e);
         }
@@ -157,11 +284,8 @@
      * @return Returns the config value if it exists, or defaultVal.
      */
     public boolean getBoolean(@NonNull String tag, boolean defaultVal) {
-        tag = tag.trim().toLowerCase();
-        if (!mValues.containsKey(tag)) {
-            return defaultVal;
-        }
-        return Boolean.parseBoolean(mValues.get(tag));
+        String value = getString(tag, null);
+        return value != null ? Boolean.parseBoolean(value) : defaultVal;
     }
 
     /**
@@ -172,7 +296,62 @@
      * @return Returns true if it exists, or false.
      */
     public boolean hasConfig(@NonNull String tag) {
-        return mValues.containsKey(tag.trim().toLowerCase());
+        return mCurrent.hasParm(tag.trim().toLowerCase());
+    }
+
+    /**
+     * Return the Characteristic with the given type
+     */
+    public @Nullable Characteristic getCharacteristic(@NonNull String type) {
+        return mCurrent.getSubByType(type.trim().toLowerCase());
+    }
+
+    /**
+     * Check whether the Characteristic with the given type exists
+     */
+    public boolean hasCharacteristic(@NonNull String type) {
+        return mCurrent.getSubByType(type.trim().toLowerCase()) != null;
+    }
+
+    /**
+     * Set current Characteristic to given Characteristic
+     */
+    public void setCurrentCharacteristic(@NonNull Characteristic current) {
+        if (current != null) {
+            mCurrent = current;
+        }
+    }
+
+    /**
+     * Move current Characteristic to parent layer
+     */
+    public boolean moveToParent() {
+        if (mCurrent.getParent() == null) {
+            return false;
+        }
+        mCurrent = mCurrent.getParent();
+        return true;
+    }
+
+    /**
+     * Move current Characteristic to the root
+     */
+    public void moveToRoot() {
+        mCurrent = mRoot;
+    }
+
+    /**
+     * Return root Characteristic
+     */
+    public @NonNull Characteristic getRoot() {
+        return mRoot;
+    }
+
+    /**
+     * Return current Characteristic
+     */
+    public @NonNull Characteristic getCurrentCharacteristic() {
+        return mCurrent;
     }
 
     /**
@@ -188,12 +367,10 @@
         final StringBuilder sb = new StringBuilder();
         sb.append("[RCS Config]");
         if (DBG) {
-            mValues.forEach((t, v) -> {
-                sb.append("\n");
-                sb.append(t);
-                sb.append(" : ");
-                sb.append(v);
-            });
+            sb.append("=== Root ===\n");
+            sb.append(mRoot);
+            sb.append("=== Current ===\n");
+            sb.append(mCurrent);
         }
         return sb.toString();
     }
@@ -206,12 +383,12 @@
 
         RcsConfig other = (RcsConfig) obj;
 
-        return mValues.equals(other.mValues);
+        return mRoot.equals(other.mRoot) && mCurrent.equals(other.mCurrent);
     }
 
     @Override
     public int hashCode() {
-        return mValues.hashCode();
+        return Objects.hash(mRoot, mCurrent);
     }
 
     /**
@@ -302,38 +479,6 @@
         return isCompressed ? data : decompressGzip(data);
     }
 
-    /**
-     * {@link Parcelable#writeToParcel}
-     */
-    public void writeToParcel(@NonNull Parcel out, int flags) {
-        out.writeMap(mValues);
-    }
-
-    /**
-     * {@link Parcelable.Creator}
-     *
-     */
-    public static final @NonNull Parcelable.Creator<RcsConfig>
-            CREATOR = new Creator<RcsConfig>() {
-                @Override
-                public RcsConfig createFromParcel(Parcel in) {
-                    HashMap<String, String> values = in.readHashMap(null);
-                    return values == null ? null : new RcsConfig(values);
-                }
-
-                @Override
-                public RcsConfig[] newArray(int size) {
-                    return new RcsConfig[size];
-                }
-            };
-
-    /**
-     * {@link Parcelable#describeContents}
-     */
-    public int describeContents() {
-        return 0;
-    }
-
     private static void logd(String msg) {
         Rlog.d(LOG_TAG, msg);
     }
diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java
index c682afe..a2015cd 100644
--- a/telephony/java/android/telephony/ims/RegistrationManager.java
+++ b/telephony/java/android/telephony/ims/RegistrationManager.java
@@ -83,6 +83,8 @@
                         AccessNetworkConstants.TRANSPORT_TYPE_INVALID);
                 put(ImsRegistrationImplBase.REGISTRATION_TECH_LTE,
                         AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+                put(ImsRegistrationImplBase.REGISTRATION_TECH_NR,
+                        AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
                 put(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
                         AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
                 /* As the cross sim will be using ePDG tunnel over internet, it behaves
diff --git a/telephony/java/android/telephony/ims/RcsConfig.aidl b/telephony/java/android/telephony/ims/SipDelegateConfiguration.aidl
similarity index 86%
rename from telephony/java/android/telephony/ims/RcsConfig.aidl
rename to telephony/java/android/telephony/ims/SipDelegateConfiguration.aidl
index cfd93fb..2fc9c48 100644
--- a/telephony/java/android/telephony/ims/RcsConfig.aidl
+++ b/telephony/java/android/telephony/ims/SipDelegateConfiguration.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (c) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,4 +16,4 @@
 
 package android.telephony.ims;
 
-parcelable RcsConfig;
+parcelable SipDelegateConfiguration;
diff --git a/telephony/java/android/telephony/ims/SipDelegateConfiguration.java b/telephony/java/android/telephony/ims/SipDelegateConfiguration.java
new file mode 100644
index 0000000..1bf5cad
--- /dev/null
+++ b/telephony/java/android/telephony/ims/SipDelegateConfiguration.java
@@ -0,0 +1,932 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.ims;
+
+import android.annotation.IntDef;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.net.InetAddresses;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.telephony.ims.stub.SipDelegate;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.Objects;
+
+/**
+ * The IMS registration and other attributes that the {@link SipDelegateConnection} used by the
+ * IMS application will need to be aware of to correctly generate outgoing {@link SipMessage}s.
+ * <p>
+ * The IMS service must generate new instances of this configuration as the IMS configuration
+ * managed by the IMS service changes. Along with each {@link SipDelegateConfiguration} instance
+ * containing the configuration is the "version", which should be incremented every time a new
+ * {@link SipDelegateConfiguration} instance is created. The {@link SipDelegateConnection} will
+ * include the version of the {@link SipDelegateConfiguration} instance that it used in order for
+ * the {@link SipDelegate} to easily identify if the IMS application used a now stale configuration
+ * to generate the {@link SipMessage} and return
+ * {@link SipDelegateManager#MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION} in
+ * {@link DelegateMessageCallback#onMessageSendFailure(String, int)} so that the IMS application can
+ * regenerate that {@link SipMessage} using the correct {@link SipDelegateConfiguration}
+ * instance.
+ * <p>
+ * Every time the IMS configuration state changes in the IMS service, a full configuration should
+ * be generated. The new  {@link SipDelegateConfiguration} instance should not be an incremental
+ * update.
+ * @see Builder
+ * @hide
+ */
+@SystemApi
+public final class SipDelegateConfiguration implements Parcelable {
+
+    /**
+     * The SIP transport uses UDP.
+     */
+    public static final int SIP_TRANSPORT_UDP = 0;
+
+    /**
+     * The SIP transport uses TCP.
+     */
+    public static final int SIP_TRANSPORT_TCP = 1;
+
+    /**@hide*/
+    @IntDef(prefix = "SIP_TRANSPORT_", value = {
+            SIP_TRANSPORT_UDP,
+            SIP_TRANSPORT_TCP
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface TransportType {}
+
+    /**
+     * The value returned by {@link #getMaxUdpPayloadSizeBytes()} when it is not defined.
+     */
+    public static final int UDP_PAYLOAD_SIZE_UNDEFINED = -1;
+
+    /**
+     * SIP over IPSec configuration
+     */
+    public static final class IpSecConfiguration {
+        private final int mLocalTxPort;
+        private final int mLocalRxPort;
+        private final int mLastLocalTxPort;
+        private final int mRemoteTxPort;
+        private final int mRemoteRxPort;
+        private final int mLastRemoteTxPort;
+        private final String mSecurityHeader;
+
+        /**
+         * Describes the SIP over IPSec configuration the SipDelegate will need to use.
+         *
+         * @param localTxPort  Local SIP port number used to send traffic.
+         * @param localRxPort Local SIP port number used to receive traffic.
+         * @param lastLocalTxPort Local SIP port number used for the previous IPsec security
+         *                        association.
+         * @param remoteTxPort Remote port number used by the SIP server to send SIP traffic.
+         * @param remoteRxPort Remote port number used by the SIP server to receive incoming SIP
+         *                     traffic.
+         * @param lastRemoteTxPort Remote port number used by the SIP server to send SIP traffic on
+         *                         the previous IPSec security association.
+         * @param securityHeader The value of the SIP security verify header.
+         */
+        public IpSecConfiguration(int localTxPort, int localRxPort, int lastLocalTxPort,
+                int remoteTxPort, int remoteRxPort, int lastRemoteTxPort,
+                @NonNull String securityHeader) {
+            mLocalTxPort = localTxPort;
+            mLocalRxPort = localRxPort;
+            mLastLocalTxPort = lastLocalTxPort;
+            mRemoteTxPort = remoteTxPort;
+            mRemoteRxPort = remoteRxPort;
+            mLastRemoteTxPort = lastRemoteTxPort;
+            mSecurityHeader = securityHeader;
+        }
+
+        /**
+         * @return The local SIP port number used to send traffic.
+         */
+        public int getLocalTxPort() {
+            return mLocalTxPort;
+        }
+
+        /**
+         * @return The Local SIP port number used to receive traffic.
+         */
+        public int getLocalRxPort() {
+            return mLocalRxPort;
+        }
+
+        /**
+         * @return The last local SIP port number used for the previous IPsec security association.
+         */
+        public int getLastLocalTxPort() {
+            return mLastLocalTxPort;
+        }
+
+        /**
+         * @return The remote port number used by the SIP server to send SIP traffic.
+         */
+        public int getRemoteTxPort() {
+            return mRemoteTxPort;
+        }
+
+        /**
+         * @return the remote port number used by the SIP server to receive incoming SIP traffic.
+         */
+        public int getRemoteRxPort() {
+            return mRemoteRxPort;
+        }
+
+        /**
+         * @return the remote port number used by the SIP server to send SIP traffic on the previous
+         * IPSec security association.
+         */
+        public int getLastRemoteTxPort() {
+            return mLastRemoteTxPort;
+        }
+
+        /**
+         * @return The value of the SIP security verify header.
+         */
+        public @NonNull String getSipSecurityVerifyHeader() {
+            return mSecurityHeader;
+        }
+
+        /**
+         * Helper for parcelling this object.
+         * @hide
+         */
+        public void addToParcel(Parcel dest) {
+            dest.writeInt(mLocalTxPort);
+            dest.writeInt(mLocalRxPort);
+            dest.writeInt(mLastLocalTxPort);
+            dest.writeInt(mRemoteTxPort);
+            dest.writeInt(mRemoteRxPort);
+            dest.writeInt(mLastRemoteTxPort);
+            dest.writeString(mSecurityHeader);
+        }
+
+        /**
+         * Helper for unparcelling this object.
+         * @hide
+         */
+        public static IpSecConfiguration fromParcel(Parcel source) {
+            return new IpSecConfiguration(source.readInt(), source.readInt(), source.readInt(),
+                    source.readInt(), source.readInt(), source.readInt(), source.readString());
+        }
+
+        @Override
+        public String toString() {
+            return "IpSecConfiguration{" + "localTx=" + mLocalTxPort + ", localRx=" + mLocalRxPort
+                    + ", lastLocalTx=" + mLastLocalTxPort + ", remoteTx=" + mRemoteTxPort
+                    + ", remoteRx=" + mRemoteRxPort + ", lastRemoteTx=" + mLastRemoteTxPort
+                    + ", securityHeader=" + mSecurityHeader + '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            IpSecConfiguration that = (IpSecConfiguration) o;
+            return mLocalTxPort == that.mLocalTxPort
+                    && mLocalRxPort == that.mLocalRxPort
+                    && mLastLocalTxPort == that.mLastLocalTxPort
+                    && mRemoteTxPort == that.mRemoteTxPort
+                    && mRemoteRxPort == that.mRemoteRxPort
+                    && mLastRemoteTxPort == that.mLastRemoteTxPort
+                    && Objects.equals(mSecurityHeader, that.mSecurityHeader);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mLocalTxPort, mLocalRxPort, mLastLocalTxPort, mRemoteTxPort,
+                    mRemoteRxPort, mLastRemoteTxPort, mSecurityHeader);
+        }
+    }
+
+    /**
+     *  Creates a new instance of {@link SipDelegateConfiguration} composed from optional
+     *  configuration items.
+     */
+    public static final class Builder {
+        private final SipDelegateConfiguration mConfig;
+
+        /**
+         *
+         * @param version The version associated with the {@link SipDelegateConfiguration} instance
+         *                being built. See {@link #getVersion()} for more information.
+         * @param transportType The transport type to use for SIP signalling.
+         * @param localAddr The local socket address used for SIP traffic.
+         * @param serverAddr The SIP server or P-CSCF default IP address for sip traffic.
+         * @see InetAddresses#parseNumericAddress(String) for how to create an
+         * {@link InetAddress} without requiring a DNS lookup.
+         */
+        public Builder(@IntRange(from = 0) long version, @TransportType int transportType,
+                @NonNull InetSocketAddress localAddr, @NonNull InetSocketAddress serverAddr) {
+            mConfig = new SipDelegateConfiguration(version, transportType, localAddr,
+                    serverAddr);
+        }
+
+        /**
+         * Create a new {@link SipDelegateConfiguration} instance with the same exact configuration
+         * as the passed in instance, except for the version parameter, which will be incremented
+         * by 1.
+         * <p>
+         * This method is useful for cases where only a small subset of configurations have changed
+         * and the new configuration is based off of the old configuration.
+         * @param c The older {@link SipDelegateConfiguration} instance to base this instance's
+         *          configuration off of.
+         */
+        public Builder(@NonNull SipDelegateConfiguration c) {
+            mConfig = c.copyAndIncrementVersion();
+        }
+
+        /**
+         * Sets whether or not SIP compact form is enabled for the associated SIP delegate.
+         * <p>
+         * If unset, this configuration defaults to {@code false}.
+         * @param isEnabled {@code true} if SIP compact form is enabled for the associated SIP
+         *     Delegate, {@code false} if it is not.
+         * @return this Builder instance with the compact form configuration set.
+         */
+        public @NonNull Builder setSipCompactFormEnabled(boolean isEnabled) {
+            mConfig.mIsSipCompactFormEnabled = isEnabled;
+            return this;
+        }
+
+        /**
+         * Sets whether or not underlying SIP keepalives are enabled for the associated SIP
+         * delegate.
+         * <p>
+         * If unset, this configuration defaults to {@code false}.
+         * @param isEnabled {@code true} if SIP keepalives are enabled for the associated SIP
+         *     Delegate, {@code false} if it is not.
+         * @return this Builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipKeepaliveEnabled(boolean isEnabled) {
+            mConfig.mIsSipKeepaliveEnabled = isEnabled;
+            return this;
+        }
+
+        /**
+         * Sets the max SIP payload size in bytes to be sent on UDP. If the SIP message payload is
+         * greater than the max UDP payload size, then TCP must be used.
+         * <p>
+         * If unset, this configuration defaults to {@link #UDP_PAYLOAD_SIZE_UNDEFINED}, or no
+         * size specified.
+         * @param size The maximum SIP payload size in bytes for UDP.
+         * @return this Builder instance with the new configuration set.
+         */
+        public @NonNull Builder setMaxUdpPayloadSizeBytes(@IntRange(from = 1) int size) {
+            mConfig.mMaxUdpPayloadSize = size;
+            return this;
+        }
+
+        /**
+         * Sets the IMS public user identifier.
+         * <p>
+         * If unset, this configuration defaults to {@code null}, or no identifier specified.
+         * @param id The IMS public user identifier.
+         * @return this Builder instance with the new configuration set.
+         */
+        public @NonNull Builder setPublicUserIdentifier(@Nullable String id) {
+            mConfig.mPublicUserIdentifier = id;
+            return this;
+        }
+
+        /**
+         * Sets the IMS private user identifier.
+         * <p>
+         * If unset, this configuration defaults to {@code null}, or no identifier specified.
+         * @param id The IMS private user identifier.
+         * @return this Builder instance with the new configuration set.
+         */
+        public @NonNull Builder setPrivateUserIdentifier(@Nullable String id) {
+            mConfig.mPrivateUserIdentifier = id;
+            return this;
+        }
+
+        /**
+         * Sets the IMS home domain.
+         * <p>
+         * If unset, this configuration defaults to {@code null}, or no domain specified.
+         * @param domain The IMS home domain.
+         * @return this Builder instance with the new configuration set.
+         */
+        public @NonNull Builder setHomeDomain(@Nullable String domain) {
+            mConfig.mHomeDomain = domain;
+            return this;
+        }
+
+        /**
+         * Sets the IMEI of the associated device.
+         * <p>
+         * Application can include the Instance-ID feature tag {@code "+sip.instance"} in the
+         * Contact header with a value of the device IMEI in the form
+         * {@code "urn:gsma:imei:<device IMEI>"}.
+         * <p>
+         * If unset, this configuration defaults to {@code null}, or no IMEI string specified.
+         * @param imei The IMEI of the device.
+         * @return this Builder instance with the new configuration set.
+         */
+        public @NonNull Builder setImei(@Nullable String imei) {
+            mConfig.mImei = imei;
+            return this;
+        }
+
+        /**
+         * Set the optional {@link IpSecConfiguration} instance used if the associated SipDelegate
+         * is communicating over IPSec.
+         * <p>
+         * If unset, this configuration defaults to {@code null}
+         * @param c The IpSecConfiguration instance to set.
+         * @return this Builder instance with IPSec configuration set.
+         */
+        public @NonNull Builder setIpSecConfiguration(@Nullable IpSecConfiguration c) {
+            mConfig.mIpSecConfiguration = c;
+            return this;
+        }
+
+        /**
+         * Describes the Device's Public IP Address and port that is set when Network Address
+         * Translation is enabled and the device is behind a NAT.
+         * <p>
+         * If unset, this configuration defaults to {@code null}
+         * @param addr The {@link InetAddress} representing the device's public IP address and port
+         *          when behind a NAT.
+         * @return this Builder instance with the new configuration set.
+         * @see InetAddresses#parseNumericAddress(String) For an example of how to create an
+         * instance of {@link InetAddress} without causing a DNS lookup.
+         */
+        public @NonNull Builder setNatSocketAddress(@Nullable InetSocketAddress addr) {
+            mConfig.mNatAddress = addr;
+            return this;
+        }
+
+        /**
+         * Sets the optional URI of the device's Globally routable user-agent URI (GRUU) if this
+         * feature is enabled for the SIP delegate.
+         * <p>
+         * If unset, this configuration defaults to {@code null}
+         * @param uri The GRUU to set.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setPublicGruuUri(@Nullable Uri uri) {
+            mConfig.mGruu = uri;
+            return this;
+        }
+
+        /**
+         * Sets the SIP authentication header value.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP authentication header's value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipAuthenticationHeader(@Nullable String header) {
+            mConfig.mSipAuthHeader = header;
+            return this;
+        }
+
+        /**
+         * Sets the SIP authentication nonce.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param nonce The SIP authentication nonce.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipAuthenticationNonce(@Nullable String nonce) {
+            mConfig.mSipAuthNonce = nonce;
+            return this;
+        }
+
+        /**
+         * Sets the SIP service route header value.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP service route header value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipServiceRouteHeader(@Nullable String header) {
+            mConfig.mServiceRouteHeader = header;
+            return this;
+        }
+
+        /**
+         * Sets the SIP path header value.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP path header value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipPathHeader(@Nullable String header) {
+            mConfig.mPathHeader = header;
+            return this;
+        }
+
+        /**
+         * Sets the SIP User-Agent header value.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP User-Agent header value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipUserAgentHeader(@Nullable String header) {
+            mConfig.mUserAgentHeader = header;
+            return this;
+        }
+
+        /**
+         * Sets the SIP Contact header's User parameter value.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param param The SIP Contact header's User parameter value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipContactUserParameter(@Nullable String param) {
+            mConfig.mContactUserParam = param;
+            return this;
+        }
+
+        /**
+         * Sets the SIP P-Access-Network-Info (P-ANI) header value. Populated for networks that
+         * require this information to be provided as part of outgoing SIP messages.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP P-ANI header value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipPaniHeader(@Nullable String header) {
+            mConfig.mPaniHeader = header;
+            return this;
+        }
+
+        /**
+         * Sets the SIP P-Last-Access-Network-Info (P-LANI) header value. Populated for
+         * networks that require this information to be provided as part of outgoing SIP messages.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP P-LANI header value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipPlaniHeader(@Nullable String header) {
+            mConfig.mPlaniHeader = header;
+            return this;
+        }
+
+        /**
+         * Sets the SIP Cellular-Network-Info (CNI) header value (See 3GPP 24.229, section 7.2.15),
+         * populated for networks that require this information to be provided as part of outgoing
+         * SIP messages.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP P-LANI header value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipCniHeader(@Nullable String header) {
+            mConfig.mCniHeader = header;
+            return this;
+        }
+
+        /**
+         * Sets the SIP P-associated-uri header value.
+         * <p>
+         * If unset, this configuration defaults to {@code null}.
+         * @param header The SIP P-associated-uri header value.
+         * @return this builder instance with the new configuration set.
+         */
+        public @NonNull Builder setSipAssociatedUriHeader(@Nullable String header) {
+            mConfig.mAssociatedUriHeader = header;
+            return this;
+        }
+
+        /**
+         * @return A {@link SipDelegateConfiguration} instance with the optional configurations set.
+         */
+        public @NonNull SipDelegateConfiguration build() {
+            return mConfig;
+        }
+    }
+
+    private final long mVersion;
+    private final int mTransportType;
+    private final InetSocketAddress mLocalAddress;
+    private final InetSocketAddress mSipServerAddress;
+    private boolean mIsSipCompactFormEnabled = false;
+    private boolean mIsSipKeepaliveEnabled = false;
+    private int mMaxUdpPayloadSize = -1;
+    private String mPublicUserIdentifier = null;
+    private String mPrivateUserIdentifier = null;
+    private String mHomeDomain = null;
+    private String mImei = null;
+    private Uri mGruu = null;
+    private String mSipAuthHeader = null;
+    private String mSipAuthNonce = null;
+    private String mServiceRouteHeader = null;
+    private String mPathHeader = null;
+    private String mUserAgentHeader = null;
+    private String mContactUserParam = null;
+    private String mPaniHeader = null;
+    private String mPlaniHeader = null;
+    private String mCniHeader = null;
+    private String mAssociatedUriHeader = null;
+    private IpSecConfiguration mIpSecConfiguration = null;
+    private InetSocketAddress mNatAddress = null;
+
+
+    private SipDelegateConfiguration(long version, int transportType,
+            InetSocketAddress localAddress, InetSocketAddress sipServerAddress) {
+        mVersion = version;
+        mTransportType = transportType;
+        mLocalAddress = localAddress;
+        mSipServerAddress = sipServerAddress;
+    }
+
+    private SipDelegateConfiguration(Parcel source) {
+        mVersion = source.readLong();
+        mTransportType = source.readInt();
+        mLocalAddress = readAddressFromParcel(source);
+        mSipServerAddress = readAddressFromParcel(source);
+        mIsSipCompactFormEnabled = source.readBoolean();
+        mIsSipKeepaliveEnabled = source.readBoolean();
+        mMaxUdpPayloadSize = source.readInt();
+        mPublicUserIdentifier = source.readString();
+        mPrivateUserIdentifier = source.readString();
+        mHomeDomain = source.readString();
+        mImei = source.readString();
+        mGruu = source.readParcelable(null);
+        mSipAuthHeader = source.readString();
+        mSipAuthNonce = source.readString();
+        mServiceRouteHeader = source.readString();
+        mPathHeader = source.readString();
+        mUserAgentHeader = source.readString();
+        mContactUserParam = source.readString();
+        mPaniHeader = source.readString();
+        mPlaniHeader = source.readString();
+        mCniHeader = source.readString();
+        mAssociatedUriHeader = source.readString();
+        boolean isIpsecConfigAvailable = source.readBoolean();
+        if (isIpsecConfigAvailable) {
+            mIpSecConfiguration = IpSecConfiguration.fromParcel(source);
+        }
+        boolean isNatConfigAvailable = source.readBoolean();
+        if (isNatConfigAvailable) {
+            mNatAddress = readAddressFromParcel(source);
+        }
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeLong(mVersion);
+        dest.writeInt(mTransportType);
+        writeAddressToParcel(mLocalAddress, dest);
+        writeAddressToParcel(mSipServerAddress, dest);
+        dest.writeBoolean(mIsSipCompactFormEnabled);
+        dest.writeBoolean(mIsSipKeepaliveEnabled);
+        dest.writeInt(mMaxUdpPayloadSize);
+        dest.writeString(mPublicUserIdentifier);
+        dest.writeString(mPrivateUserIdentifier);
+        dest.writeString(mHomeDomain);
+        dest.writeString(mImei);
+        dest.writeParcelable(mGruu, flags);
+        dest.writeString(mSipAuthHeader);
+        dest.writeString(mSipAuthNonce);
+        dest.writeString(mServiceRouteHeader);
+        dest.writeString(mPathHeader);
+        dest.writeString(mUserAgentHeader);
+        dest.writeString(mContactUserParam);
+        dest.writeString(mPaniHeader);
+        dest.writeString(mPlaniHeader);
+        dest.writeString(mCniHeader);
+        dest.writeString(mAssociatedUriHeader);
+        dest.writeBoolean(mIpSecConfiguration != null);
+        if (mIpSecConfiguration != null) {
+            mIpSecConfiguration.addToParcel(dest);
+        }
+        dest.writeBoolean(mNatAddress != null);
+        if (mNatAddress != null) {
+            writeAddressToParcel(mNatAddress, dest);
+        }
+    }
+
+    /**
+     * @return A copy of this instance with an incremented version.
+     * @hide
+     */
+    public SipDelegateConfiguration copyAndIncrementVersion() {
+        SipDelegateConfiguration c = new SipDelegateConfiguration(getVersion() + 1, mTransportType,
+                mLocalAddress, mSipServerAddress);
+        c.mIsSipCompactFormEnabled = mIsSipCompactFormEnabled;
+        c.mIsSipKeepaliveEnabled = mIsSipKeepaliveEnabled;
+        c.mMaxUdpPayloadSize = mMaxUdpPayloadSize;
+        c.mIpSecConfiguration = mIpSecConfiguration;
+        c.mNatAddress = mNatAddress;
+        c.mPublicUserIdentifier = mPublicUserIdentifier;
+        c.mPrivateUserIdentifier = mPrivateUserIdentifier;
+        c.mHomeDomain = mHomeDomain;
+        c.mImei = mImei;
+        c.mGruu = mGruu;
+        c.mSipAuthHeader = mSipAuthHeader;
+        c.mSipAuthNonce = mSipAuthNonce;
+        c.mServiceRouteHeader = mServiceRouteHeader;
+        c.mPathHeader = mPathHeader;
+        c.mUserAgentHeader = mUserAgentHeader;
+        c.mContactUserParam = mContactUserParam;
+        c.mPaniHeader = mPaniHeader;
+        c.mPlaniHeader = mPlaniHeader;
+        c.mCniHeader = mCniHeader;
+        c.mAssociatedUriHeader = mAssociatedUriHeader;
+        return c;
+    }
+
+    /**
+     * An integer representing the version number of this SipDelegateImsConfiguration.
+     * {@link SipMessage}s that are created using this configuration will also have a this
+     * version number associated with them, which will allow the IMS service to validate that the
+     * {@link SipMessage} was using the latest configuration during creation and not a stale
+     * configuration due to race conditions between the configuration being updated and the RCS
+     * application not receiving the updated configuration before generating a new message.
+     * <p>
+     * The version number should be a positive number that starts at 0 and increments sequentially
+     * as new {@link SipDelegateConfiguration} instances are created to update the IMS
+     * configuration state.
+     *
+     * @return the version number associated with this {@link SipDelegateConfiguration}.
+     */
+    public @IntRange(from = 0) long getVersion() {
+        return mVersion;
+    }
+
+    /**
+     * @return The Transport type of the SIP delegate.
+     */
+    public @TransportType int getTransportType() {
+        return mTransportType;
+    }
+
+    /**
+     * @return The local IP address and port used for SIP traffic.
+     */
+    public @NonNull InetSocketAddress getLocalAddress() {
+        return mLocalAddress;
+    }
+
+    /**
+     * @return The default IP Address and port of the SIP server or P-CSCF used for SIP traffic.
+     */
+    public @NonNull InetSocketAddress getSipServerAddress() {
+        return mSipServerAddress;
+    }
+
+    /**
+     * @return {@code true} if SIP compact form is enabled for the associated SIP Delegate,
+     * {@code false} if it is not.
+     */
+    public boolean isSipCompactFormEnabled() {
+        return mIsSipCompactFormEnabled;
+    }
+
+    /**
+     * @return {@code true} if SIP keepalives are enabled for the associated SIP Delegate,
+     * {@code false} if it is not.
+     */
+    public boolean isSipKeepaliveEnabled() {
+        return mIsSipKeepaliveEnabled;
+    }
+
+    /**
+     * @return The maximum SIP payload size in bytes for UDP or {code -1} if no value was set.
+     */
+    public int getMaxUdpPayloadSizeBytes() {
+        return mMaxUdpPayloadSize;
+    }
+
+    /**
+     * @return The IMS public user identifier or {@code null} if it was not set.
+     */
+    public @Nullable String getPublicUserIdentifier() {
+        return mPublicUserIdentifier;
+    }
+
+    /**
+     * @return The IMS private user identifier or {@code null} if it was not set.
+     */
+    public @Nullable String getPrivateUserIdentifier() {
+        return mPrivateUserIdentifier;
+    }
+
+    /**
+     * @return The IMS home domain or {@code null} if it was not set.
+     */
+    public @Nullable String getHomeDomain() {
+        return mHomeDomain;
+    }
+
+    /**
+     * get the IMEI of the associated device.
+     * <p>
+     * Application can include the Instance-ID feature tag {@code "+sip.instance"} in the Contact
+     * header with a value of the device IMEI in the form {@code "urn:gsma:imei:<device IMEI>"}.
+     * @return The IMEI of the device or {@code null} if it was not set.
+     */
+    public @Nullable String getImei() {
+        return mImei;
+    }
+
+    /**
+     * @return The IPSec configuration that must be used because SIP is communicating over IPSec.
+     * This returns {@code null} SIP is not communicating over IPSec.
+     */
+    public @Nullable IpSecConfiguration getIpSecConfiguration() {
+        return mIpSecConfiguration;
+    }
+
+    /**
+     * @return The public IP address and port of the device due to it being behind a NAT.
+     * This returns {@code null} if the device is not behind a NAT.
+     */
+    public @Nullable InetSocketAddress getNatSocketAddress() {
+        return mNatAddress;
+    }
+
+    /**
+     * @return The device's Globally routable user-agent URI (GRUU) or {@code null} if this feature
+     * is not enabled for the SIP delegate.
+     */
+    public @Nullable Uri getPublicGruuUri() {
+        return mGruu;
+    }
+
+    /**
+     * @return The value of the SIP authentication header or {@code null} if there is none set.
+     */
+    public @Nullable String getSipAuthenticationHeader() {
+        return mSipAuthHeader;
+    }
+
+    /**
+     * @return The value of the SIP authentication nonce or {@code null} if there is none set.
+     */
+    public @Nullable String getSipAuthenticationNonce() {
+        return mSipAuthNonce;
+    }
+
+    /**
+     * @return The value of the SIP service route header or {@code null} if there is none set.
+     */
+    public @Nullable String getSipServiceRouteHeader() {
+        return mServiceRouteHeader;
+    }
+
+    /**
+     * @return The value of the SIP path header or {@code null} if there is none set.
+     */
+    public @Nullable String getSipPathHeader() {
+        return mPathHeader;
+    }
+
+    /**
+     * @return The value of the SIP User-Agent header or {@code null} if there is none set.
+     */
+    public @Nullable String getSipUserAgentHeader() {
+        return mUserAgentHeader;
+    }
+    /**
+     * @return The value of the SIP Contact header's User parameter or {@code null} if there is
+     * none set.
+     */
+    public @Nullable String getSipContactUserParameter() {
+        return mContactUserParam;
+    }
+
+    /**
+     * @return The value of the SIP P-Access-Network-Info (P-ANI) header or {@code null} if there is
+     * none set.
+     */
+    public @Nullable String getSipPaniHeader() {
+        return mPaniHeader;
+    }
+    /**
+     * @return The value of the SIP P-Last-Access-Network-Info (P-LANI) header or {@code null} if
+     * there is none set.
+     */
+    public @Nullable String getSipPlaniHeader() {
+        return mPlaniHeader;
+    }
+
+    /**
+     * @return The value of the SIP Cellular-Network-Info (CNI) header or {@code null} if there is
+     * none set.
+     */
+    public @Nullable String getSipCniHeader() {
+        return mCniHeader;
+    }
+
+    /**
+     * @return The value of the SIP P-associated-uri header or {@code null} if there is none set.
+     */
+    public @Nullable String getSipAssociatedUriHeader() {
+        return mAssociatedUriHeader;
+    }
+
+    private void writeAddressToParcel(InetSocketAddress addr, Parcel dest) {
+        dest.writeByteArray(addr.getAddress().getAddress());
+        dest.writeInt(addr.getPort());
+    }
+
+    private InetSocketAddress readAddressFromParcel(Parcel source) {
+        final byte[] addressBytes = source.createByteArray();
+        final int port = source.readInt();
+        try {
+            return new InetSocketAddress(InetAddress.getByAddress(addressBytes), port);
+        } catch (UnknownHostException e) {
+            // Should not happen, as length of array was verified before parcelling.
+            Log.e("SipDelegateConfiguration", "exception reading address, returning null");
+            return null;
+        }
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final @NonNull Creator<SipDelegateConfiguration> CREATOR =
+            new Creator<SipDelegateConfiguration>() {
+        @Override
+        public SipDelegateConfiguration createFromParcel(Parcel source) {
+            return new SipDelegateConfiguration(source);
+        }
+
+        @Override
+        public SipDelegateConfiguration[] newArray(int size) {
+            return new SipDelegateConfiguration[size];
+        }
+    };
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SipDelegateConfiguration that = (SipDelegateConfiguration) o;
+        return mVersion == that.mVersion
+                && mTransportType == that.mTransportType
+                && mIsSipCompactFormEnabled == that.mIsSipCompactFormEnabled
+                && mIsSipKeepaliveEnabled == that.mIsSipKeepaliveEnabled
+                && mMaxUdpPayloadSize == that.mMaxUdpPayloadSize
+                && Objects.equals(mLocalAddress, that.mLocalAddress)
+                && Objects.equals(mSipServerAddress, that.mSipServerAddress)
+                && Objects.equals(mPublicUserIdentifier, that.mPublicUserIdentifier)
+                && Objects.equals(mPrivateUserIdentifier, that.mPrivateUserIdentifier)
+                && Objects.equals(mHomeDomain, that.mHomeDomain)
+                && Objects.equals(mImei, that.mImei)
+                && Objects.equals(mGruu, that.mGruu)
+                && Objects.equals(mSipAuthHeader, that.mSipAuthHeader)
+                && Objects.equals(mSipAuthNonce, that.mSipAuthNonce)
+                && Objects.equals(mServiceRouteHeader, that.mServiceRouteHeader)
+                && Objects.equals(mPathHeader, that.mPathHeader)
+                && Objects.equals(mUserAgentHeader, that.mUserAgentHeader)
+                && Objects.equals(mContactUserParam, that.mContactUserParam)
+                && Objects.equals(mPaniHeader, that.mPaniHeader)
+                && Objects.equals(mPlaniHeader, that.mPlaniHeader)
+                && Objects.equals(mCniHeader, that.mCniHeader)
+                && Objects.equals(mAssociatedUriHeader, that.mAssociatedUriHeader)
+                && Objects.equals(mIpSecConfiguration, that.mIpSecConfiguration)
+                && Objects.equals(mNatAddress, that.mNatAddress);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mVersion, mTransportType, mLocalAddress, mSipServerAddress,
+                mIsSipCompactFormEnabled, mIsSipKeepaliveEnabled, mMaxUdpPayloadSize,
+                mPublicUserIdentifier, mPrivateUserIdentifier, mHomeDomain, mImei, mGruu,
+                mSipAuthHeader, mSipAuthNonce, mServiceRouteHeader, mPathHeader, mUserAgentHeader,
+                mContactUserParam, mPaniHeader, mPlaniHeader, mCniHeader, mAssociatedUriHeader,
+                mIpSecConfiguration, mNatAddress);
+    }
+
+    @Override
+    public String toString() {
+        return "SipDelegateConfiguration{ mVersion=" + mVersion + ", mTransportType="
+                + mTransportType + '}';
+    }
+}
diff --git a/telephony/java/android/telephony/ims/SipDelegateConnection.java b/telephony/java/android/telephony/ims/SipDelegateConnection.java
index d7a19bc..4dbb08d 100644
--- a/telephony/java/android/telephony/ims/SipDelegateConnection.java
+++ b/telephony/java/android/telephony/ims/SipDelegateConnection.java
@@ -48,7 +48,7 @@
      * sending the message.
      * @param sipMessage The SipMessage to be sent.
      * @param configVersion The SipDelegateImsConfiguration version used to construct the
-     *                      SipMessage. See {@link SipDelegateImsConfiguration#getVersion} for more
+     *                      SipMessage. See {@link SipDelegateConfiguration#getVersion} for more
      */
     void sendMessage(@NonNull SipMessage sipMessage, long configVersion);
 
diff --git a/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java
index 0d63f7b..ffbfde6 100644
--- a/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java
+++ b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java
@@ -21,35 +21,21 @@
 import android.annotation.StringDef;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
+import android.net.InetAddresses;
+import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.PersistableBundle;
-import android.telephony.ims.stub.SipDelegate;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.net.InetSocketAddress;
 
 /**
- * The IMS registration and other attributes that the {@link SipDelegateConnection} used by the
- * IMS application will need to be aware of to correctly generate outgoing {@link SipMessage}s.
- * <p>
- * The IMS service must generate new instances of this configuration as the IMS configuration
- * managed by the IMS service changes. Along with each {@link SipDelegateImsConfiguration} instance
- * containing the configuration is the "version", which should be incremented every time a new
- * {@link SipDelegateImsConfiguration} instance is created. The {@link SipDelegateConnection} will
- * include the version of the {@link SipDelegateImsConfiguration} instance that it used in order for
- * the {@link SipDelegate} to easily identify if the IMS application used a now stale configuration
- * to generate the {@link SipMessage} and return
- * {@link SipDelegateManager#MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION} in
- * {@link DelegateMessageCallback#onMessageSendFailure(String, int)} so that the IMS application can
- * regenerate that {@link SipMessage} using the correct {@link SipDelegateImsConfiguration}
- * instance.
- * <p>
- * Every time the IMS configuration state changes in the IMS service, a full configuration should
- * be generated. The new  {@link SipDelegateImsConfiguration} instance should not be an incremental
- * update.
  * @hide
+ * @deprecated Use {@link SipDelegateConfiguration} instead.
  */
+@Deprecated
 @SystemApi
 public final class SipDelegateImsConfiguration implements Parcelable {
 
@@ -535,4 +521,68 @@
             return new SipDelegateImsConfiguration[size];
         }
     };
+
+    /**
+     * Temporary helper to transition from old form of config to new form.
+     * @return new config
+     * @hide
+     */
+    public SipDelegateConfiguration toNewConfig() {
+        // IP version is now included in call to InetSocketAddr
+        String transportTypeString = getString(KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING);
+        int transportType = (transportTypeString != null
+                && transportTypeString.equals(SIP_TRANSPORT_UDP))
+                ? SipDelegateConfiguration.SIP_TRANSPORT_UDP
+                : SipDelegateConfiguration.SIP_TRANSPORT_TCP;
+        SipDelegateConfiguration.Builder builder = new SipDelegateConfiguration.Builder(mVersion,
+                transportType,
+                getSocketAddr(getString(KEY_SIP_CONFIG_UE_DEFAULT_IPADDRESS_STRING),
+                        getInt(KEY_SIP_CONFIG_UE_DEFAULT_PORT_INT, -1)),
+                getSocketAddr(getString(KEY_SIP_CONFIG_SERVER_DEFAULT_IPADDRESS_STRING),
+                        getInt(KEY_SIP_CONFIG_SERVER_DEFAULT_PORT_INT, -1)));
+        builder.setSipCompactFormEnabled(
+                getBoolean(KEY_SIP_CONFIG_IS_COMPACT_FORM_ENABLED_BOOL, false));
+        builder.setSipKeepaliveEnabled(
+                getBoolean(KEY_SIP_CONFIG_IS_KEEPALIVE_ENABLED_BOOL, false));
+        builder.setMaxUdpPayloadSizeBytes(getInt(KEY_SIP_CONFIG_MAX_PAYLOAD_SIZE_ON_UDP_INT, -1));
+        builder.setPublicUserIdentifier(getString(KEY_SIP_CONFIG_UE_PUBLIC_USER_ID_STRING));
+        builder.setPrivateUserIdentifier(getString(KEY_SIP_CONFIG_UE_PRIVATE_USER_ID_STRING));
+        builder.setHomeDomain(getString(KEY_SIP_CONFIG_HOME_DOMAIN_STRING));
+        builder.setImei(getString(KEY_SIP_CONFIG_IMEI_STRING));
+        builder.setSipAuthenticationHeader(getString(KEY_SIP_CONFIG_AUTHENTICATION_HEADER_STRING));
+        builder.setSipAuthenticationNonce(getString(KEY_SIP_CONFIG_AUTHENTICATION_NONCE_STRING));
+        builder.setSipServiceRouteHeader(getString(KEY_SIP_CONFIG_SERVICE_ROUTE_HEADER_STRING));
+        builder.setSipPathHeader(getString(KEY_SIP_CONFIG_PATH_HEADER_STRING));
+        builder.setSipUserAgentHeader(getString(KEY_SIP_CONFIG_USER_AGENT_HEADER_STRING));
+        builder.setSipContactUserParameter(getString(KEY_SIP_CONFIG_URI_USER_PART_STRING));
+        builder.setSipPaniHeader(getString(KEY_SIP_CONFIG_P_ACCESS_NETWORK_INFO_HEADER_STRING));
+        builder.setSipPlaniHeader(
+                getString(KEY_SIP_CONFIG_P_LAST_ACCESS_NETWORK_INFO_HEADER_STRING));
+        builder.setSipCniHeader(getString(KEY_SIP_CONFIG_CELLULAR_NETWORK_INFO_HEADER_STRING));
+        builder.setSipAssociatedUriHeader(getString(KEY_SIP_CONFIG_P_ASSOCIATED_URI_HEADER_STRING));
+        if (getBoolean(KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL, false)) {
+            builder.setPublicGruuUri(Uri.parse(getString(KEY_SIP_CONFIG_UE_PUBLIC_GRUU_STRING)));
+        }
+        if (getBoolean(KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL, false)) {
+            builder.setIpSecConfiguration(new SipDelegateConfiguration.IpSecConfiguration(
+                    getInt(KEY_SIP_CONFIG_UE_IPSEC_CLIENT_PORT_INT, -1),
+                    getInt(KEY_SIP_CONFIG_UE_IPSEC_SERVER_PORT_INT, -1),
+                    getInt(KEY_SIP_CONFIG_UE_IPSEC_OLD_CLIENT_PORT_INT, -1),
+                    getInt(KEY_SIP_CONFIG_SERVER_IPSEC_CLIENT_PORT_INT, -1),
+                    getInt(KEY_SIP_CONFIG_SERVER_IPSEC_SERVER_PORT_INT, -1),
+                    getInt(KEY_SIP_CONFIG_SERVER_IPSEC_OLD_CLIENT_PORT_INT, -1),
+                    getString(KEY_SIP_CONFIG_SECURITY_VERIFY_HEADER_STRING))
+            );
+        }
+        if (getBoolean(KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL, false)) {
+            builder.setNatSocketAddress(getSocketAddr(
+                    getString(KEY_SIP_CONFIG_UE_PUBLIC_IPADDRESS_WITH_NAT_STRING),
+                    getInt(KEY_SIP_CONFIG_UE_PUBLIC_PORT_WITH_NAT_INT, -1)));
+        }
+        return builder.build();
+    }
+
+    private InetSocketAddress getSocketAddr(String ipAddr, int port) {
+        return new InetSocketAddress(InetAddresses.parseNumericAddress(ipAddr), port);
+    }
 }
diff --git a/telephony/java/android/telephony/ims/SipDelegateManager.java b/telephony/java/android/telephony/ims/SipDelegateManager.java
index 171842b..a504c9a 100644
--- a/telephony/java/android/telephony/ims/SipDelegateManager.java
+++ b/telephony/java/android/telephony/ims/SipDelegateManager.java
@@ -34,11 +34,13 @@
 import android.telephony.ims.stub.DelegateConnectionMessageCallback;
 import android.telephony.ims.stub.DelegateConnectionStateCallback;
 import android.telephony.ims.stub.SipDelegate;
+import android.util.ArrayMap;
 
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
 import java.util.concurrent.Executor;
 
 /**
@@ -79,13 +81,18 @@
     public static final int MESSAGE_FAILURE_REASON_DELEGATE_CLOSED = 2;
 
     /**
-     * The SIP message has an invalid start line and the message can not be sent.
+     * The SIP message has an invalid start line and the message can not be sent or the start line
+     * failed validation due to the request containing a restricted SIP request method.
+     * {@link SipDelegateConnection}s can not send SIP requests for the methods: REGISTER, PUBLISH,
+     * or OPTIONS.
      */
     public static final int MESSAGE_FAILURE_REASON_INVALID_START_LINE = 3;
 
     /**
      * One or more of the header fields in the header section of the outgoing SIP message is invalid
-     * and the SIP message can not be sent.
+     * or contains a restricted header value and the SIP message can not be sent.
+     * {@link SipDelegateConnection}s can not send SIP SUBSCRIBE requests for the "Event" header
+     * value of "presence".
      */
     public static final int MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS = 4;
 
@@ -125,12 +132,12 @@
     public static final int MESSAGE_FAILURE_REASON_NOT_REGISTERED = 9;
 
     /**
-     * The outgoing SIP message has not been sent because the {@link SipDelegateImsConfiguration}
+     * The outgoing SIP message has not been sent because the {@link SipDelegateConfiguration}
      * version associated with the outgoing {@link SipMessage} is now stale and has failed
      * validation checks.
      * <p>
      * The @link SipMessage} should be recreated using the newest
-     * {@link SipDelegateImsConfiguration} and sent again.
+     * {@link SipDelegateConfiguration} and sent again.
      */
     public static final int MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION = 10;
 
@@ -162,6 +169,35 @@
     })
     public @interface MessageFailureReason {}
 
+    /**@hide*/
+    public static final ArrayMap<Integer, String> MESSAGE_FAILURE_REASON_STRING_MAP =
+            new ArrayMap<>(11);
+    static {
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_UNKNOWN,
+                "MESSAGE_FAILURE_REASON_UNKNOWN");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_DELEGATE_DEAD,
+                "MESSAGE_FAILURE_REASON_DELEGATE_DEAD");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_DELEGATE_CLOSED,
+                "MESSAGE_FAILURE_REASON_DELEGATE_CLOSED");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS,
+                "MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_INVALID_BODY_CONTENT,
+                "MESSAGE_FAILURE_REASON_INVALID_BODY_CONTENT");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_INVALID_FEATURE_TAG,
+                "MESSAGE_FAILURE_REASON_INVALID_FEATURE_TAG");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(
+                MESSAGE_FAILURE_REASON_TAG_NOT_ENABLED_FOR_DELEGATE,
+                "MESSAGE_FAILURE_REASON_TAG_NOT_ENABLED_FOR_DELEGATE");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE,
+                "MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_NOT_REGISTERED,
+                "MESSAGE_FAILURE_REASON_NOT_REGISTERED");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION,
+                "MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION");
+        MESSAGE_FAILURE_REASON_STRING_MAP.append(
+                MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION,
+                "MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION");
+    }
 
     /**
      * Access to use this feature tag has been denied for an unknown reason.
@@ -322,9 +358,10 @@
     public void createSipDelegate(@NonNull DelegateRequest request, @NonNull Executor executor,
             @NonNull DelegateConnectionStateCallback dc,
             @NonNull DelegateConnectionMessageCallback mc) throws ImsException {
-        if (request == null || executor == null || dc == null || mc == null) {
-            throw new IllegalArgumentException("Invalid arguments passed into createSipDelegate");
-        }
+        Objects.requireNonNull(request, "The DelegateRequest must not be null.");
+        Objects.requireNonNull(executor, "The Executor must not be null.");
+        Objects.requireNonNull(dc, "The DelegateConnectionStateCallback must not be null.");
+        Objects.requireNonNull(mc, "The DelegateConnectionMessageCallback must not be null.");
         try {
             SipDelegateConnectionAidlWrapper wrapper =
                     new SipDelegateConnectionAidlWrapper(executor, dc, mc);
@@ -355,10 +392,7 @@
     @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION)
     public void destroySipDelegate(@NonNull SipDelegateConnection delegateConnection,
             @SipDelegateDestroyReason int reason) {
-
-        if (delegateConnection == null) {
-            throw new IllegalArgumentException("invalid argument passed into destroySipDelegate");
-        }
+        Objects.requireNonNull(delegateConnection, "SipDelegateConnection can not be null.");
         if (delegateConnection instanceof SipDelegateConnectionAidlWrapper) {
             SipDelegateConnectionAidlWrapper w =
                     (SipDelegateConnectionAidlWrapper) delegateConnection;
@@ -396,9 +430,7 @@
     @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION)
     public void triggerFullNetworkRegistration(@NonNull SipDelegateConnection connection,
             @IntRange(from = 100, to = 699) int sipCode, @Nullable String sipReason) {
-        if (connection == null) {
-            throw new IllegalArgumentException("invalid connection.");
-        }
+        Objects.requireNonNull(connection, "SipDelegateConnection can not be null.");
         if (connection instanceof SipDelegateConnectionAidlWrapper) {
             SipDelegateConnectionAidlWrapper w = (SipDelegateConnectionAidlWrapper) connection;
             try {
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegateConnectionStateCallback.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegateConnectionStateCallback.aidl
index ddfcb99..855000b 100644
--- a/telephony/java/android/telephony/ims/aidl/ISipDelegateConnectionStateCallback.aidl
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegateConnectionStateCallback.aidl
@@ -18,6 +18,7 @@
 
 import android.telephony.ims.DelegateRegistrationState;
 import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConfiguration;
 import android.telephony.ims.SipDelegateImsConfiguration;
 import android.telephony.ims.aidl.ISipDelegate;
 
@@ -30,5 +31,6 @@
     void onFeatureTagStatusChanged(in DelegateRegistrationState registrationState,
                 in List<FeatureTagState> deniedFeatureTags);
     void onImsConfigurationChanged(in SipDelegateImsConfiguration registeredSipConfig);
+    void onConfigurationChanged(in SipDelegateConfiguration registeredSipConfig);
     void onDestroyed(int reason);
 }
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegateStateCallback.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegateStateCallback.aidl
index 609ee26..4c3c93d 100644
--- a/telephony/java/android/telephony/ims/aidl/ISipDelegateStateCallback.aidl
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegateStateCallback.aidl
@@ -18,6 +18,7 @@
 
 import android.telephony.ims.DelegateRegistrationState;
 import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConfiguration;
 import android.telephony.ims.SipDelegateImsConfiguration;
 import android.telephony.ims.aidl.ISipDelegate;
 
@@ -29,5 +30,6 @@
     void onCreated(ISipDelegate c, in List<FeatureTagState> deniedFeatureTags);
     void onFeatureTagRegistrationChanged(in DelegateRegistrationState registrationState);
     void onImsConfigurationChanged(in SipDelegateImsConfiguration registeredSipConfig);
+    void onConfigurationChanged(in SipDelegateConfiguration registeredSipConfig);
     void onDestroyed(int reason);
 }
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
index 6a98d80..c18ab33 100644
--- a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java
@@ -24,6 +24,7 @@
 import android.telephony.ims.DelegateRegistrationState;
 import android.telephony.ims.DelegateStateCallback;
 import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConfiguration;
 import android.telephony.ims.SipDelegateImsConfiguration;
 import android.telephony.ims.SipDelegateManager;
 import android.telephony.ims.SipMessage;
@@ -166,6 +167,15 @@
     }
 
     @Override
+    public void onConfigurationChanged(@NonNull SipDelegateConfiguration config) {
+        try {
+            mStateBinder.onConfigurationChanged(config);
+        } catch (RemoteException e) {
+            // BinderDied will trigger destroySipDelegate, so just ignore this locally.
+        }
+    }
+
+    @Override
     public void onDestroyed(int reasonCode) {
         mDelegate = null;
         try {
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
index 0abb495..47ddcb9 100644
--- a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
@@ -21,6 +21,7 @@
 import android.os.RemoteException;
 import android.telephony.ims.DelegateRegistrationState;
 import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConfiguration;
 import android.telephony.ims.SipDelegateConnection;
 import android.telephony.ims.SipDelegateImsConfiguration;
 import android.telephony.ims.SipDelegateManager;
@@ -90,6 +91,17 @@
         }
 
         @Override
+        public void onConfigurationChanged(SipDelegateConfiguration registeredSipConfig) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                mExecutor.execute(() ->
+                        mStateCallback.onConfigurationChanged(registeredSipConfig));
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override
         public void onDestroyed(int reason) {
             invalidateSipDelegateBinder();
             final long token = Binder.clearCallingIdentity();
diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java
index b384e50..ddd6fbe 100644
--- a/telephony/java/android/telephony/ims/feature/RcsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java
@@ -120,8 +120,8 @@
                 @Nullable ICapabilityExchangeEventListener listener) throws RemoteException {
             CapabilityExchangeEventListener listenerWrapper =
                     new CapabilityExchangeAidlWrapper(listener);
-            executeMethodAsync(() -> mReference.setCapabilityExchangeEventListener(
-                    mExecutor, listenerWrapper), "setCapabilityExchangeEventListener");
+            executeMethodAsync(() -> mReference.setCapabilityExchangeEventListener(listenerWrapper),
+                    "setCapabilityExchangeEventListener");
         }
 
         @Override
@@ -385,30 +385,6 @@
      * operation and the RcsFeature sets the status of the capability to true using
      * {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)}.
      *
-     * @param executor The executor for the framework to use when request RCS resquests to this
-     * service.
-     * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange
-     * event to the framework.
-     * @return An instance of {@link RcsCapabilityExchangeImplBase} that implements capability
-     * exchange if it is supported by the device.
-     * @hide
-     */
-    public @NonNull RcsCapabilityExchangeImplBase createCapabilityExchangeImpl(
-            @NonNull Executor executor, @NonNull CapabilityExchangeEventListener listener) {
-        // Base Implementation, override to implement functionality
-        return new RcsCapabilityExchangeImplBase(executor);
-    }
-
-    /**
-     * Retrieve the implementation of UCE for this {@link RcsFeature}, which can use either
-     * presence or OPTIONS for capability exchange.
-     *
-     * Will only be requested by the framework if capability exchange is configured
-     * as capable during a
-     * {@link #changeEnabledCapabilities(CapabilityChangeRequest, CapabilityCallbackProxy)}
-     * operation and the RcsFeature sets the status of the capability to true using
-     * {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)}.
-     *
      * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange
      * event to the framework.
      * @return An instance of {@link RcsCapabilityExchangeImplBase} that implements capability
@@ -461,17 +437,15 @@
 
     /**
      * Set the capability exchange listener.
-     * @param executor The executor for the framework to use when request RCS requests to this
-     * service.
      * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange
      * event to the framework.
      */
-    private void setCapabilityExchangeEventListener(@NonNull Executor executor,
+    private void setCapabilityExchangeEventListener(
             @Nullable CapabilityExchangeEventListener listener) {
         synchronized (mLock) {
             mCapExchangeEventListener = listener;
             if (mCapExchangeEventListener != null) {
-                initRcsCapabilityExchangeImplBase(executor, mCapExchangeEventListener);
+                initRcsCapabilityExchangeImplBase(mCapExchangeEventListener);
             } else {
                 // Remove the RcsCapabilityExchangeImplBase instance when the capability exchange
                 // instance has been removed in the framework.
@@ -486,19 +460,17 @@
     /**
      * Initialize the RcsCapabilityExchangeImplBase instance if the capability exchange instance
      * has already been created in the framework.
-     * @param executor The executor for the framework to use when request RCS requests to this
-     * service.
      * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange
      * event to the framework.
      */
-    private void initRcsCapabilityExchangeImplBase(@NonNull Executor executor,
+    private void initRcsCapabilityExchangeImplBase(
             @NonNull CapabilityExchangeEventListener listener) {
         synchronized (mLock) {
             // Remove the original instance
             if (mCapabilityExchangeImpl != null) {
                 removeCapabilityExchangeImpl(mCapabilityExchangeImpl);
             }
-            mCapabilityExchangeImpl = createCapabilityExchangeImpl(executor, listener);
+            mCapabilityExchangeImpl = createCapabilityExchangeImpl(listener);
         }
     }
 
diff --git a/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java b/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java
index 02218ea..c078637 100644
--- a/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java
+++ b/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java
@@ -21,6 +21,7 @@
 import android.telephony.ims.DelegateRegistrationState;
 import android.telephony.ims.DelegateRequest;
 import android.telephony.ims.FeatureTagState;
+import android.telephony.ims.SipDelegateConfiguration;
 import android.telephony.ims.SipDelegateConnection;
 import android.telephony.ims.SipDelegateImsConfiguration;
 import android.telephony.ims.SipDelegateManager;
@@ -44,7 +45,7 @@
  * <p>
  * In order to start sending SIP messages, the SIP configuration parameters will need to be
  * received, so the messaging application should make no assumptions about these parameters and wait
- * until {@link #onImsConfigurationChanged(SipDelegateImsConfiguration)} has been called. This is
+ * until {@link #onConfigurationChanged(SipDelegateConfiguration)} has been called. This is
  * guaranteed to happen after the first {@link #onFeatureTagStatusChanged} if there is at least one
  * feature tag that has been successfully associated with the {@link SipDelegateConnection}. If all
  * feature tags were denied, no IMS configuration will be sent.
@@ -135,8 +136,32 @@
      * not compleed yet.
      *
      * @param registeredSipConfig The configuration of the IMS stack registered on the IMS network.
+     * @deprecated Will not be in final API, use
+     * {@link #onConfigurationChanged(SipDelegateConfiguration)} instead}.
      */
-    void onImsConfigurationChanged(@NonNull SipDelegateImsConfiguration registeredSipConfig);
+    @Deprecated
+    default void onImsConfigurationChanged(
+            @NonNull SipDelegateImsConfiguration registeredSipConfig) {
+        onConfigurationChanged(registeredSipConfig.toNewConfig());
+    }
+
+    /**
+     * IMS configuration of the underlying IMS stack used by this IMS application for construction
+     * of the SIP messages that will be sent over the carrier's network.
+     * <p>
+     * There should never be assumptions made about the configuration of the underling IMS stack and
+     * the IMS application should wait for this indication before sending out any outgoing SIP
+     * messages.
+     * <p>
+     * Configuration may change due to IMS registration changes as well as
+     * other optional events on the carrier network. If IMS stack is already registered at the time
+     * of callback registration, then this method shall be invoked with the current configuration.
+     * Otherwise, there may be a delay in this method being called if initial IMS registration has
+     * not compleed yet.
+     *
+     * @param registeredSipConfig The configuration of the IMS stack registered on the IMS network.
+     */
+    default void onConfigurationChanged(@NonNull SipDelegateConfiguration registeredSipConfig) {}
 
     /**
      * The previously created {@link SipDelegateConnection} instance delivered via
diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
index 39994be..02bcdec 100644
--- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
@@ -57,7 +57,8 @@
                     REGISTRATION_TECH_NONE,
                     REGISTRATION_TECH_LTE,
                     REGISTRATION_TECH_IWLAN,
-                    REGISTRATION_TECH_CROSS_SIM
+                    REGISTRATION_TECH_CROSS_SIM,
+                    REGISTRATION_TECH_NR
             })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ImsRegistrationTech {}
@@ -66,19 +67,24 @@
      */
     public static final int REGISTRATION_TECH_NONE = -1;
     /**
-     * IMS is registered to IMS via LTE.
+     * This ImsService is registered to IMS via LTE.
      */
     public static final int REGISTRATION_TECH_LTE = 0;
     /**
-     * IMS is registered to IMS via IWLAN.
+     * This ImsService is registered to IMS via IWLAN.
      */
     public static final int REGISTRATION_TECH_IWLAN = 1;
 
     /**
-     * IMS is registered to IMS via internet over second subscription.
+     * This ImsService is registered to IMS via internet over second subscription.
      */
     public static final int REGISTRATION_TECH_CROSS_SIM = 2;
 
+    /**
+     * This ImsService is registered to IMS via NR.
+     */
+    public static final int REGISTRATION_TECH_NR = 3;
+
     // Registration states, used to notify new ImsRegistrationImplBase#Callbacks of the current
     // state.
     // The unknown state is set as the initialization state. This is so that we do not call back
diff --git a/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java b/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java
index 57616d35..474eb05 100644
--- a/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/RcsCapabilityExchangeImplBase.java
@@ -356,21 +356,6 @@
         void onTerminated(@NonNull String reason, long retryAfterMilliseconds) throws ImsException;
     }
 
-    private Executor mBinderExecutor;
-
-    /**
-     * Create a new RcsCapabilityExchangeImplBase instance.
-     *
-     * @param executor The executor that remote calls from the framework will be called on.
-     * @hide
-     */
-    public RcsCapabilityExchangeImplBase(@NonNull Executor executor) {
-        if (executor == null) {
-            throw new IllegalArgumentException("executor must not be null");
-        }
-        mBinderExecutor = executor;
-    }
-
     /**
      * Create a new RcsCapabilityExchangeImplBase instance.
      */
diff --git a/telephony/java/android/telephony/ims/stub/SipDelegate.java b/telephony/java/android/telephony/ims/stub/SipDelegate.java
index d5198a0..997d00b 100644
--- a/telephony/java/android/telephony/ims/stub/SipDelegate.java
+++ b/telephony/java/android/telephony/ims/stub/SipDelegate.java
@@ -21,8 +21,8 @@
 import android.telephony.ims.DelegateMessageCallback;
 import android.telephony.ims.DelegateRegistrationState;
 import android.telephony.ims.ImsService;
+import android.telephony.ims.SipDelegateConfiguration;
 import android.telephony.ims.SipDelegateConnection;
-import android.telephony.ims.SipDelegateImsConfiguration;
 import android.telephony.ims.SipDelegateManager;
 import android.telephony.ims.SipMessage;
 
@@ -38,7 +38,7 @@
  * modified to include the features managed by these SipDelegates.
  * <p>
  * This SipDelegate will need to notify the remote application of the registration of these features
- * as well as the associated {@link SipDelegateImsConfiguration} before the application can start
+ * as well as the associated {@link SipDelegateConfiguration} before the application can start
  * sending/receiving SIP messages via the transport. See
  * {@link android.telephony.ims.DelegateStateCallback} for more information.
  * @hide
@@ -55,9 +55,9 @@
      * {@link DelegateMessageCallback#onMessageSendFailure(String, int)}.
      * @param message The SIP message to be sent over the operator’s network.
      * @param configVersion The SipDelegateImsConfiguration version used to construct the
-     *         SipMessage. See {@link SipDelegateImsConfiguration} for more information. If the
+     *         SipMessage. See {@link SipDelegateConfiguration} for more information. If the
      *         version specified here does not match the most recently constructed
-     *         {@link SipDelegateImsConfiguration}, this message should fail validation checks and
+     *         {@link SipDelegateConfiguration}, this message should fail validation checks and
      *         {@link DelegateMessageCallback#onMessageSendFailure} should be called with code
      *         {@link SipDelegateManager#MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION}.
      */
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index 1e5d598..409c838 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -114,7 +114,6 @@
     public static final int EVENT_CARRIER_CONFIG_CHANGED = BASE + 54;
     public static final int EVENT_SIM_STATE_UPDATED = BASE + 55;
     public static final int EVENT_APN_UNTHROTTLED = BASE + 56;
-    public static final int EVENT_AIRPLANE_MODE_CHANGED = BASE + 57;
 
     /***** Constants *****/
 
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index afc538d..00ddec2 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1063,11 +1063,13 @@
 
     /**
      * Similar to above, but check for the package whose name is pkgName.
+     * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission
      */
     int checkCarrierPrivilegesForPackage(int subId, String pkgName);
 
     /**
      * Similar to above, but check across all phones.
+     * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission
      */
     int checkCarrierPrivilegesForPackageAnyPhone(String pkgName);
 
@@ -1075,6 +1077,8 @@
      * Returns list of the package names of the carrier apps that should handle the input intent
      * and have carrier privileges for the given phoneId.
      *
+     * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission
+     *
      * @param intent Intent that will be sent.
      * @param phoneId The phoneId on which the carrier app has carrier privileges.
      * @return list of carrier app package names that can handle the intent on phoneId.
@@ -1443,11 +1447,13 @@
 
     /**
      * Returns a list of packages that have carrier privileges for the specific phone.
+     * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission
      */
     List<String> getPackagesWithCarrierPrivileges(int phoneId);
 
      /**
       * Returns a list of packages that have carrier privileges.
+      * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission
       */
     List<String> getPackagesWithCarrierPrivilegesForAllPhones();
 
diff --git a/test-mock/src/android/test/mock/MockContext.java b/test-mock/src/android/test/mock/MockContext.java
index 65aa9ae..7a1dda3 100644
--- a/test-mock/src/android/test/mock/MockContext.java
+++ b/test-mock/src/android/test/mock/MockContext.java
@@ -375,6 +375,13 @@
 
     /** @hide */
     @Override
+    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions,
+            Bundle options) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** @hide */
+    @Override
     public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
             String[] receiverPermissions) {
         throw new UnsupportedOperationException();
diff --git a/tests/Camera2Tests/CameraToo/Android.mk b/tests/Camera2Tests/CameraToo/Android.mk
index 7e5911d..3347314 100644
--- a/tests/Camera2Tests/CameraToo/Android.mk
+++ b/tests/Camera2Tests/CameraToo/Android.mk
@@ -17,6 +17,9 @@
 
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := CameraToo
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 
diff --git a/tests/Camera2Tests/CameraToo/tests/Android.mk b/tests/Camera2Tests/CameraToo/tests/Android.mk
index fe4dc42..dfa64f1 100644
--- a/tests/Camera2Tests/CameraToo/tests/Android.mk
+++ b/tests/Camera2Tests/CameraToo/tests/Android.mk
@@ -17,6 +17,9 @@
 
 LOCAL_MODULE_TAGS := tests
 LOCAL_PACKAGE_NAME := CameraTooTests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../NOTICE
 LOCAL_INSTRUMENTATION_FOR := CameraToo
 LOCAL_SDK_VERSION := current
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk b/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk
index 4e3675f..6003628 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk
@@ -32,6 +32,9 @@
     $(call all-renderscript-files-under, src)
 
 LOCAL_PACKAGE_NAME := SmartCamera
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../NOTICE
 LOCAL_JNI_SHARED_LIBRARIES := libsmartcamera_jni
 
 include $(BUILD_PACKAGE)
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk
index a900077..c23d593 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk
@@ -22,6 +22,9 @@
 LOCAL_PRIVATE_PLATFORM_APIS := true
 
 LOCAL_PACKAGE_NAME := SmartCamera-tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 
 LOCAL_SRC_FILES += $(call all-java-files-under, src)
 
diff --git a/tests/CanvasCompare/Android.mk b/tests/CanvasCompare/Android.mk
index 6a0a93e..b82ae65 100644
--- a/tests/CanvasCompare/Android.mk
+++ b/tests/CanvasCompare/Android.mk
@@ -20,6 +20,9 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
 
 LOCAL_PACKAGE_NAME := CanvasCompare
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../NOTICE
 LOCAL_PRIVATE_PLATFORM_APIS := true
 
 LOCAL_MODULE_TAGS := tests
diff --git a/tests/DynamicCodeLoggerIntegrationTests/Android.mk b/tests/DynamicCodeLoggerIntegrationTests/Android.mk
index bfb5b07..dab8304 100644
--- a/tests/DynamicCodeLoggerIntegrationTests/Android.mk
+++ b/tests/DynamicCodeLoggerIntegrationTests/Android.mk
@@ -89,4 +89,7 @@
     $(dynamiccodeloggertest_jar) \
     $(dynamiccodeloggertest_executable) \
 
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE
 include $(BUILD_PACKAGE)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
index 9ac504b..96c7c0a 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
@@ -116,7 +116,7 @@
         }
     }
 
-    @Presubmit
+    @FlakyTest(bugId = 185400889)
     @Test
     open fun noUncoveredRegions() {
         testSpec.noUncoveredRegions(testSpec.config.startRotation, Surface.ROTATION_0)
@@ -134,7 +134,7 @@
         testSpec.launcherWindowBecomesVisible()
     }
 
-    @Presubmit
+    @FlakyTest(bugId = 185400889)
     @Test
     open fun launcherLayerReplacesApp() {
         testSpec.launcherLayerReplacesApp(testApp)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
index cdec51d..7bc004f 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
@@ -50,6 +50,7 @@
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@FlakyTest(bugId = 185400889)
 class CloseImeWindowToAppTest(private val testSpec: FlickerTestParameter) {
     private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
     private val testApp = ImeAppHelper(instrumentation)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
index 559d953..5703e6c 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
@@ -39,6 +39,7 @@
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@FlakyTest(bugId = 185400889)
 class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) {
     override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
         get() = {
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
index 8be3b7e..c06f8fd 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
@@ -60,7 +60,7 @@
         private float mShaderParam1 = 0.0f;
 
         static final String sSkSL =
-                "in shader bitmapShader;\n"
+                "uniform shader bitmapShader;\n"
                 + "uniform float param1;\n"
                 + "half4 main(float2 xy) {\n"
                 + "  return half4(sample(bitmapShader, xy).rgb, param1);\n"
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java
index 487c856..79410cf 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java
@@ -89,7 +89,7 @@
                 + "    d = rand(float2(x, y)) > density ? d : d * .2;\n"
                 + "    d = d * rand(float2(fraction, x * y));\n"
                 + "    float alpha = 1. - pow(fraction, 3.);\n"
-                + "    return float4(sample(in_paintColor).rgb, d * alpha);\n"
+                + "    return float4(sample(in_paintColor, p).rgb, d * alpha);\n"
                 + "}";
 
         RippleView(Context c) {
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java
index 912aee6..ade94a9 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java
@@ -440,7 +440,7 @@
         }
     }
 
-    private static final String SKSL = "in shader uContentTexture;\n"
+    private static final String SKSL = "uniform shader uContentTexture;\n"
             + "uniform float uMaxStretchIntensity; // multiplier to apply to scale effect\n"
             + "uniform float uStretchAffectedDist; // Maximum percentage to stretch beyond bounds"
             + " of target\n"
diff --git a/tests/LockTaskTests/Android.mk b/tests/LockTaskTests/Android.mk
index a693eaa..5406ee1 100644
--- a/tests/LockTaskTests/Android.mk
+++ b/tests/LockTaskTests/Android.mk
@@ -5,6 +5,9 @@
 LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/priv-app
 
 LOCAL_PACKAGE_NAME := LockTaskTests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_CERTIFICATE := platform
 
diff --git a/tests/SoundTriggerTests/Android.mk b/tests/SoundTriggerTests/Android.mk
index 204a74e..cc0fa1c 100644
--- a/tests/SoundTriggerTests/Android.mk
+++ b/tests/SoundTriggerTests/Android.mk
@@ -31,6 +31,9 @@
 LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
 
 LOCAL_PACKAGE_NAME := SoundTriggerTests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../NOTICE
 LOCAL_PRIVATE_PLATFORM_APIS := true
 
 include $(BUILD_PACKAGE)
diff --git a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
index 032da3f..74f6bca 100644
--- a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
+++ b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java
@@ -19,6 +19,8 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
+
 import android.platform.test.annotations.RootPermissionTest;
 
 import com.android.fsverity.AddFsVerityCertRule;
@@ -35,7 +37,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -77,6 +78,7 @@
     private static final String EMOJI_RENDERING_TEST_APP_ID = "com.android.emojirenderingtestapp";
     private static final String EMOJI_RENDERING_TEST_ACTIVITY =
             EMOJI_RENDERING_TEST_APP_ID + "/.EmojiRenderingTestActivity";
+    private static final long ACTIVITY_TIMEOUT_MILLIS = SECONDS.toMillis(10);
 
     private interface ThrowingSupplier<T> {
         T get() throws Exception;
@@ -167,9 +169,8 @@
     public void launchApp() throws Exception {
         String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
         assertThat(fontPath).startsWith(SYSTEM_FONTS_DIR);
-        expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID);
-        expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY);
-        waitUntil(TimeUnit.SECONDS.toMillis(5), () ->
+        startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY);
+        waitUntil(ACTIVITY_TIMEOUT_MILLIS, () ->
                 isFileOpenedBy(fontPath, EMOJI_RENDERING_TEST_APP_ID));
     }
 
@@ -181,10 +182,9 @@
                 TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG));
         String updatedFontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
         assertThat(updatedFontPath).startsWith(DATA_FONTS_DIR);
-        expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID);
-        expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY);
+        startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY);
         // The original font should NOT be opened by the app.
-        waitUntil(TimeUnit.SECONDS.toMillis(5), () ->
+        waitUntil(ACTIVITY_TIMEOUT_MILLIS, () ->
                 isFileOpenedBy(updatedFontPath, EMOJI_RENDERING_TEST_APP_ID)
                         && !isFileOpenedBy(originalFontPath, EMOJI_RENDERING_TEST_APP_ID));
     }
@@ -196,9 +196,8 @@
         String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF);
         assertThat(fontPath).startsWith(DATA_FONTS_DIR);
 
-        expectRemoteCommandToSucceed("stop");
-        expectRemoteCommandToSucceed("start");
-        waitUntilFontCommandIsReady();
+        // Emulate reboot by 'cmd font restart'.
+        expectRemoteCommandToSucceed("cmd font restart");
         String fontPathAfterReboot = getFontPath(NOTO_COLOR_EMOJI_TTF);
         assertThat(fontPathAfterReboot).isEqualTo(fontPath);
     }
@@ -216,6 +215,17 @@
         return null;
     }
 
+    private void startActivity(String appId, String activityId) throws Exception {
+        // Make sure that the app is installed and enabled.
+        waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> {
+            String packageInfo = expectRemoteCommandToSucceed(
+                    "pm list packages -e " + EMOJI_RENDERING_TEST_APP_ID);
+            return !packageInfo.isEmpty();
+        });
+        expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID);
+        expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY);
+    }
+
     private String expectRemoteCommandToSucceed(String cmd) throws Exception {
         CommandResult result = getDevice().executeShellV2Command(cmd);
         assertWithMessage("`" + cmd + "` failed: " + result.getStderr())
@@ -231,17 +241,6 @@
                 .isNotEqualTo(CommandStatus.SUCCESS);
     }
 
-    private void waitUntilFontCommandIsReady() {
-        waitUntil(TimeUnit.SECONDS.toMillis(30), () -> {
-            try {
-                return getDevice().executeShellV2Command("cmd font status").getStatus()
-                        == CommandStatus.SUCCESS;
-            } catch (DeviceNotAvailableException e) {
-                return false;
-            }
-        });
-    }
-
     private void waitUntil(long timeoutMillis, ThrowingSupplier<Boolean> func) {
         long untilMillis = System.currentTimeMillis() + timeoutMillis;
         do {
diff --git a/tests/backup/Android.mk b/tests/backup/Android.mk
index 9b155c9..b6f3471 100644
--- a/tests/backup/Android.mk
+++ b/tests/backup/Android.mk
@@ -47,4 +47,7 @@
 
 LOCAL_PROGUARD_ENABLED := disabled
 
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE
 include $(BUILD_PACKAGE)
diff --git a/tests/net/TEST_MAPPING b/tests/net/TEST_MAPPING
index d659688..502f885 100644
--- a/tests/net/TEST_MAPPING
+++ b/tests/net/TEST_MAPPING
@@ -28,7 +28,7 @@
   ],
   "imports": [
     {
-      "path": "cts/tests/tests/net"
+      "path": "packages/modules/Connectivity"
     }
   ]
 }
\ No newline at end of file
diff --git a/tests/net/common/java/ParseExceptionTest.kt b/tests/net/common/java/ParseExceptionTest.kt
index f17715a..b702d61 100644
--- a/tests/net/common/java/ParseExceptionTest.kt
+++ b/tests/net/common/java/ParseExceptionTest.kt
@@ -15,16 +15,22 @@
  */
 
 import android.net.ParseException
+import android.os.Build
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import com.android.testutils.DevSdkIgnoreRule
 import junit.framework.Assert.assertEquals
 import junit.framework.Assert.assertNull
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ParseExceptionTest {
+    @get:Rule
+    val ignoreRule = DevSdkIgnoreRule(ignoreClassUpTo = Build.VERSION_CODES.R)
+
     @Test
     fun testConstructor_WithCause() {
         val testMessage = "Test message"
diff --git a/tests/net/common/java/android/net/NetworkTest.java b/tests/net/common/java/android/net/NetworkTest.java
index cd9da8e..7423c73 100644
--- a/tests/net/common/java/android/net/NetworkTest.java
+++ b/tests/net/common/java/android/net/NetworkTest.java
@@ -29,6 +29,7 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.testutils.DevSdkIgnoreRule;
+import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
 
 import org.junit.Rule;
@@ -158,16 +159,22 @@
         assertEquals(16290598925L, three.getNetworkHandle());
     }
 
+    // getNetId() did not exist in Q
+    @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
+    public void testGetNetId() {
+        assertEquals(1234, new Network(1234).getNetId());
+        assertEquals(2345, new Network(2345, true).getNetId());
+    }
+
     @Test
     public void testFromNetworkHandle() {
         final Network network = new Network(1234);
-        assertEquals(network.getNetId(),
-                Network.fromNetworkHandle(network.getNetworkHandle()).getNetId());
+        assertEquals(network.netId, Network.fromNetworkHandle(network.getNetworkHandle()).netId);
     }
 
     // Parsing private DNS bypassing handle was not supported until S
     @Test @IgnoreUpTo(Build.VERSION_CODES.R)
-    public void testFromNetworkHandle_S() {
+    public void testFromNetworkHandlePrivateDnsBypass_S() {
         final Network network = new Network(1234, true);
 
         final Network recreatedNetwork = Network.fromNetworkHandle(network.getNetworkHandle());
@@ -175,6 +182,16 @@
         assertEquals(network.getNetIdForResolv(), recreatedNetwork.getNetIdForResolv());
     }
 
+    @Test @IgnoreAfter(Build.VERSION_CODES.R)
+    public void testFromNetworkHandlePrivateDnsBypass_R() {
+        final Network network = new Network(1234, true);
+
+        final Network recreatedNetwork = Network.fromNetworkHandle(network.getNetworkHandle());
+        assertEquals(network.netId, recreatedNetwork.netId);
+        // Until R included, fromNetworkHandle would not parse the private DNS bypass flag
+        assertEquals(network.netId, recreatedNetwork.getNetIdForResolv());
+    }
+
     @Test
     public void testGetPrivateDnsBypassingCopy() {
         final Network copy = mNetwork.getPrivateDnsBypassingCopy();
diff --git a/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt b/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt
index 87cfb34..f23ba26 100644
--- a/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt
+++ b/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt
@@ -36,15 +36,15 @@
     @Test
     fun testParcelUnparcel() {
         val testInfo = UnderlyingNetworkInfo(TEST_OWNER_UID, TEST_IFACE, TEST_IFACE_LIST)
-        assertEquals(TEST_OWNER_UID, testInfo.ownerUid)
-        assertEquals(TEST_IFACE, testInfo.iface)
-        assertEquals(TEST_IFACE_LIST, testInfo.underlyingIfaces)
+        assertEquals(TEST_OWNER_UID, testInfo.getOwnerUid())
+        assertEquals(TEST_IFACE, testInfo.getInterface())
+        assertEquals(TEST_IFACE_LIST, testInfo.getUnderlyingInterfaces())
         assertParcelSane(testInfo, 3)
 
         val emptyInfo = UnderlyingNetworkInfo(0, String(), listOf())
-        assertEquals(0, emptyInfo.ownerUid)
-        assertEquals(String(), emptyInfo.iface)
-        assertEquals(listOf(), emptyInfo.underlyingIfaces)
+        assertEquals(0, emptyInfo.getOwnerUid())
+        assertEquals(String(), emptyInfo.getInterface())
+        assertEquals(listOf(), emptyInfo.getUnderlyingInterfaces())
         assertParcelSane(emptyInfo, 3)
     }
 }
\ No newline at end of file
diff --git a/tests/net/integration/AndroidManifest.xml b/tests/net/integration/AndroidManifest.xml
index db18500..2e13689 100644
--- a/tests/net/integration/AndroidManifest.xml
+++ b/tests/net/integration/AndroidManifest.xml
@@ -38,6 +38,8 @@
     <!-- Reading DeviceConfig flags -->
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
     <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
+    <!-- Querying the resources package -->
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
     <application android:debuggable="true">
         <uses-library android:name="android.test.runner"/>
 
diff --git a/tests/net/java/android/net/ConnectivityManagerTest.java b/tests/net/java/android/net/ConnectivityManagerTest.java
index 19f8843..591e0cc 100644
--- a/tests/net/java/android/net/ConnectivityManagerTest.java
+++ b/tests/net/java/android/net/ConnectivityManagerTest.java
@@ -379,7 +379,7 @@
                 eq(testPkgName), eq(testAttributionTag));
         reset(mService);
 
-        manager.registerDefaultNetworkCallbackAsUid(42, callback, handler);
+        manager.registerDefaultNetworkCallbackForUid(42, callback, handler);
         verify(mService).requestNetwork(eq(42), eq(null),
                 eq(TRACK_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(),
                 eq(testPkgName), eq(testAttributionTag));
diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java
index 735fa7c..23d5a7e 100644
--- a/tests/net/java/android/net/NetworkStatsTest.java
+++ b/tests/net/java/android/net/NetworkStatsTest.java
@@ -50,6 +50,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Arrays;
 import java.util.HashSet;
 
 @RunWith(AndroidJUnit4.class)
@@ -616,7 +617,7 @@
                 .insertEntry(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO,
                         ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
 
-        delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface});
+        delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface));
         assertEquals(20, delta.size());
 
         // tunIface and TEST_IFACE entries are not changed.
@@ -697,7 +698,7 @@
                 .insertEntry(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
                         DEFAULT_NETWORK_NO, 75500L, 37L, 130000L, 70L, 0L);
 
-        delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface});
+        delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface));
         assertEquals(9, delta.size());
 
         // tunIface entries should not be changed.
diff --git a/tests/net/java/android/net/NetworkTemplateTest.kt b/tests/net/java/android/net/NetworkTemplateTest.kt
index 64b774c..ab6b2f4 100644
--- a/tests/net/java/android/net/NetworkTemplateTest.kt
+++ b/tests/net/java/android/net/NetworkTemplateTest.kt
@@ -31,11 +31,16 @@
 import android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD
 import android.net.NetworkTemplate.MATCH_WIFI
 import android.net.NetworkTemplate.MATCH_WIFI_WILDCARD
+import android.net.NetworkTemplate.WIFI_NETWORKID_ALL
 import android.net.NetworkTemplate.NETWORK_TYPE_5G_NSA
 import android.net.NetworkTemplate.NETWORK_TYPE_ALL
 import android.net.NetworkTemplate.OEM_MANAGED_ALL
 import android.net.NetworkTemplate.OEM_MANAGED_NO
 import android.net.NetworkTemplate.OEM_MANAGED_YES
+import android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT
+import android.net.NetworkTemplate.buildTemplateWifi
+import android.net.NetworkTemplate.buildTemplateWifiWildcard
+import android.net.NetworkTemplate.buildTemplateCarrier
 import android.net.NetworkTemplate.buildTemplateMobileWithRatType
 import android.telephony.TelephonyManager
 import com.android.testutils.assertParcelSane
@@ -53,6 +58,7 @@
 private const val TEST_IMSI1 = "imsi1"
 private const val TEST_IMSI2 = "imsi2"
 private const val TEST_SSID1 = "ssid1"
+private const val TEST_SSID2 = "ssid2"
 
 @RunWith(JUnit4::class)
 class NetworkTemplateTest {
@@ -60,8 +66,8 @@
 
     private fun buildMobileNetworkState(subscriberId: String): NetworkStateSnapshot =
             buildNetworkState(TYPE_MOBILE, subscriberId = subscriberId)
-    private fun buildWifiNetworkState(ssid: String): NetworkStateSnapshot =
-            buildNetworkState(TYPE_WIFI, ssid = ssid)
+    private fun buildWifiNetworkState(subscriberId: String?, ssid: String?): NetworkStateSnapshot =
+            buildNetworkState(TYPE_WIFI, subscriberId = subscriberId, ssid = ssid)
 
     private fun buildNetworkState(
         type: Int,
@@ -94,6 +100,95 @@
     }
 
     @Test
+    fun testWifiWildcardMatches() {
+        val templateWifiWildcard = buildTemplateWifiWildcard()
+
+        val identMobileImsi1 = buildNetworkIdentity(mockContext,
+                buildMobileNetworkState(TEST_IMSI1),
+                false, TelephonyManager.NETWORK_TYPE_UMTS)
+        val identWifiImsiNullSsid1 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0)
+        val identWifiImsi1Ssid1 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0)
+
+        templateWifiWildcard.assertDoesNotMatch(identMobileImsi1)
+        templateWifiWildcard.assertMatches(identWifiImsiNullSsid1)
+        templateWifiWildcard.assertMatches(identWifiImsi1Ssid1)
+    }
+
+    @Test
+    fun testWifiMatches() {
+        val templateWifiSsid1 = buildTemplateWifi(TEST_SSID1)
+        val templateWifiSsid1ImsiNull = buildTemplateWifi(TEST_SSID1, null)
+        val templateWifiSsid1Imsi1 = buildTemplateWifi(TEST_SSID1, TEST_IMSI1)
+        val templateWifiSsidAllImsi1 = buildTemplateWifi(WIFI_NETWORKID_ALL, TEST_IMSI1)
+
+        val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1),
+                false, TelephonyManager.NETWORK_TYPE_UMTS)
+        val identWifiImsiNullSsid1 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0)
+        val identWifiImsi1Ssid1 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0)
+        val identWifiImsi2Ssid1 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_SSID1), true, 0)
+        val identWifiImsi1Ssid2 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID2), true, 0)
+
+        // Verify that template with SSID only matches any subscriberId and specific SSID.
+        templateWifiSsid1.assertDoesNotMatch(identMobile1)
+        templateWifiSsid1.assertMatches(identWifiImsiNullSsid1)
+        templateWifiSsid1.assertMatches(identWifiImsi1Ssid1)
+        templateWifiSsid1.assertMatches(identWifiImsi2Ssid1)
+        templateWifiSsid1.assertDoesNotMatch(identWifiImsi1Ssid2)
+
+        // Verify that template with SSID1 and null imsi matches any network with
+        // SSID1 and null imsi.
+        templateWifiSsid1ImsiNull.assertDoesNotMatch(identMobile1)
+        templateWifiSsid1ImsiNull.assertMatches(identWifiImsiNullSsid1)
+        templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi1Ssid1)
+        templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi2Ssid1)
+        templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi1Ssid2)
+
+        // Verify that template with SSID1 and imsi1 matches any network with
+        // SSID1 and imsi1.
+        templateWifiSsid1Imsi1.assertDoesNotMatch(identMobile1)
+        templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsiNullSsid1)
+        templateWifiSsid1Imsi1.assertMatches(identWifiImsi1Ssid1)
+        templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsi2Ssid1)
+        templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsi1Ssid2)
+
+        // Verify that template with SSID all and imsi1 matches any network with
+        // any SSID and imsi1.
+        templateWifiSsidAllImsi1.assertDoesNotMatch(identMobile1)
+        templateWifiSsidAllImsi1.assertDoesNotMatch(identWifiImsiNullSsid1)
+        templateWifiSsidAllImsi1.assertMatches(identWifiImsi1Ssid1)
+        templateWifiSsidAllImsi1.assertDoesNotMatch(identWifiImsi2Ssid1)
+        templateWifiSsidAllImsi1.assertMatches(identWifiImsi1Ssid2)
+    }
+
+    @Test
+    fun testCarrierMatches() {
+        val templateCarrierImsi1 = buildTemplateCarrier(TEST_IMSI1)
+
+        val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1),
+                false, TelephonyManager.NETWORK_TYPE_UMTS)
+        val identMobile2 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI2),
+                false, TelephonyManager.NETWORK_TYPE_UMTS)
+        val identWifiSsid1 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0)
+        val identCarrierWifiImsi1 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0)
+        val identCarrierWifiImsi2 = buildNetworkIdentity(
+                mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_SSID1), true, 0)
+
+        templateCarrierImsi1.assertMatches(identCarrierWifiImsi1)
+        templateCarrierImsi1.assertDoesNotMatch(identCarrierWifiImsi2)
+        templateCarrierImsi1.assertDoesNotMatch(identWifiSsid1)
+        templateCarrierImsi1.assertMatches(identMobile1)
+        templateCarrierImsi1.assertDoesNotMatch(identMobile2)
+    }
+
+    @Test
     fun testRatTypeGroupMatches() {
         val stateMobile = buildMobileNetworkState(TEST_IMSI1)
         // Build UMTS template that matches mobile identities with RAT in the same
@@ -117,7 +212,7 @@
         val identImsi2 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI2),
                 false, TelephonyManager.NETWORK_TYPE_UMTS)
         val identWifi = buildNetworkIdentity(
-                mockContext, buildWifiNetworkState(TEST_SSID1), true, 0)
+                mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0)
 
         // Assert that identity with the same RAT matches.
         templateUmts.assertMatches(identUmts)
@@ -151,14 +246,16 @@
     fun testParcelUnparcel() {
         val templateMobile = NetworkTemplate(MATCH_MOBILE, TEST_IMSI1, null, null, METERED_ALL,
                 ROAMING_ALL, DEFAULT_NETWORK_ALL, TelephonyManager.NETWORK_TYPE_LTE,
-                OEM_MANAGED_ALL)
+                OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT)
         val templateWifi = NetworkTemplate(MATCH_WIFI, null, null, TEST_SSID1, METERED_ALL,
-                ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_ALL)
+                ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_ALL,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT)
         val templateOem = NetworkTemplate(MATCH_MOBILE, null, null, null, METERED_ALL,
-                ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_YES)
-        assertParcelSane(templateMobile, 9)
-        assertParcelSane(templateWifi, 9)
-        assertParcelSane(templateOem, 9)
+                ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_YES,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT)
+        assertParcelSane(templateMobile, 10)
+        assertParcelSane(templateWifi, 10)
+        assertParcelSane(templateOem, 10)
     }
 
     // Verify NETWORK_TYPE_* constants in NetworkTemplate do not conflict with
@@ -207,15 +304,14 @@
         identSsid: String? = null
     ) {
         val oemManagedStates = arrayOf(OEM_NONE, OEM_PAID, OEM_PRIVATE, OEM_PAID or OEM_PRIVATE)
-        // A null subscriberId needs a null matchSubscriberIds argument as well.
-        val matchSubscriberIds = if (subscriberId == null) null else arrayOf(subscriberId)
+        val matchSubscriberIds = arrayOf(subscriberId)
 
         val templateOemYes = NetworkTemplate(matchType, subscriberId, matchSubscriberIds,
                 templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL,
-                OEM_MANAGED_YES)
+                OEM_MANAGED_YES, SUBSCRIBER_ID_MATCH_RULE_EXACT)
         val templateOemAll = NetworkTemplate(matchType, subscriberId, matchSubscriberIds,
                 templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL,
-                OEM_MANAGED_ALL)
+                OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT)
 
         for (identityOemManagedState in oemManagedStates) {
             val ident = buildNetworkIdentity(mockContext, buildNetworkState(networkType,
@@ -226,7 +322,7 @@
             for (templateOemManagedState in oemManagedStates) {
                 val template = NetworkTemplate(matchType, subscriberId, matchSubscriberIds,
                         templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL,
-                        NETWORK_TYPE_ALL, templateOemManagedState)
+                        NETWORK_TYPE_ALL, templateOemManagedState, SUBSCRIBER_ID_MATCH_RULE_EXACT)
                 if (identityOemManagedState == templateOemManagedState) {
                     template.assertMatches(ident)
                 } else {
diff --git a/tests/net/java/android/net/VpnTransportInfoTest.java b/tests/net/java/android/net/VpnTransportInfoTest.java
index fee65f0..ccaa5cf 100644
--- a/tests/net/java/android/net/VpnTransportInfoTest.java
+++ b/tests/net/java/android/net/VpnTransportInfoTest.java
@@ -63,6 +63,6 @@
         assertEquals(v31, v32);
         assertEquals(v11.hashCode(), v13.hashCode());
         assertEquals(REDACT_FOR_NETWORK_SETTINGS, v32.getApplicableRedactions());
-        assertEquals(session1, v15.makeCopy(REDACT_NONE).sessionId);
+        assertEquals(session1, v15.makeCopy(REDACT_NONE).getSessionId());
     }
 }
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 7ebed39..f277e94 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -44,9 +44,6 @@
 import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
 import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO;
 import static android.net.ConnectivityManager.EXTRA_NETWORK_TYPE;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_DEFAULT;
 import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_ENTERPRISE;
 import static android.net.ConnectivityManager.TYPE_ETHERNET;
@@ -57,6 +54,9 @@
 import static android.net.ConnectivityManager.TYPE_PROXY;
 import static android.net.ConnectivityManager.TYPE_VPN;
 import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OFF;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_HTTP;
@@ -1387,7 +1387,7 @@
         final TransportInfo ti = nc.getTransportInfo();
         assertTrue("VPN TransportInfo is not a VpnTransportInfo: " + ti,
                 ti instanceof VpnTransportInfo);
-        assertEquals(type, ((VpnTransportInfo) ti).type);
+        assertEquals(type, ((VpnTransportInfo) ti).getType());
 
     }
 
@@ -2896,7 +2896,7 @@
         callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
 
         // Set teardown delay and make sure CS has processed it.
-        mWiFiNetworkAgent.getNetworkAgent().setTeardownDelayMs(300);
+        mWiFiNetworkAgent.getNetworkAgent().setTeardownDelayMillis(300);
         waitForIdle();
 
         // Post the duringTeardown lambda to the handler so it fires while teardown is in progress.
@@ -2974,15 +2974,9 @@
 
         mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET);
         mEthernetNetworkAgent.connect(true);
-        // BUG: with the legacy int-based scoring code, the network will no longer linger, even
-        // though it's validated and outscored.
-        // The new policy-based scoring code fixes this.
-        // TODO: remove the line below and replace with the three commented lines when
-        // the policy-based scoring code is turned on.
-        callback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent);
-        // callback.expectAvailableCallbacksUnvalidated(mEthernetNetworkAgent);
-        // callback.expectCallback(CallbackEntry.LOSING, mWiFiNetworkAgent);
-        // callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent);
+        callback.expectAvailableCallbacksUnvalidated(mEthernetNetworkAgent);
+        callback.expectCallback(CallbackEntry.LOSING, mWiFiNetworkAgent);
+        callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent);
         assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork());
         callback.assertNoCallback();
 
@@ -4253,7 +4247,7 @@
                 () -> mCm.registerSystemDefaultNetworkCallback(callback, handler));
         callback.assertNoCallback();
         assertThrows(SecurityException.class,
-                () -> mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler));
+                () -> mCm.registerDefaultNetworkCallbackForUid(APP1_UID, callback, handler));
         callback.assertNoCallback();
 
         mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
@@ -4261,7 +4255,7 @@
         callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
         mCm.unregisterNetworkCallback(callback);
 
-        mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler);
+        mCm.registerDefaultNetworkCallbackForUid(APP1_UID, callback, handler);
         callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
         mCm.unregisterNetworkCallback(callback);
     }
@@ -4279,10 +4273,9 @@
         waitForIdle();
     }
 
-    private void setPrivateDnsSettings(String mode, String specifier) {
-        final ContentResolver cr = mServiceContext.getContentResolver();
-        Settings.Global.putString(cr, ConnectivitySettingsManager.PRIVATE_DNS_MODE, mode);
-        Settings.Global.putString(cr, ConnectivitySettingsManager.PRIVATE_DNS_SPECIFIER, specifier);
+    private void setPrivateDnsSettings(int mode, String specifier) {
+        ConnectivitySettingsManager.setPrivateDnsMode(mServiceContext, mode);
+        ConnectivitySettingsManager.setPrivateDnsHostname(mServiceContext, specifier);
         mService.updatePrivateDnsSettings();
         waitForIdle();
     }
@@ -5685,7 +5678,7 @@
             for (int i = 0; i < SYSTEM_ONLY_MAX_REQUESTS - 1; i++) {
                 NetworkCallback cb = new NetworkCallback();
                 if (i % 2 == 0) {
-                    mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, cb, handler);
+                    mCm.registerDefaultNetworkCallbackForUid(1000000 + i, cb, handler);
                 } else {
                     mCm.registerNetworkCallback(networkRequest, cb);
                 }
@@ -5694,7 +5687,7 @@
             waitForIdle();
 
             assertThrows(TooManyRequestsException.class, () ->
-                    mCm.registerDefaultNetworkCallbackAsUid(1001042, new NetworkCallback(),
+                    mCm.registerDefaultNetworkCallbackForUid(1001042, new NetworkCallback(),
                             handler));
             assertThrows(TooManyRequestsException.class, () ->
                     mCm.registerNetworkCallback(networkRequest, new NetworkCallback()));
@@ -5747,7 +5740,7 @@
         withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> {
             for (int i = 0; i < MAX_REQUESTS; i++) {
                 NetworkCallback networkCallback = new NetworkCallback();
-                mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, networkCallback,
+                mCm.registerDefaultNetworkCallbackForUid(1000000 + i, networkCallback,
                         new Handler(ConnectivityThread.getInstanceLooper()));
                 mCm.unregisterNetworkCallback(networkCallback);
             }
@@ -5904,10 +5897,10 @@
         if (vpnUid != null) {
             assertEquals("Should have exactly one VPN:", 1, infos.length);
             UnderlyingNetworkInfo info = infos[0];
-            assertEquals("Unexpected VPN owner:", (int) vpnUid, info.ownerUid);
-            assertEquals("Unexpected VPN interface:", vpnIfname, info.iface);
+            assertEquals("Unexpected VPN owner:", (int) vpnUid, info.getOwnerUid());
+            assertEquals("Unexpected VPN interface:", vpnIfname, info.getInterface());
             assertSameElementsNoDuplicates(underlyingIfaces,
-                    info.underlyingIfaces.toArray(new String[0]));
+                    info.getUnderlyingInterfaces().toArray(new String[0]));
         } else {
             assertEquals(0, infos.length);
             return;
@@ -6051,8 +6044,8 @@
         // network for the VPN...
         verify(mStatsManager, never()).notifyNetworkStatus(any(List.class),
                 any(List.class), any() /* anyString() doesn't match null */,
-                argThat(infos -> infos.get(0).underlyingIfaces.size() == 1
-                        && WIFI_IFNAME.equals(infos.get(0).underlyingIfaces.get(0))));
+                argThat(infos -> infos.get(0).getUnderlyingInterfaces().size() == 1
+                        && WIFI_IFNAME.equals(infos.get(0).getUnderlyingInterfaces().get(0))));
         verifyNoMoreInteractions(mStatsManager);
         reset(mStatsManager);
 
@@ -6066,8 +6059,8 @@
         waitForIdle();
         verify(mStatsManager).notifyNetworkStatus(any(List.class),
                 any(List.class), any() /* anyString() doesn't match null */,
-                argThat(vpnInfos -> vpnInfos.get(0).underlyingIfaces.size() == 1
-                        && WIFI_IFNAME.equals(vpnInfos.get(0).underlyingIfaces.get(0))));
+                argThat(vpnInfos -> vpnInfos.get(0).getUnderlyingInterfaces().size() == 1
+                        && WIFI_IFNAME.equals(vpnInfos.get(0).getUnderlyingInterfaces().get(0))));
         mEthernetNetworkAgent.disconnect();
         waitForIdle();
         reset(mStatsManager);
@@ -7831,7 +7824,7 @@
         registerDefaultNetworkCallbackAsUid(vpnUidDefaultCallback, VPN_UID);
 
         final TestNetworkCallback vpnDefaultCallbackAsUid = new TestNetworkCallback();
-        mCm.registerDefaultNetworkCallbackAsUid(VPN_UID, vpnDefaultCallbackAsUid,
+        mCm.registerDefaultNetworkCallbackForUid(VPN_UID, vpnDefaultCallbackAsUid,
                 new Handler(ConnectivityThread.getInstanceLooper()));
 
         final int uid = Process.myUid();
@@ -10409,12 +10402,15 @@
         return UidRange.createForUser(UserHandle.of(userId));
     }
 
-    private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid)
-            throws Exception {
+    private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid) {
         final ApplicationInfo applicationInfo = new ApplicationInfo();
         applicationInfo.uid = uid;
-        when(mPackageManager.getApplicationInfo(eq(packageName), anyInt()))
-                .thenReturn(applicationInfo);
+        try {
+            when(mPackageManager.getApplicationInfo(eq(packageName), anyInt()))
+                    .thenReturn(applicationInfo);
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
     }
 
     private void mockGetApplicationInfoThrowsNameNotFound(@NonNull final String packageName)
@@ -10435,8 +10431,7 @@
     }
 
     private OemNetworkPreferences createDefaultOemNetworkPreferences(
-            @OemNetworkPreferences.OemNetworkPreference final int preference)
-            throws Exception {
+            @OemNetworkPreferences.OemNetworkPreference final int preference) {
         // Arrange PackageManager mocks
         mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID);
 
@@ -10483,7 +10478,7 @@
         assertTrue(mRequests.get(0).hasCapability(NET_CAPABILITY_VALIDATED));
         assertTrue(mRequests.get(1).isRequest());
         assertTrue(mRequests.get(1).hasCapability(NET_CAPABILITY_OEM_PAID));
-        assertTrue(mRequests.get(2).isRequest());
+        assertEquals(NetworkRequest.Type.TRACK_DEFAULT, mRequests.get(2).type);
         assertTrue(mService.getDefaultRequest().networkCapabilities.equalsNetCapabilities(
                 mRequests.get(2).networkCapabilities));
     }
@@ -10913,11 +10908,13 @@
             mDone.complete(new Object());
         }
 
-        void expectOnComplete() throws Exception {
+        void expectOnComplete() {
             try {
                 mDone.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
             } catch (TimeoutException e) {
                 fail("Expected onComplete() not received after " + TIMEOUT_MS + " ms");
+            } catch (Exception e) {
+                fail(e.getMessage());
             }
         }
 
@@ -10993,7 +10990,7 @@
 
         final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
         withPermission(NETWORK_SETTINGS, () ->
-                mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
+                mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
                         new Handler(ConnectivityThread.getInstanceLooper())));
 
         // Setup the test process to use networkPref for their default network.
@@ -11041,7 +11038,7 @@
 
         final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
         withPermission(NETWORK_SETTINGS, () ->
-                mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
+                mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
                         new Handler(ConnectivityThread.getInstanceLooper())));
 
         // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID.
@@ -11083,7 +11080,7 @@
 
         final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
         withPermission(NETWORK_SETTINGS, () ->
-                mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
+                mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
                         new Handler(ConnectivityThread.getInstanceLooper())));
 
         // Setup a process different than the test process to use the default network. This means
@@ -11695,10 +11692,12 @@
                 mServiceContext, "internetFactory", internetFilter, mCsHandlerThread);
         internetFactory.setScoreFilter(40);
         internetFactory.register();
-        // Default internet request & 3rd (fallback) request in OEM_PAID NRI. The unmetered request
-        // is never sent to factories (it's a LISTEN, not requestable) and the OEM_PAID request
-        // doesn't match the internetFactory filter.
-        internetFactory.expectRequestAdds(2);
+        // Default internet request only. The unmetered request is never sent to factories (it's a
+        // LISTEN, not requestable). The 3rd (fallback) request in OEM_PAID NRI is TRACK_DEFAULT
+        // which is also not sent to factories. Finally, the OEM_PAID request doesn't match the
+        // internetFactory filter.
+        internetFactory.expectRequestAdds(1);
+        internetFactory.assertRequestCountEquals(1);
 
         NetworkCapabilities oemPaidFilter = new NetworkCapabilities()
                 .addCapability(NET_CAPABILITY_INTERNET)
@@ -11721,7 +11720,7 @@
         expectNoRequestChanged(oemPaidFactory);
         oemPaidFactory.assertRequestCountEquals(1);
         // The internet factory however is outscored, and should lose its requests.
-        internetFactory.expectRequestRemoves(2);
+        internetFactory.expectRequestRemove();
         internetFactory.assertRequestCountEquals(0);
 
         final NetworkCapabilities oemPaidNc = new NetworkCapabilities();
@@ -12648,4 +12647,72 @@
                 expected,
                 () -> mCm.registerNetworkCallback(getRequestWithSubIds(), new NetworkCallback()));
     }
+
+    /**
+     * Validate request counts are counted accurately on setProfileNetworkPreference on set/replace.
+     */
+    @Test
+    public void testProfileNetworkPrefCountsRequestsCorrectlyOnSet() throws Exception {
+        final UserHandle testHandle = setupEnterpriseNetwork();
+        testRequestCountLimits(() -> {
+            // Set initially to test the limit prior to having existing requests.
+            final TestOnCompleteListener listener = new TestOnCompleteListener();
+            mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
+                    Runnable::run, listener);
+            listener.expectOnComplete();
+
+            // re-set so as to test the limit as part of replacing existing requests.
+            mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
+                    Runnable::run, listener);
+            listener.expectOnComplete();
+        });
+    }
+
+    /**
+     * Validate request counts are counted accurately on setOemNetworkPreference on set/replace.
+     */
+    @Test
+    public void testSetOemNetworkPreferenceCountsRequestsCorrectlyOnSet() throws Exception {
+        mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true);
+        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
+                OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY;
+        testRequestCountLimits(() -> {
+            // Set initially to test the limit prior to having existing requests.
+            final TestOemListenerCallback listener = new TestOemListenerCallback();
+            mService.setOemNetworkPreference(
+                    createDefaultOemNetworkPreferences(networkPref), listener);
+            listener.expectOnComplete();
+
+            // re-set so as to test the limit as part of replacing existing requests.
+            mService.setOemNetworkPreference(
+                    createDefaultOemNetworkPreferences(networkPref), listener);
+            listener.expectOnComplete();
+        });
+    }
+
+    private void testRequestCountLimits(@NonNull final Runnable r) throws Exception {
+        final ArraySet<TestNetworkCallback> callbacks = new ArraySet<>();
+        try {
+            final int requestCount = mService.mSystemNetworkRequestCounter
+                    .mUidToNetworkRequestCount.get(Process.myUid());
+            // The limit is hit when total requests <= limit.
+            final int maxCount =
+                    ConnectivityService.MAX_NETWORK_REQUESTS_PER_SYSTEM_UID - requestCount;
+            // Need permission so registerDefaultNetworkCallback uses mSystemNetworkRequestCounter
+            withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> {
+                for (int i = 1; i < maxCount - 1; i++) {
+                    final TestNetworkCallback cb = new TestNetworkCallback();
+                    mCm.registerDefaultNetworkCallback(cb);
+                    callbacks.add(cb);
+                }
+
+                // Code to run to check if it triggers a max request count limit error.
+                r.run();
+            });
+        } finally {
+            for (final TestNetworkCallback cb : callbacks) {
+                mCm.unregisterNetworkCallback(cb);
+            }
+        }
+    }
 }
diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
index 692c50f..0ffeec9 100644
--- a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
+++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
@@ -16,10 +16,10 @@
 
 package com.android.server.connectivity;
 
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_DEFAULT_MODE;
 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OFF;
+import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_SPECIFIER;
 import static android.net.NetworkCapabilities.MAX_TRANSPORT;
 import static android.net.NetworkCapabilities.MIN_TRANSPORT;
@@ -44,6 +44,7 @@
 
 import android.annotation.NonNull;
 import android.content.Context;
+import android.net.ConnectivitySettingsManager;
 import android.net.IDnsResolver;
 import android.net.IpPrefix;
 import android.net.LinkAddress;
@@ -187,9 +188,8 @@
         lp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("2001:db8:1::1"),
                 TEST_IFACENAME));
 
-        Settings.Global.putString(mContentResolver,
-                PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
-        Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com");
+        ConnectivitySettingsManager.setPrivateDnsMode(mCtx, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
+        ConnectivitySettingsManager.setPrivateDnsHostname(mCtx, "strictmode.com");
         mDnsManager.updatePrivateDns(new Network(TEST_NETID),
                 new PrivateDnsConfig("strictmode.com", new InetAddress[] {
                     InetAddress.parseNumericAddress("6.6.6.6"),
@@ -294,7 +294,7 @@
         assertNull(lp.getPrivateDnsServerName());
 
         // Turn private DNS mode off
-        Settings.Global.putString(mContentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF);
+        ConnectivitySettingsManager.setPrivateDnsMode(mCtx, PRIVATE_DNS_MODE_OFF);
         mDnsManager.updatePrivateDns(new Network(TEST_NETID),
                 mDnsManager.getPrivateDnsConfig());
         mDnsManager.updateTransportsForNetwork(TEST_NETID, TEST_TRANSPORT_TYPES);
@@ -318,16 +318,15 @@
         assertEquals(new InetAddress[0], cfgAuto.ips);
 
         // Pretend a gservices push sets the default to "off".
-        Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, "off");
+        ConnectivitySettingsManager.setPrivateDnsDefaultMode(mCtx, PRIVATE_DNS_MODE_OFF);
         final PrivateDnsConfig cfgOff = DnsManager.getPrivateDnsConfig(mCtx);
         assertFalse(cfgOff.useTls);
         assertEquals("", cfgOff.hostname);
         assertEquals(new InetAddress[0], cfgOff.ips);
 
         // Strict mode still works.
-        Settings.Global.putString(
-                mContentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
-        Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com");
+        ConnectivitySettingsManager.setPrivateDnsMode(mCtx, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
+        ConnectivitySettingsManager.setPrivateDnsHostname(mCtx, "strictmode.com");
         final PrivateDnsConfig cfgStrict = DnsManager.getPrivateDnsConfig(mCtx);
         assertTrue(cfgStrict.useTls);
         assertEquals("strictmode.com", cfgStrict.hostname);
diff --git a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt
index 1348c6a..551b94c 100644
--- a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt
+++ b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt
@@ -16,7 +16,9 @@
 
 package com.android.server.connectivity
 
+import android.net.NetworkCapabilities
 import android.net.NetworkRequest
+import android.net.NetworkScore.KEEP_CONNECTED_NONE
 import androidx.test.filters.SmallTest
 import androidx.test.runner.AndroidJUnit4
 import org.junit.Test
@@ -32,10 +34,14 @@
 class NetworkRankerTest {
     private val ranker = NetworkRanker()
 
-    private fun makeNai(satisfy: Boolean, score: Int) = mock(NetworkAgentInfo::class.java).also {
-        doReturn(satisfy).`when`(it).satisfies(any())
-        doReturn(score).`when`(it).currentScore
-    }
+    private fun makeNai(satisfy: Boolean, legacyScore: Int) =
+            mock(NetworkAgentInfo::class.java).also {
+                doReturn(satisfy).`when`(it).satisfies(any())
+                val fs = FullScore(legacyScore, 0 /* policies */, KEEP_CONNECTED_NONE)
+                doReturn(fs).`when`(it).getScore()
+                val nc = NetworkCapabilities.Builder().build()
+                doReturn(nc).`when`(it).getCapsNoCopy()
+            }
 
     @Test
     fun testGetBestNetwork() {
diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java
index 6ad4900..b725b82 100644
--- a/tests/net/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/net/java/com/android/server/connectivity/VpnTest.java
@@ -1023,7 +1023,7 @@
         assertNotNull(nc);
         VpnTransportInfo ti = (VpnTransportInfo) nc.getTransportInfo();
         assertNotNull(ti);
-        assertEquals(type, ti.type);
+        assertEquals(type, ti.getType());
     }
 
     public void startRacoon(final String serverAddr, final String expectedAddr)
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index eeeb4fb..fd374bc 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -45,6 +45,7 @@
 import static android.net.NetworkTemplate.NETWORK_TYPE_ALL;
 import static android.net.NetworkTemplate.OEM_MANAGED_NO;
 import static android.net.NetworkTemplate.OEM_MANAGED_YES;
+import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT;
 import static android.net.NetworkTemplate.buildTemplateMobileAll;
 import static android.net.NetworkTemplate.buildTemplateMobileWithRatType;
 import static android.net.NetworkTemplate.buildTemplateWifi;
@@ -67,6 +68,7 @@
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -88,8 +90,8 @@
 import android.net.NetworkStats;
 import android.net.NetworkStatsHistory;
 import android.net.NetworkTemplate;
-import android.net.UnderlyingNetworkInfo;
 import android.net.TelephonyNetworkSpecifier;
+import android.net.UnderlyingNetworkInfo;
 import android.net.netstats.provider.INetworkStatsProviderCallback;
 import android.os.ConditionVariable;
 import android.os.Handler;
@@ -165,9 +167,9 @@
 
     private long mElapsedRealtime;
 
-    private BroadcastInterceptingContext mServiceContext;
     private File mStatsDir;
-
+    private MockContext mServiceContext;
+    private @Mock TelephonyManager mTelephonyManager;
     private @Mock INetworkManagementService mNetManager;
     private @Mock NetworkStatsFactory mStatsFactory;
     private @Mock NetworkStatsSettings mSettings;
@@ -183,19 +185,32 @@
     private ContentObserver mContentObserver;
     private Handler mHandler;
 
+    private class MockContext extends BroadcastInterceptingContext {
+        private final Context mBaseContext;
+
+        MockContext(Context base) {
+            super(base);
+            mBaseContext = base;
+        }
+
+        @Override
+        public Object getSystemService(String name) {
+            if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager;
+            return mBaseContext.getSystemService(name);
+        }
+    }
+
     private final Clock mClock = new SimpleClock(ZoneOffset.UTC) {
         @Override
         public long millis() {
             return currentTimeMillis();
         }
     };
-
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
         final Context context = InstrumentationRegistry.getContext();
-
-        mServiceContext = new BroadcastInterceptingContext(context);
+        mServiceContext = new MockContext(context);
         mStatsDir = context.getFilesDir();
         if (mStatsDir.exists()) {
             IoUtils.deleteContents(mStatsDir);
@@ -217,7 +232,6 @@
         expectDefaultSettings();
         expectNetworkStatsUidDetail(buildEmptyStats());
         expectSystemReady();
-
         mService.systemReady();
         // Verify that system ready fetches realtime stats
         verify(mStatsFactory).readNetworkStatsDetail(UID_ALL, INTERFACES_ALL, TAG_ALL);
@@ -228,6 +242,9 @@
         verify(mNetworkStatsSubscriptionsMonitor).start();
         reset(mNetworkStatsSubscriptionsMonitor);
 
+        doReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS).when(mTelephonyManager)
+                .checkCarrierPrivilegesForPackageAnyPhone(anyString());
+
         mSession = mService.openSession();
         assertNotNull("openSession() failed", mSession);
 
@@ -653,24 +670,28 @@
     public void testMobileStatsOemManaged() throws Exception {
         final NetworkTemplate templateOemPaid = new NetworkTemplate(MATCH_MOBILE_WILDCARD,
                 /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
-                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PAID);
+                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PAID,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT);
 
         final NetworkTemplate templateOemPrivate = new NetworkTemplate(MATCH_MOBILE_WILDCARD,
                 /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
-                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PRIVATE);
+                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PRIVATE,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT);
 
         final NetworkTemplate templateOemAll = new NetworkTemplate(MATCH_MOBILE_WILDCARD,
                 /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
                 METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL,
-                OEM_PAID | OEM_PRIVATE);
+                OEM_PAID | OEM_PRIVATE, SUBSCRIBER_ID_MATCH_RULE_EXACT);
 
         final NetworkTemplate templateOemYes = new NetworkTemplate(MATCH_MOBILE_WILDCARD,
                 /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
-                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_YES);
+                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_YES,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT);
 
         final NetworkTemplate templateOemNone = new NetworkTemplate(MATCH_MOBILE_WILDCARD,
                 /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
-                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_NO);
+                METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_NO,
+                SUBSCRIBER_ID_MATCH_RULE_EXACT);
 
         // OEM_PAID network comes online.
         NetworkStateSnapshot[] states = new NetworkStateSnapshot[]{
@@ -873,7 +894,7 @@
         final LinkProperties stackedProp = new LinkProperties();
         stackedProp.setInterfaceName(stackedIface);
         final NetworkStateSnapshot wifiState = buildWifiState();
-        wifiState.linkProperties.addStackedLink(stackedProp);
+        wifiState.getLinkProperties().addStackedLink(stackedProp);
         NetworkStateSnapshot[] states = new NetworkStateSnapshot[] {wifiState};
 
         expectNetworkStatsSummary(buildEmptyStats());
@@ -1564,10 +1585,10 @@
     }
 
     private String getActiveIface(NetworkStateSnapshot... states) throws Exception {
-        if (states == null || states.length == 0 || states[0].linkProperties == null) {
+        if (states == null || states.length == 0 || states[0].getLinkProperties() == null) {
             return null;
         }
-        return states[0].linkProperties.getInterfaceName();
+        return states[0].getLinkProperties().getInterfaceName();
     }
 
     private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
diff --git a/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java b/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java
index 4a1f96d..3da8b46 100644
--- a/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java
+++ b/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java
@@ -196,6 +196,12 @@
     }
 
     @Override
+    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions,
+            Bundle options) {
+        sendBroadcast(intent);
+    }
+
+    @Override
     public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
             String[] receiverPermissions) {
         sendBroadcast(intent);
diff --git a/tests/vcn/java/android/net/vcn/VcnControlPlaneIkeConfigTest.java b/tests/vcn/java/android/net/vcn/VcnControlPlaneIkeConfigTest.java
deleted file mode 100644
index 43b80e4..0000000
--- a/tests/vcn/java/android/net/vcn/VcnControlPlaneIkeConfigTest.java
+++ /dev/null
@@ -1,113 +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.vcn;
-
-import static android.net.ipsec.ike.SaProposal.DH_GROUP_2048_BIT_MODP;
-import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_GCM_12;
-import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_AES128_XCBC;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import android.net.ipsec.ike.ChildSaProposal;
-import android.net.ipsec.ike.IkeFqdnIdentification;
-import android.net.ipsec.ike.IkeSaProposal;
-import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.SaProposal;
-import android.net.ipsec.ike.TunnelModeChildSessionParams;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class VcnControlPlaneIkeConfigTest {
-    private static final IkeSessionParams IKE_PARAMS;
-    private static final TunnelModeChildSessionParams CHILD_PARAMS;
-
-    static {
-        IkeSaProposal ikeProposal =
-                new IkeSaProposal.Builder()
-                        .addEncryptionAlgorithm(
-                                ENCRYPTION_ALGORITHM_AES_GCM_12, SaProposal.KEY_LEN_AES_128)
-                        .addDhGroup(DH_GROUP_2048_BIT_MODP)
-                        .addPseudorandomFunction(PSEUDORANDOM_FUNCTION_AES128_XCBC)
-                        .build();
-
-        final String serverHostname = "192.0.2.100";
-        final String testLocalId = "test.client.com";
-        final String testRemoteId = "test.server.com";
-        final byte[] psk = "psk".getBytes();
-
-        IKE_PARAMS =
-                new IkeSessionParams.Builder()
-                        .setServerHostname(serverHostname)
-                        .addSaProposal(ikeProposal)
-                        .setLocalIdentification(new IkeFqdnIdentification(testLocalId))
-                        .setRemoteIdentification(new IkeFqdnIdentification(testRemoteId))
-                        .setAuthPsk(psk)
-                        .build();
-
-        ChildSaProposal childProposal =
-                new ChildSaProposal.Builder()
-                        .addEncryptionAlgorithm(
-                                ENCRYPTION_ALGORITHM_AES_GCM_12, SaProposal.KEY_LEN_AES_128)
-                        .build();
-        CHILD_PARAMS =
-                new TunnelModeChildSessionParams.Builder().addSaProposal(childProposal).build();
-    }
-
-    // Package private for use in VcnGatewayConnectionConfigTest
-    static VcnControlPlaneIkeConfig buildTestConfig() {
-        return new VcnControlPlaneIkeConfig(IKE_PARAMS, CHILD_PARAMS);
-    }
-
-    @Test
-    public void testGetters() {
-        final VcnControlPlaneIkeConfig config = buildTestConfig();
-        assertEquals(IKE_PARAMS, config.getIkeSessionParams());
-        assertEquals(CHILD_PARAMS, config.getChildSessionParams());
-    }
-
-    @Test
-    public void testPersistableBundle() {
-        final VcnControlPlaneIkeConfig config = buildTestConfig();
-
-        assertEquals(config, new VcnControlPlaneIkeConfig(config.toPersistableBundle()));
-    }
-
-    @Test
-    public void testConstructConfigWithoutIkeParams() {
-        try {
-            new VcnControlPlaneIkeConfig(null, CHILD_PARAMS);
-            fail("Expect to fail because ikeParams was null");
-        } catch (NullPointerException expected) {
-        }
-    }
-
-    @Test
-    public void testBuilderConfigWithoutChildParams() {
-        try {
-            new VcnControlPlaneIkeConfig(IKE_PARAMS, null);
-            fail("Expect to fail because childParams was null");
-        } catch (NullPointerException expected) {
-        }
-    }
-}
diff --git a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
index 4ee4d61..7cfd275 100644
--- a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
@@ -18,11 +18,12 @@
 
 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 android.net.NetworkCapabilities;
+import android.net.ipsec.ike.IkeTunnelConnectionParams;
+import android.net.vcn.persistablebundleutils.TunnelConnectionParamsUtilsTest;
 
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
@@ -59,8 +60,8 @@
             };
     public static final int MAX_MTU = 1360;
 
-    public static final VcnControlPlaneConfig CONTROL_PLANE_CONFIG =
-            VcnControlPlaneIkeConfigTest.buildTestConfig();
+    public static final IkeTunnelConnectionParams TUNNEL_CONNECTION_PARAMS =
+            TunnelConnectionParamsUtilsTest.buildTestParams();
 
     public static final String GATEWAY_CONNECTION_NAME_PREFIX = "gatewayConnectionName-";
     private static int sGatewayConnectionConfigCount = 0;
@@ -75,13 +76,13 @@
         // VcnGatewayConnectionConfigs have a unique name (required by VcnConfig).
         return new VcnGatewayConnectionConfig.Builder(
                 GATEWAY_CONNECTION_NAME_PREFIX + sGatewayConnectionConfigCount++,
-                CONTROL_PLANE_CONFIG);
+                TUNNEL_CONNECTION_PARAMS);
     }
 
     // Public for use in VcnGatewayConnectionTest
     public static VcnGatewayConnectionConfig buildTestConfigWithExposedCaps(int... exposedCaps) {
         final VcnGatewayConnectionConfig.Builder builder =
-                newBuilder().setRetryInterval(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU);
+                newBuilder().setRetryIntervalsMs(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU);
 
         for (int caps : exposedCaps) {
             builder.addExposedCapability(caps);
@@ -98,7 +99,7 @@
     public void testBuilderRequiresNonNullGatewayConnectionName() {
         try {
             new VcnGatewayConnectionConfig.Builder(
-                            null /* gatewayConnectionName */, CONTROL_PLANE_CONFIG)
+                            null /* gatewayConnectionName */, TUNNEL_CONNECTION_PARAMS)
                     .build();
 
             fail("Expected exception due to invalid gateway connection name");
@@ -107,13 +108,13 @@
     }
 
     @Test
-    public void testBuilderRequiresNonNullControlPlaneConfig() {
+    public void testBuilderRequiresNonNullTunnelConnectionParams() {
         try {
             new VcnGatewayConnectionConfig.Builder(
-                            GATEWAY_CONNECTION_NAME_PREFIX, null /* ctrlPlaneConfig */)
+                            GATEWAY_CONNECTION_NAME_PREFIX, null /* tunnelConnectionParams */)
                     .build();
 
-            fail("Expected exception due to invalid control plane config");
+            fail("Expected exception due to the absence of tunnel connection parameters");
         } catch (NullPointerException e) {
         }
     }
@@ -133,7 +134,7 @@
     @Test
     public void testBuilderRequiresNonNullRetryInterval() {
         try {
-            newBuilder().setRetryInterval(null);
+            newBuilder().setRetryIntervalsMs(null);
             fail("Expected exception due to invalid retryIntervalMs");
         } catch (IllegalArgumentException e) {
         }
@@ -142,7 +143,7 @@
     @Test
     public void testBuilderRequiresNonEmptyRetryInterval() {
         try {
-            newBuilder().setRetryInterval(new long[0]);
+            newBuilder().setRetryIntervalsMs(new long[0]);
             fail("Expected exception due to invalid retryIntervalMs");
         } catch (IllegalArgumentException e) {
         }
@@ -171,8 +172,7 @@
         Arrays.sort(underlyingCaps);
         assertArrayEquals(UNDERLYING_CAPS, underlyingCaps);
 
-        assertEquals(CONTROL_PLANE_CONFIG, config.getControlPlaneConfig());
-        assertFalse(CONTROL_PLANE_CONFIG == config.getControlPlaneConfig());
+        assertEquals(TUNNEL_CONNECTION_PARAMS, config.getTunnelConnectionParams());
 
         assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMs());
         assertEquals(MAX_MTU, config.getMaxMtu());
diff --git a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java
index 3156190..582275d 100644
--- a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java
@@ -16,6 +16,8 @@
 
 package android.net.vcn;
 
+import static android.net.NetworkCapabilities.REDACT_ALL;
+import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
 import static org.junit.Assert.assertEquals;
@@ -37,6 +39,12 @@
     private static final VcnTransportInfo WIFI_UNDERLYING_INFO = new VcnTransportInfo(WIFI_INFO);
 
     @Test
+    public void testRedactionDefaults() {
+        assertEquals(REDACT_ALL, CELL_UNDERLYING_INFO.getRedaction());
+        assertEquals(REDACT_ALL, WIFI_UNDERLYING_INFO.getRedaction());
+    }
+
+    @Test
     public void testGetWifiInfo() {
         assertEquals(WIFI_INFO, WIFI_UNDERLYING_INFO.getWifiInfo());
 
@@ -51,6 +59,18 @@
     }
 
     @Test
+    public void testMakeCopySetsRedactions() {
+        assertEquals(
+                REDACT_FOR_NETWORK_SETTINGS,
+                ((VcnTransportInfo) CELL_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS))
+                        .getRedaction());
+        assertEquals(
+                REDACT_FOR_NETWORK_SETTINGS,
+                ((VcnTransportInfo) WIFI_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS))
+                        .getRedaction());
+    }
+
+    @Test
     public void testEquals() {
         assertEquals(CELL_UNDERLYING_INFO, CELL_UNDERLYING_INFO);
         assertEquals(WIFI_UNDERLYING_INFO, WIFI_UNDERLYING_INFO);
@@ -64,8 +84,29 @@
     }
 
     private void verifyParcelingIsNull(VcnTransportInfo vcnTransportInfo) {
+        // Verify redacted by default
         Parcel parcel = Parcel.obtain();
         vcnTransportInfo.writeToParcel(parcel, 0 /* flags */);
+        parcel.setDataPosition(0);
+
         assertNull(VcnTransportInfo.CREATOR.createFromParcel(parcel));
     }
+
+    @Test
+    public void testParcelUnparcelNotRedactedForSysUi() {
+        verifyParcelingForSysUi(CELL_UNDERLYING_INFO);
+        verifyParcelingForSysUi(WIFI_UNDERLYING_INFO);
+    }
+
+    private void verifyParcelingForSysUi(VcnTransportInfo vcnTransportInfo) {
+        // Allow fully unredacted; SysUI will have all the relevant permissions.
+        final VcnTransportInfo unRedacted = (VcnTransportInfo) vcnTransportInfo.makeCopy(0);
+        final Parcel parcel = Parcel.obtain();
+        unRedacted.writeToParcel(parcel, 0 /* flags */);
+        parcel.setDataPosition(0);
+
+        final VcnTransportInfo unparceled = VcnTransportInfo.CREATOR.createFromParcel(parcel);
+        assertEquals(vcnTransportInfo, unparceled);
+        assertEquals(REDACT_ALL, unparceled.getRedaction());
+    }
 }
diff --git a/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java b/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java
index 546d957..393787f 100644
--- a/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java
+++ b/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java
@@ -52,14 +52,17 @@
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class IkeSessionParamsUtilsTest {
-    private static IkeSessionParams.Builder createBuilderMinimum() {
+    // Package private for use in EncryptedTunnelParamsUtilsTest
+    static IkeSessionParams.Builder createBuilderMinimum() {
         final InetAddress serverAddress = InetAddresses.parseNumericAddress("192.0.2.100");
 
+        // TODO: b/185941731 Make sure all valid IKE_OPTIONS are added and validated.
         return new IkeSessionParams.Builder()
                 .setServerHostname(serverAddress.getHostAddress())
                 .addSaProposal(SaProposalUtilsTest.buildTestIkeSaProposal())
                 .setLocalIdentification(new IkeFqdnIdentification("client.test.android.net"))
                 .setRemoteIdentification(new IkeFqdnIdentification("server.test.android.net"))
+                .addIkeOption(IkeSessionParams.IKE_OPTION_FORCE_PORT_4500)
                 .setAuthPsk("psk".getBytes());
     }
 
diff --git a/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtilsTest.java b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtilsTest.java
new file mode 100644
index 0000000..0c8ad32
--- /dev/null
+++ b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtilsTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.vcn.persistablebundleutils;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.ipsec.ike.IkeTunnelConnectionParams;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TunnelConnectionParamsUtilsTest {
+    // Public for use in VcnGatewayConnectionConfigTest
+    public static IkeTunnelConnectionParams buildTestParams() {
+        return new IkeTunnelConnectionParams(
+                IkeSessionParamsUtilsTest.createBuilderMinimum().build(),
+                TunnelModeChildSessionParamsUtilsTest.createBuilderMinimum().build());
+    }
+
+    @Test
+    public void testIkeTunnelConnectionParamsToFromPersistableBundle() {
+        final IkeTunnelConnectionParams params = buildTestParams();
+
+        assertEquals(
+                params,
+                TunnelConnectionParamsUtils.fromPersistableBundle(
+                        TunnelConnectionParamsUtils.toPersistableBundle(params)));
+    }
+}
diff --git a/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java
index b3cd0ab..e0b5f0e 100644
--- a/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java
+++ b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java
@@ -40,7 +40,8 @@
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class TunnelModeChildSessionParamsUtilsTest {
-    private TunnelModeChildSessionParams.Builder createBuilderMinimum() {
+    // Package private for use in EncryptedTunnelParamsUtilsTest
+    static TunnelModeChildSessionParams.Builder createBuilderMinimum() {
         final ChildSaProposal saProposal = SaProposalUtilsTest.buildTestChildSaProposal();
         return new TunnelModeChildSessionParams.Builder().addSaProposal(saProposal);
     }
diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
index 907cb46..aa4b5f8 100644
--- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
+++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
@@ -96,6 +96,7 @@
 
 import java.io.FileNotFoundException;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -617,6 +618,43 @@
     }
 
     @Test
+    public void testGetConfiguredSubscriptionGroupsRequiresSystemUser() throws Exception {
+        doReturn(UserHandle.getUid(UserHandle.MIN_SECONDARY_USER_ID, TEST_UID))
+                .when(mMockDeps)
+                .getBinderCallingUid();
+
+        try {
+            mVcnMgmtSvc.getConfiguredSubscriptionGroups(TEST_PACKAGE_NAME);
+            fail("Expected security exception for non system user");
+        } catch (SecurityException expected) {
+        }
+    }
+
+    @Test
+    public void testGetConfiguredSubscriptionGroupsMismatchedPackages() throws Exception {
+        final String badPackage = "IncorrectPackage";
+        doThrow(new SecurityException()).when(mAppOpsMgr).checkPackage(TEST_UID, badPackage);
+
+        try {
+            mVcnMgmtSvc.getConfiguredSubscriptionGroups(badPackage);
+            fail("Expected security exception due to mismatched packages");
+        } catch (SecurityException expected) {
+        }
+    }
+
+    @Test
+    public void testGetConfiguredSubscriptionGroups() throws Exception {
+        mVcnMgmtSvc.setVcnConfig(TEST_UUID_2, TEST_VCN_CONFIG, TEST_PACKAGE_NAME);
+
+        // Assert that if both UUID 1 and 2 are provisioned, the caller only gets ones that they are
+        // privileged for.
+        triggerSubscriptionTrackerCbAndGetSnapshot(Collections.singleton(TEST_UUID_1));
+        final List<ParcelUuid> subGrps =
+                mVcnMgmtSvc.getConfiguredSubscriptionGroups(TEST_PACKAGE_NAME);
+        assertEquals(Collections.singletonList(TEST_UUID_1), subGrps);
+    }
+
+    @Test
     public void testAddVcnUnderlyingNetworkPolicyListener() throws Exception {
         mVcnMgmtSvc.addVcnUnderlyingNetworkPolicyListener(mMockPolicyListener);
 
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
index 95a9726..eedaac4 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java
@@ -54,7 +54,6 @@
 import android.net.ipsec.ike.exceptions.IkeException;
 import android.net.ipsec.ike.exceptions.IkeInternalException;
 import android.net.ipsec.ike.exceptions.IkeProtocolException;
-import android.net.vcn.VcnControlPlaneIkeConfig;
 import android.net.vcn.VcnManager.VcnErrorCode;
 
 import androidx.test.filters.SmallTest;
@@ -181,8 +180,8 @@
         assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState());
 
         final List<ChildSaProposal> saProposals =
-                ((VcnControlPlaneIkeConfig) mConfig.getControlPlaneConfig())
-                        .getChildSessionParams()
+                mConfig.getTunnelConnectionParams()
+                        .getTunnelModeChildSessionParams()
                         .getSaProposals();
         final int expectedMtu =
                 MtuUtils.getMtu(
@@ -344,6 +343,31 @@
         assertFalse(mGatewayConnection.isInSafeMode());
     }
 
+    @Test
+    public void testSubsequentFailedValidationTriggersSafeMode() throws Exception {
+        triggerChildOpened();
+        mTestLooper.dispatchAll();
+
+        triggerValidation(NetworkAgent.VALIDATION_STATUS_VALID);
+        assertFalse(mGatewayConnection.isInSafeMode());
+
+        // Trigger a failed validation, and the subsequent safemode timeout.
+        triggerValidation(NetworkAgent.VALIDATION_STATUS_NOT_VALID);
+        mTestLooper.dispatchAll();
+
+        final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
+        verify(mDeps, times(2))
+                .newWakeupMessage(
+                        eq(mVcnContext),
+                        any(),
+                        eq(VcnGatewayConnection.SAFEMODE_TIMEOUT_ALARM),
+                        runnableCaptor.capture());
+        runnableCaptor.getValue().run();
+        mTestLooper.dispatchAll();
+
+        assertTrue(mGatewayConnection.isInSafeMode());
+    }
+
     private Consumer<VcnNetworkAgent> setupNetworkAndGetUnwantedCallback() {
         triggerChildOpened();
         mTestLooper.dispatchAll();
diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java
index 6dbf7d5..044bef5 100644
--- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java
+++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java
@@ -38,7 +38,7 @@
     public void setUp() throws Exception {
         super.setUp();
 
-        mFirstRetryInterval = mConfig.getRetryInterval()[0];
+        mFirstRetryInterval = mConfig.getRetryIntervalsMs()[0];
 
         mGatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1);
         mGatewayConnection.transitionTo(mGatewayConnection.mRetryTimeoutState);
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 3937cee..12dc156 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -162,6 +162,7 @@
         "Configuration.proto",
         "Resources.proto",
         "ResourcesInternal.proto",
+        "ValueTransformer.cpp",
     ],
     proto: {
         export_proto_headers: true,
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index 27f7bdd..45ea654 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -577,6 +577,7 @@
 
 std::unique_ptr<ResourceTable> ResourceTable::Clone() const {
   std::unique_ptr<ResourceTable> new_table = util::make_unique<ResourceTable>();
+  CloningValueTransformer cloner(&new_table->string_pool);
   for (const auto& pkg : packages) {
     ResourceTablePackage* new_pkg = new_table->FindOrCreatePackage(pkg->name);
     for (const auto& type : pkg->types) {
@@ -593,7 +594,7 @@
         for (const auto& config_value : entry->values) {
           ResourceConfigValue* new_value =
               new_entry->FindOrCreateValue(config_value->config, config_value->product);
-          new_value->value.reset(config_value->value->Clone(&new_table->string_pool));
+          new_value->value = config_value->value->Transform(cloner);
         }
       }
     }
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 4f0fa8a..574bd2e 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -47,6 +47,14 @@
   return out;
 }
 
+std::unique_ptr<Value> Value::Transform(ValueTransformer& transformer) const {
+  return std::unique_ptr<Value>(this->TransformValueImpl(transformer));
+}
+
+std::unique_ptr<Item> Item::Transform(ValueTransformer& transformer) const {
+  return std::unique_ptr<Item>(this->TransformItemImpl(transformer));
+}
+
 template <typename Derived>
 void BaseValue<Derived>::Accept(ValueVisitor* visitor) {
   visitor->Visit(static_cast<Derived*>(this));
@@ -77,13 +85,6 @@
   return *this->value == *other->value;
 }
 
-RawString* RawString::Clone(StringPool* new_pool) const {
-  RawString* rs = new RawString(new_pool->MakeRef(value));
-  rs->comment_ = comment_;
-  rs->source_ = source_;
-  return rs;
-}
-
 bool RawString::Flatten(android::Res_value* out_value) const {
   out_value->dataType = android::Res_value::TYPE_STRING;
   out_value->data = util::HostToDevice32(static_cast<uint32_t>(value.index()));
@@ -136,10 +137,6 @@
   return true;
 }
 
-Reference* Reference::Clone(StringPool* /*new_pool*/) const {
-  return new Reference(*this);
-}
-
 void Reference::Print(std::ostream* out) const {
   if (reference_type == Type::kResource) {
     *out << "(reference) @";
@@ -220,10 +217,6 @@
   return true;
 }
 
-Id* Id::Clone(StringPool* /*new_pool*/) const {
-  return new Id(*this);
-}
-
 void Id::Print(std::ostream* out) const {
   *out << "(id)";
 }
@@ -266,14 +259,6 @@
   return true;
 }
 
-String* String::Clone(StringPool* new_pool) const {
-  String* str = new String(new_pool->MakeRef(value));
-  str->comment_ = comment_;
-  str->source_ = source_;
-  str->untranslatable_sections = untranslatable_sections;
-  return str;
-}
-
 void String::Print(std::ostream* out) const {
   *out << "(string) \"" << *value << "\"";
 }
@@ -321,14 +306,6 @@
   return true;
 }
 
-StyledString* StyledString::Clone(StringPool* new_pool) const {
-  StyledString* str = new StyledString(new_pool->MakeRef(value));
-  str->comment_ = comment_;
-  str->source_ = source_;
-  str->untranslatable_sections = untranslatable_sections;
-  return str;
-}
-
 void StyledString::Print(std::ostream* out) const {
   *out << "(styled string) \"" << value->value << "\"";
   for (const StringPool::Span& span : value->spans) {
@@ -357,15 +334,6 @@
   return true;
 }
 
-FileReference* FileReference::Clone(StringPool* new_pool) const {
-  FileReference* fr = new FileReference(new_pool->MakeRef(path));
-  fr->file = file;
-  fr->type = type;
-  fr->comment_ = comment_;
-  fr->source_ = source_;
-  return fr;
-}
-
 void FileReference::Print(std::ostream* out) const {
   *out << "(file) " << *path;
   switch (type) {
@@ -406,10 +374,6 @@
   return true;
 }
 
-BinaryPrimitive* BinaryPrimitive::Clone(StringPool* /*new_pool*/) const {
-  return new BinaryPrimitive(*this);
-}
-
 void BinaryPrimitive::Print(std::ostream* out) const {
   *out << StringPrintf("(primitive) type=0x%02x data=0x%08x", value.dataType, value.data);
 }
@@ -587,10 +551,6 @@
   return this_type_mask == that_type_mask;
 }
 
-Attribute* Attribute::Clone(StringPool* /*new_pool*/) const {
-  return new Attribute(*this);
-}
-
 std::string Attribute::MaskString() const {
   if (type_mask == android::ResTable_map::TYPE_ANY) {
     return "any";
@@ -893,18 +853,6 @@
                     });
 }
 
-Style* Style::Clone(StringPool* new_pool) const {
-  Style* style = new Style();
-  style->parent = parent;
-  style->parent_inferred = parent_inferred;
-  style->comment_ = comment_;
-  style->source_ = source_;
-  for (auto& entry : entries) {
-    style->entries.push_back(Entry{entry.key, std::unique_ptr<Item>(entry.value->Clone(new_pool))});
-  }
-  return style;
-}
-
 void Style::Print(std::ostream* out) const {
   *out << "(style) ";
   if (parent && parent.value().name) {
@@ -920,7 +868,8 @@
 Style::Entry CloneEntry(const Style::Entry& entry, StringPool* pool) {
   Style::Entry cloned_entry{entry.key};
   if (entry.value != nullptr) {
-    cloned_entry.value.reset(entry.value->Clone(pool));
+    CloningValueTransformer cloner(pool);
+    cloned_entry.value = entry.value->Transform(cloner);
   }
   return cloned_entry;
 }
@@ -993,16 +942,6 @@
                     });
 }
 
-Array* Array::Clone(StringPool* new_pool) const {
-  Array* array = new Array();
-  array->comment_ = comment_;
-  array->source_ = source_;
-  for (auto& item : elements) {
-    array->elements.emplace_back(std::unique_ptr<Item>(item->Clone(new_pool)));
-  }
-  return array;
-}
-
 void Array::Print(std::ostream* out) const {
   *out << "(array) [" << util::Joiner(elements, ", ") << "]";
 }
@@ -1030,19 +969,6 @@
   return true;
 }
 
-Plural* Plural::Clone(StringPool* new_pool) const {
-  Plural* p = new Plural();
-  p->comment_ = comment_;
-  p->source_ = source_;
-  const size_t count = values.size();
-  for (size_t i = 0; i < count; i++) {
-    if (values[i]) {
-      p->values[i] = std::unique_ptr<Item>(values[i]->Clone(new_pool));
-    }
-  }
-  return p;
-}
-
 void Plural::Print(std::ostream* out) const {
   *out << "(plural)";
   if (values[Zero]) {
@@ -1086,10 +1012,6 @@
                     });
 }
 
-Styleable* Styleable::Clone(StringPool* /*new_pool*/) const {
-  return new Styleable(*this);
-}
-
 void Styleable::Print(std::ostream* out) const {
   *out << "(styleable) "
        << " [" << util::Joiner(entries, ", ") << "]";
@@ -1126,4 +1048,105 @@
   entries.insert(entries.end(), references.begin(), references.end());
 }
 
+template <typename T>
+std::unique_ptr<T> CopyValueFields(std::unique_ptr<T> new_value, const T* value) {
+  new_value->SetSource(value->GetSource());
+  new_value->SetComment(value->GetComment());
+  return new_value;
+}
+
+CloningValueTransformer::CloningValueTransformer(StringPool* new_pool)
+    : ValueTransformer(new_pool) {
+}
+
+std::unique_ptr<Reference> CloningValueTransformer::TransformDerived(const Reference* value) {
+  return std::make_unique<Reference>(*value);
+}
+
+std::unique_ptr<Id> CloningValueTransformer::TransformDerived(const Id* value) {
+  return std::make_unique<Id>(*value);
+}
+
+std::unique_ptr<RawString> CloningValueTransformer::TransformDerived(const RawString* value) {
+  auto new_value = std::make_unique<RawString>(pool_->MakeRef(value->value));
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<String> CloningValueTransformer::TransformDerived(const String* value) {
+  auto new_value = std::make_unique<String>(pool_->MakeRef(value->value));
+  new_value->untranslatable_sections = value->untranslatable_sections;
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<StyledString> CloningValueTransformer::TransformDerived(const StyledString* value) {
+  auto new_value = std::make_unique<StyledString>(pool_->MakeRef(value->value));
+  new_value->untranslatable_sections = value->untranslatable_sections;
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<FileReference> CloningValueTransformer::TransformDerived(
+    const FileReference* value) {
+  auto new_value = std::make_unique<FileReference>(pool_->MakeRef(value->path));
+  new_value->file = value->file;
+  new_value->type = value->type;
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<BinaryPrimitive> CloningValueTransformer::TransformDerived(
+    const BinaryPrimitive* value) {
+  return std::make_unique<BinaryPrimitive>(*value);
+}
+
+std::unique_ptr<Attribute> CloningValueTransformer::TransformDerived(const Attribute* value) {
+  auto new_value = std::make_unique<Attribute>();
+  new_value->type_mask = value->type_mask;
+  new_value->min_int = value->min_int;
+  new_value->max_int = value->max_int;
+  for (const Attribute::Symbol& s : value->symbols) {
+    new_value->symbols.emplace_back(Attribute::Symbol{
+        .symbol = *s.symbol.Transform(*this),
+        .value = s.value,
+        .type = s.type,
+    });
+  }
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<Style> CloningValueTransformer::TransformDerived(const Style* value) {
+  auto new_value = std::make_unique<Style>();
+  new_value->parent = value->parent;
+  new_value->parent_inferred = value->parent_inferred;
+  for (auto& entry : value->entries) {
+    new_value->entries.push_back(Style::Entry{entry.key, entry.value->Transform(*this)});
+  }
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<Array> CloningValueTransformer::TransformDerived(const Array* value) {
+  auto new_value = std::make_unique<Array>();
+  for (auto& item : value->elements) {
+    new_value->elements.emplace_back(item->Transform(*this));
+  }
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<Plural> CloningValueTransformer::TransformDerived(const Plural* value) {
+  auto new_value = std::make_unique<Plural>();
+  const size_t count = value->values.size();
+  for (size_t i = 0; i < count; i++) {
+    if (value->values[i]) {
+      new_value->values[i] = value->values[i]->Transform(*this);
+    }
+  }
+  return CopyValueFields(std::move(new_value), value);
+}
+
+std::unique_ptr<Styleable> CloningValueTransformer::TransformDerived(const Styleable* value) {
+  auto new_value = std::make_unique<Styleable>();
+  for (const Reference& s : value->entries) {
+    new_value->entries.emplace_back(*s.Transform(*this));
+  }
+  return CopyValueFields(std::move(new_value), value);
+}
+
 }  // namespace aapt
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index fe0883b..025864d 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -28,6 +28,7 @@
 #include "Diagnostics.h"
 #include "Resource.h"
 #include "StringPool.h"
+#include "ValueTransformer.h"
 #include "io/File.h"
 #include "text/Printer.h"
 #include "util/Maybe.h"
@@ -100,9 +101,8 @@
   // Calls the appropriate overload of ConstValueVisitor.
   virtual void Accept(ConstValueVisitor* visitor) const = 0;
 
-  // Clone the value. `new_pool` is the new StringPool that
-  // any resources with strings should use when copying their string.
-  virtual Value* Clone(StringPool* new_pool) const = 0;
+  // Transform this Value into another Value using the transformer.
+  std::unique_ptr<Value> Transform(ValueTransformer& transformer) const;
 
   // Human readable printout of this value.
   virtual void Print(std::ostream* out) const = 0;
@@ -118,6 +118,9 @@
   std::string comment_;
   bool weak_ = false;
   bool translatable_ = true;
+
+ private:
+  virtual Value* TransformValueImpl(ValueTransformer& transformer) const = 0;
 };
 
 // Inherit from this to get visitor accepting implementations for free.
@@ -129,12 +132,15 @@
 
 // A resource item with a single value. This maps to android::ResTable_entry.
 struct Item : public Value {
-  // Clone the Item.
-  virtual Item* Clone(StringPool* new_pool) const override = 0;
-
   // Fills in an android::Res_value structure with this Item's binary representation.
   // Returns false if an error occurred.
   virtual bool Flatten(android::Res_value* out_value) const = 0;
+
+  // Transform this Item into another Item using the transformer.
+  std::unique_ptr<Item> Transform(ValueTransformer& transformer) const;
+
+ private:
+  virtual Item* TransformItemImpl(ValueTransformer& transformer) const = 0;
 };
 
 // Inherit from this to get visitor accepting implementations for free.
@@ -147,7 +153,7 @@
 // A reference to another resource. This maps to android::Res_value::TYPE_REFERENCE.
 // A reference can be symbolic (with the name set to a valid resource name) or be
 // numeric (the id is set to a valid resource ID).
-struct Reference : public BaseItem<Reference> {
+struct Reference : public TransformableItem<Reference, BaseItem<Reference>> {
   enum class Type {
     kResource,
     kAttribute,
@@ -166,7 +172,6 @@
 
   bool Equals(const Value* value) const override;
   bool Flatten(android::Res_value* out_value) const override;
-  Reference* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
   void PrettyPrint(text::Printer* printer) const override;
 
@@ -178,27 +183,25 @@
 bool operator==(const Reference&, const Reference&);
 
 // An ID resource. Has no real value, just a place holder.
-struct Id : public BaseItem<Id> {
+struct Id : public TransformableItem<Id, BaseItem<Id>> {
   Id() {
     weak_ = true;
   }
 
   bool Equals(const Value* value) const override;
   bool Flatten(android::Res_value* out) const override;
-  Id* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
 };
 
 // A raw, unprocessed string. This may contain quotations, escape sequences, and whitespace.
 // This shall *NOT* end up in the final resource table.
-struct RawString : public BaseItem<RawString> {
+struct RawString : public TransformableItem<RawString, BaseItem<RawString>> {
   StringPool::Ref value;
 
   explicit RawString(const StringPool::Ref& ref);
 
   bool Equals(const Value* value) const override;
   bool Flatten(android::Res_value* out_value) const override;
-  RawString* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
 };
 
@@ -220,7 +223,7 @@
   return a.start != b.start || a.end != b.end;
 }
 
-struct String : public BaseItem<String> {
+struct String : public TransformableItem<String, BaseItem<String>> {
   StringPool::Ref value;
 
   // Sections of the string to NOT translate. Mainly used
@@ -232,12 +235,11 @@
 
   bool Equals(const Value* value) const override;
   bool Flatten(android::Res_value* out_value) const override;
-  String* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
   void PrettyPrint(text::Printer* printer) const override;
 };
 
-struct StyledString : public BaseItem<StyledString> {
+struct StyledString : public TransformableItem<StyledString, BaseItem<StyledString>> {
   StringPool::StyleRef value;
 
   // Sections of the string to NOT translate. Mainly used
@@ -249,11 +251,10 @@
 
   bool Equals(const Value* value) const override;
   bool Flatten(android::Res_value* out_value) const override;
-  StyledString* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
 };
 
-struct FileReference : public BaseItem<FileReference> {
+struct FileReference : public TransformableItem<FileReference, BaseItem<FileReference>> {
   StringPool::Ref path;
 
   // A handle to the file object from which this file can be read.
@@ -269,12 +270,11 @@
 
   bool Equals(const Value* value) const override;
   bool Flatten(android::Res_value* out_value) const override;
-  FileReference* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
 };
 
 // Represents any other android::Res_value.
-struct BinaryPrimitive : public BaseItem<BinaryPrimitive> {
+struct BinaryPrimitive : public TransformableItem<BinaryPrimitive, BaseItem<BinaryPrimitive>> {
   android::Res_value value;
 
   BinaryPrimitive() = default;
@@ -283,12 +283,11 @@
 
   bool Equals(const Value* value) const override;
   bool Flatten(android::Res_value* out_value) const override;
-  BinaryPrimitive* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
   void PrettyPrint(text::Printer* printer) const override;
 };
 
-struct Attribute : public BaseValue<Attribute> {
+struct Attribute : public TransformableValue<Attribute, BaseValue<Attribute>> {
   struct Symbol {
     Reference symbol;
     uint32_t value;
@@ -311,13 +310,12 @@
   // TYPE_ENUMS are never compatible.
   bool IsCompatibleWith(const Attribute& attr) const;
 
-  Attribute* Clone(StringPool* new_pool) const override;
   std::string MaskString() const;
   void Print(std::ostream* out) const override;
   bool Matches(const Item& item, DiagMessage* out_msg = nullptr) const;
 };
 
-struct Style : public BaseValue<Style> {
+struct Style : public TransformableValue<Style, BaseValue<Style>> {
   struct Entry {
     Reference key;
     std::unique_ptr<Item> value;
@@ -333,7 +331,6 @@
   std::vector<Entry> entries;
 
   bool Equals(const Value* value) const override;
-  Style* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
 
   // Merges `style` into this Style. All identical attributes of `style` take precedence, including
@@ -341,29 +338,26 @@
   void MergeWith(Style* style, StringPool* pool);
 };
 
-struct Array : public BaseValue<Array> {
+struct Array : public TransformableValue<Array, BaseValue<Array>> {
   std::vector<std::unique_ptr<Item>> elements;
 
   bool Equals(const Value* value) const override;
-  Array* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
 };
 
-struct Plural : public BaseValue<Plural> {
+struct Plural : public TransformableValue<Plural, BaseValue<Plural>> {
   enum { Zero = 0, One, Two, Few, Many, Other, Count };
 
   std::array<std::unique_ptr<Item>, Count> values;
 
   bool Equals(const Value* value) const override;
-  Plural* Clone(StringPool* new_pool) const override;
   void Print(std::ostream* out) const override;
 };
 
-struct Styleable : public BaseValue<Styleable> {
+struct Styleable : public TransformableValue<Styleable, BaseValue<Styleable>> {
   std::vector<Reference> entries;
 
   bool Equals(const Value* value) const override;
-  Styleable* Clone(StringPool* newPool) const override;
   void Print(std::ostream* out) const override;
   void MergeWith(Styleable* styleable);
 };
@@ -379,6 +373,23 @@
   return out;
 }
 
+struct CloningValueTransformer : public ValueTransformer {
+  explicit CloningValueTransformer(StringPool* new_pool);
+
+  std::unique_ptr<Reference> TransformDerived(const Reference* value) override;
+  std::unique_ptr<Id> TransformDerived(const Id* value) override;
+  std::unique_ptr<RawString> TransformDerived(const RawString* value) override;
+  std::unique_ptr<String> TransformDerived(const String* value) override;
+  std::unique_ptr<StyledString> TransformDerived(const StyledString* value) override;
+  std::unique_ptr<FileReference> TransformDerived(const FileReference* value) override;
+  std::unique_ptr<BinaryPrimitive> TransformDerived(const BinaryPrimitive* value) override;
+  std::unique_ptr<Attribute> TransformDerived(const Attribute* value) override;
+  std::unique_ptr<Style> TransformDerived(const Style* value) override;
+  std::unique_ptr<Array> TransformDerived(const Array* value) override;
+  std::unique_ptr<Plural> TransformDerived(const Plural* value) override;
+  std::unique_ptr<Styleable> TransformDerived(const Styleable* value) override;
+};
+
 }  // namespace aapt
 
 #endif  // AAPT_RESOURCE_VALUES_H
diff --git a/tools/aapt2/ResourceValues_test.cpp b/tools/aapt2/ResourceValues_test.cpp
index c4a1108..c75a4b9 100644
--- a/tools/aapt2/ResourceValues_test.cpp
+++ b/tools/aapt2/ResourceValues_test.cpp
@@ -62,7 +62,8 @@
   a.values[Plural::One] = util::make_unique<String>(pool.MakeRef("one"));
   a.values[Plural::Other] = util::make_unique<String>(pool.MakeRef("other"));
 
-  std::unique_ptr<Plural> b(a.Clone(&pool));
+  CloningValueTransformer cloner(&pool);
+  std::unique_ptr<Plural> b(a.Transform(cloner));
   EXPECT_TRUE(a.Equals(b.get()));
 }
 
@@ -97,7 +98,8 @@
   a.elements.push_back(util::make_unique<String>(pool.MakeRef("one")));
   a.elements.push_back(util::make_unique<String>(pool.MakeRef("two")));
 
-  std::unique_ptr<Array> b(a.Clone(&pool));
+  CloningValueTransformer cloner(&pool);
+  std::unique_ptr<Array> b(a.Transform(cloner));
   EXPECT_TRUE(a.Equals(b.get()));
 }
 
@@ -160,7 +162,8 @@
       .AddItem("android:attr/bar", ResourceUtils::TryParseInt("2"))
       .Build();
 
-  std::unique_ptr<Style> b(a->Clone(nullptr));
+  CloningValueTransformer cloner(nullptr);
+  std::unique_ptr<Style> b(a->Transform(cloner));
   EXPECT_TRUE(a->Equals(b.get()));
 }
 
@@ -174,7 +177,8 @@
   EXPECT_THAT(pool_a.strings()[0]->context.config, Eq(test::ParseConfigOrDie("en")));
   EXPECT_THAT(pool_a.strings()[0]->value, StrEq("hello"));
 
-  std::unique_ptr<String> str_b(str_a.Clone(&pool_b));
+  CloningValueTransformer cloner(&pool_b);
+  str_a.Transform(cloner);
   ASSERT_THAT(pool_b, SizeIs(1u));
   EXPECT_THAT(pool_b.strings()[0]->context.config, Eq(test::ParseConfigOrDie("en")));
   EXPECT_THAT(pool_b.strings()[0]->value, StrEq("hello"));
diff --git a/tools/aapt2/ValueTransformer.cpp b/tools/aapt2/ValueTransformer.cpp
new file mode 100644
index 0000000..6eb2e30
--- /dev/null
+++ b/tools/aapt2/ValueTransformer.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ValueTransformer.h"
+
+#include "ResourceValues.h"
+
+namespace aapt {
+
+#define VALUE_CREATE_VALUE_DECL(T)                                          \
+  std::unique_ptr<Value> ValueTransformer::TransformValue(const T* value) { \
+    return TransformDerived(value);                                         \
+  }
+
+#define VALUE_CREATE_ITEM_DECL(T)                                           \
+  std::unique_ptr<Item> ValueTransformer::TransformItem(const T* value) {   \
+    return TransformDerived(value);                                         \
+  }                                                                         \
+  std::unique_ptr<Value> ValueTransformer::TransformValue(const T* value) { \
+    return TransformItem(value);                                            \
+  }
+
+VALUE_CREATE_ITEM_DECL(Id);
+VALUE_CREATE_ITEM_DECL(Reference);
+VALUE_CREATE_ITEM_DECL(RawString);
+VALUE_CREATE_ITEM_DECL(String);
+VALUE_CREATE_ITEM_DECL(StyledString);
+VALUE_CREATE_ITEM_DECL(FileReference);
+VALUE_CREATE_ITEM_DECL(BinaryPrimitive);
+
+VALUE_CREATE_VALUE_DECL(Attribute);
+VALUE_CREATE_VALUE_DECL(Style);
+VALUE_CREATE_VALUE_DECL(Array);
+VALUE_CREATE_VALUE_DECL(Plural);
+VALUE_CREATE_VALUE_DECL(Styleable);
+
+}  // namespace aapt
\ No newline at end of file
diff --git a/tools/aapt2/ValueTransformer.h b/tools/aapt2/ValueTransformer.h
new file mode 100644
index 0000000..6925111
--- /dev/null
+++ b/tools/aapt2/ValueTransformer.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT_VALUE_TRANSFORMER_H
+#define AAPT_VALUE_TRANSFORMER_H
+
+#include <memory>
+
+#include "StringPool.h"
+
+namespace aapt {
+
+class Value;
+struct Item;
+struct Reference;
+struct Id;
+struct RawString;
+struct String;
+struct StyledString;
+struct FileReference;
+struct BinaryPrimitive;
+struct Attribute;
+struct Style;
+struct Array;
+struct Plural;
+struct Styleable;
+
+#define AAPT_TRANSFORM_VALUE(T)                                    \
+  virtual std::unique_ptr<T> TransformDerived(const T* value) = 0; \
+  virtual std::unique_ptr<Value> TransformValue(const T* value);
+
+#define AAPT_TRANSFORM_ITEM(T)                                 \
+  virtual std::unique_ptr<Item> TransformItem(const T* value); \
+  AAPT_TRANSFORM_VALUE(T)
+
+/**
+ * An interface for consuming a Value type and transforming it into another Value.
+ *
+ * The interface defines 2 methods for each type (T) that inherits from TransformableValue:
+ *   std::unique_ptr<T> TransformDerived(const T*)
+ *   std::unique_ptr<Value> TransformValue(const T*)
+ *
+ * The interface defines 3 method for each type (T) that inherits from TransformableItem:
+ *   std::unique_ptr<T> TransformDerived(const T*)
+ *   std::unique_ptr<Item> TransformItem(const T*)
+ *   std::unique_ptr<Value> TransformValue(const T*)
+ *
+ * TransformDerived is invoked when Transform is invoked on the derived type T.
+ * TransformItem is invoked when Transform is invoked on an Item type.
+ * TransformValue is invoked when Transform is invoked on a Value type.
+ *
+ *  ValueTransformerImpl transformer(&string_pool);
+ *  T* derived = ...;
+ *  std::unique_ptr<T> new_type = derived->Transform(transformer); // Invokes TransformDerived
+ *
+ *  Item* item = derived;
+ *  std::unique_ptr<Item> new_item = item->TransformItem(transformer); // Invokes TransformItem
+ *
+ *  Value* value = item;
+ *  std::unique_ptr<Value> new_value = value->TransformValue(transformer); // Invokes TransformValue
+ *
+ * For types that inherit from AbstractTransformableItem, the default implementation of
+ * TransformValue invokes TransformItem which invokes TransformDerived.
+ *
+ * For types that inherit from AbstractTransformableValue, the default implementation of
+ * TransformValue invokes TransformDerived.
+ */
+struct ValueTransformer {
+  // `new_pool` is the new StringPool that newly created Values should use for string storing string
+  // values.
+  explicit ValueTransformer(StringPool* new_pool);
+  virtual ~ValueTransformer() = default;
+
+  AAPT_TRANSFORM_ITEM(Id);
+  AAPT_TRANSFORM_ITEM(Reference);
+  AAPT_TRANSFORM_ITEM(RawString);
+  AAPT_TRANSFORM_ITEM(String);
+  AAPT_TRANSFORM_ITEM(StyledString);
+  AAPT_TRANSFORM_ITEM(FileReference);
+  AAPT_TRANSFORM_ITEM(BinaryPrimitive);
+
+  AAPT_TRANSFORM_VALUE(Attribute);
+  AAPT_TRANSFORM_VALUE(Style);
+  AAPT_TRANSFORM_VALUE(Array);
+  AAPT_TRANSFORM_VALUE(Plural);
+  AAPT_TRANSFORM_VALUE(Styleable);
+
+ protected:
+  StringPool* const pool_;
+};
+
+#undef AAPT_TRANSFORM_VALUE
+#undef AAPT_TRANSFORM_ITEM
+
+template <typename Derived, typename Base>
+struct TransformableValue : public Base {
+  // Transform this Derived into another Derived using the transformer.
+  std::unique_ptr<Derived> Transform(ValueTransformer& transformer) const;
+
+ private:
+  Value* TransformValueImpl(ValueTransformer& transformer) const override;
+};
+
+template <typename Derived, typename Base>
+struct TransformableItem : public TransformableValue<Derived, Base> {
+ private:
+  Item* TransformItemImpl(ValueTransformer& transformer) const override;
+};
+
+}  // namespace aapt
+
+// Implementation
+#include "ValueTransformer_inline.h"
+
+#endif  // AAPT_VALUE_TRANSFORMER_H
\ No newline at end of file
diff --git a/tools/aapt2/ValueTransformer_inline.h b/tools/aapt2/ValueTransformer_inline.h
new file mode 100644
index 0000000..c6c07c0
--- /dev/null
+++ b/tools/aapt2/ValueTransformer_inline.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT_VALUE_TRANSFORMER_IMPL_H
+#define AAPT_VALUE_TRANSFORMER_IMPL_H
+
+namespace aapt {
+
+inline ValueTransformer::ValueTransformer(StringPool* new_pool) : pool_(new_pool) {
+}
+
+template <typename Derived, typename Base>
+inline std::unique_ptr<Derived> TransformableValue<Derived, Base>::Transform(
+    ValueTransformer& transformer) const {
+  return transformer.TransformDerived(static_cast<const Derived*>(this));
+}
+
+template <typename Derived, typename Base>
+Value* TransformableValue<Derived, Base>::TransformValueImpl(ValueTransformer& transformer) const {
+  auto self = static_cast<const Derived*>(this);
+  auto transformed = transformer.TransformValue(self);
+  return transformed.release();
+}
+
+template <typename Derived, typename Base>
+Item* TransformableItem<Derived, Base>::TransformItemImpl(ValueTransformer& transformer) const {
+  auto self = static_cast<const Derived*>(this);
+  auto transformed = transformer.TransformItem(self);
+  return transformed.release();
+}
+
+}  // namespace aapt
+
+#endif  // AAPT_VALUE_TRANSFORMER_IMPL_H
\ No newline at end of file
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 2a8923d..2c57fb2 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -1656,10 +1656,11 @@
                                                      << " with config \"" << config_value->config
                                                      << "\" for round icon compatibility");
 
-      auto value = icon_reference->Clone(&table->string_pool);
+      CloningValueTransformer cloner(&table->string_pool);
+      auto value = icon_reference->Transform(cloner);
       auto round_config_value =
           round_icon_entry->FindOrCreateValue(config_value->config, config_value->product);
-      round_config_value->value.reset(value);
+      round_config_value->value = std::move(value);
     }
   }
 
diff --git a/tools/aapt2/compile/PseudolocaleGenerator.cpp b/tools/aapt2/compile/PseudolocaleGenerator.cpp
index 5e0300b..3f574ee 100644
--- a/tools/aapt2/compile/PseudolocaleGenerator.cpp
+++ b/tools/aapt2/compile/PseudolocaleGenerator.cpp
@@ -226,6 +226,7 @@
       : pool_(pool), method_(method), localizer_(method) {}
 
   void Visit(Plural* plural) override {
+    CloningValueTransformer cloner(pool_);
     std::unique_ptr<Plural> localized = util::make_unique<Plural>();
     for (size_t i = 0; i < plural->values.size(); i++) {
       Visitor sub_visitor(pool_, method_);
@@ -234,7 +235,7 @@
         if (sub_visitor.item) {
           localized->values[i] = std::move(sub_visitor.item);
         } else {
-          localized->values[i] = std::unique_ptr<Item>(plural->values[i]->Clone(pool_));
+          localized->values[i] = plural->values[i]->Transform(cloner);
         }
       }
     }
diff --git a/tools/aapt2/format/binary/TableFlattener_test.cpp b/tools/aapt2/format/binary/TableFlattener_test.cpp
index f5fe5e3..8139d73 100644
--- a/tools/aapt2/format/binary/TableFlattener_test.cpp
+++ b/tools/aapt2/format/binary/TableFlattener_test.cpp
@@ -299,6 +299,7 @@
           .Build();
 
   // Add regular entries.
+  CloningValueTransformer cloner(&table->string_pool);
   int stride = static_cast<int>(1.0f / load);
   for (int i = 0; i < 100; i++) {
     const ResourceName name = test::ParseNameOrDie(
@@ -308,7 +309,7 @@
         util::make_unique<BinaryPrimitive>(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(i));
     CHECK(table->AddResource(NewResourceBuilder(name)
                                  .SetId(resid)
-                                 .SetValue(std::unique_ptr<Value>(value->Clone(nullptr)))
+                                 .SetValue(std::unique_ptr<Value>(value->Transform(cloner)))
                                  .Build(),
                              context->GetDiagnostics()));
 
@@ -317,7 +318,7 @@
       CHECK(table->AddResource(
           NewResourceBuilder(name)
               .SetId(resid)
-              .SetValue(std::unique_ptr<Value>(value->Clone(nullptr)), sparse_config)
+              .SetValue(std::unique_ptr<Value>(value->Transform(cloner)), sparse_config)
               .Build(),
           context->GetDiagnostics()));
     }
diff --git a/tools/aapt2/integration-tests/MergeOnlyTest/App/Android.mk b/tools/aapt2/integration-tests/MergeOnlyTest/App/Android.mk
index 6bc2064..27b6068 100644
--- a/tools/aapt2/integration-tests/MergeOnlyTest/App/Android.mk
+++ b/tools/aapt2/integration-tests/MergeOnlyTest/App/Android.mk
@@ -20,10 +20,13 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_AAPT_NAMESPACES := true
 LOCAL_PACKAGE_NAME := AaptTestMergeOnly_App
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_EXPORT_PACKAGE_RESOURCES := true
 LOCAL_MODULE_TAGS := tests
 LOCAL_STATIC_ANDROID_LIBRARIES := \
     AaptTestMergeOnly_LeafLib \
     AaptTestMergeOnly_LocalLib
-include $(BUILD_PACKAGE)
\ No newline at end of file
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk
index 4462374..98b7440 100644
--- a/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk
+++ b/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk
@@ -20,6 +20,9 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_AAPT_NAMESPACES := true
 LOCAL_PACKAGE_NAME := AaptTestNamespace_App
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_EXPORT_PACKAGE_RESOURCES := true
 LOCAL_MODULE_TAGS := tests
diff --git a/tools/aapt2/integration-tests/NamespaceTest/Split/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/Split/Android.mk
index 83e2289..3037572 100644
--- a/tools/aapt2/integration-tests/NamespaceTest/Split/Android.mk
+++ b/tools/aapt2/integration-tests/NamespaceTest/Split/Android.mk
@@ -20,6 +20,9 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_AAPT_NAMESPACES := true
 LOCAL_PACKAGE_NAME := AaptTestNamespace_Split
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE  := $(LOCAL_PATH)/../../../../../NOTICE
 LOCAL_SDK_VERSION := current
 LOCAL_MODULE_TAGS := tests
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
diff --git a/tools/aapt2/java/JavaClassGenerator_test.cpp b/tools/aapt2/java/JavaClassGenerator_test.cpp
index 8bb3ee9..d08b61e 100644
--- a/tools/aapt2/java/JavaClassGenerator_test.cpp
+++ b/tools/aapt2/java/JavaClassGenerator_test.cpp
@@ -334,11 +334,12 @@
   styleable.entries.push_back(Reference(test::ParseNameOrDie("android:attr/one")));
   styleable.SetComment(StringPiece("This is a styleable"));
 
+  CloningValueTransformer cloner(nullptr);
   std::unique_ptr<ResourceTable> table =
       test::ResourceTableBuilder()
           .AddValue("android:attr/one", util::make_unique<Attribute>(attr))
           .AddValue("android:styleable/Container",
-                    std::unique_ptr<Styleable>(styleable.Clone(nullptr)))
+                    std::unique_ptr<Styleable>(styleable.Transform(cloner)))
           .Build();
 
   std::unique_ptr<IAaptContext> context =
@@ -371,11 +372,12 @@
   styleable.entries.push_back(Reference(test::ParseNameOrDie("android:attr/one")));
   styleable.SetComment(StringPiece("This is a styleable"));
 
+  CloningValueTransformer cloner(nullptr);
   std::unique_ptr<ResourceTable> table =
       test::ResourceTableBuilder()
           .AddValue("android:attr/one", util::make_unique<Attribute>(attr))
           .AddValue("android:styleable/Container",
-                    std::unique_ptr<Styleable>(styleable.Clone(nullptr)))
+                    std::unique_ptr<Styleable>(styleable.Transform(cloner)))
           .Build();
 
   std::unique_ptr<IAaptContext> context =
diff --git a/tools/aapt2/link/AutoVersioner.cpp b/tools/aapt2/link/AutoVersioner.cpp
index 73b9254..876494e 100644
--- a/tools/aapt2/link/AutoVersioner.cpp
+++ b/tools/aapt2/link/AutoVersioner.cpp
@@ -72,6 +72,7 @@
 
 bool AutoVersioner::Consume(IAaptContext* context, ResourceTable* table) {
   TRACE_NAME("AutoVersioner::Consume");
+  CloningValueTransformer cloner(&table->string_pool);
   for (auto& package : table->packages) {
     for (auto& type : package->types) {
       if (type->type != ResourceType::kStyle) {
@@ -128,7 +129,7 @@
                 ConfigDescription new_config(config_value->config);
                 new_config.sdkVersion = static_cast<uint16_t>(min_sdk_stripped.value());
 
-                std::unique_ptr<Style> new_style(style->Clone(&table->string_pool));
+                std::unique_ptr<Style> new_style(style->Transform(cloner));
                 new_style->SetComment(style->GetComment());
                 new_style->SetSource(style->GetSource());
 
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index 4ef2882..bc93ec6 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -280,13 +280,13 @@
         }
 
         // Continue if we're taking the new resource.
-
+        CloningValueTransformer cloner(&main_table_->string_pool);
         if (FileReference* f = ValueCast<FileReference>(src_config_value->value.get())) {
           std::unique_ptr<FileReference> new_file_ref;
           if (mangle_package) {
             new_file_ref = CloneAndMangleFile(src_package->name, *f);
           } else {
-            new_file_ref = std::unique_ptr<FileReference>(f->Clone(&main_table_->string_pool));
+            new_file_ref = std::unique_ptr<FileReference>(f->Transform(cloner));
           }
           dst_config_value->value = std::move(new_file_ref);
 
@@ -294,8 +294,7 @@
           Maybe<std::string> original_comment = (dst_config_value->value)
               ? dst_config_value->value->GetComment() : Maybe<std::string>();
 
-          dst_config_value->value = std::unique_ptr<Value>(
-              src_config_value->value->Clone(&main_table_->string_pool));
+          dst_config_value->value = src_config_value->value->Transform(cloner);
 
           // Keep the comment from the original resource and ignore all comments from overlaying
           // resources
@@ -323,7 +322,9 @@
     new_file_ref->file = file_ref.file;
     return new_file_ref;
   }
-  return std::unique_ptr<FileReference>(file_ref.Clone(&main_table_->string_pool));
+
+  CloningValueTransformer cloner(&main_table_->string_pool);
+  return std::unique_ptr<FileReference>(file_ref.Transform(cloner));
 }
 
 bool TableMerger::MergeFile(const ResourceFile& file_desc, bool overlay, io::IFile* file) {
diff --git a/tools/aapt2/link/XmlCompatVersioner.cpp b/tools/aapt2/link/XmlCompatVersioner.cpp
index 6937ca9..957b64c 100644
--- a/tools/aapt2/link/XmlCompatVersioner.cpp
+++ b/tools/aapt2/link/XmlCompatVersioner.cpp
@@ -23,9 +23,10 @@
 namespace aapt {
 
 static xml::Attribute CopyAttr(const xml::Attribute& src, StringPool* out_string_pool) {
+  CloningValueTransformer cloner(out_string_pool);
   xml::Attribute dst{src.namespace_uri, src.name, src.value, src.compiled_attribute};
   if (src.compiled_value != nullptr) {
-    dst.compiled_value.reset(src.compiled_value->Clone(out_string_pool));
+    dst.compiled_value = src.compiled_value->Transform(cloner);
   }
   return dst;
 }
@@ -34,6 +35,7 @@
 // (came from a rule).
 static bool CopyAttribute(const xml::Attribute& src_attr, bool generated, xml::Element* dst_el,
                           StringPool* out_string_pool) {
+  CloningValueTransformer cloner(out_string_pool);
   xml::Attribute* dst_attr = dst_el->FindAttribute(src_attr.namespace_uri, src_attr.name);
   if (dst_attr != nullptr) {
     if (generated) {
@@ -41,7 +43,7 @@
       dst_attr->value = src_attr.value;
       dst_attr->compiled_attribute = src_attr.compiled_attribute;
       if (src_attr.compiled_value != nullptr) {
-        dst_attr->compiled_value.reset(src_attr.compiled_value->Clone(out_string_pool));
+        dst_attr->compiled_value = src_attr.compiled_value->Transform(cloner);
       }
       return true;
     }
@@ -158,7 +160,8 @@
   if (src == nullptr) {
     return {};
   }
-  return std::unique_ptr<Item>(src->Clone(out_string_pool));
+  CloningValueTransformer cloner(out_string_pool);
+  return src->Transform(cloner);
 }
 
 std::vector<DegradeResult> DegradeToManyRule::Degrade(const xml::Element& src_el,
diff --git a/tools/aapt2/split/TableSplitter.cpp b/tools/aapt2/split/TableSplitter.cpp
index 2f319b1..116b2ab9 100644
--- a/tools/aapt2/split/TableSplitter.cpp
+++ b/tools/aapt2/split/TableSplitter.cpp
@@ -229,6 +229,7 @@
         for (size_t idx = 0; idx < split_count; idx++) {
           const SplitConstraints& split_constraint = split_constraints_[idx];
           ResourceTable* split_table = splits_[idx].get();
+          CloningValueTransformer cloner(&split_table->string_pool);
 
           // Select the values we want from this entry for this split.
           SplitValueSelector selector(split_constraint);
@@ -254,8 +255,7 @@
             for (ResourceConfigValue* config_value : selected_values) {
               ResourceConfigValue* new_config_value =
                   split_entry->FindOrCreateValue(config_value->config, config_value->product);
-              new_config_value->value = std::unique_ptr<Value>(
-                  config_value->value->Clone(&split_table->string_pool));
+              new_config_value->value = config_value->value->Transform(cloner);
             }
           }
         }
diff --git a/tools/aapt2/test/Context.h b/tools/aapt2/test/Context.h
index 553c43e..5d8ded3 100644
--- a/tools/aapt2/test/Context.h
+++ b/tools/aapt2/test/Context.h
@@ -200,10 +200,11 @@
 
    private:
     std::unique_ptr<SymbolTable::Symbol> CloneSymbol(SymbolTable::Symbol* sym) {
+      CloningValueTransformer cloner(nullptr);
       std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
       clone->id = sym->id;
       if (sym->attribute) {
-        clone->attribute = std::unique_ptr<Attribute>(sym->attribute->Clone(nullptr));
+        clone->attribute = std::unique_ptr<Attribute>(sym->attribute->Transform(cloner));
       }
       clone->is_public = sym->is_public;
       return clone;
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 005eeb9..2cdcfe4 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -374,6 +374,7 @@
 
 std::unique_ptr<XmlResource> XmlResource::Clone() const {
   std::unique_ptr<XmlResource> cloned = util::make_unique<XmlResource>(file);
+  CloningValueTransformer cloner(&cloned->string_pool);
   if (root != nullptr) {
     cloned->root = root->CloneElement([&](const xml::Element& src, xml::Element* dst) {
       dst->attributes.reserve(src.attributes.size());
@@ -384,7 +385,7 @@
         cloned_attr.value = attr.value;
         cloned_attr.compiled_attribute = attr.compiled_attribute;
         if (attr.compiled_value != nullptr) {
-          cloned_attr.compiled_value.reset(attr.compiled_value->Clone(&cloned->string_pool));
+          cloned_attr.compiled_value = attr.compiled_value->Transform(cloner);
         }
         dst->attributes.push_back(std::move(cloned_attr));
       }
diff --git a/tools/fonts/Android.bp b/tools/fonts/Android.bp
index 8ea114f..eeb9e3c 100644
--- a/tools/fonts/Android.bp
+++ b/tools/fonts/Android.bp
@@ -12,6 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "frameworks_base_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["frameworks_base_license"],
+}
+
 python_defaults {
     name: "fonts_python_defaults",
     version: {